| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * (C) Copyright 2021 | |
| * Francis Laniel, Amarula Solutions, francis.laniel@amarulasolutions.com | |
| */ | |
| #include <command.h> | |
| #include <env_attr.h> | |
| #include <vsprintf.h> | |
| #include <test/hush.h> | |
| #include <test/ut.h> | |
| /* | |
| * All tests will execute the following: | |
| * if condition_to_test; then | |
| * true | |
| * else | |
| * false | |
| * fi | |
| * If condition is true, command returns 1, 0 otherwise. | |
| */ | |
| const char *if_format = "if %s; then true; else false; fi"; | |
| static int hush_test_if_base(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "true"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "false"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_base, 0); | |
| static int hush_test_if_basic_operators(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "test aaa = aaa"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa = bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa != bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa != aaa"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa < bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test bbb < aaa"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test bbb > aaa"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa > bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -eq 123"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -eq 456"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -ne 456"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -ne 123"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -lt 456"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -lt 123"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 456 -lt 123"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -le 456"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -le 123"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 456 -le 123"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 456 -gt 123"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -gt 123"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -gt 456"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 456 -ge 123"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -ge 123"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 123 -ge 456"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_basic_operators, 0); | |
| static int hush_test_if_octal(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "test 010 -eq 010"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 010 -eq 011"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 010 -ne 011"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 010 -ne 010"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_octal, 0); | |
| static int hush_test_if_hexadecimal(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "test 0x2000000 -gt 0x2000001"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0x2000000 -gt 0x2000000"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0x2000000 -gt 0x1ffffff"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_hexadecimal, 0); | |
| static int hush_test_if_mixed(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "test 010 -eq 10"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 010 -ne 10"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0xa -eq 10"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0xa -eq 012"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 2000000 -gt 0x1ffffff"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0x2000000 -gt 1ffffff"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0x2000000 -lt 1ffffff"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0x2000000 -eq 2000000"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test 0x2000000 -ne 2000000"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test -z \"\""); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test -z \"aaa\""); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test -n \"aaa\""); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test -n \"\""); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_mixed, 0); | |
| static int hush_test_if_inverted(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "test ! aaa = aaa"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test ! aaa = bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test ! ! aaa = aaa"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test ! ! aaa = bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_inverted, 0); | |
| static int hush_test_if_binary(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "test aaa != aaa -o bbb != bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa != aaa -o bbb = bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa = aaa -o bbb != bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa = aaa -o bbb = bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa != aaa -a bbb != bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa != aaa -a bbb = bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa = aaa -a bbb != bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test aaa = aaa -a bbb = bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_binary, 0); | |
| static int hush_test_if_inverted_binary(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| sprintf(if_formatted, if_format, "test ! aaa != aaa -o ! bbb != bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test ! aaa != aaa -o ! bbb = bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test ! aaa = aaa -o ! bbb != bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test ! aaa = aaa -o ! bbb = bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, | |
| "test ! ! aaa != aaa -o ! ! bbb != bbb"); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, | |
| "test ! ! aaa != aaa -o ! ! bbb = bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, | |
| "test ! ! aaa = aaa -o ! ! bbb != bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test ! ! aaa = aaa -o ! ! bbb = bbb"); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_inverted_binary, 0); | |
| static int hush_test_if_z_operator(struct unit_test_state *uts) | |
| { | |
| char if_formatted[128]; | |
| /* Deal with environment variable used during test. */ | |
| env_set("ut_var_nonexistent", NULL); | |
| env_set("ut_var_exists", "1"); | |
| env_set("ut_var_unset", "1"); | |
| sprintf(if_formatted, if_format, "test -z \"$ut_var_nonexistent\""); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test -z \"$ut_var_exists\""); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| sprintf(if_formatted, if_format, "test -z \"$ut_var_unset\""); | |
| ut_asserteq(1, run_command(if_formatted, 0)); | |
| env_set("ut_var_unset", NULL); | |
| sprintf(if_formatted, if_format, "test -z \"$ut_var_unset\""); | |
| ut_assertok(run_command(if_formatted, 0)); | |
| /* Clear the set environment variable. */ | |
| env_set("ut_var_exists", NULL); | |
| return 0; | |
| } | |
| HUSH_TEST(hush_test_if_z_operator, 0); |