Hi Mattijs,

On Thu, Oct 15, 2026 at 3:55 PM Mattijs Korpershoek
<[email protected]> wrote:
>
> The image creation code in test_ut is huge and difficult to follow.
> The android part contain code duplications when making mmc7.img/mmc8.img.
>
> To prepare some code refactoring, move the Android specific bits into a
> dedicated file under test_android/.
>
> No functional change.
>
> Signed-off-by: Mattijs Korpershoek <[email protected]>
> ---
>  test/py/tests/test_android/android_image.py | 135 
> ++++++++++++++++++++++++++++
>  test/py/tests/test_ut.py                    | 129 +-------------------------
>  2 files changed, 136 insertions(+), 128 deletions(-)
>
> diff --git a/test/py/tests/test_android/android_image.py 
> b/test/py/tests/test_android/android_image.py
> new file mode 100644
> index 000000000000..3bea311586bf
> --- /dev/null
> +++ b/test/py/tests/test_android/android_image.py
> @@ -0,0 +1,135 @@
> +# SPDX-License-Identifier: GPL-2.0
> +"""Helpers to create Android disk images for sandbox testing."""
> +
> +import collections
> +import os
> +
> +import utils
> +from test_android import test_abootimg
> +
> +def setup_android_image(ubman):
> +    """Create a 20MB disk image with Android partitions"""
> +    Partition = collections.namedtuple('part', 'start,size,name')
> +    parts = {}
> +    disk_data = None
> +
> +    def set_part_data(partnum, data):
> +        """Set the contents of a disk partition
> +
> +        This updates disk_data by putting data in the right place
> +
> +        Args:
> +            partnum (int): Partition number to set
> +            data (bytes): Data for that partition
> +        """
> +        nonlocal disk_data
> +
> +        start = parts[partnum].start * sect_size
> +        disk_data = disk_data[:start] + data + disk_data[start + len(data):]
> +
> +    mmc_dev = 7
> +    fname = os.path.join(ubman.config.source_dir, f'mmc{mmc_dev}.img')
> +    utils.run_and_log(ubman, f'qemu-img create {fname} 20M')
> +    utils.run_and_log(ubman, f'cgpt create {fname}')
> +
> +    ptr = 40
> +
> +    # Number of sectors in 1MB
> +    sect_size = 512
> +    sect_1mb = (1 << 20) // sect_size
> +
> +    required_parts = [
> +        {'num': 1, 'label':'misc', 'size': '1M'},
> +        {'num': 2, 'label':'boot_a', 'size': '4M'},
> +        {'num': 3, 'label':'boot_b', 'size': '4M'},
> +        {'num': 4, 'label':'vendor_boot_a', 'size': '4M'},
> +        {'num': 5, 'label':'vendor_boot_b', 'size': '4M'},
> +    ]
> +
> +    for part in required_parts:
> +        size_str = part['size']
> +        if 'M' in size_str:
> +            size = int(size_str[:-1]) * sect_1mb
> +        else:
> +            size = int(size_str)
> +        utils.run_and_log(
> +            ubman,
> +            f"cgpt add -i {part['num']} -b {ptr} -s {size} -l 
> {part['label']} -t basicdata {fname}")
> +        ptr += size
> +
> +    utils.run_and_log(ubman, f'cgpt boot -p {fname}')
> +    out = utils.run_and_log(ubman, f'cgpt show -q {fname}')
> +
> +    # Create a dict (indexed by partition number) containing the above info
> +    for line in out.splitlines():
> +        start, size, num, name = line.split(maxsplit=3)
> +        parts[int(num)] = Partition(int(start), int(size), name)
> +
> +    with open(fname, 'rb') as inf:
> +        disk_data = inf.read()
> +
> +    test_abootimg.AbootimgTestDiskImage(ubman, 'bootv4.img', 
> test_abootimg.boot_img_hex)
> +    boot_img = os.path.join(ubman.config.result_dir, 'bootv4.img')
> +    with open(boot_img, 'rb') as inf:
> +        set_part_data(2, inf.read())
> +
> +    test_abootimg.AbootimgTestDiskImage(ubman, 'vendor_boot.img', 
> test_abootimg.vboot_img_hex)
> +    vendor_boot_img = os.path.join(ubman.config.result_dir, 
> 'vendor_boot.img')
> +    with open(vendor_boot_img, 'rb') as inf:
> +        set_part_data(4, inf.read())
> +
> +    with open(fname, 'wb') as outf:
> +        outf.write(disk_data)
> +
> +    print(f'wrote to {fname}')
> +
> +    mmc_dev = 8
> +    fname = os.path.join(ubman.config.source_dir, f'mmc{mmc_dev}.img')
> +    utils.run_and_log(ubman, f'qemu-img create {fname} 20M')
> +    utils.run_and_log(ubman, f'cgpt create {fname}')
> +
> +    ptr = 40
> +
> +    # Number of sectors in 1MB
> +    sect_size = 512
> +    sect_1mb = (1 << 20) // sect_size
> +
> +    required_parts = [
> +        {'num': 1, 'label':'misc', 'size': '1M'},
> +        {'num': 2, 'label':'boot_a', 'size': '4M'},
> +        {'num': 3, 'label':'boot_b', 'size': '4M'},
> +    ]
> +
> +    for part in required_parts:
> +        size_str = part['size']
> +        if 'M' in size_str:
> +            size = int(size_str[:-1]) * sect_1mb
> +        else:
> +            size = int(size_str)
> +        utils.run_and_log(
> +            ubman,
> +            f"cgpt add -i {part['num']} -b {ptr} -s {size} -l 
> {part['label']} -t basicdata {fname}")
> +        ptr += size
> +
> +    utils.run_and_log(ubman, f'cgpt boot -p {fname}')
> +    out = utils.run_and_log(ubman, f'cgpt show -q {fname}')
> +
> +    # Create a dict (indexed by partition number) containing the above info
> +    for line in out.splitlines():
> +        start, size, num, name = line.split(maxsplit=3)
> +        parts[int(num)] = Partition(int(start), int(size), name)
> +
> +    with open(fname, 'rb') as inf:
> +        disk_data = inf.read()
> +
> +    test_abootimg.AbootimgTestDiskImage(ubman, 'boot.img', 
> test_abootimg.img_hex)
> +    boot_img = os.path.join(ubman.config.result_dir, 'boot.img')
> +    with open(boot_img, 'rb') as inf:
> +        set_part_data(2, inf.read())
> +
> +    with open(fname, 'wb') as outf:
> +        outf.write(disk_data)
> +
> +    print(f'wrote to {fname}')
> +
> +    return fname
> diff --git a/test/py/tests/test_ut.py b/test/py/tests/test_ut.py
> index 2a5acc18c612..c1b5bc056023 100644
> --- a/test/py/tests/test_ut.py
> +++ b/test/py/tests/test_ut.py
> @@ -19,7 +19,7 @@ import utils
>  # pylint: disable=E0611
>  from tests import fs_helper
>  from fs_helper import DiskHelper, FsHelper
> -from test_android import test_abootimg
> +from test_android.android_image import setup_android_image
>
>  def mkdir_cond(dirname):
>      """Create a directory if it doesn't already exist
> @@ -506,133 +506,6 @@ def setup_cros_image(ubman):
>
>      return fname
>
> -def setup_android_image(ubman):
> -    """Create a 20MB disk image with Android partitions"""
> -    Partition = collections.namedtuple('part', 'start,size,name')
> -    parts = {}
> -    disk_data = None
> -
> -    def set_part_data(partnum, data):
> -        """Set the contents of a disk partition
> -
> -        This updates disk_data by putting data in the right place
> -
> -        Args:
> -            partnum (int): Partition number to set
> -            data (bytes): Data for that partition
> -        """
> -        nonlocal disk_data
> -
> -        start = parts[partnum].start * sect_size
> -        disk_data = disk_data[:start] + data + disk_data[start + len(data):]
> -
> -    mmc_dev = 7
> -    fname = os.path.join(ubman.config.source_dir, f'mmc{mmc_dev}.img')
> -    utils.run_and_log(ubman, f'qemu-img create {fname} 20M')
> -    utils.run_and_log(ubman, f'cgpt create {fname}')
> -
> -    ptr = 40
> -
> -    # Number of sectors in 1MB
> -    sect_size = 512
> -    sect_1mb = (1 << 20) // sect_size
> -
> -    required_parts = [
> -        {'num': 1, 'label':'misc', 'size': '1M'},
> -        {'num': 2, 'label':'boot_a', 'size': '4M'},
> -        {'num': 3, 'label':'boot_b', 'size': '4M'},
> -        {'num': 4, 'label':'vendor_boot_a', 'size': '4M'},
> -        {'num': 5, 'label':'vendor_boot_b', 'size': '4M'},
> -    ]
> -
> -    for part in required_parts:
> -        size_str = part['size']
> -        if 'M' in size_str:
> -            size = int(size_str[:-1]) * sect_1mb
> -        else:
> -            size = int(size_str)
> -        utils.run_and_log(
> -            ubman,
> -            f"cgpt add -i {part['num']} -b {ptr} -s {size} -l 
> {part['label']} -t basicdata {fname}")
> -        ptr += size
> -
> -    utils.run_and_log(ubman, f'cgpt boot -p {fname}')
> -    out = utils.run_and_log(ubman, f'cgpt show -q {fname}')
> -
> -    # Create a dict (indexed by partition number) containing the above info
> -    for line in out.splitlines():
> -        start, size, num, name = line.split(maxsplit=3)
> -        parts[int(num)] = Partition(int(start), int(size), name)
> -
> -    with open(fname, 'rb') as inf:
> -        disk_data = inf.read()
> -
> -    test_abootimg.AbootimgTestDiskImage(ubman, 'bootv4.img', 
> test_abootimg.boot_img_hex)
> -    boot_img = os.path.join(ubman.config.result_dir, 'bootv4.img')
> -    with open(boot_img, 'rb') as inf:
> -        set_part_data(2, inf.read())
> -
> -    test_abootimg.AbootimgTestDiskImage(ubman, 'vendor_boot.img', 
> test_abootimg.vboot_img_hex)
> -    vendor_boot_img = os.path.join(ubman.config.result_dir, 
> 'vendor_boot.img')
> -    with open(vendor_boot_img, 'rb') as inf:
> -        set_part_data(4, inf.read())
> -
> -    with open(fname, 'wb') as outf:
> -        outf.write(disk_data)
> -
> -    print(f'wrote to {fname}')
> -
> -    mmc_dev = 8
> -    fname = os.path.join(ubman.config.source_dir, f'mmc{mmc_dev}.img')
> -    utils.run_and_log(ubman, f'qemu-img create {fname} 20M')
> -    utils.run_and_log(ubman, f'cgpt create {fname}')
> -
> -    ptr = 40
> -
> -    # Number of sectors in 1MB
> -    sect_size = 512
> -    sect_1mb = (1 << 20) // sect_size
> -
> -    required_parts = [
> -        {'num': 1, 'label':'misc', 'size': '1M'},
> -        {'num': 2, 'label':'boot_a', 'size': '4M'},
> -        {'num': 3, 'label':'boot_b', 'size': '4M'},
> -    ]
> -
> -    for part in required_parts:
> -        size_str = part['size']
> -        if 'M' in size_str:
> -            size = int(size_str[:-1]) * sect_1mb
> -        else:
> -            size = int(size_str)
> -        utils.run_and_log(
> -            ubman,
> -            f"cgpt add -i {part['num']} -b {ptr} -s {size} -l 
> {part['label']} -t basicdata {fname}")
> -        ptr += size
> -
> -    utils.run_and_log(ubman, f'cgpt boot -p {fname}')
> -    out = utils.run_and_log(ubman, f'cgpt show -q {fname}')
> -
> -    # Create a dict (indexed by partition number) containing the above info
> -    for line in out.splitlines():
> -        start, size, num, name = line.split(maxsplit=3)
> -        parts[int(num)] = Partition(int(start), int(size), name)
> -
> -    with open(fname, 'rb') as inf:
> -        disk_data = inf.read()
> -
> -    test_abootimg.AbootimgTestDiskImage(ubman, 'boot.img', 
> test_abootimg.img_hex)
> -    boot_img = os.path.join(ubman.config.result_dir, 'boot.img')
> -    with open(boot_img, 'rb') as inf:
> -        set_part_data(2, inf.read())
> -
> -    with open(fname, 'wb') as outf:
> -        outf.write(disk_data)
> -
> -    print(f'wrote to {fname}')
> -
> -    return fname
> -
>  def setup_cedit_file(ubman):
>      """Set up a .dtb file for use with testing expo and configuration 
> editor"""
>      infname = os.path.join(ubman.config.source_dir,
>
> --
> 2.56.0
>

Reviewed-by: Igor Opaniuk <[email protected]>

Reply via email to