diff options
| author | Rasmus Villemoes <[email protected]> | 2026-03-12 11:01:06 +0100 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-03-25 14:37:55 -0600 |
| commit | 8b0619579b2282050e7fb0d92fbc645b79d18bae (patch) | |
| tree | 9f2fd0ce8625dc8a5709f423420ec232c9a9f51b | |
| parent | 6f9cc3310a764aaae4478b5a8a0c0cae3b2be4a1 (diff) | |
cmd: test: fix handling of single-argument form of test
POSIX states that
0 arguments:
Exit false (1).
1 argument:
Exit true (0) if $1 is not null; otherwise, exit false.
and at least bash and busybox sh behave that way.
The current 'argc < 3' does the right thing for a non-existing or
empty argv[1], but not for a non-empty argv[1]. Fix that and add
corresponding test cases.
Signed-off-by: Rasmus Villemoes <[email protected]>
Tested-by: Anshul Dalal <[email protected]>
| -rw-r--r-- | cmd/test.c | 11 | ||||
| -rw-r--r-- | test/hush/if.c | 30 |
2 files changed, 39 insertions, 2 deletions
diff --git a/cmd/test.c b/cmd/test.c index f0645ef98f1..0d0f090386c 100644 --- a/cmd/test.c +++ b/cmd/test.c @@ -71,10 +71,17 @@ static int do_test(struct cmd_tbl *cmdtp, int flag, int argc, argc--; } - /* args? */ - if (argc < 3) + /* + * Per POSIX, 'test' with 0 arguments should return 1, while + * 'test <arg>' should be equivalent to 'test -n <arg>', + * i.e. true if and only if <arg> is not empty. + */ + if (argc < 2) return 1; + if (argc == 2) + return !strcmp(argv[1], ""); + #ifdef DEBUG { debug("test(%d):", argc); diff --git a/test/hush/if.c b/test/hush/if.c index 5f75ea68b32..6129e2c530c 100644 --- a/test/hush/if.c +++ b/test/hush/if.c @@ -32,6 +32,15 @@ static int hush_test_if_base(struct unit_test_state *uts) sprintf(if_formatted, if_format, "false"); ut_asserteq(1, run_command(if_formatted, 0)); + sprintf(if_formatted, if_format, "test"); + ut_asserteq(1, run_command(if_formatted, 0)); + + sprintf(if_formatted, if_format, "test ''"); + ut_asserteq(1, run_command(if_formatted, 0)); + + sprintf(if_formatted, if_format, "test 'abc'"); + ut_assertok(run_command(if_formatted, 0)); + return 0; } HUSH_TEST(hush_test_if_base, 0); @@ -355,6 +364,27 @@ static int hush_test_lbracket_alias(struct unit_test_state *uts) sprintf(if_formatted, if_format, "[ ! aaa != aaa -o ! bbb = bbb ]"); ut_assertok(run_command(if_formatted, 0)); + sprintf(if_formatted, if_format, "[ ]"); + ut_asserteq(1, run_command(if_formatted, 0)); + + sprintf(if_formatted, if_format, "["); + ut_asserteq(1, run_command(if_formatted, 0)); + ut_assert_nextline(missing_rbracket_error); + + sprintf(if_formatted, if_format, "[ '' ]"); + ut_asserteq(1, run_command(if_formatted, 0)); + + sprintf(if_formatted, if_format, "[ ''"); + ut_asserteq(1, run_command(if_formatted, 0)); + ut_assert_nextline(missing_rbracket_error); + + sprintf(if_formatted, if_format, "[ 'abc' ]"); + ut_assertok(run_command(if_formatted, 0)); + + sprintf(if_formatted, if_format, "[ 'abc'"); + ut_asserteq(1, run_command(if_formatted, 0)); + ut_assert_nextline(missing_rbracket_error); + return 0; } HUSH_TEST(hush_test_lbracket_alias, UTF_CONSOLE); |
