aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--lorem.txt9
-rwxr-xr-xmain.py6
-rw-r--r--screenshot.pngbin0 -> 28402 bytes
-rw-r--r--suites.py137
-rw-r--r--utils.py10
6 files changed, 147 insertions, 17 deletions
diff --git a/README.md b/README.md
index ec3b1a0..65eb18e 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,8 @@
Test for the minishell project of school 42.
+![screenshot](./screenshot.png)
+
# 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.
diff --git a/main.py b/main.py
index 6043232..aab8473 100755
--- a/main.py
+++ b/main.py
@@ -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
new file mode 100644
index 0000000..406f37c
--- /dev/null
+++ b/screenshot.png
Binary files differ
diff --git a/suites.py b/suites.py
index 97e6a0b..8b4f218 100644
--- a/suites.py
+++ b/suites.py
@@ -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`"\'()|&><']))
diff --git a/utils.py b/utils.py
index 4c0cff3..0a6539b 100644
--- a/utils.py
+++ b/utils.py
@@ -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