aboutsummaryrefslogtreecommitdiffstats
path: root/roms/u-boot/test/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'roms/u-boot/test/cmd')
-rw-r--r--roms/u-boot/test/cmd/Makefile12
-rw-r--r--roms/u-boot/test/cmd/addrmap.c38
-rw-r--r--roms/u-boot/test/cmd/mem.c20
-rw-r--r--roms/u-boot/test/cmd/mem_search.c325
-rw-r--r--roms/u-boot/test/cmd/pwm.c47
-rw-r--r--roms/u-boot/test/cmd/setexpr.c398
-rw-r--r--roms/u-boot/test/cmd/test_echo.c61
7 files changed, 901 insertions, 0 deletions
diff --git a/roms/u-boot/test/cmd/Makefile b/roms/u-boot/test/cmd/Makefile
new file mode 100644
index 000000000..2cfe43a6b
--- /dev/null
+++ b/roms/u-boot/test/cmd/Makefile
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (c) 2013 Google, Inc
+
+ifdef CONFIG_HUSH_PARSER
+obj-$(CONFIG_CONSOLE_RECORD) += test_echo.o
+endif
+obj-y += mem.o
+obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o
+obj-$(CONFIG_CMD_MEM_SEARCH) += mem_search.o
+obj-$(CONFIG_CMD_PWM) += pwm.o
+obj-$(CONFIG_CMD_SETEXPR) += setexpr.o
diff --git a/roms/u-boot/test/cmd/addrmap.c b/roms/u-boot/test/cmd/addrmap.c
new file mode 100644
index 000000000..fb744485b
--- /dev/null
+++ b/roms/u-boot/test/cmd/addrmap.c
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Tests for addrmap command
+ *
+ * Copyright (C) 2021, Bin Meng <bmeng.cn@gmail.com>
+ */
+
+#include <common.h>
+#include <console.h>
+#include <test/suites.h>
+#include <test/ut.h>
+
+/* Declare a new addrmap test */
+#define ADDRMAP_TEST(_name, _flags) UNIT_TEST(_name, _flags, addrmap_test)
+
+/* Test 'addrmap' command output */
+static int addrmap_test_basic(struct unit_test_state *uts)
+{
+ ut_assertok(console_record_reset_enable());
+ ut_assertok(run_command("addrmap", 0));
+ ut_assert_nextline(" vaddr paddr size");
+ ut_assert_nextline("================ ================ ================");
+ /* There should be at least one entry */
+ ut_assertok(!ut_check_console_end(uts));
+
+ return 0;
+}
+ADDRMAP_TEST(addrmap_test_basic, UT_TESTF_CONSOLE_REC);
+
+int do_ut_addrmap(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+ struct unit_test *tests = ll_entry_start(struct unit_test,
+ addrmap_test);
+ const int n_ents = ll_entry_count(struct unit_test, addrmap_test);
+
+ return cmd_ut_category("cmd_addrmap", "cmd_addrmap_", tests, n_ents,
+ argc, argv);
+}
diff --git a/roms/u-boot/test/cmd/mem.c b/roms/u-boot/test/cmd/mem.c
new file mode 100644
index 000000000..d76f47cf3
--- /dev/null
+++ b/roms/u-boot/test/cmd/mem.c
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Executes tests for memory-related commands
+ *
+ * Copyright 2020 Google LLC
+ */
+
+#include <common.h>
+#include <command.h>
+#include <test/suites.h>
+#include <test/test.h>
+
+int do_ut_mem(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+ struct unit_test *tests = UNIT_TEST_SUITE_START(mem_test);
+ const int n_ents = UNIT_TEST_SUITE_COUNT(mem_test);
+
+ return cmd_ut_category("cmd_mem", "mem_test_", tests, n_ents, argc,
+ argv);
+}
diff --git a/roms/u-boot/test/cmd/mem_search.c b/roms/u-boot/test/cmd/mem_search.c
new file mode 100644
index 000000000..94942793a
--- /dev/null
+++ b/roms/u-boot/test/cmd/mem_search.c
@@ -0,0 +1,325 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Tests for memory commands
+ *
+ * Copyright 2020 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <console.h>
+#include <mapmem.h>
+#include <dm/test.h>
+#include <test/ut.h>
+
+#define BUF_SIZE 0x100
+
+/* Declare a new mem test */
+#define MEM_TEST(_name, _flags) UNIT_TEST(_name, _flags, mem_test)
+
+/* Test 'ms' command with bytes */
+static int mem_test_ms_b(struct unit_test_state *uts)
+{
+ u8 *buf;
+
+ buf = map_sysmem(0, BUF_SIZE + 1);
+ memset(buf, '\0', BUF_SIZE);
+ buf[0x0] = 0x12;
+ buf[0x31] = 0x12;
+ buf[0xff] = 0x12;
+ buf[0x100] = 0x12;
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.b 1 ff 12", 0);
+ ut_assert_nextline("00000030: 00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................");
+ ut_assert_nextline("--");
+ ut_assert_nextline("000000f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 ................");
+ ut_assert_nextline("2 matches");
+ ut_assert_console_end();
+
+ ut_asserteq(2, env_get_hex("memmatches", 0));
+ ut_asserteq(0xff, env_get_hex("memaddr", 0));
+ ut_asserteq(0xfe, env_get_hex("mempos", 0));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_b, UT_TESTF_CONSOLE_REC);
+
+/* Test 'ms' command with 16-bit values */
+static int mem_test_ms_w(struct unit_test_state *uts)
+{
+ u16 *buf;
+
+ buf = map_sysmem(0, BUF_SIZE + 2);
+ memset(buf, '\0', BUF_SIZE);
+ buf[0x34 / 2] = 0x1234;
+ buf[BUF_SIZE / 2] = 0x1234;
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.w 0 80 1234", 0);
+ ut_assert_nextline("00000030: 0000 0000 1234 0000 0000 0000 0000 0000 ....4...........");
+ ut_assert_nextline("1 match");
+ ut_assert_console_end();
+
+ ut_asserteq(1, env_get_hex("memmatches", 0));
+ ut_asserteq(0x34, env_get_hex("memaddr", 0));
+ ut_asserteq(0x34 / 2, env_get_hex("mempos", 0));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_w, UT_TESTF_CONSOLE_REC);
+
+/* Test 'ms' command with 32-bit values */
+static int mem_test_ms_l(struct unit_test_state *uts)
+{
+ u32 *buf;
+
+ buf = map_sysmem(0, BUF_SIZE + 4);
+ memset(buf, '\0', BUF_SIZE);
+ buf[0x38 / 4] = 0x12345678;
+ buf[BUF_SIZE / 4] = 0x12345678;
+ ut_assertok(console_record_reset_enable());
+ run_command("ms 0 40 12345678", 0);
+ ut_assert_nextline("00000030: 00000000 00000000 12345678 00000000 ........xV4.....");
+ ut_assert_nextline("1 match");
+ ut_assert_console_end();
+
+ ut_asserteq(1, env_get_hex("memmatches", 0));
+ ut_asserteq(0x38, env_get_hex("memaddr", 0));
+ ut_asserteq(0x38 / 4, env_get_hex("mempos", 0));
+
+ ut_assertok(console_record_reset_enable());
+ run_command("ms 0 80 12345679", 0);
+ ut_assert_nextline("0 matches");
+ ut_assert_console_end();
+
+ ut_asserteq(0, env_get_hex("memmatches", 0));
+ ut_asserteq(0, env_get_hex("memaddr", 0));
+ ut_asserteq(0 / 4, env_get_hex("mempos", 0));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_l, UT_TESTF_CONSOLE_REC);
+
+/* Test 'ms' command with continuation */
+static int mem_test_ms_cont(struct unit_test_state *uts)
+{
+ char *const args[] = {"ms.b", "0", "100", "34"};
+ int repeatable;
+ u8 *buf;
+ int i;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\0', BUF_SIZE);
+ for (i = 5; i < 0x33; i += 3)
+ buf[i] = 0x34;
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.b 0 100 34", 0);
+ ut_assert_nextlinen("00000000: 00 00 00 00 00 34 00 00 34 00 00 34 00 00 34 00");
+ ut_assert_nextline("--");
+ ut_assert_nextlinen("00000010: 00 34 00 00 34 00 00 34 00 00 34 00 00 34 00 00");
+ ut_assert_nextline("--");
+ ut_assert_nextlinen("00000020: 34 00 00 34 00 00 34 00 00 34 00 00 34 00 00 34");
+ ut_assert_nextlinen("10 matches (repeat command to check for more)");
+ ut_assert_console_end();
+
+ ut_asserteq(10, env_get_hex("memmatches", 0));
+ ut_asserteq(0x20, env_get_hex("memaddr", 0));
+ ut_asserteq(0x20, env_get_hex("mempos", 0));
+
+ /*
+ * run_command() ignoes the repeatable flag when using hush, so call
+ * cmd_process() directly
+ */
+ ut_assertok(console_record_reset_enable());
+ cmd_process(CMD_FLAG_REPEAT, 4, args, &repeatable, NULL);
+ ut_assert_nextlinen("00000020: 34 00 00 34 00 00 34 00 00 34 00 00 34 00 00 34");
+ ut_assert_nextline("--");
+ ut_assert_nextlinen("00000030: 00 00 34 00 00 00 00 00");
+ ut_assert_nextlinen("6 matches");
+ ut_assert_console_end();
+
+ ut_asserteq(6, env_get_hex("memmatches", 0));
+ ut_asserteq(0x32, env_get_hex("memaddr", 0));
+
+ /* 0x32 less 0x21, where the second search started */
+ ut_asserteq(0x11, env_get_hex("mempos", 0));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_cont, UT_TESTF_CONSOLE_REC);
+
+/* Test that an 'ms' command with continuation stops at the end of the range */
+static int mem_test_ms_cont_end(struct unit_test_state *uts)
+{
+ char *const args[] = {"ms.b", "1", "ff", "12"};
+ int repeatable;
+ u8 *buf;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\0', BUF_SIZE);
+ buf[0x0] = 0x12;
+ buf[0x31] = 0x12;
+ buf[0xff] = 0x12;
+ buf[0x100] = 0x12;
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.b 1 ff 12", 0);
+ ut_assert_nextlinen("00000030");
+ ut_assert_nextlinen("--");
+ ut_assert_nextlinen("000000f0");
+ ut_assert_nextlinen("2 matches");
+ ut_assert_console_end();
+
+ /*
+ * run_command() ignoes the repeatable flag when using hush, so call
+ * cmd_process() directly.
+ *
+ * This should produce no matches.
+ */
+ ut_assertok(console_record_reset_enable());
+ cmd_process(CMD_FLAG_REPEAT, 4, args, &repeatable, NULL);
+ ut_assert_nextlinen("0 matches");
+ ut_assert_console_end();
+
+ /* One more time */
+ ut_assertok(console_record_reset_enable());
+ cmd_process(CMD_FLAG_REPEAT, 4, args, &repeatable, NULL);
+ ut_assert_nextlinen("0 matches");
+ ut_assert_console_end();
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_cont_end, UT_TESTF_CONSOLE_REC);
+
+/* Test 'ms' command with multiple values */
+static int mem_test_ms_mult(struct unit_test_state *uts)
+{
+ static const char str[] = "hello";
+ char *buf;
+
+ buf = map_sysmem(0, BUF_SIZE + 5);
+ memset(buf, '\0', BUF_SIZE);
+ strcpy(buf + 0x1e, str);
+ strcpy(buf + 0x63, str);
+ strcpy(buf + BUF_SIZE - strlen(str) + 1, str);
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.b 0 100 68 65 6c 6c 6f", 0);
+ ut_assert_nextline("00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 65 ..............he");
+ ut_assert_nextline("00000020: 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00 00 00 llo.............");
+ ut_assert_nextline("--");
+ ut_assert_nextline("00000060: 00 00 00 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 ...hello........");
+ ut_assert_nextline("2 matches");
+ ut_assert_console_end();
+ unmap_sysmem(buf);
+
+ ut_asserteq(2, env_get_hex("memmatches", 0));
+ ut_asserteq(0x63, env_get_hex("memaddr", 0));
+ ut_asserteq(0x63, env_get_hex("mempos", 0));
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_mult, UT_TESTF_CONSOLE_REC);
+
+/* Test 'ms' command with string */
+static int mem_test_ms_s(struct unit_test_state *uts)
+{
+ static const char str[] = "hello";
+ static const char str2[] = "hellothere";
+ char *buf;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\0', BUF_SIZE);
+ strcpy(buf + 0x1e, str);
+ strcpy(buf + 0x63, str);
+ strcpy(buf + 0xa1, str2);
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.s 0 100 hello", 0);
+ ut_assert_nextline("00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 65 ..............he");
+ ut_assert_nextline("00000020: 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00 00 00 llo.............");
+ ut_assert_nextline("--");
+ ut_assert_nextline("00000060: 00 00 00 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 ...hello........");
+ ut_assert_nextline("--");
+ ut_assert_nextline("000000a0: 00 68 65 6c 6c 6f 74 68 65 72 65 00 00 00 00 00 .hellothere.....");
+ ut_assert_nextline("3 matches");
+ ut_assert_console_end();
+
+ ut_asserteq(3, env_get_hex("memmatches", 0));
+ ut_asserteq(0xa1, env_get_hex("memaddr", 0));
+ ut_asserteq(0xa1, env_get_hex("mempos", 0));
+
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.s 0 100 hello there", 0);
+ ut_assert_nextline("000000a0: 00 68 65 6c 6c 6f 74 68 65 72 65 00 00 00 00 00 .hellothere.....");
+ ut_assert_nextline("1 match");
+ ut_assert_console_end();
+
+ ut_asserteq(1, env_get_hex("memmatches", 0));
+ ut_asserteq(0xa1, env_get_hex("memaddr", 0));
+ ut_asserteq(0xa1, env_get_hex("mempos", 0));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_s, UT_TESTF_CONSOLE_REC);
+
+/* Test 'ms' command with limit */
+static int mem_test_ms_limit(struct unit_test_state *uts)
+{
+ u8 *buf;
+
+ buf = map_sysmem(0, BUF_SIZE + 1);
+ memset(buf, '\0', BUF_SIZE);
+ buf[0x0] = 0x12;
+ buf[0x31] = 0x12;
+ buf[0x62] = 0x12;
+ buf[0x76] = 0x12;
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.b -l2 1 ff 12", 0);
+ ut_assert_nextline("00000030: 00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................");
+ ut_assert_nextline("--");
+ ut_assert_nextlinen("00000060: 00 00 12 00 00 00 00 00 00 00 00 00 00 00 00 00");
+ ut_assert_nextline("2 matches (repeat command to check for more)");
+ ut_assert_console_end();
+
+ ut_asserteq(2, env_get_hex("memmatches", 0));
+ ut_asserteq(0x62, env_get_hex("memaddr", 0));
+ ut_asserteq(0x61, env_get_hex("mempos", 0));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_limit, UT_TESTF_CONSOLE_REC);
+
+/* Test 'ms' command in quiet mode */
+static int mem_test_ms_quiet(struct unit_test_state *uts)
+{
+ u8 *buf;
+
+ buf = map_sysmem(0, BUF_SIZE + 1);
+ memset(buf, '\0', BUF_SIZE);
+ buf[0x0] = 0x12;
+ buf[0x31] = 0x12;
+ buf[0x62] = 0x12;
+ buf[0x76] = 0x12;
+ ut_assertok(console_record_reset_enable());
+ run_command("ms.b -q -l2 1 ff 12", 0);
+ ut_assert_console_end();
+ unmap_sysmem(buf);
+
+ ut_asserteq(2, env_get_hex("memmatches", 0));
+ ut_asserteq(0x62, env_get_hex("memaddr", 0));
+ ut_asserteq(0x61, env_get_hex("mempos", 0));
+
+ return 0;
+}
+MEM_TEST(mem_test_ms_quiet, UT_TESTF_CONSOLE_REC);
diff --git a/roms/u-boot/test/cmd/pwm.c b/roms/u-boot/test/cmd/pwm.c
new file mode 100644
index 000000000..5343af83f
--- /dev/null
+++ b/roms/u-boot/test/cmd/pwm.c
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Test for pwm command
+ *
+ * Copyright 2020 SiFive, Inc
+ *
+ * Authors:
+ * Pragnesh Patel <pragnesh.patel@sifive.com>
+ */
+
+#include <dm.h>
+#include <dm/test.h>
+#include <test/test.h>
+#include <test/ut.h>
+
+/* Basic test of 'pwm' command */
+static int dm_test_pwm_cmd(struct unit_test_state *uts)
+{
+ struct udevice *dev;
+
+ ut_assertok(uclass_get_device(UCLASS_PWM, 0, &dev));
+ ut_assertnonnull(dev);
+
+ ut_assertok(console_record_reset_enable());
+
+ /* pwm <invert> <pwm_dev_num> <channel> <polarity> */
+ ut_assertok(run_command("pwm invert 0 0 1", 0));
+ ut_assert_console_end();
+
+ ut_assertok(run_command("pwm invert 0 0 0", 0));
+ ut_assert_console_end();
+
+ /* pwm <config> <pwm_dev_num> <channel> <period_ns> <duty_ns> */
+ ut_assertok(run_command("pwm config 0 0 10 50", 0));
+ ut_assert_console_end();
+
+ /* pwm <enable/disable> <pwm_dev_num> <channel> */
+ ut_assertok(run_command("pwm enable 0 0", 0));
+ ut_assert_console_end();
+
+ ut_assertok(run_command("pwm disable 0 0", 0));
+ ut_assert_console_end();
+
+ return 0;
+}
+
+DM_TEST(dm_test_pwm_cmd, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT | UT_TESTF_CONSOLE_REC);
diff --git a/roms/u-boot/test/cmd/setexpr.c b/roms/u-boot/test/cmd/setexpr.c
new file mode 100644
index 000000000..c537e8935
--- /dev/null
+++ b/roms/u-boot/test/cmd/setexpr.c
@@ -0,0 +1,398 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Tests for setexpr command
+ *
+ * Copyright 2020 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <console.h>
+#include <mapmem.h>
+#include <dm/test.h>
+#include <test/suites.h>
+#include <test/ut.h>
+
+#define BUF_SIZE 0x100
+
+/* Declare a new setexpr test */
+#define SETEXPR_TEST(_name, _flags) UNIT_TEST(_name, _flags, setexpr_test)
+
+/* Test 'setexpr' command with simply setting integers */
+static int setexpr_test_int(struct unit_test_state *uts)
+{
+ u8 *buf;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\xff', BUF_SIZE);
+
+ /* byte */
+ buf[0x0] = 0x12;
+ ut_assertok(run_command("setexpr.b fred 0", 0));
+ ut_asserteq_str("0", env_get("fred"));
+ ut_assertok(run_command("setexpr.b fred *0", 0));
+ ut_asserteq_str("12", env_get("fred"));
+
+ /* 16-bit */
+ *(short *)buf = 0x2345;
+ ut_assertok(run_command("setexpr.w fred 0", 0));
+ ut_asserteq_str("0", env_get("fred"));
+ ut_assertok(run_command("setexpr.w fred *0", 0));
+ ut_asserteq_str("2345", env_get("fred"));
+
+ /* 32-bit */
+ *(u32 *)buf = 0x3456789a;
+ ut_assertok(run_command("setexpr.l fred 0", 0));
+ ut_asserteq_str("0", env_get("fred"));
+ ut_assertok(run_command("setexpr.l fred *0", 0));
+ ut_asserteq_str("3456789a", env_get("fred"));
+
+ /* 64-bit */
+ *(u64 *)buf = 0x456789abcdef0123;
+ ut_assertok(run_command("setexpr.q fred 0", 0));
+ ut_asserteq_str("0", env_get("fred"));
+ ut_assertok(run_command("setexpr.q fred *0", 0));
+ ut_asserteq_str("456789abcdef0123", env_get("fred"));
+
+ /* default */
+ ut_assertok(run_command("setexpr fred 0", 0));
+ ut_asserteq_str("0", env_get("fred"));
+ ut_assertok(run_command("setexpr fred *0", 0));
+ ut_asserteq_str("cdef0123", env_get("fred"));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_int, UT_TESTF_CONSOLE_REC);
+
+/* Test 'setexpr' command with + operator */
+static int setexpr_test_plus(struct unit_test_state *uts)
+{
+ char *buf;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\xff', BUF_SIZE);
+
+ /* byte */
+ buf[0x0] = 0x12;
+ buf[0x10] = 0x34;
+ ut_assertok(run_command("setexpr.b fred *0 + *10", 0));
+ ut_asserteq_str("46", env_get("fred"));
+
+ /* 16-bit */
+ *(short *)buf = 0x2345;
+ *(short *)(buf + 0x10) = 0xf012;
+ ut_assertok(run_command("setexpr.w fred *0 + *10", 0));
+ ut_asserteq_str("11357", env_get("fred"));
+
+ /* 32-bit */
+ *(u32 *)buf = 0x3456789a;
+ *(u32 *)(buf + 0x10) = 0xc3384235;
+ ut_assertok(run_command("setexpr.l fred *0 + *10", 0));
+ ut_asserteq_str("f78ebacf", env_get("fred"));
+
+ /* 64-bit */
+ *(u64 *)buf = 0x456789abcdef0123;
+ *(u64 *)(buf + 0x10) = 0x4987328372849283;
+ ut_assertok(run_command("setexpr.q fred *0 + *10", 0));
+ ut_asserteq_str("8eeebc2f407393a6", env_get("fred"));
+
+ /* default */
+ ut_assertok(run_command("setexpr fred *0 + *10", 0));
+ ut_asserteq_str("1407393a6", env_get("fred"));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_plus, UT_TESTF_CONSOLE_REC);
+
+/* Test 'setexpr' command with other operators */
+static int setexpr_test_oper(struct unit_test_state *uts)
+{
+ char *buf;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\xff', BUF_SIZE);
+
+ *(u32 *)buf = 0x1234;
+ *(u32 *)(buf + 0x10) = 0x560000;
+
+ /* Quote | to avoid confusing hush */
+ ut_assertok(run_command("setexpr fred *0 \"|\" *10", 0));
+ ut_asserteq_str("561234", env_get("fred"));
+
+ *(u32 *)buf = 0x561200;
+ *(u32 *)(buf + 0x10) = 0x1234;
+
+ /* Quote & to avoid confusing hush */
+ ut_assertok(run_command("setexpr.l fred *0 \"&\" *10", 0));
+ ut_asserteq_str("1200", env_get("fred"));
+
+ ut_assertok(run_command("setexpr.l fred *0 ^ *10", 0));
+ ut_asserteq_str("560034", env_get("fred"));
+
+ ut_assertok(run_command("setexpr.l fred *0 - *10", 0));
+ ut_asserteq_str("55ffcc", env_get("fred"));
+
+ ut_assertok(run_command("setexpr.l fred *0 * *10", 0));
+ ut_asserteq_str("61ebfa800", env_get("fred"));
+
+ ut_assertok(run_command("setexpr.l fred *0 / *10", 0));
+ ut_asserteq_str("4ba", env_get("fred"));
+
+ ut_assertok(run_command("setexpr.l fred *0 % *10", 0));
+ ut_asserteq_str("838", env_get("fred"));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_oper, UT_TESTF_CONSOLE_REC);
+
+/* Test 'setexpr' command with regex */
+static int setexpr_test_regex(struct unit_test_state *uts)
+{
+ char *buf, *val;
+
+ buf = map_sysmem(0, BUF_SIZE);
+
+ /* Single substitution */
+ ut_assertok(run_command("setenv fred 'this is a test'", 0));
+ ut_assertok(run_command("setexpr fred sub is us", 0));
+ val = env_get("fred");
+ ut_asserteq_str("thus is a test", val);
+
+ /* Global substitution */
+ ut_assertok(run_command("setenv fred 'this is a test'", 0));
+ ut_assertok(run_command("setexpr fred gsub is us", 0));
+ val = env_get("fred");
+ ut_asserteq_str("thus us a test", val);
+
+ /* Global substitution */
+ ut_assertok(run_command("setenv fred 'this is a test'", 0));
+ ut_assertok(run_command("setenv mary 'this is a test'", 0));
+ ut_assertok(run_command("setexpr fred gsub is us \"${mary}\"", 0));
+ val = env_get("fred");
+ ut_asserteq_str("thus us a test", val);
+ val = env_get("mary");
+ ut_asserteq_str("this is a test", val);
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_regex, UT_TESTF_CONSOLE_REC);
+
+/* Test 'setexpr' command with regex replacement that expands the string */
+static int setexpr_test_regex_inc(struct unit_test_state *uts)
+{
+ char *buf, *val;
+
+ buf = map_sysmem(0, BUF_SIZE);
+
+ ut_assertok(run_command("setenv fred 'this is a test'", 0));
+ ut_assertok(run_command("setexpr fred gsub is much_longer_string", 0));
+ val = env_get("fred");
+ ut_asserteq_str("thmuch_longer_string much_longer_string a test", val);
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_regex_inc, UT_TESTF_CONSOLE_REC);
+
+/* Test setexpr_regex_sub() directly to check buffer usage */
+static int setexpr_test_sub(struct unit_test_state *uts)
+{
+ char *buf, *nbuf;
+ int i;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ nbuf = map_sysmem(0x1000, BUF_SIZE);
+
+ /* Add a pattern so we can check the buffer limits */
+ memset(buf, '\xff', BUF_SIZE);
+ memset(nbuf, '\xff', BUF_SIZE);
+ for (i = BUF_SIZE; i < 0x1000; i++) {
+ buf[i] = i & 0xff;
+ nbuf[i] = i & 0xff;
+ }
+ strcpy(buf, "this is a test");
+
+ /*
+ * This is a regression test, since a bug was found in the use of
+ * memmove() in setexpr
+ */
+ ut_assertok(setexpr_regex_sub(buf, BUF_SIZE, nbuf, BUF_SIZE, "is",
+ "us it is longer", true));
+ ut_asserteq_str("thus it is longer us it is longer a test", buf);
+ for (i = BUF_SIZE; i < 0x1000; i++) {
+ ut_assertf(buf[i] == (char)i,
+ "buf byte at %x should be %02x, got %02x)\n",
+ i, i & 0xff, (u8)buf[i]);
+ ut_assertf(nbuf[i] == (char)i,
+ "nbuf byte at %x should be %02x, got %02x)\n",
+ i, i & 0xff, (u8)nbuf[i]);
+ }
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_sub, UT_TESTF_CONSOLE_REC);
+
+/* Test setexpr_regex_sub() with back references */
+static int setexpr_test_backref(struct unit_test_state *uts)
+{
+ char *buf, *nbuf;
+ int i;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ nbuf = map_sysmem(0x1000, BUF_SIZE);
+
+ /* Add a pattern so we can check the buffer limits */
+ memset(buf, '\xff', BUF_SIZE);
+ memset(nbuf, '\xff', BUF_SIZE);
+ for (i = BUF_SIZE; i < 0x1000; i++) {
+ buf[i] = i & 0xff;
+ nbuf[i] = i & 0xff;
+ }
+ strcpy(buf, "this is surely a test is it? yes this is indeed a test");
+
+ /*
+ * This is a regression test, since a bug was found in the use of
+ * memmove() in setexpr
+ */
+ ut_assertok(setexpr_regex_sub(buf, BUF_SIZE, nbuf, BUF_SIZE,
+ "(this) (is) (surely|indeed)",
+ "us \\1 \\2 \\3!", true));
+ ut_asserteq_str("us this is surely! a test is it? yes us this is indeed! a test",
+ buf);
+
+ /* The following checks fail at present due to a bug in setexpr */
+ return 0;
+ for (i = BUF_SIZE; i < 0x1000; i++) {
+ ut_assertf(buf[i] == (char)i,
+ "buf byte at %x should be %02x, got %02x)\n",
+ i, i & 0xff, (u8)buf[i]);
+ ut_assertf(nbuf[i] == (char)i,
+ "nbuf byte at %x should be %02x, got %02x)\n",
+ i, i & 0xff, (u8)nbuf[i]);
+ }
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_backref, UT_TESTF_CONSOLE_REC);
+
+/* Test 'setexpr' command with setting strings */
+static int setexpr_test_str(struct unit_test_state *uts)
+{
+ ulong start_mem;
+ char *buf;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\xff', BUF_SIZE);
+
+ /*
+ * Set 'fred' to the same length as we expect to get below, to avoid a
+ * new allocation in 'setexpr'. That way we can check for memory leaks.
+ */
+ ut_assertok(env_set("fred", "x"));
+ start_mem = ut_check_free();
+ strcpy(buf, "hello");
+ ut_asserteq(1, run_command("setexpr.s fred 0", 0));
+ ut_assertok(ut_check_delta(start_mem));
+
+ ut_assertok(env_set("fred", "12345"));
+ start_mem = ut_check_free();
+ ut_assertok(run_command("setexpr.s fred *0", 0));
+ ut_asserteq_str("hello", env_get("fred"));
+ ut_assertok(ut_check_delta(start_mem));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_str, UT_TESTF_CONSOLE_REC);
+
+
+/* Test 'setexpr' command with concatenating strings */
+static int setexpr_test_str_oper(struct unit_test_state *uts)
+{
+ ulong start_mem;
+ char *buf;
+
+ buf = map_sysmem(0, BUF_SIZE);
+ memset(buf, '\xff', BUF_SIZE);
+ strcpy(buf, "hello");
+ strcpy(buf + 0x10, " there");
+
+ ut_assertok(console_record_reset_enable());
+ start_mem = ut_check_free();
+ ut_asserteq(1, run_command("setexpr.s fred *0 * *10", 0));
+ ut_assertok(ut_check_delta(start_mem));
+ ut_assert_nextline("invalid op");
+ ut_assert_console_end();
+
+ /*
+ * Set 'fred' to the same length as we expect to get below, to avoid a
+ * new allocation in 'setexpr'. That way we can check for memory leaks.
+ */
+ ut_assertok(env_set("fred", "12345012345"));
+ start_mem = ut_check_free();
+ ut_assertok(run_command("setexpr.s fred *0 + *10", 0));
+ ut_asserteq_str("hello there", env_get("fred"));
+
+ /*
+ * This check does not work with sandbox_flattree, apparently due to
+ * memory allocations in env_set().
+ *
+ * The truetype console produces lots of memory allocations even though
+ * the LCD display is not visible. But even without these, it does not
+ * work.
+ *
+ * A better test would be for dlmalloc to record the allocs and frees
+ * for a particular caller, but that is not supported.
+ *
+ * For now, drop this test.
+ *
+ * ut_assertok(ut_check_delta(start_mem));
+ */
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_str_oper, UT_TESTF_CONSOLE_REC);
+
+/* Test 'setexpr' command with a string that is too long */
+static int setexpr_test_str_long(struct unit_test_state *uts)
+{
+ const int size = 128 << 10; /* setexpr strings are a max of 64KB */
+ char *buf, *val;
+
+ buf = map_sysmem(0, size);
+ memset(buf, 'a', size);
+
+ /* String should be truncated to 64KB */
+ ut_assertok(run_command("setexpr.s fred *0", 0));
+ val = env_get("fred");
+ ut_asserteq(64 << 10, strlen(val));
+
+ unmap_sysmem(buf);
+
+ return 0;
+}
+SETEXPR_TEST(setexpr_test_str_long, UT_TESTF_CONSOLE_REC);
+
+int do_ut_setexpr(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+ struct unit_test *tests = UNIT_TEST_SUITE_START(setexpr_test);
+ const int n_ents = UNIT_TEST_SUITE_COUNT(setexpr_test);
+
+ return cmd_ut_category("cmd_setexpr", "setexpr_test_", tests, n_ents,
+ argc, argv);
+}
diff --git a/roms/u-boot/test/cmd/test_echo.c b/roms/u-boot/test/cmd/test_echo.c
new file mode 100644
index 000000000..091e4f823
--- /dev/null
+++ b/roms/u-boot/test/cmd/test_echo.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Tests for echo command
+ *
+ * Copyright 2020, Heinrich Schuchadt <xypron.glpk@gmx.de>
+ */
+
+#include <common.h>
+#include <command.h>
+#include <asm/global_data.h>
+#include <display_options.h>
+#include <test/lib.h>
+#include <test/test.h>
+#include <test/ut.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct test_data {
+ char *cmd;
+ char *expected;
+};
+
+static struct test_data echo_data[] = {
+ {"echo 1 2 3",
+ "1 2 3"},
+ /* Test new line handling */
+ {"echo -n 1 2 3; echo a b c",
+ "1 2 3a b c"},
+ /*
+ * Test handling of environment variables.
+ *
+ * j, q, x are among the least frequent letters in English.
+ * Hence no collision for the variable name jQx is expected.
+ */
+ {"setenv jQx X; echo \"a)\" ${jQx} 'b)' '${jQx}' c) ${jQx}; setenv jQx",
+ "a) X b) ${jQx} c) X"},
+ /* Test shell variable assignments without substitutions */
+ {"foo=bar echo baz", "baz"},
+ /* Test handling of shell variables. */
+ {"setenv jQx; for jQx in 1 2 3; do echo -n \"${jQx}, \"; done; echo;",
+ "1, 2, 3, "},
+};
+
+static int lib_test_hush_echo(struct unit_test_state *uts)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(echo_data); ++i) {
+ ut_silence_console(uts);
+ console_record_reset_enable();
+ ut_assertok(run_command(echo_data[i].cmd, 0));
+ ut_unsilence_console(uts);
+ console_record_readline(uts->actual_str,
+ sizeof(uts->actual_str));
+ ut_asserteq_str(echo_data[i].expected, uts->actual_str);
+ ut_assertok(ut_check_console_end(uts));
+ }
+ return 0;
+}
+
+LIB_TEST(lib_test_hush_echo, 0);