From f3c318d126fb30e787b6bff717faab4073615011 Mon Sep 17 00:00:00 2001 From: James Graham Date: Mon, 20 Apr 2015 19:46:41 +0100 Subject: [PATCH 1/3] Fix servo debugger support to work when one test is run. It turns out that mozprocess + gdb isn't such a great combination since the output gets swallowed somewhere along the way. So when the debugger is active use subprocess directly instead. This does mean that we can't collect test results when running with a debugger, which is unfortunate --- wptrunner/browsers/servo.py | 8 +++----- wptrunner/executors/executorservo.py | 24 +++++++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/wptrunner/browsers/servo.py b/wptrunner/browsers/servo.py index cbc21e607c7895..80121434736973 100644 --- a/wptrunner/browsers/servo.py +++ b/wptrunner/browsers/servo.py @@ -26,8 +26,7 @@ def check_args(**kwargs): def browser_kwargs(**kwargs): return {"binary": kwargs["binary"], - "debug_info": kwargs["debug_info"], - "interactive": kwargs["interactive"]} + "debug_info": kwargs["debug_info"]} def executor_kwargs(test_type, server_config, cache_manager, **kwargs): @@ -44,13 +43,12 @@ def env_options(): class ServoBrowser(NullBrowser): - def __init__(self, logger, binary, debug_info=None, interactive=False): + def __init__(self, logger, binary, debug_info=None): NullBrowser.__init__(self, logger) self.binary = binary self.debug_info = debug_info - self.interactive = interactive def executor_browser(self): return ExecutorBrowser, {"binary": self.binary, "debug_info": self.debug_info, - "interactive": self.interactive} + "interactive": self.debug_info.interactive if self.debug_info else False} diff --git a/wptrunner/executors/executorservo.py b/wptrunner/executors/executorservo.py index e7b2cd415bc505..232ba3ad28996a 100644 --- a/wptrunner/executors/executorservo.py +++ b/wptrunner/executors/executorservo.py @@ -21,7 +21,7 @@ testharness_result_converter, reftest_result_converter) from .process import ProcessTestExecutor -from ..executors.base import browser_command +from ..browsers.base import browser_command hosts_text = """127.0.0.1 web-platform.test 127.0.0.1 www.web-platform.test @@ -75,29 +75,35 @@ def do_test(self, test): env = os.environ.copy() env["HOST_FILE"] = self.hosts_path - self.proc = ProcessHandler(self.command, - processOutputLine=[self.on_output], - onFinish=self.on_finish, - env=env) - try: + + if not self.interactive: + self.proc = ProcessHandler(self.command, + processOutputLine=[self.on_output], + onFinish=self.on_finish, + env=env, + storeOutput=False) self.proc.run() + else: + self.proc = subprocess.Popen(self.command, env=env) + try: timeout = test.timeout * self.timeout_multiplier # Now wait to get the output we expect, or until we reach the timeout if self.debug_info is None and not self.pause_after_test: wait_timeout = timeout + 5 + self.result_flag.wait(wait_timeout) else: wait_timeout = None - self.result_flag.wait(wait_timeout) + self.proc.wait() proc_is_running = True if self.result_flag.is_set() and self.result_data is not None: self.result_data["test"] = test.url result = self.convert_result(test, self.result_data) else: - if self.proc.proc.poll() is not None: + if self.proc.poll() is not None: result = (test.result_cls("CRASH", None), []) proc_is_running = False else: @@ -215,7 +221,7 @@ def do_test(self, test): def on_output(self, line): line = line.decode("utf8", "replace") - if self.interactive: + if self.debug_info.interactive: print line else: self.logger.process_output(self.proc.pid, From df21a5778cb88c9fdb99cdc4e40b7e7105045b2e Mon Sep 17 00:00:00 2001 From: James Graham Date: Mon, 20 Apr 2015 19:58:52 +0100 Subject: [PATCH 2/3] Force one process when running under a debugger --- wptrunner/wptcommandline.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wptrunner/wptcommandline.py b/wptrunner/wptcommandline.py index 18a5367434d6c8..bf00901ab37124 100644 --- a/wptrunner/wptcommandline.py +++ b/wptrunner/wptcommandline.py @@ -276,7 +276,8 @@ def check_args(kwargs): debug_info = mozdebug.get_debugger_info(kwargs["debugger"], kwargs["debugger_args"]) if debug_info.interactive: - require_arg(kwargs, "processes", lambda x: x == 1) + if kwargs["processes"] != 1: + kwargs["processes"] = 1 kwargs["no_capture_stdio"] = True kwargs["debug_info"] = debug_info else: From a68b1a46c902620e9f6c8e9a76d4560be9af4f3b Mon Sep 17 00:00:00 2001 From: James Graham Date: Tue, 21 Apr 2015 17:40:11 +0100 Subject: [PATCH 3/3] fixup! Fix servo debugger support to work when one test is run. --- wptrunner/browsers/servo.py | 3 +-- wptrunner/executors/executorservo.py | 4 ++-- wptrunner/executors/process.py | 3 ++- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/wptrunner/browsers/servo.py b/wptrunner/browsers/servo.py index 80121434736973..11499b66b9f42c 100644 --- a/wptrunner/browsers/servo.py +++ b/wptrunner/browsers/servo.py @@ -50,5 +50,4 @@ def __init__(self, logger, binary, debug_info=None): def executor_browser(self): return ExecutorBrowser, {"binary": self.binary, - "debug_info": self.debug_info, - "interactive": self.debug_info.interactive if self.debug_info else False} + "debug_info": self.debug_info} diff --git a/wptrunner/executors/executorservo.py b/wptrunner/executors/executorservo.py index 232ba3ad28996a..ef2bffdb2b32a1 100644 --- a/wptrunner/executors/executorservo.py +++ b/wptrunner/executors/executorservo.py @@ -91,7 +91,7 @@ def do_test(self, test): timeout = test.timeout * self.timeout_multiplier # Now wait to get the output we expect, or until we reach the timeout - if self.debug_info is None and not self.pause_after_test: + if not self.interactive and not self.pause_after_test: wait_timeout = timeout + 5 self.result_flag.wait(wait_timeout) else: @@ -221,7 +221,7 @@ def do_test(self, test): def on_output(self, line): line = line.decode("utf8", "replace") - if self.debug_info.interactive: + if self.interactive: print line else: self.logger.process_output(self.proc.pid, diff --git a/wptrunner/executors/process.py b/wptrunner/executors/process.py index bff8b5bfb53620..45f33ab2c75cb4 100644 --- a/wptrunner/executors/process.py +++ b/wptrunner/executors/process.py @@ -9,7 +9,8 @@ class ProcessTestExecutor(TestExecutor): def __init__(self, *args, **kwargs): TestExecutor.__init__(self, *args, **kwargs) self.binary = self.browser.binary - self.interactive = self.browser.interactive + self.interactive = (False if self.debug_info is None + else self.debug_info.interactive) def setup(self, runner): self.runner = runner