Chromium Code Reviews| Index: webkit/tools/layout_tests/layout_package/test_shell_thread.py |
| =================================================================== |
| --- webkit/tools/layout_tests/layout_package/test_shell_thread.py (revision 30489) |
| +++ webkit/tools/layout_tests/layout_package/test_shell_thread.py (working copy) |
| @@ -24,7 +24,7 @@ |
| import path_utils |
| import test_failures |
| -def ProcessOutput(proc, test_info, test_types, test_args, target): |
| +def ProcessOutput(proc, test_info, test_types, test_args, target, output_dir): |
| """Receives the output from a test_shell process, subjects it to a number |
| of tests, and returns a list of failure types the test produced. |
| @@ -34,6 +34,7 @@ |
| test_types: list of test types to subject the output to |
| test_args: arguments to be passed to each test |
| target: Debug or Release |
| + output_dir: directory to put crash stack traces into |
| Returns: a list of failure objects and times for the test being processed |
| """ |
| @@ -51,7 +52,8 @@ |
| line = proc.stdout.readline() |
| # Only start saving output lines once we've loaded the URL for the test. |
| - hit_load_url = False |
| + url = None |
| + test_string = test_info.uri.strip() |
| while line.rstrip() != "#EOF": |
| # Make sure we haven't crashed. |
| @@ -73,8 +75,6 @@ |
| # Don't include #URL lines in our output |
| if line.startswith("#URL:"): |
| - hit_load_url = True |
| - test_string = test_info.uri.strip() |
| url = line.rstrip()[5:] |
| if url != test_string: |
| logging.fatal("Test got out of sync:\n|%s|\n|%s|" % |
| @@ -85,7 +85,7 @@ |
| elif line.startswith("#TEST_TIMED_OUT"): |
| # Test timed out, but we still need to read until #EOF. |
| failures.append(test_failures.FailureTimeout()) |
| - elif hit_load_url: |
| + elif url: |
| outlines.append(line) |
| else: |
| extra_lines.append(line) |
| @@ -95,8 +95,18 @@ |
| end_test_time = time.time() |
| if len(extra_lines): |
| - logging.warning("Previous test output extra lines after dump:\n%s" % ( |
| - "".join(extra_lines))) |
| + extra = "".join(extra_lines) |
| + if crash: |
| + logging.info("Stacktrace for %s:\n%s" % (test_string, extra)) |
| + # Strip off "file://" since RelativeTestFilename expects filesystem paths. |
| + filename = os.path.join(output_dir, |
| + path_utils.RelativeTestFilename(test_string[7:])) |
| + filename = os.path.splitext(filename)[0] + "-stack.txt" |
| + path_utils.MaybeMakeDirectory(os.path.split(filename)[0]) |
| + open(filename, "wb").write(extra) |
| + else: |
| + logging.warning("Previous test output extra lines after dump:\n%s" % |
| + extra) |
| # Check the output and save the results. |
| time_for_diffs = {} |
| @@ -147,7 +157,7 @@ |
| class SingleTestThread(threading.Thread): |
| """Thread wrapper for running a single test file.""" |
| def __init__(self, test_shell_command, shell_args, test_info, test_types, |
| - test_args, target): |
| + test_args, target, output_dir): |
| """ |
| Args: |
| test_info: Object containing the test filename, uri and timeout |
| @@ -161,12 +171,13 @@ |
| self._test_types = test_types |
| self._test_args = test_args |
| self._target = target |
| + self._output_dir = output_dir |
| def run(self): |
| proc = StartTestShell(self._command, self._shell_args + |
| ["--time-out-ms=" + self._test_info.timeout, self._test_info.uri]) |
| self._test_stats = ProcessOutput(proc, self._test_info, self._test_types, |
| - self._test_args, self._target) |
| + self._test_args, self._target, self._output_dir) |
| def GetTestStats(self): |
| return self._test_stats |
| @@ -174,7 +185,7 @@ |
| class TestShellThread(threading.Thread): |
| def __init__(self, filename_list_queue, test_shell_command, test_types, |
| - test_args, shell_args, options): |
| + test_args, shell_args, output_dir, options): |
| """Initialize all the local state for this test shell thread. |
| Args: |
| @@ -184,6 +195,7 @@ |
| test_types: A list of TestType objects to run the test output against. |
| test_args: A TestArguments object to pass to each TestType. |
| shell_args: Any extra arguments to be passed to test_shell.exe. |
| + output_dir: Directory to put crash stacks into. |
| options: A property dictionary as produced by optparse. The command-line |
| options should match those expected by run_webkit_tests; they |
| are typically passed via the run_webkit_tests.TestRunner class. |
| @@ -196,6 +208,7 @@ |
| self._test_args = test_args |
| self._test_shell_proc = None |
| self._shell_args = shell_args |
| + self._output_dir = output_dir |
|
tony
2009/10/29 23:13:51
Nit: Maybe just use options.results_directory rath
|
| self._options = options |
| self._failures = {} |
| self._canceled = False |
| @@ -357,7 +370,8 @@ |
| test_info, |
| self._test_types, |
| self._test_args, |
| - self._options.target) |
| + self._options.target, |
| + self._output_dir) |
| worker.start() |
| @@ -416,7 +430,7 @@ |
| self._test_shell_proc.stdin.flush() |
| stats = ProcessOutput(self._test_shell_proc, test_info, self._test_types, |
| - self._test_args, self._options.target) |
| + self._test_args, self._options.target, self._output_dir) |
| self._test_stats.append(stats) |
| return stats.failures |