Skip to content

Commit fe578c6

Browse files
authored
Merge pull request diffblue#296 from diffblue/smowton/feature/print-command-on-test-failure
Regression tests: print failed driver command on test failure
2 parents 3196528 + f29de1c commit fe578c6

File tree

8 files changed

+69
-63
lines changed

8 files changed

+69
-63
lines changed

regression/end_to_end/driver.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
import os.path
44
import tempfile
55
import regression.utils as utils
6-
6+
import sys
77

88
from regression.executable_runner import ExecutableRunner
99

1010

1111
class ErrorTraces:
1212

13-
def __init__(self, traces):
13+
def __init__(self, traces, cmdline):
1414
self.traces = traces
15+
self.cmdline = cmdline
1516

1617
def count_traces(self):
1718
count = 0
@@ -47,6 +48,22 @@ def trace_goes_through(
4748
pass
4849
return False
4950

51+
def __enter__(self):
52+
return self
53+
54+
def __exit__(self, exc_type, exc_value, traceback):
55+
print("Failure may relate to command: ", self.cmdline, file=sys.stderr)
56+
57+
def quote_pathnames_in_command_line(cmdline):
58+
assert isinstance(cmdline, list) and len(cmdline) > 0
59+
result = cmdline[:1]
60+
for idx in range(1, len(cmdline)):
61+
if cmdline[idx - 1] in ["-C", "-I", "-R", "-T"] or \
62+
(cmdline[idx - 1] == "--name" and " " in cmdline[idx]):
63+
result.append("'" + cmdline[idx] + "'")
64+
else:
65+
result.append(cmdline[idx])
66+
return result
5067

5168
def run_security_analyser_pipeline(
5269
relative_binary_path,
@@ -84,28 +101,18 @@ def run_security_analyser_pipeline(
84101
if "SECURITY_ANALYSER_END_TO_END_TESTS_EXTRA_ARGS" in os.environ:
85102
cmdline.extend(os.environ["SECURITY_ANALYSER_END_TO_END_TESTS_EXTRA_ARGS"].split(","))
86103

104+
pretty_cmdline = " ".join(quote_pathnames_in_command_line(cmdline))
105+
87106
with utils.working_dir(analyzer_home), \
88107
utils.temp_dir_deleter(results_dir), \
89108
utils.temp_dir_deleter(temporary_dir):
90109

91-
def quote_pathnames_in_command_line(cmdline):
92-
assert isinstance(cmdline, list) and len(cmdline) > 0
93-
result = cmdline[:1]
94-
for idx in range(1, len(cmdline)):
95-
if cmdline[idx - 1] in ["-C", "-I", "-R", "-T"] or \
96-
(cmdline[idx - 1] == "--name" and " " in cmdline[idx]):
97-
result.append("'" + cmdline[idx] + "'")
98-
else:
99-
result.append(cmdline[idx])
100-
return result
101-
102110
executable_runner = ExecutableRunner(cmdline)
103111
(stdout, stderr, ret) = executable_runner.run()
104112
if ret != 0:
105113
raise Exception(
106114
"Failed running \"%s\":\nstdout:\n\n%s\nstderr\n\n%s" % \
107-
(" ".join(quote_pathnames_in_command_line(cmdline)),
108-
stdout, stderr))
115+
(pretty_cmdline, stdout, stderr))
109116

110117
trace_list = \
111118
os.path.join(
@@ -126,7 +133,6 @@ def quote_pathnames_in_command_line(cmdline):
126133

127134
if "SECURITY_ANALYSER_END_TO_END_TESTS_KEEP_RESULTS" in os.environ:
128135
print("Test \"%s\" kept results (%s) and temporary directory (%s)" %
129-
(" ".join(quote_pathnames_in_command_line(cmdline)),
130-
results_dir, temporary_dir))
136+
(pretty_cmdline, results_dir, temporary_dir))
131137

132-
return ErrorTraces(traces)
138+
return ErrorTraces(traces, pretty_cmdline)

regression/end_to_end/general001/test_general001.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import os
66

77
def test_general001():
8-
traces = run_security_analyser_pipeline(
9-
"taint_traces_01.jar",
10-
"taint_traces_01_rules.json",
11-
os.path.realpath(os.path.dirname(__file__)))
12-
assert traces.count_traces() > 0
13-
assert traces.trace_exists("java::Main.bug:(I)V", 84)
8+
with run_security_analyser_pipeline(
9+
"taint_traces_01.jar",
10+
"taint_traces_01_rules.json",
11+
os.path.realpath(os.path.dirname(__file__))) as traces:
12+
assert traces.count_traces() > 0
13+
assert traces.trace_exists("java::Main.bug:(I)V", 84)

regression/end_to_end/general002/test_general002.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import os
66

77
def test_general002():
8-
traces = run_security_analyser_pipeline(
9-
"taint_traces_02.jar",
10-
"taint_traces_02_rules.json",
11-
os.path.realpath(os.path.dirname(__file__)))
12-
assert traces.count_traces() == 0
8+
with run_security_analyser_pipeline(
9+
"taint_traces_02.jar",
10+
"taint_traces_02_rules.json",
11+
os.path.realpath(os.path.dirname(__file__))) as traces:
12+
assert traces.count_traces() == 0

regression/end_to_end/general003/test_general003.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import os
66

77
def test_general003():
8-
traces = run_security_analyser_pipeline(
9-
"taint_traces_03.jar",
10-
"taint_traces_03_rules.json",
11-
os.path.realpath(os.path.dirname(__file__)))
12-
assert traces.count_traces() == 0
8+
with run_security_analyser_pipeline(
9+
"taint_traces_03.jar",
10+
"taint_traces_03_rules.json",
11+
os.path.realpath(os.path.dirname(__file__))) as traces:
12+
assert traces.count_traces() == 0

regression/end_to_end/general004/test_general004.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import os
66

77
def test_general004():
8-
traces = run_security_analyser_pipeline(
9-
"taint_traces_04.jar",
10-
"taint_traces_04_rules.json",
11-
os.path.realpath(os.path.dirname(__file__)))
12-
assert traces.count_traces() > 0
13-
assert traces.trace_exists("java::Main.baz0:()V", 19)
14-
assert traces.trace_exists("java::Main.baz1:()V", 26)
15-
assert traces.trace_exists("java::Main.baz2:(LOther;)V", 32)
8+
with run_security_analyser_pipeline(
9+
"taint_traces_04.jar",
10+
"taint_traces_04_rules.json",
11+
os.path.realpath(os.path.dirname(__file__))) as traces:
12+
assert traces.count_traces() > 0
13+
assert traces.trace_exists("java::Main.baz0:()V", 19)
14+
assert traces.trace_exists("java::Main.baz1:()V", 26)
15+
assert traces.trace_exists("java::Main.baz2:(LOther;)V", 32)

regression/end_to_end/general005/test_general005.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
import os
66

77
def test_general005():
8-
traces = run_security_analyser_pipeline(
9-
"taint_traces_05.jar",
10-
"taint_traces_05_rules.json",
11-
os.path.realpath(os.path.dirname(__file__)),
12-
["--data-flow-insensitive-instrumentation"])
13-
assert traces.count_traces() > 0
14-
assert traces.trace_exists("java::DummyAssignmentSubmissionEdit.setSubmittedText:(Ljava/lang/String;)V", 3)
8+
with run_security_analyser_pipeline(
9+
"taint_traces_05.jar",
10+
"taint_traces_05_rules.json",
11+
os.path.realpath(os.path.dirname(__file__)),
12+
["--data-flow-insensitive-instrumentation"]) as traces:
13+
assert traces.count_traces() > 0
14+
assert traces.trace_exists("java::DummyAssignmentSubmissionEdit.setSubmittedText:(Ljava/lang/String;)V", 3)

regression/end_to_end/general006/test_general006.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import os
66

77
def test_general006():
8-
traces = run_security_analyser_pipeline(
9-
"taint_traces_06.jar",
10-
"taint_traces_06_rules.json",
11-
os.path.realpath(os.path.dirname(__file__)),
12-
["--data-flow-insensitive-instrumentation"])
13-
assert traces.count_traces() > 0
14-
assert traces.trace_exists("java::taint_test.test.doGet:(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V", 165)
15-
assert traces.trace_exists("java::taint_test.test.doGet:(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V", 143)
8+
with run_security_analyser_pipeline(
9+
"taint_traces_06.jar",
10+
"taint_traces_06_rules.json",
11+
os.path.realpath(os.path.dirname(__file__)),
12+
["--data-flow-insensitive-instrumentation"]) as traces:
13+
assert traces.count_traces() > 0
14+
assert traces.trace_exists("java::taint_test.test.doGet:(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V", 165)
15+
assert traces.trace_exists("java::taint_test.test.doGet:(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V", 143)

regression/end_to_end/general007/test_general007.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import os
66

77
def test_general007():
8-
traces = run_security_analyser_pipeline(
9-
"taint_traces_07.jar",
10-
"taint_traces_07_rules.json",
11-
os.path.realpath(os.path.dirname(__file__)))
12-
assert traces.count_traces() > 0
13-
assert traces.trace_exists("java::training07.test.doGet:(Ltraining07/HttpServletRequest;Ltraining07/HttpServletResponse;)V", 109)
8+
with run_security_analyser_pipeline(
9+
"taint_traces_07.jar",
10+
"taint_traces_07_rules.json",
11+
os.path.realpath(os.path.dirname(__file__))) as traces:
12+
assert traces.count_traces() > 0
13+
assert traces.trace_exists("java::training07.test.doGet:(Ltraining07/HttpServletRequest;Ltraining07/HttpServletResponse;)V", 109)

0 commit comments

Comments
 (0)