1
0
Fork 1
mirror of https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git synced 2025-07-12 19:09:56 +03:00
pmbootstrap/test/parse/test_deviceinfo.py
Hugo Osvaldo Barrera 5a152aebae
test: move all tests into separate module (MR 2551)
When installing pmboostrap, all tests are installed alongside it. There
doesn't seem to be any way to selectively exclude some files inside
python modules, so move all test into a separate module instead.

This is the typical convention in python projects.

See: https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/79862
Fixes: https://gitlab.postmarketos.org/postmarketOS/pmbootstrap/-/issues/2541
2025-02-13 01:28:20 +01:00

207 lines
5.2 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"])
# 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)