diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-06-16 19:35:49 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-06-16 19:35:49 +0200 |
| commit | 2ac2df38b1d812f5ef25a4d9a9f25143005b82b8 (patch) | |
| tree | 3e6b794b393a0a9a586e1b03799ac66999ec8c65 | |
| parent | f7571404f308d889dc0e7baf1edea3774b8e45f5 (diff) | |
| download | minishell_test-2ac2df38b1d812f5ef25a4d9a9f25143005b82b8.tar.gz minishell_test-2ac2df38b1d812f5ef25a4d9a9f25143005b82b8.tar.bz2 minishell_test-2ac2df38b1d812f5ef25a4d9a9f25143005b82b8.zip | |
Added test for interpolation, glob and escape
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | lorem.txt | 9 | ||||
| -rwxr-xr-x | main.py | 6 | ||||
| -rw-r--r-- | screenshot.png | bin | 0 -> 28402 bytes | |||
| -rw-r--r-- | suites.py | 137 | ||||
| -rw-r--r-- | utils.py | 10 |
6 files changed, 147 insertions, 17 deletions
@@ -2,6 +2,8 @@ Test for the minishell project of school 42. + + # Usage The default path to your project is `..` but you can change it the the [configuration](config.py). diff --git a/lorem.txt b/lorem.txt deleted file mode 100644 index d3d78b8..0000000 --- a/lorem.txt +++ /dev/null @@ -1,9 +0,0 @@ -Mollitia asperiores assumenda excepturi et ipsa. Nihil corporis facere aut a rem consequatur. Quas molestiae corporis et quibusdam maiores. Molestiae sed unde aut at sed. - -Deserunt quidem quidem aspernatur pariatur vel illum voluptatum. Culpa unde dolor aspernatur sit. Mollitia tenetur sed eaque autem placeat a aut in. Ipsam ea consequuntur omnis. - -Non et qui vel corrupti similique eum aut voluptatibus. Iste consequatur voluptatum et omnis debitis. Sit quia neque nihil consequatur sint. Velit libero ut aut et et rerum. - -Placeat cumque incidunt non repellat sunt perspiciatis ullam. Repellendus repudiandae nostrum quia quis corrupti. Rerum veniam earum cumque pariatur accusantium voluptatum omnis. Alias ut et et adipisci. Tempore omnis numquam ullam et animi et eveniet. - -Dolor itaque distinctio in. Magnam rerum quia est laboriosam repellat perspiciatis eos. Consequuntur quae corrupti atque. Numquam enim ut ut. Perspiciatis ut maxime et libero quo voluptas consequatur illum. Pariatur porro dolor cumque molestiae harum. @@ -22,6 +22,11 @@ def main(): suites.suite_redirection() suites.suite_edgecases() suites.suite_cmd_error() + suites.suite_interpolation() + suites.suite_glob() + suites.suite_escape() + suites.suite_preprocess() + suites.suite_encoding() except KeyboardInterrupt: shutil.rmtree(config.SANDBOX_PATH) @@ -64,4 +69,5 @@ if __name__ == "__main__": log_file.write("=" * 80 + "\n\n") print(utils.green("{:2} [PASS]".format(pass_total)), end=" ") print(utils.red("{:2} [FAIL]".format(len(results) - pass_total))) + print("See", config.LOG_PATH, "for more information") sys.exit(utils.status) diff --git a/screenshot.png b/screenshot.png Binary files differnew file mode 100644 index 0000000..406f37c --- /dev/null +++ b/screenshot.png @@ -77,9 +77,12 @@ def suite_redirection(): test("echo bonjour>>test>je>>suis", setup="", files=["test", "je", "suis"]) test("cat<test<je", setup="echo bonjour > test; echo salut > je") - test("echo bonjour > a'b'c'd'e'f'g'h'i'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'", files=["abcdefghijklmnopqrstuvzxyz"]) - test('echo bonjour > a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"', files=["abcdefghijklmnopqrstuvzxyz"]) - test('echo bonjour > a\'b\'c"d"e\'f\'g"h"i\'j\'k"l"m\'n\'o"p\'q\'r"s\'t\'u"v"w"x"y\'z\'', files=["abcdefghijklmnopqrstuvzxyz"]) + test("echo bonjour > a'b'c'd'e'f'g'h'i'j'k'l'm'n'o'p'q'r's't'u'v'w'x'y'z'", + files=["abcdefghijklmnopqrstuvzxyz"]) + test('echo bonjour > a"b"c"d"e"f"g"h"i"j"k"l"m"n"o"p"q"r"s"t"u"v"w"x"y"z"', + files=["abcdefghijklmnopqrstuvzxyz"]) + test('echo bonjour > a\'b\'c"d"e\'f\'g"h"i\'j\'k"l"m\'n\'o"p\'q\'r"s\'t\'u"v"w"x"y\'z\'', + files=["abcdefghijklmnopqrstuvzxyz"]) @suite def suite_edgecases(): @@ -105,3 +108,131 @@ def suite_cmd_error(): test("cat <<< bar", setup="echo bonjour > bar") test("cat <<<< bar", setup="echo bonjour > bar") test("cat <<<<< bar", setup="echo bonjour > bar") + +@suite +def suite_interpolation(): + test("echo $TEST", exports={"TEST": "bonjour"}) + test("echo $TES", exports={"TEST": "bonjour"}) + test("echo $TEST_", exports={"TEST": "bonjour"}) + + test('echo "|$TEST|"', exports={"TEST": "bonjour"}) + test('echo "|$TES|"', exports={"TEST": "bonjour"}) + test('echo "|$TEST_|"', exports={"TEST": "bonjour"}) + + test("echo '|$TEST|'", exports={"TEST": "bonjour"}) + test("echo '|$TES|'", exports={"TEST": "bonjour"}) + test("echo '|$TEST_|'", exports={"TEST": "bonjour"}) + + test("echo $A$B$C", exports={"A": "foo", "B": "bar", "C": "baz"}) + test('echo "$A$B$C"', exports={"A": "foo", "B": "bar", "C": "baz"}) + test("echo '$A$B$C'", exports={"A": "foo", "B": "bar", "C": "baz"}) + + test("echo $A,$B,$C", exports={"A": "foo", "B": "bar", "C": "baz"}) + test('echo "$A,$B,$C"', exports={"A": "foo", "B": "bar", "C": "baz"}) + test("echo '$A,$B,$C'", exports={"A": "foo", "B": "bar", "C": "baz"}) + + test('echo $A"$B"$C"A"$B"$C"', exports={"A": "foo", "B": "bar", "C": "baz"}) + test("echo $A'$B'$C'A'$B'$C'", exports={"A": "foo", "B": "bar", "C": "baz"}) + + test("echo $A", exports={"A": "'" + config.LOREM + "'"}) + test('echo "$A"', exports={"A": "'" + config.LOREM + "'"}) + test("echo '$A'", exports={"A": "'" + config.LOREM + "'"}) + + test("$ECHO $ECHO", exports={"ECHO": "echo"}) + test("$A$B bonjour", exports={"A": "ec", "B": "ho"}) + + test("echo $") + +@suite +def suite_glob(): + test("echo *") + test("echo *", setup="touch a b c") + test("echo *.c", setup="touch a b c foo.c bar.c") + test("echo src/*.c", setup="mkdir src; touch src/a src/b src/c src/foo.c src/bar.c") + test("echo */*.c", setup="mkdir src; touch src/a src/b src/c src/foo.c src/bar.c") + test("echo */*.c", + setup="mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.c inc/bar.c") + test("echo */*.h", + setup="mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h") + test("echo l1/*/l3/*/*", + setup="mkdir -p l1/l2_1/l3; mkdir -p l1/l2_2; cd l1/l2_1/l3;\ + mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h;\ + cd ../../..; cd l1/l2_2; touch bonjour je suis") + + test("echo */*/*/*/*.c", + setup="mkdir -p l1/l2/l3; cd l1/l2/l3;\ + mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h") + test("echo */*/*/*/*.h", + setup="mkdir -p l1/l2/l3; cd l1/l2/l3;\ + mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h") + + test("echo */*/*/*.c", + setup="mkdir -p l1/l2/l3; cd l1/l2/l3;\ + mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h") + test("echo */*/*/*.h", + setup="mkdir -p l1/l2/l3; cd l1/l2/l3;\ + mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h") + + test("echo */*/*/*/*/*.c", + setup="mkdir -p l1/l2/l3; cd l1/l2/l3;\ + mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h") + test("echo */*/*/*/*/*.h", + setup="mkdir -p l1/l2/l3; cd l1/l2/l3;\ + mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.h inc/bar.h") + + test("echo /etc/*") + test("echo /usr/include/*.h") + test("echo /*/*") + + test("echo *nothing") + test("echo nothing*") + test("echo *nothing*") + + test("echo **") + test("echo **", setup="touch a b c") + test("echo **", setup="mkdir d; touch d/a d/b d/c") + test("echo */*", setup="mkdir d; touch d/a d/b d/c") + test("echo */a", setup="mkdir d; touch d/a d/b d/c") + test("echo d/*", setup="mkdir d; touch d/a d/b d/c") + +@suite +def suite_escape(): + test(r"echo \a") + test(r"\e\c\h\o bonjour") + test(r"echo charles\ ") + test(r"echo \ \ jesuis\ \ charles") + test(r"echo \ \ \ \ \ \ \ \ ") + test(r"echo \ \ \ \ \ \ \ \ \ \ \ \ \ \ ") + test(r"echo \$PATH") + test(r"echo \$\P\A\T\H") + test(r"echo\ bonjour") + +@suite +def suite_preprocess(): + test(r"echo \*", setup="touch a b c") + test(r"echo \*\*", setup="touch a b c") + test(r"echo \ *", setup="touch a b c") + test(r"echo *\.c", setup="touch a.c b.c c.c") + test(r"echo *.\c", setup="touch a.c b.c c.c") + test(r"echo *.c\ ", setup="touch a.c b.c c.c") + test("echo $A$B", + setup="mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.c inc/bar.c", + exports={"A": "*", "B": "/*.c"}) + test("echo $A$B", + setup="mkdir src; touch src/a src/b src/c src/foo.c src/bar.c;\ + mkdir inc; touch inc/a inc/b inc/c inc/foo.c inc/bar.c", + exports={"A": "*/.", "B": "*.c"}) + +@suite +def suite_encoding(): + test("echo " + ''.join([chr(i) for i in range(1, 127) if chr(i) not in '\n`"\'()|&><'])) @@ -88,7 +88,7 @@ def put_result(passed: bool, cmd: str): print(red("{:74} [FAIL]".format(cmd))) -def run_sandboxed(program: str, cmd: str, setup: str = None, files: [str] = []) -> str: +def run_sandboxed(program: str, cmd: str, setup: str = None, files: [str] = [], exports: {str, str} = {}) -> str: """ run the command in a sandbox environment, return the output (stdout and stderr) of it """ try: @@ -109,7 +109,7 @@ def run_sandboxed(program: str, cmd: str, setup: str = None, files: [str] = []) stderr=subprocess.STDOUT, stdout=subprocess.PIPE, cwd=config.SANDBOX_PATH, - env={'PATH': config.PATH_VARIABLE}) + env={'PATH': config.PATH_VARIABLE, **exports}) output = process_status.stdout.decode() output_files = [] @@ -132,11 +132,11 @@ verbose = False def check(expected: str, actual: str, expected_files: [str], actual_files: [str]) -> bool: return actual == expected and all([a == e for a, e in zip(actual_files, expected_files)]) -def test(cmd: str, setup: str = None, files: [str] = []): +def test(cmd: str, setup: str = None, files: [str] = [], exports: {str, str} = {}): """ get expected and actual strings, compare them and push them to the suites result """ - (expected, expected_files) = run_sandboxed(config.REFERENCE_SHELL_PATH, cmd, setup, files) - (actual, actual_files) = run_sandboxed(config.MINISHELL_PATH, cmd, setup, files) + (expected, expected_files) = run_sandboxed(config.REFERENCE_SHELL_PATH, cmd, setup, files, exports) + (actual, actual_files) = run_sandboxed(config.MINISHELL_PATH, cmd, setup, files, exports) passed = check(expected, actual, expected_files, actual_files) global status |
