Files
u-boot/test/py/tests/test_ut.py
Simon Glass 570c30e820 test: Write the SPI image to the persistent-data directory
It is annoying to have disk images in the source directory since it
clutters up the working space.

Move spi.bin (used by the SPI tests) into the persistent-data
directory, update the driver and add a comment.

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
2025-12-29 08:49:51 -07:00

151 lines
5.9 KiB
Python

# SPDX-License-Identifier: GPL-2.0
"""
Unit-test runner
Provides a test_ut() function which is used by conftest.py to run each unit
test one at a time, as well setting up some files needed by the tests.
# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
"""
import collections
import gzip
import hashlib
import os
import os.path
import pytest
import utils
# pylint: disable=E0611
from fs_helper import DiskHelper, FsHelper
from test_android import test_abootimg
from img.vbe import setup_vbe_image
from img.common import mkdir_cond, copy_partition, setup_extlinux_image
from img.fedora import setup_fedora_image
from img.ubuntu import setup_ubuntu_image
from img.armbian import setup_bootmenu_image
from img.chromeos import setup_cros_image
from img.android import setup_android_image
from img.efi import setup_efi_image
from img.cedit import setup_cedit_file
from img.localboot import setup_localboot_image
@pytest.mark.buildconfigspec('ut_dm')
def test_ut_dm_init(ubman):
"""Initialize data for ut dm tests."""
# This is used by flash-stick@0 in test.py
fn = ubman.config.persistent_data_dir + '/testflash.bin'
if not os.path.exists(fn):
data = b'this is a test'
data += b'\x00' * ((4 * 1024 * 1024) - len(data))
with open(fn, 'wb') as fh:
fh.write(data)
fn = ubman.config.persistent_data_dir + '/spi.bin'
if not os.path.exists(fn):
data = b'\x00' * (2 * 1024 * 1024)
with open(fn, 'wb') as fh:
fh.write(data)
# Create a file with a single partition (used by /scsi in test.dts) */
fn = ubman.config.persistent_data_dir + '/scsi.img'
if not os.path.exists(fn):
data = b'\x00' * (2 * 1024 * 1024)
with open(fn, 'wb') as fh:
fh.write(data)
utils.run_and_log(
ubman, f'sfdisk {fn}', stdin=b'type=83')
# These two are used by test/dm/host.c
FsHelper(ubman.config, 'ext2', 2, '2MB').mk_fs()
FsHelper(ubman.config, 'fat32', 1, '1MB').mk_fs()
# This is used by test/cmd/mbr.c
mmc_dev = 6
fn = os.path.join(ubman.config.persistent_data_dir, f'mmc{mmc_dev}.img')
data = b'\x00' * (12 * 1024 * 1024)
with open(fn, 'wb') as fh:
fh.write(data)
@pytest.mark.buildconfigspec('cmd_bootflow')
@pytest.mark.buildconfigspec('sandbox')
def test_ut_dm_init_bootstd(u_boot_config, u_boot_log):
"""Initialise data for bootflow tests
Args:
u_boot_config (ArbitraryAttributeContainer): Configuration
u_boot_log (multiplexed_log.Logfile): Log to write to
"""
setup_fedora_image(u_boot_config, u_boot_log, 1, 'mmc')
setup_bootmenu_image(u_boot_config, u_boot_log)
setup_cedit_file(u_boot_config, u_boot_log)
setup_cros_image(u_boot_config, u_boot_log)
setup_android_image(u_boot_config, u_boot_log)
setup_efi_image(u_boot_config)
setup_ubuntu_image(u_boot_config, u_boot_log, 3, 'flash', '25.04')
setup_localboot_image(u_boot_config, u_boot_log)
setup_vbe_image(u_boot_config, u_boot_log)
# Generate TKey emulator disk key for LUKS encryption
# The emulator generates pubkey as 0x50 + (i & 0xf) for i in range(32)
# Disk key = SHA256(hex_string_of_pubkey), matching tkey_derive_disk_key()
# Allow override via external key file for testing with real keys
override_keyfile = os.path.join(u_boot_config.source_dir, 'override.bin')
if os.path.exists(override_keyfile):
keyfile = override_keyfile
u_boot_log.action(f'Using override TKey key: {keyfile}')
else:
pubkey = bytes([0x50 + (i & 0xf) for i in range(32)])
disk_key = hashlib.sha256(pubkey.hex().encode()).digest()
keyfile = os.path.join(u_boot_config.persistent_data_dir, 'tkey_emul.key')
with open(keyfile, 'wb') as f:
f.write(disk_key)
u_boot_log.action(f'Generated TKey emulator disk key: {keyfile}')
setup_ubuntu_image(u_boot_config, u_boot_log, 11, 'mmc', use_fde=1)
setup_ubuntu_image(u_boot_config, u_boot_log, 12, 'mmc', use_fde=2,
luks_kdf='argon2id')
setup_ubuntu_image(u_boot_config, u_boot_log, 13, 'mmc', use_fde=2,
luks_kdf='argon2id', encrypt_keyfile=keyfile)
# Create mmc14 with a known master key for pre_derived unlock testing
# For LUKS2 with aes-xts-plain64, we need a 64-byte (512-bit) master key
master_key = bytes([0x20 + (i & 0x3f) for i in range(64)])
master_keyfile = os.path.join(u_boot_config.persistent_data_dir,
'luks_master.key')
with open(master_keyfile, 'wb') as f:
f.write(master_key)
u_boot_log.action(f'Generated LUKS master key: {master_keyfile}')
setup_ubuntu_image(u_boot_config, u_boot_log, 14, 'mmc', use_fde=2,
luks_kdf='argon2id', encrypt_keyfile=keyfile,
master_keyfile=master_keyfile)
def test_ut(ubman, ut_subtest):
"""Execute a "ut" subtest.
The subtests are collected in function generate_ut_subtest() from linker
generated lists by applying a regular expression to the lines of file
u-boot.sym. The list entries are created using the C macro UNIT_TEST().
Strict naming conventions have to be followed to match the regular
expression. Use UNIT_TEST(foo_test_bar, _flags, foo_test) for a test bar in
test suite foo that can be executed via command 'ut foo bar' and is
implemented in C function foo_test_bar().
Args:
ubman (ConsoleBase): U-Boot console
ut_subtest (str): test to be executed via command ut, e.g 'foo bar' to
execute command 'ut foo bar'
"""
if ut_subtest == 'hush hush_test_simple_dollar':
# ut hush hush_test_simple_dollar prints "Unknown command" on purpose.
with ubman.disable_check('unknown_command'):
output = ubman.run_command('ut ' + ut_subtest)
assert 'Unknown command \'quux\' - try \'help\'' in output
else:
output = ubman.run_command('ut ' + ut_subtest)
assert output.endswith('failures: 0')