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

