Hi Marek,

Thank you for the patch.

On Fri, Jan 30, 2026 at 00:55, Marek Vasut <[email protected]> 
wrote:

> Add simple test for zip/unzip/gzwrite commands. The test works as
> follows. First, create three buffers with a bit of space between
> each of them, fill them with random data, then compress data in
> buffer 1 into buffer 2, decompress data in buffer 2 either directly
> into buffer 3 or into MMC 1 and then read them back into buffer 3,
> and finally compare buffer 1 and buffer 3, they have to be identical.
>
> The buffers are filled with random data to detect out of bounds writes.
> Test for various sizes, both small and large and unaligned.
>
> The test uses ut_assert_skip_to_line() to skip over gzwrite progress
> bar. Since the progress bar updates fill up the console record buffer,
> increase the size of it to compensate.
>
> Signed-off-by: Marek Vasut <[email protected]>

I've applied the deps from the cover letter, then I ran:

$ ./test/py/test.py --bd sandbox --build -k ut # to build mmc9.img
$ ./test/py/test.py --bd sandbox --build -k cmd_zip

Tests pass, so:

Tested-by: Mattijs Korpershoek <[email protected]>

Also, code looks good to me:

Reviewed-by: Mattijs Korpershoek <[email protected]>

> ---
> Cc: Alexander Graf <[email protected]>
> Cc: Heinrich Schuchardt <[email protected]>
> Cc: Ilias Apalodimas <[email protected]>
> Cc: Jerome Forissier <[email protected]>
> Cc: Mattijs Korpershoek <[email protected]>
> Cc: Neil Armstrong <[email protected]>
> Cc: Peng Fan <[email protected]>
> Cc: Quentin Schulz <[email protected]>
> Cc: Simon Glass <[email protected]>
> Cc: Tom Rini <[email protected]>
> Cc: Yuya Hamamachi <[email protected]>
> Cc: [email protected]
> ---
> V2: Use ut_assert_skip_to_line() to skip over the progress bar.
>     Since that fills up the console record buffer, increase the
>     size of it to compensate.
> ---
>  arch/sandbox/dts/test.dts |   7 +++
>  common/Kconfig            |   2 +-
>  test/cmd/Makefile         |   4 ++
>  test/cmd/unzip.c          | 123 ++++++++++++++++++++++++++++++++++++++
>  test/py/tests/test_ut.py  |   6 ++
>  5 files changed, 141 insertions(+), 1 deletion(-)
>  create mode 100644 test/cmd/unzip.c
>
> diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
> index b7402d7042a..762c1d9bbe2 100644
> --- a/arch/sandbox/dts/test.dts
> +++ b/arch/sandbox/dts/test.dts
> @@ -1272,6 +1272,13 @@
>               filename = "mmc8.img";
>       };
>  
> +     /* This is used for zip/unzip/gzwrite tests. */
> +     mmc9 {
> +             status = "disabled";
> +             compatible = "sandbox,mmc";
> +             filename = "mmc9.img";
> +     };
> +
>       pch {
>               compatible = "sandbox,pch";
>       };
> diff --git a/common/Kconfig b/common/Kconfig
> index 47d17f4e7c6..63448bdc13b 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -26,7 +26,7 @@ config CONSOLE_RECORD_INIT_F
>  config CONSOLE_RECORD_OUT_SIZE
>       hex "Output buffer size"
>       depends on CONSOLE_RECORD
> -     default 0x6000
> +     default 0x20000
>       help
>         Set the size of the console recording output buffer. When this fills
>         up, no more data will be recorded until some is removed. The buffer
> diff --git a/test/cmd/Makefile b/test/cmd/Makefile
> index 2476068aee6..273009a034f 100644
> --- a/test/cmd/Makefile
> +++ b/test/cmd/Makefile
> @@ -45,3 +45,7 @@ endif
>  obj-$(CONFIG_ARM_FFA_TRANSPORT) += armffa.o
>  endif
>  obj-$(CONFIG_CMD_SPAWN) += spawn.o
> +
> +ifdef CONFIG_CMD_ZIP
> +obj-$(CONFIG_CMD_UNZIP) += unzip.o
> +endif
> diff --git a/test/cmd/unzip.c b/test/cmd/unzip.c
> new file mode 100644
> index 00000000000..dc4a9c93745
> --- /dev/null
> +++ b/test/cmd/unzip.c
> @@ -0,0 +1,123 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Tests for zip/unzip/gzwrite commands
> + *
> + * Copyright 2026, Marek Vasut <[email protected]>
> + */
> +
> +#include <command.h>
> +#include <env.h>
> +#include <dm.h>
> +#include <dm/lists.h>
> +#include <dm/test.h>
> +#include <linux/sizes.h>
> +#include <mapmem.h>
> +#include <part.h>
> +#include <test/cmd.h>
> +#include <test/test.h>
> +#include <test/ut.h>
> +#include <u-boot/crc.h>
> +
> +static const int sizes[] = { 32, SZ_1K, SZ_4K, SZ_1M, SZ_16M, SZ_1M - 1, 
> SZ_1M + 1, 6758401 };
> +
> +static int do_test_cmd_zip_unzip(struct unit_test_state *uts, const int size,
> +                              const bool gzwrite)
> +{
> +     env_set_hex("size", size);
> +
> +     /*
> +      * Prepare three buffers, $loadadd, $encaddr, $decaddr, and
> +      * fill them all with random data. Add slight space between
> +      * the compressed buffer 'encaddr' and uncompressed buffer
> +      * 'decaddr', because the compressed data with gzip header
> +      * might be longer than uncompressed source data 'loadaddr',
> +      * and if the uncompressed data buffer 'decaddr' followed
> +      * 'encaddr', the decompression could corrupt end of 'encaddr'
> +      * buffer.
> +      */
> +     ut_assertok(run_command("setexpr encaddr $loadaddr + $size", 0));
> +     ut_assertok(run_command("setexpr encaddr $encaddr + 0x10000", 0));
> +
> +     ut_assertok(run_command("setexpr decaddr $encaddr + $size", 0));
> +     ut_assertok(run_command("setexpr decaddr $decaddr + 0x10000", 0));
> +
> +     ut_assertok(run_command("random $loadaddr $size", 0));
> +     ut_assert_nextline("%d bytes filled with random data", size);
> +     ut_assertok(run_command("random $encaddr $size", 0));
> +     ut_assert_nextline("%d bytes filled with random data", size);
> +     ut_assertok(run_command("random $decaddr $size", 0));
> +     ut_assert_nextline("%d bytes filled with random data", size);
> +
> +     /* Compress data in $loadaddr into $encaddr */
> +     ut_assertok(run_command("zip $loadaddr $size $encaddr", 0));
> +     console_record_readline(uts->actual_str, sizeof(uts->actual_str));
> +     ut_assert(strstr(uts->actual_str, "Compressed size: "));
> +
> +     if (gzwrite) {
> +             unsigned int sectsize = DIV_ROUND_UP(size, 512);
> +             unsigned char *db = map_sysmem(env_get_ulong("loadaddr", 16, 
> 0), size);
> +             u32 crc = crc32(0, db, size);
> +
> +             ut_assertok(run_command("gzwrite mmc 9 $encaddr $filesize", 0));
> +             ut_assert_skip_to_line("\t%u bytes, crc 0x%08x", size, crc);
> +
> +             env_set_hex("sectsize", sectsize);
> +             ut_assertok(run_command("mmc read $decaddr 0 $sectsize", 0));
> +             ut_assert_nextline("MMC read: dev # 9, block # 0, count %u ... 
> %u blocks read: OK",
> +                                sectsize, sectsize);
> +     } else {
> +             /* Decompress data in $encaddr into $decaddr */
> +             ut_assertok(run_command("unzip $encaddr $decaddr $filesize", 
> 0));
> +             ut_assert_nextline("Uncompressed size: %u = 0x%X", size, size);
> +     }
> +
> +     /* Input data and compressed-decompressed data */
> +     ut_assertok(run_command("cmp.b $loadaddr $decaddr $size", 0));
> +     ut_assert_nextline("Total of %u byte(s) were the same", size);
> +
> +     ut_assert_console_end();
> +
> +     return 0;
> +}
> +
> +static int dm_test_cmd_zip_unzip(struct unit_test_state *uts)
> +{
> +     int i, ret;
> +
> +     for (i = 0; i < ARRAY_SIZE(sizes); i++) {
> +             ret = do_test_cmd_zip_unzip(uts, sizes[i], false);
> +             if (ret)
> +                     return ret;
> +     }
> +
> +     return 0;
> +}
> +DM_TEST(dm_test_cmd_zip_unzip, UTF_CONSOLE);
> +
> +static int dm_test_cmd_zip_gzwrite(struct unit_test_state *uts)
> +{
> +     struct blk_desc *mmc_dev_desc;
> +     struct udevice *dev;
> +     ofnode root, node;
> +     int i, ret;
> +
> +     /* Enable the mmc9 node for this test */
> +     root = oftree_root(oftree_default());
> +     node = ofnode_find_subnode(root, "mmc9");
> +     ut_assert(ofnode_valid(node));
> +     ut_assertok(lists_bind_fdt(gd->dm_root, node, &dev, NULL, false));
> +
> +     ut_asserteq(9, blk_get_device_by_str("mmc", "9", &mmc_dev_desc));
> +     ut_assertok(run_commandf("mmc dev 9"));
> +     ut_assert_nextline("switch to partitions #0, OK");
> +     ut_assert_nextline("mmc9 is current device");
> +
> +     for (i = 0; i < ARRAY_SIZE(sizes); i++) {
> +             ret = do_test_cmd_zip_unzip(uts, sizes[i], true);
> +             if (ret)
> +                     return ret;
> +     }
> +
> +     return 0;
> +}
> +DM_TEST(dm_test_cmd_zip_gzwrite, UTF_CONSOLE);
> diff --git a/test/py/tests/test_ut.py b/test/py/tests/test_ut.py
> index 6d535b5206d..b7166d59943 100644
> --- a/test/py/tests/test_ut.py
> +++ b/test/py/tests/test_ut.py
> @@ -522,6 +522,12 @@ def test_ut_dm_init(ubman):
>      with open(fn, 'wb') as fh:
>          fh.write(data)
>  
> +    mmc_dev = 9
> +    fn = os.path.join(ubman.config.source_dir, f'mmc{mmc_dev}.img')
> +    data = b'\x00' * (32 * 1024 * 1024)
> +    with open(fn, 'wb') as fh:
> +        fh.write(data)
> +
>  
>  def setup_efi_image(ubman):
>      """Create a 20MB disk image with an EFI app on it"""
> -- 
> 2.51.0

Reply via email to