Hi Tobias, On Wed, 1 Feb 2023 at 11:10, Tobias Waldekranz <tob...@waldekranz.com> wrote: > > Verify that: > > - Block maps can be created and destroyed > - Mappings aren't allowed to overlap > - Multiple mappings can be attached and be read/written from/to > > Signed-off-by: Tobias Waldekranz <tob...@waldekranz.com> > --- > MAINTAINERS | 1 + > configs/sandbox_defconfig | 1 + > test/py/tests/test_blkmap.py | 164 +++++++++++++++++++++++++++++++++++ > 3 files changed, 166 insertions(+) > create mode 100644 test/py/tests/test_blkmap.py
https://u-boot.readthedocs.io/en/latest/develop/tests_writing.html This should be done in C...see test/dm/acpi.c for an example of how to check console output. > > diff --git a/MAINTAINERS b/MAINTAINERS > index 83c0f90a53..c420c8e1f9 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -792,6 +792,7 @@ S: Maintained > F: cmd/blkmap.c > F: drivers/block/blkmap.c > F: include/blkmap.h > +F: test/py/tests/test_blkmap.py > > BOOTDEVICE > M: Simon Glass <s...@chromium.org> > diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig > index 34c342b6f5..06021e4902 100644 > --- a/configs/sandbox_defconfig > +++ b/configs/sandbox_defconfig > @@ -145,6 +145,7 @@ CONFIG_ADC=y > CONFIG_ADC_SANDBOX=y > CONFIG_AXI=y > CONFIG_AXI_SANDBOX=y > +CONFIG_BLKMAP=y > CONFIG_SYS_IDE_MAXBUS=1 > CONFIG_SYS_ATA_BASE_ADDR=0x100 > CONFIG_SYS_ATA_STRIDE=4 > diff --git a/test/py/tests/test_blkmap.py b/test/py/tests/test_blkmap.py > new file mode 100644 > index 0000000000..5a4c770c81 > --- /dev/null > +++ b/test/py/tests/test_blkmap.py > @@ -0,0 +1,164 @@ > +# SPDX-License-Identifier: GPL-2.0+ > +# > +# Copyright (c) 2023 Addiva Elektronik > +# Author: Tobias Waldekranz <tob...@waldekranz.com> > + > +""" Unit test for blkmap command > +""" > + > +import pytest > + > +BLKSZ = 0x200 > + > +MAPPING = [ > + ((0, 1), 3), > + ((1, 3), 0), > + ((4, 2), 6), > + ((6, 2), 4), > +] > + > +ORDERED = 0x0000 > +UNORDERED = 0x1000 > +BUFFER = 0x2000 > + > +def mkblob(base, mapping): > + cmds = [] > + > + for ((blksrc, blkcnt), blkdst) in mapping: > + for blknr in range(blkcnt): > + cmds.append(f"mw.b 0x{base + (blkdst + blknr) * BLKSZ:x}" + > + f" 0x{blksrc + blknr:x} 0x{BLKSZ:x}") > + return cmds > + > +class Blkmap(object): > + def __init__(self, console, num): > + self.console, self.num = console, num > + > + def __enter__(self): > + r = self.console.run_command(f"blkmap create {self.num}") > + assert(f"Created device {self.num}" in r) > + > + r = self.console.run_command(f"blkmap dev {self.num}") > + assert("is now current device" in r) > + > + return self > + > + def __exit__(self, typ, value, traceback): > + r = self.console.run_command(f"blkmap destroy {self.num}") > + assert(f"Destroyed device {self.num}" in r) > + > + def map_mem(self, blknr, blkcnt, addr): > + r = self.console.run_command( > + f"blkmap map {self.num} {blknr:#x} {blkcnt:#x} mem {addr:#x}" > + ) > + assert(" mapped to " in r) > + > + def read(self, addr, blknr, blkcnt): > + r = self.console.run_command( > + f"blkmap read {addr:#x} {blknr:#x} {blkcnt:#x}" > + ) > + assert(" OK" in r) > + > + def write(self, addr, blknr, blkcnt): > + r = self.console.run_command( > + f"blkmap write {addr:#x} {blknr:#x} {blkcnt:#x}" > + ) > + assert(" OK" in r) > + > +@pytest.mark.boardspec('sandbox') > +@pytest.mark.buildconfigspec('cmd_blkmap') > +def test_blkmap_creation(u_boot_console): > + """ Verify that blkmaps can be created and destroyed > + > + Args: > + u_boot_console -- U-Boot console > + """ > + with Blkmap(u_boot_console, 0): > + # Can't have 2 blkmap 0's > + with pytest.raises(AssertionError): > + with Blkmap(u_boot_console, 0): > + pass > + > + # But blkmap 1 should be fine > + with Blkmap(u_boot_console, 1): > + pass > + > + # Once blkmap 0 is destroyed, we should be able to create it again > + with Blkmap(u_boot_console, 0): > + pass > + > +@pytest.mark.boardspec('sandbox') > +@pytest.mark.buildconfigspec('cmd_blkmap') > +def test_blkmap_slicing(u_boot_console): > + """ Verify that slices aren't allowed to overlap > + > + Args: > + u_boot_console -- U-Boot console > + """ > + with Blkmap(u_boot_console, 0) as bm: > + bm.map_mem(8, 8, 0) > + > + # Can't overlap on the low end > + with pytest.raises(AssertionError): > + bm.map_mem(4, 5, 0) > + > + # Can't be inside > + with pytest.raises(AssertionError): > + bm.map_mem(10, 2, 0) > + > + # Can't overlap on the high end > + with pytest.raises(AssertionError): > + bm.map_mem(15, 4, 0) > + > + # But we should be able to add slices right before and after > + bm.map_mem( 4, 4, 0) > + bm.map_mem(16, 4, 0) > + > +@pytest.mark.boardspec('sandbox') > +@pytest.mark.buildconfigspec('cmd_blkmap') > +def test_blkmap_mem_read(u_boot_console): > + """ Test reading from a memory backed blkmap > + > + Args: > + u_boot_console -- U-Boot console > + """ > + > + # Generate an ordered and an unordered pattern in memory > + u_boot_console.run_command_list(mkblob(ORDERED, (((0, 8), 0),))) > + u_boot_console.run_command_list(mkblob(UNORDERED, MAPPING)) > + > + with Blkmap(u_boot_console, 0) as bm: > + # Create a blkmap that cancels out the disorder > + for ((blksrc, blkcnt), blkdst) in MAPPING: > + bm.map_mem(blksrc, blkcnt, UNORDERED + blkdst * BLKSZ) > + > + # Read out the data via the blkmap device to another area > + bm.read(BUFFER, 0, 8) > + > + # And verify that it matches the ordered pattern > + response = u_boot_console.run_command(f"cmp.b 0x{BUFFER:x} 0x{ORDERED:x} > 0x1000") > + assert("Total of 4096 byte(s) were the same" in response) > + > +@pytest.mark.boardspec('sandbox') > +@pytest.mark.buildconfigspec('cmd_blkmap') > +def test_blkmap_mem_write(u_boot_console): > + """ Test writing to a memory backed blkmap > + > + Args: > + u_boot_console -- U-Boot console > + """ > + # Generate an ordered and an unordered pattern in memory > + u_boot_console.run_command_list(mkblob(ORDERED, (((0, 8), 0),))) > + u_boot_console.run_command_list(mkblob(UNORDERED, MAPPING)) > + > + with Blkmap(u_boot_console, 0) as bm: > + # Create a blkmap that mimics the disorder > + for ((blksrc, blkcnt), blkdst) in MAPPING: > + bm.map_mem(blksrc, blkcnt, BUFFER + blkdst * BLKSZ) > + > + # Write the ordered data via the blkmap device to another area > + bm.write(ORDERED, 0, 8) > + > + # And verify that the result matches the unordered pattern > + response = u_boot_console.run_command(f"cmp.b 0x{BUFFER:x} > 0x{UNORDERED:x} 0x1000") > + assert("Total of 4096 byte(s) were the same" in response) > -- > 2.34.1 > Regards, Simon