test: cmd: exit: Add unit test for exit and partly run commands
Add a test which validates that exit from environment script works as expected, including return value propagation and clipping to positive integers. Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Marek Vasut <marex@denx.de>
This commit is contained in:
		
							parent
							
								
									721307eba0
								
							
						
					
					
						commit
						f08dcd9fd0
					
				|  | @ -38,6 +38,7 @@ int do_ut_compression(struct cmd_tbl *cmdtp, int flag, int argc, | ||||||
| 		      char *const argv[]); | 		      char *const argv[]); | ||||||
| int do_ut_dm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | int do_ut_dm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | ||||||
| int do_ut_env(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | int do_ut_env(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | ||||||
|  | int do_ut_exit(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | ||||||
| int do_ut_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | int do_ut_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | ||||||
| int do_ut_font(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | int do_ut_font(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | ||||||
| int do_ut_lib(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | int do_ut_lib(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ endif | ||||||
| ifdef CONFIG_CONSOLE_RECORD | ifdef CONFIG_CONSOLE_RECORD | ||||||
| obj-$(CONFIG_CMD_PAUSE) += test_pause.o | obj-$(CONFIG_CMD_PAUSE) += test_pause.o | ||||||
| endif | endif | ||||||
| obj-y += mem.o | obj-y += exit.o mem.o | ||||||
| obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o | obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o | ||||||
| obj-$(CONFIG_CMD_FDT) += fdt.o | obj-$(CONFIG_CMD_FDT) += fdt.o | ||||||
| obj-$(CONFIG_CONSOLE_TRUETYPE) += font.o | obj-$(CONFIG_CONSOLE_TRUETYPE) += font.o | ||||||
|  |  | ||||||
|  | @ -0,0 +1,135 @@ | ||||||
|  | // SPDX-License-Identifier: GPL-2.0+
 | ||||||
|  | /*
 | ||||||
|  |  * Tests for exit command | ||||||
|  |  * | ||||||
|  |  * Copyright 2022 Marek Vasut <marex@denx.de> | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <console.h> | ||||||
|  | #include <mapmem.h> | ||||||
|  | #include <asm/global_data.h> | ||||||
|  | #include <test/suites.h> | ||||||
|  | #include <test/ut.h> | ||||||
|  | 
 | ||||||
|  | DECLARE_GLOBAL_DATA_PTR; | ||||||
|  | 
 | ||||||
|  | /* Declare a new exit test */ | ||||||
|  | #define EXIT_TEST(_name, _flags)	UNIT_TEST(_name, _flags, exit_test) | ||||||
|  | 
 | ||||||
|  | /* Test 'exit addr' getting/setting address */ | ||||||
|  | static int cmd_exit_test(struct unit_test_state *uts) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	 * Test 'exit' with parameter -3, -2, -1, 0, 1, 2, 3 . Use all those | ||||||
|  | 	 * parameters to cover also the special return value -2 that is used | ||||||
|  | 	 * in HUSH to detect exit command. | ||||||
|  | 	 * | ||||||
|  | 	 * Always test whether 'exit' command: | ||||||
|  | 	 * - exits out of the 'run' command | ||||||
|  | 	 * - return value is propagated out of the 'run' command | ||||||
|  | 	 * - return value can be tested on outside of 'run' command | ||||||
|  | 	 * - return value can be printed outside of 'run' command | ||||||
|  | 	 */ | ||||||
|  | 	for (i = -3; i <= 3; i++) { | ||||||
|  | 		ut_assertok(console_record_reset_enable()); | ||||||
|  | 		ut_assertok(run_commandf("setenv foo 'echo bar ; exit %d ; echo baz' ; run foo ; echo $?", i)); | ||||||
|  | 		ut_assert_nextline("bar"); | ||||||
|  | 		ut_assert_nextline("%d", i > 0 ? i : 0); | ||||||
|  | 		ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 		ut_assertok(console_record_reset_enable()); | ||||||
|  | 		ut_assertok(run_commandf("setenv foo 'echo bar ; exit %d ; echo baz' ; run foo && echo quux ; echo $?", i)); | ||||||
|  | 		ut_assert_nextline("bar"); | ||||||
|  | 		if (i <= 0) | ||||||
|  | 			ut_assert_nextline("quux"); | ||||||
|  | 		ut_assert_nextline("%d", i > 0 ? i : 0); | ||||||
|  | 		ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 		ut_assertok(console_record_reset_enable()); | ||||||
|  | 		ut_assertok(run_commandf("setenv foo 'echo bar ; exit %d ; echo baz' ; run foo || echo quux ; echo $?", i)); | ||||||
|  | 		ut_assert_nextline("bar"); | ||||||
|  | 		if (i > 0) | ||||||
|  | 			ut_assert_nextline("quux"); | ||||||
|  | 		/* Either 'exit' returns 0, or 'echo quux' returns 0 */ | ||||||
|  | 		ut_assert_nextline("0"); | ||||||
|  | 		ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Validate that 'exit' behaves the same way as 'exit 0' */ | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; exit ; echo baz' ; run foo ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	ut_assert_nextline("0"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; exit ; echo baz' ; run foo && echo quux ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	ut_assert_nextline("quux"); | ||||||
|  | 	ut_assert_nextline("0"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; exit ; echo baz' ; run foo || echo quux ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	/* Either 'exit' returns 0, or 'echo quux' returns 0 */ | ||||||
|  | 	ut_assert_nextline("0"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	/* Validate that return value still propagates from 'run' command */ | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; true' ; run foo ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	ut_assert_nextline("0"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; true' ; run foo && echo quux ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	ut_assert_nextline("quux"); | ||||||
|  | 	ut_assert_nextline("0"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; true' ; run foo || echo quux ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	/* The 'true' returns 0 */ | ||||||
|  | 	ut_assert_nextline("0"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; false' ; run foo ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	ut_assert_nextline("1"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; false' ; run foo && echo quux ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	ut_assert_nextline("1"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(console_record_reset_enable()); | ||||||
|  | 	ut_assertok(run_commandf("setenv foo 'echo bar ; false' ; run foo || echo quux ; echo $?", i)); | ||||||
|  | 	ut_assert_nextline("bar"); | ||||||
|  | 	ut_assert_nextline("quux"); | ||||||
|  | 	/* The 'echo quux' returns 0 */ | ||||||
|  | 	ut_assert_nextline("0"); | ||||||
|  | 	ut_assertok(ut_check_console_end(uts)); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | EXIT_TEST(cmd_exit_test, UT_TESTF_CONSOLE_REC); | ||||||
|  | 
 | ||||||
|  | int do_ut_exit(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) | ||||||
|  | { | ||||||
|  | 	struct unit_test *tests = UNIT_TEST_SUITE_START(exit_test); | ||||||
|  | 	const int n_ents = UNIT_TEST_SUITE_COUNT(exit_test); | ||||||
|  | 
 | ||||||
|  | 	return cmd_ut_category("cmd_exit", "exit_test_", tests, n_ents, | ||||||
|  | 			       argc, argv); | ||||||
|  | } | ||||||
|  | @ -65,6 +65,7 @@ static struct cmd_tbl cmd_ut_sub[] = { | ||||||
| #if defined(CONFIG_UT_ENV) | #if defined(CONFIG_UT_ENV) | ||||||
| 	U_BOOT_CMD_MKENT(env, CONFIG_SYS_MAXARGS, 1, do_ut_env, "", ""), | 	U_BOOT_CMD_MKENT(env, CONFIG_SYS_MAXARGS, 1, do_ut_env, "", ""), | ||||||
| #endif | #endif | ||||||
|  | 	U_BOOT_CMD_MKENT(exit, CONFIG_SYS_MAXARGS, 1, do_ut_exit, "", ""), | ||||||
| #ifdef CONFIG_CMD_FDT | #ifdef CONFIG_CMD_FDT | ||||||
| 	U_BOOT_CMD_MKENT(fdt, CONFIG_SYS_MAXARGS, 1, do_ut_fdt, "", ""), | 	U_BOOT_CMD_MKENT(fdt, CONFIG_SYS_MAXARGS, 1, do_ut_fdt, "", ""), | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue