blob: 5e5b44af30bc995ebb8accbde1d1180c171cb6bd [file] [log] [blame] [edit]
import hashlib
import re
import zlib
from pathlib import Path
import infra.basetest
EXAMPLE_ITS = Path(__file__).parent / "test_uboot_tools/example.its"
def get_hashes(output: str) -> dict[str, str]:
"""Get hashes from dumpimage output (assumes exactly one image in FIT)"""
pat = re.compile(
r"Hash algo:\s+(\S+)$\s+Hash value:\s+(\w+)$", flags=re.MULTILINE)
return dict(pat.findall(output))
def calc_hashes(data: bytes) -> dict[str, str]:
"""Calculate the hashes dumpimage should report for a given blob"""
return {
"crc32": f"{zlib.crc32(data):08x}",
"md5": hashlib.md5(data).hexdigest(),
"sha1": hashlib.sha1(data).hexdigest(),
"sha256": hashlib.sha256(data).hexdigest(),
"sha384": hashlib.sha384(data).hexdigest(),
"sha512": hashlib.sha512(data).hexdigest(),
}
class TestUbootTools(infra.basetest.BRTest):
rootfs_overlay = \
infra.filepath("tests/package/test_uboot_tools")
config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
f"""
BR2_PACKAGE_UBOOT_TOOLS=y
BR2_PACKAGE_UBOOT_TOOLS_DUMPIMAGE=y
BR2_PACKAGE_UBOOT_TOOLS_FIT_SUPPORT=y
BR2_PACKAGE_UBOOT_TOOLS_MKIMAGE=y
BR2_ROOTFS_OVERLAY="{rootfs_overlay}"
BR2_TARGET_ROOTFS_CPIO=y
# BR2_TARGET_ROOTFS_TAR is not set
"""
def test_run(self):
ramdisk = Path(self.builddir) / "images/rootfs.cpio"
self.emulator.boot(arch="armv5",
kernel="builtin",
options=["-initrd", str(ramdisk)])
self.emulator.login()
self.assertRunOk(f"mkimage -f /{EXAMPLE_ITS.name} /tmp/test.fit")
cmd = "dumpimage -l /tmp/test.fit"
out, exit_code = self.emulator.run(cmd, -1)
self.assertEqual(
exit_code,
0,
"\nFailed to run: {}\noutput was:\n{}".format(cmd, ' '+'\n '.join(out))
)
reported = get_hashes("\n".join(out))
expected = calc_hashes(EXAMPLE_ITS.read_bytes())
for h in expected:
with self.subTest(hash=h):
self.assertEqual(expected[h], reported[h])
# Python does not have built-in CRC16 support, just check it is present
self.assertIn("crc16-ccitt", reported)
class TestHostUbootTools(infra.basetest.BRHostPkgTest):
hostpkgs = ["host-uboot-tools"]
config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \
"""
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y
"""
def test_run(self):
cmd = ["host/bin/mkimage", "-f", str(EXAMPLE_ITS), "test.fit"]
infra.run_cmd_on_host(self.builddir, cmd)
cmd = ["host/bin/dumpimage", "-l", "test.fit"]
reported = get_hashes(infra.run_cmd_on_host(self.builddir, cmd))
expected = calc_hashes(EXAMPLE_ITS.read_bytes())
for h in expected:
with self.subTest(hash=h):
self.assertEqual(expected[h], reported[h])
# Python does not have built-in CRC16 support, just check it is present
self.assertIn("crc16-ccitt", reported)