87 lines
2.5 KiB
Python
87 lines
2.5 KiB
Python
import re
|
|
import sys
|
|
|
|
from joblib.testing import check_subprocess_call, raises
|
|
|
|
|
|
def test_check_subprocess_call():
|
|
code = "\n".join(
|
|
["result = 1 + 2 * 3", "print(result)", "my_list = [1, 2, 3]", "print(my_list)"]
|
|
)
|
|
|
|
check_subprocess_call([sys.executable, "-c", code])
|
|
|
|
# Now checking stdout with a regex
|
|
check_subprocess_call(
|
|
[sys.executable, "-c", code],
|
|
# Regex needed for platform-specific line endings
|
|
stdout_regex=r"7\s{1,2}\[1, 2, 3\]",
|
|
)
|
|
|
|
|
|
def test_check_subprocess_call_non_matching_regex():
|
|
code = "42"
|
|
non_matching_pattern = "_no_way_this_matches_anything_"
|
|
|
|
with raises(ValueError) as excinfo:
|
|
check_subprocess_call(
|
|
[sys.executable, "-c", code], stdout_regex=non_matching_pattern
|
|
)
|
|
excinfo.match("Unexpected stdout.+{}".format(non_matching_pattern))
|
|
|
|
|
|
def test_check_subprocess_call_wrong_command():
|
|
wrong_command = "_a_command_that_does_not_exist_"
|
|
with raises(OSError):
|
|
check_subprocess_call([wrong_command])
|
|
|
|
|
|
def test_check_subprocess_call_non_zero_return_code():
|
|
code_with_non_zero_exit = "\n".join(
|
|
[
|
|
"import sys",
|
|
'print("writing on stdout")',
|
|
'sys.stderr.write("writing on stderr")',
|
|
"sys.exit(123)",
|
|
]
|
|
)
|
|
|
|
pattern = re.compile(
|
|
"Non-zero return code: 123.+"
|
|
"Stdout:\nwriting on stdout.+"
|
|
"Stderr:\nwriting on stderr",
|
|
re.DOTALL,
|
|
)
|
|
|
|
with raises(ValueError) as excinfo:
|
|
check_subprocess_call([sys.executable, "-c", code_with_non_zero_exit])
|
|
excinfo.match(pattern)
|
|
|
|
|
|
def test_check_subprocess_call_timeout():
|
|
code_timing_out = "\n".join(
|
|
[
|
|
"import time",
|
|
"import sys",
|
|
'print("before sleep on stdout")',
|
|
"sys.stdout.flush()",
|
|
'sys.stderr.write("before sleep on stderr")',
|
|
"sys.stderr.flush()",
|
|
# We need to sleep for at least 2 * timeout seconds in case the SIGKILL
|
|
# is triggered.
|
|
"time.sleep(10)",
|
|
'print("process should have be killed before")',
|
|
"sys.stdout.flush()",
|
|
]
|
|
)
|
|
|
|
pattern = re.compile(
|
|
"Non-zero return code:.+"
|
|
"Stdout:\nbefore sleep on stdout\\s+"
|
|
"Stderr:\nbefore sleep on stderr",
|
|
re.DOTALL,
|
|
)
|
|
|
|
with raises(ValueError) as excinfo:
|
|
check_subprocess_call([sys.executable, "-c", code_timing_out], timeout=1)
|
|
excinfo.match(pattern)
|