mirror of
https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
synced 2025-07-12 19:09:56 +03:00
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
207 lines
5.2 KiB
Python
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)
|