1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2a72007d9SSimon Glass /*
3a72007d9SSimon Glass * Copyright (c) 2012, The Chromium Authors
4a72007d9SSimon Glass */
5a72007d9SSimon Glass
6a72007d9SSimon Glass #define DEBUG
7a72007d9SSimon Glass
8a72007d9SSimon Glass #include <common.h>
9a72007d9SSimon Glass
10a72007d9SSimon Glass static const char test_cmd[] = "setenv list 1\n setenv list ${list}2; "
11a72007d9SSimon Glass "setenv list ${list}3\0"
12a72007d9SSimon Glass "setenv list ${list}4";
13a72007d9SSimon Glass
do_ut_cmd(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])14a72007d9SSimon Glass static int do_ut_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
15a72007d9SSimon Glass {
16a72007d9SSimon Glass printf("%s: Testing commands\n", __func__);
1767486728SStephen Warren run_command("env default -f -a", 0);
18a72007d9SSimon Glass
19a72007d9SSimon Glass /* commands separated by \n */
20a72007d9SSimon Glass run_command_list("setenv list 1\n setenv list ${list}1", -1, 0);
2100caae6dSSimon Glass assert(!strcmp("11", env_get("list")));
22a72007d9SSimon Glass
23a72007d9SSimon Glass /* command followed by \n and nothing else */
24a72007d9SSimon Glass run_command_list("setenv list 1${list}\n", -1, 0);
2500caae6dSSimon Glass assert(!strcmp("111", env_get("list")));
26a72007d9SSimon Glass
27a72007d9SSimon Glass /* a command string with \0 in it. Stuff after \0 should be ignored */
28a72007d9SSimon Glass run_command("setenv list", 0);
29a72007d9SSimon Glass run_command_list(test_cmd, sizeof(test_cmd), 0);
3000caae6dSSimon Glass assert(!strcmp("123", env_get("list")));
31a72007d9SSimon Glass
32a72007d9SSimon Glass /*
33a72007d9SSimon Glass * a command list where we limit execution to only the first command
34a72007d9SSimon Glass * using the length parameter.
35a72007d9SSimon Glass */
36a72007d9SSimon Glass run_command_list("setenv list 1\n setenv list ${list}2; "
37a72007d9SSimon Glass "setenv list ${list}3", strlen("setenv list 1"), 0);
3800caae6dSSimon Glass assert(!strcmp("1", env_get("list")));
39a72007d9SSimon Glass
4093ce7561SSimon Glass assert(run_command("false", 0) == 1);
4193ce7561SSimon Glass assert(run_command("echo", 0) == 0);
4293ce7561SSimon Glass assert(run_command_list("false", -1, 0) == 1);
4393ce7561SSimon Glass assert(run_command_list("echo", -1, 0) == 0);
4493ce7561SSimon Glass
45f1f9d4faSMasahiro Yamada #ifdef CONFIG_HUSH_PARSER
4687b6398bSSimon Glass run_command("setenv foo 'setenv black 1\nsetenv adder 2'", 0);
4787b6398bSSimon Glass run_command("run foo", 0);
4800caae6dSSimon Glass assert(env_get("black") != NULL);
4900caae6dSSimon Glass assert(!strcmp("1", env_get("black")));
5000caae6dSSimon Glass assert(env_get("adder") != NULL);
5100caae6dSSimon Glass assert(!strcmp("2", env_get("adder")));
52f2afe701SStephen Warren #endif
53f2afe701SStephen Warren
54484408fbSRabin Vincent assert(run_command("", 0) == 0);
55484408fbSRabin Vincent assert(run_command(" ", 0) == 0);
56484408fbSRabin Vincent
572302b3abSRabin Vincent assert(run_command("'", 0) == 1);
582302b3abSRabin Vincent
59a72007d9SSimon Glass printf("%s: Everything went swimmingly\n", __func__);
60a72007d9SSimon Glass return 0;
61a72007d9SSimon Glass }
62a72007d9SSimon Glass
63a72007d9SSimon Glass U_BOOT_CMD(
64a72007d9SSimon Glass ut_cmd, 5, 1, do_ut_cmd,
65a72007d9SSimon Glass "Very basic test of command parsers",
66a72007d9SSimon Glass ""
67a72007d9SSimon Glass );
68