diff options
| author | Tom Rini <[email protected]> | 2026-02-18 14:58:36 -0600 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-02-18 15:02:58 -0600 |
| commit | 7dca54ef4c44c82bdc6716ac6cdc84c22c66e9ed (patch) | |
| tree | 685fc391514228cc2708383020090c2874899bf3 /test/cmd | |
| parent | 73823d1c581617a9adbecae1f4aa06c313e0a2f6 (diff) | |
| parent | 6be3db6c1ab33c7ad90a8b25d7777e8425bf15cf (diff) | |
Merge patch series "test: cmd: Add test for zip/unzip/gzwrite commands"
Marek Vasut <[email protected]> says:
Enable zip command in sandbox so it is always build tested.
Add simple test for zip/unzip/gzwrite commands so they are
unit tested.
Link: https://lore.kernel.org/r/[email protected]
Diffstat (limited to 'test/cmd')
| -rw-r--r-- | test/cmd/Makefile | 3 | ||||
| -rw-r--r-- | test/cmd/unzip.c | 124 |
2 files changed, 127 insertions, 0 deletions
diff --git a/test/cmd/Makefile b/test/cmd/Makefile index 2476068aee6..8c9f112782d 100644 --- a/test/cmd/Makefile +++ b/test/cmd/Makefile @@ -45,3 +45,6 @@ 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..b67c5ba1956 --- /dev/null +++ b/test/cmd/unzip.c @@ -0,0 +1,124 @@ +// 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> + +/* sys/random.h is not accessible */ +extern ssize_t getrandom(void *buf, size_t size, unsigned int flags); + +static const ssize_t 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, ssize_t size, + const bool gzwrite) +{ + unsigned long loadaddr = env_get_ulong("loadaddr", 16, 0); + unsigned long encaddr = loadaddr + size + 0x10000; + unsigned long decaddr = encaddr + size + 0x10000; + unsigned char *loadmap = map_sysmem(loadaddr, size); + unsigned char *decmap = map_sysmem(decaddr, size); + unsigned char *encmap = map_sysmem(encaddr, 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_assert(getrandom(loadmap, size, 0) == size); + ut_assert(getrandom(decmap, size, 0) == size); + ut_assert(getrandom(encmap, size, 0) == size); + + /* Compress data in $loadaddr into $encaddr */ + ut_assertok(run_commandf("zip $loadaddr %zx %zx", size, encaddr)); + 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); + u32 crc = crc32(0, loadmap, size); + struct blk_desc *mmc_dev_desc; + + ut_assertok(run_commandf("gzwrite mmc 9 %zx $filesize", encaddr)); + ut_assert_skip_to_line("\t%zu bytes, crc 0x%08x", size, crc); + + 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"); + + ut_assertok(run_commandf("mmc read %zx 0 %x", decaddr, sectsize)); + 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_commandf("unzip %zx %zx $filesize", encaddr, decaddr)); + ut_assert_nextline("Uncompressed size: %zu = 0x%zX", size, size); + } + + /* Input data and compressed-decompressed data */ + ut_asserteq_mem(loadmap, decmap, size); + + ut_assert_console_end(); + + unmap_sysmem(loadmap); + unmap_sysmem(decmap); + unmap_sysmem(encmap); + + 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 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)); + + 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); |
