|
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]) |
|
|
|
|
|
check_subprocess_call( |
|
[sys.executable, "-c", code], |
|
|
|
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()", |
|
|
|
|
|
"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) |
|
|