1
0
Fork 1
mirror of https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git synced 2025-07-13 11:29:46 +03:00
pmbootstrap/test/parse/test_deviceinfo.py
Casey Connolly e44ef84b4b fix tests
Signed-off-by: Casey Connolly <kcxt@postmarketos.org>
2025-06-13 21:47:42 +02:00

213 lines
5.6 KiB
Python

# Copyright 2024 Caleb Connolly
# SPDX-License-Identifier: GPL-3.0-or-later
from pathlib import Path
from pmb.parse.deviceinfo import Deviceinfo
from pmb.config import deviceinfo_chassis_types
import pytest
import tempfile
import random
# Exported from the wiki using https://www.convertcsv.com/html-table-to-csv.htm
# on 2024/10/23
deviceinfo_keys = [
"format_version",
"name",
"manufacturer",
"codename",
"uboot_boardname",
"year",
"chassis",
"dtb",
"append_dtb",
"external_storage",
"flash_method",
"arch",
"dev_internal_storage",
"dev_internal_storage_repartition",
"dev_touchscreen",
"dev_touchscreen_calibration",
"keymaps",
"swap_size_recommended",
"zram_swap_pct",
"tmp_as_tmpfs_size",
"disable_dhcpd",
"no_framebuffer",
"initfs_compression",
"create_initfs_extra",
"getty",
"gpu_accelerated",
"super_partitions",
"Variable",
"flash_offset_base",
"flash_offset_dtb",
"flash_offset_kernel",
"flash_offset_ramdisk",
"flash_offset_second",
"flash_offset_tags",
"flash_pagesize",
"flash_sparse",
"flash_sparse_samsung_format",
"flash_kernel_on_update",
"kernel_cmdline",
"kernel_cmdline_append",
"bootimg_amazon_omap_header_size",
"bootimg_blobpack",
"bootimg_qcdt",
"bootimg_qcdt_type",
"bootimg_mtk_label_kernel",
"bootimg_mtk_label_ramdisk",
"bootimg_override_payload",
"bootimg_override_initramfs",
"bootimg_override_payload_compression",
"deviceinfo_bootimg_prepend_dhtb",
"bootimg_override_payload_append_dtb",
"bootimg_dtb_second",
"bootimg_append_seandroidenforce",
"bootimg_pxa",
"bootimg_custom_args",
"header_version",
"generate_bootimg",
"generate_extlinux_config",
"generate_grub_config",
"generate_systemd_boot",
"generate_uboot_fit_images",
"generate_legacy_uboot_initfs",
"legacy_uboot_load_address",
"legacy_uboot_image_name",
"flash_fastboot_partition_kernel",
"flash_fastboot_partition_system",
"flash_fastboot_partition_vbmeta",
"flash_fastboot_partition_dtbo",
"flash_fastboot_max_size",
"flash_heimdall_partition_kernel",
"flash_heimdall_partition_initfs",
"flash_heimdall_partition_system",
"flash_heimdall_partition_vbmeta",
"flash_rk_partition_kernel",
"flash_rk_partition_system",
"flash_mtkclient_partition_kernel",
"flash_mtkclient_partition_rootfs",
"flash_mtkclient_partition_vbmeta",
"flash_mtkclient_partition_dtbo",
"boot_filesystem",
"root_filesystem",
"rootfs_image_sector_size",
"sd_embed_firmware",
"sd_embed_firmware_step_size",
"partition_blacklist",
"boot_part_start",
"partition_type",
"mkinitfs_postprocess",
"Variable",
"bootimg_vendor_dependent",
"bootimg_vendor_android_boot_image",
"bootimg_vendor_device_tree_identifiers",
"Variable",
"screen_width",
"screen_height",
"Variable",
"usb_idVendor",
"usb_idProduct",
"usb_serialnumber",
"usb_network_function",
"usb_network_udc",
"Variable",
"cgpt_kpart",
"cgpt_kpart_start",
"cgpt_kpart_size",
"depthcharge_board",
"generate_depthcharge_image",
]
deprecated_keys = [
"flash_methods",
"external_disk",
"external_disk_install",
"msm_refresher",
"flash_fastboot_vendor_id",
"nonfree",
"dev_keyboard",
"date",
]
required_keys = [
"codename",
"chassis",
"arch",
]
# Guaranteed by fair dice roll
random_values = [
"",
"test",
"True",
"false",
"2020",
"0xf100f",
"843772384",
"0",
"1",
"///@@",
"/34u3294£$*R",
]
def random_deviceinfo_props(nprops=10):
props = {}
for _ in range(nprops):
key = random.choice(deviceinfo_keys)
value = random.choice(random_values)
props[key] = value
return props
def random_valid_deviceinfo(tmp_path):
_, name = tempfile.mkstemp(dir=tmp_path)
path = Path(name)
info = random_deviceinfo_props(random.randint(1, len(deviceinfo_keys)))
# Set the required properties
# This would be the device package dir...
info["codename"] = tmp_path.name[7:]
info["chassis"] = random.choice(deviceinfo_chassis_types)
info["arch"] = random.choice(["armhf", "aarch64", "x86_64"])
# FIXME: we can't keep adding properties here manually as we make more of them
# discrete types..
if "rootfs_image_sector_size" in info:
info["rootfs_image_sector_size"] = random.choice([512, 2048, 4096])
if "boot_part_start" in info:
info["boot_part_start"] = random.choice([0, 2048, 4096])
# Now write it all out to a file
with open(path, "w") as f:
for key, value in info.items():
f.write(f'deviceinfo_{key}="{value}"\n')
return path
# Test deviceinfo files that are technically valid but have bogus data
# These are expected to get more strict as the parser is improved
def test_random_valid_deviceinfos(tmp_path):
for _ in range(1000):
info_path = random_valid_deviceinfo(tmp_path)
print(f"Testing randomly generate deviceinfo file {info_path}")
info = Deviceinfo(info_path)
print(info.codename)
# Check that lines starting with deviceinfo_ but don't have an
# "=" raise a syntax error
def test_syntax_error(tmp_file):
with open(tmp_file, "w") as f:
f.write('deviceinfo_codename="test"\n')
f.write('deviceinfo_chassis="test"\n')
f.write('deviceinfo_arch="test"\n')
f.write("deviceinfo_nothing??\n\n\n")
with pytest.raises(SyntaxError):
Deviceinfo(tmp_file)