]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
a72007d9 SG |
2 | /* |
3 | * Copyright (c) 2012, The Chromium Authors | |
a72007d9 SG |
4 | */ |
5 | ||
6 | #define DEBUG | |
7 | ||
288b29e4 | 8 | #include <command.h> |
09140113 | 9 | #include <env.h> |
f7ae49fc | 10 | #include <log.h> |
dd1f34a9 EB |
11 | #include <string.h> |
12 | #include <linux/errno.h> | |
a72007d9 SG |
13 | |
14 | static const char test_cmd[] = "setenv list 1\n setenv list ${list}2; " | |
15 | "setenv list ${list}3\0" | |
16 | "setenv list ${list}4"; | |
17 | ||
09140113 SG |
18 | static int do_ut_cmd(struct cmd_tbl *cmdtp, int flag, int argc, |
19 | char *const argv[]) | |
a72007d9 | 20 | { |
dd1f34a9 EB |
21 | char long_str[CONFIG_SYS_CBSIZE + 42]; |
22 | ||
a72007d9 | 23 | printf("%s: Testing commands\n", __func__); |
67486728 | 24 | run_command("env default -f -a", 0); |
a72007d9 | 25 | |
a72007d9 SG |
26 | /* commands separated by \n */ |
27 | run_command_list("setenv list 1\n setenv list ${list}1", -1, 0); | |
00caae6d | 28 | assert(!strcmp("11", env_get("list"))); |
a72007d9 SG |
29 | |
30 | /* command followed by \n and nothing else */ | |
31 | run_command_list("setenv list 1${list}\n", -1, 0); | |
00caae6d | 32 | assert(!strcmp("111", env_get("list"))); |
a72007d9 | 33 | |
a72007d9 SG |
34 | /* a command string with \0 in it. Stuff after \0 should be ignored */ |
35 | run_command("setenv list", 0); | |
36 | run_command_list(test_cmd, sizeof(test_cmd), 0); | |
00caae6d | 37 | assert(!strcmp("123", env_get("list"))); |
a72007d9 SG |
38 | |
39 | /* | |
40 | * a command list where we limit execution to only the first command | |
41 | * using the length parameter. | |
42 | */ | |
43 | run_command_list("setenv list 1\n setenv list ${list}2; " | |
44 | "setenv list ${list}3", strlen("setenv list 1"), 0); | |
00caae6d | 45 | assert(!strcmp("1", env_get("list"))); |
a72007d9 | 46 | |
93ce7561 SG |
47 | assert(run_command("false", 0) == 1); |
48 | assert(run_command("echo", 0) == 0); | |
49 | assert(run_command_list("false", -1, 0) == 1); | |
50 | assert(run_command_list("echo", -1, 0) == 0); | |
51 | ||
f1f9d4fa | 52 | #ifdef CONFIG_HUSH_PARSER |
87b6398b SG |
53 | run_command("setenv foo 'setenv black 1\nsetenv adder 2'", 0); |
54 | run_command("run foo", 0); | |
00caae6d SG |
55 | assert(env_get("black") != NULL); |
56 | assert(!strcmp("1", env_get("black"))); | |
57 | assert(env_get("adder") != NULL); | |
58 | assert(!strcmp("2", env_get("adder"))); | |
f2afe701 SW |
59 | #endif |
60 | ||
484408fb RV |
61 | assert(run_command("", 0) == 0); |
62 | assert(run_command(" ", 0) == 0); | |
63 | ||
2302b3ab RV |
64 | assert(run_command("'", 0) == 1); |
65 | ||
dd1f34a9 EB |
66 | /* Variadic function test-cases */ |
67 | #pragma GCC diagnostic push | |
68 | #pragma GCC diagnostic ignored "-Wformat-zero-length" | |
69 | assert(run_commandf("") == 0); | |
70 | #pragma GCC diagnostic pop | |
71 | assert(run_commandf(" ") == 0); | |
72 | assert(run_commandf("'") == 1); | |
73 | ||
74 | assert(run_commandf("env %s %s", "delete -f", "list") == 0); | |
75 | /* Expected: "Error: "list" not defined" */ | |
76 | assert(run_commandf("printenv list") == 1); | |
77 | ||
78 | memset(long_str, 'x', sizeof(long_str)); | |
79 | assert(run_commandf("Truncation case: %s", long_str) == -ENOSPC); | |
80 | ||
81 | if (IS_ENABLED(CONFIG_HUSH_PARSER)) { | |
82 | assert(run_commandf("env %s %s %s %s", "delete -f", "adder", | |
83 | "black", "foo") == 0); | |
84 | assert(run_commandf("setenv foo 'setenv %s 1\nsetenv %s 2'", | |
85 | "black", "adder") == 0); | |
86 | run_command("run foo", 0); | |
87 | assert(env_get("black")); | |
88 | assert(!strcmp("1", env_get("black"))); | |
89 | assert(env_get("adder")); | |
90 | assert(!strcmp("2", env_get("adder"))); | |
91 | } | |
92 | ||
93 | /* Clean up before exit */ | |
94 | run_command("env default -f -a", 0); | |
95 | ||
a72007d9 SG |
96 | printf("%s: Everything went swimmingly\n", __func__); |
97 | return 0; | |
98 | } | |
99 | ||
100 | U_BOOT_CMD( | |
101 | ut_cmd, 5, 1, do_ut_cmd, | |
102 | "Very basic test of command parsers", | |
103 | "" | |
104 | ); |