From 4480587bb844bfec39d266612193b91338efa7d3 Mon Sep 17 00:00:00 2001 From: James Graham Date: Mon, 19 Jun 2017 19:20:41 +0100 Subject: [PATCH] Bug 1294820 - Add support for running wpt from one-click loaner mach environment, r=ahal Allow running |mach wpt| on one click loaners in order to run web-platform-tests tests. This implementation is just like the one for other testsuites using thee packaged tests rather than the checkout that we get with wpt, at least on Linux. That's also where the tests run from so it seems reasonable for now. Moving to the checkout in the future could remove some of the logic here by using a fake mozbuild environment so that the testsuite itself doesn't have to implement anything much. MozReview-Commit-ID: CaewrdjJ2ef --HG-- extra : rebase_source : 491b8014d48f06ff5bd41b28cc985608981fbdf4 --- .../mozharness/scripts/web_platform_tests.py | 5 +- testing/tools/mach_test_package_bootstrap.py | 3 + testing/web-platform/mach_commands.py | 48 +++---------- testing/web-platform/mach_commands_base.py | 29 ++++++++ .../mach_test_package_commands.py | 68 +++++++++++++++++++ testing/web-platform/moz.build | 2 + 6 files changed, 114 insertions(+), 41 deletions(-) create mode 100644 testing/web-platform/mach_commands_base.py create mode 100644 testing/web-platform/mach_test_package_commands.py diff --git a/testing/mozharness/scripts/web_platform_tests.py b/testing/mozharness/scripts/web_platform_tests.py index 209d0a23a50a..c76bfe43a562 100755 --- a/testing/mozharness/scripts/web_platform_tests.py +++ b/testing/mozharness/scripts/web_platform_tests.py @@ -207,11 +207,12 @@ class WebPlatformTest(TestingMixin, MercurialScript, BlobUploadMixin, CodeCovera def download_and_extract(self): super(WebPlatformTest, self).download_and_extract( - extract_dirs=["bin/*", + extract_dirs=["mach", + "bin/*", "config/*", "mozbase/*", "marionette/*", - "tools/wptserve/*", + "tools/*", "web-platform/*"], suite_categories=["web-platform"]) diff --git a/testing/tools/mach_test_package_bootstrap.py b/testing/tools/mach_test_package_bootstrap.py index 4ec9280b0278..af934fbfc0ba 100644 --- a/testing/tools/mach_test_package_bootstrap.py +++ b/testing/tools/mach_test_package_bootstrap.py @@ -37,6 +37,8 @@ SEARCH_PATHS = [ 'reftest', 'tools/mach', 'tools/wptserve', + 'web-platform', + 'web-platform/tests/tools/wptrunner', 'xpcshell', ] @@ -46,6 +48,7 @@ MACH_MODULES = [ 'mochitest/mach_test_package_commands.py', 'reftest/mach_test_package_commands.py', 'tools/mach/mach/commands/commandinfo.py', + 'web-platform/mach_test_package_commands.py', 'xpcshell/mach_test_package_commands.py', ] diff --git a/testing/web-platform/mach_commands.py b/testing/web-platform/mach_commands.py index ca9931328ae6..cd7e6e6879a0 100644 --- a/testing/web-platform/mach_commands.py +++ b/testing/web-platform/mach_commands.py @@ -20,15 +20,13 @@ from mach.decorators import ( Command, ) -# This should probably be consolidated with similar classes in other test -# runners. -class InvalidTestPathError(Exception): - """Exception raised when the test path is not valid.""" +from mach_commands_base import WebPlatformTestsRunner, create_parser_wpt -class WebPlatformTestsRunner(MozbuildObject): - """Run web platform tests.""" - def setup_kwargs_firefox(self, kwargs): +class WebPlatformTestsRunnerSetup(MozbuildObject): + default_log_type = "mach" + + def kwargs_firefox(self, kwargs): from wptrunner import wptcommandline build_path = os.path.join(self.topobjdir, 'build') @@ -70,7 +68,7 @@ class WebPlatformTestsRunner(MozbuildObject): kwargs = wptcommandline.check_args(kwargs) - def setup_kwargs_wptrun(self, kwargs): + def kwargs_wptrun(self, kwargs): from wptrunner import wptcommandline here = os.path.join(self.topsrcdir, 'testing', 'web-platform') @@ -113,27 +111,6 @@ class WebPlatformTestsRunner(MozbuildObject): kwargs = wptcommandline.check_args(kwargs) - def run_tests(self, **kwargs): - from wptrunner import wptrunner - - if kwargs["product"] in ["firefox", None]: - self.setup_kwargs_firefox(kwargs) - elif kwargs["product"] in ("chrome", "edge", "servo"): - self.setup_kwargs_wptrun(kwargs) - else: - raise ValueError("Unknown product %s" % kwargs["product"]) - - logger = wptrunner.setup_logging(kwargs, {"mach": sys.stdout}) - result = wptrunner.run_tests(**kwargs) - - return int(not result) - - def list_test_groups(self, **kwargs): - from wptrunner import wptrunner - - self.setup_kwargs(kwargs) - - wptrunner.list_test_groups(**kwargs) class WebPlatformTestsUpdater(MozbuildObject): """Update web platform tests.""" @@ -307,10 +284,6 @@ class WPTManifestUpdater(MozbuildObject): manifestupdate.update(logger, wpt_dir, check_clean, rebuild) -def create_parser_wpt(): - from wptrunner import wptcommandline - return wptcommandline.create_parser(["firefox", "chrome", "edge", "servo"]) - def create_parser_update(): from update import updatecommandline return updatecommandline.create_parser() @@ -364,12 +337,9 @@ class MachCommands(MachCommandBase): params["include"].append(item["name"]) del params["test_objects"] - wpt_runner = self._spawn(WebPlatformTestsRunner) - - if params["list_test_groups"]: - return wpt_runner.list_test_groups(**params) - else: - return wpt_runner.run_tests(**params) + wpt_setup = self._spawn(WebPlatformTestsRunnerSetup) + wpt_runner = WebPlatformTestsRunner(wpt_setup) + return wpt_runner.run(**params) @Command("wpt", category="testing", diff --git a/testing/web-platform/mach_commands_base.py b/testing/web-platform/mach_commands_base.py new file mode 100644 index 000000000000..af63775c9b81 --- /dev/null +++ b/testing/web-platform/mach_commands_base.py @@ -0,0 +1,29 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import sys + + +def create_parser_wpt(): + from wptrunner import wptcommandline + return wptcommandline.create_parser(["firefox", "chrome", "edge", "servo"]) + + +class WebPlatformTestsRunner(object): + """Run web platform tests.""" + + def __init__(self, setup): + self.setup = setup + + def run(self, **kwargs): + from wptrunner import wptrunner + if kwargs["product"] in ["firefox", None]: + self.setup.kwargs_firefox(kwargs) + elif kwargs["product"] in ("chrome", "edge", "servo"): + self.setup.kwargs_wptrun(kwargs) + else: + raise ValueError("Unknown product %s" % kwargs["product"]) + logger = wptrunner.setup_logging(kwargs, {self.setup.default_log_type: sys.stdout}) + result = wptrunner.start(**kwargs) + return int(not result) diff --git a/testing/web-platform/mach_test_package_commands.py b/testing/web-platform/mach_test_package_commands.py new file mode 100644 index 000000000000..9f558fc94a8a --- /dev/null +++ b/testing/web-platform/mach_test_package_commands.py @@ -0,0 +1,68 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from __future__ import unicode_literals + +import os + +from mach_commands_base import WebPlatformTestsRunner, create_parser_wpt +from mach.decorators import ( + CommandProvider, + Command, +) + + +class WebPlatformTestsRunnerSetup(object): + default_log_type = "tbpl" + + def __init__(self, context): + self.context = context + + def kwargs_firefox(self, kwargs): + from wptrunner import wptcommandline + if kwargs["config"] is None: + kwargs["config"] = os.path.join(self.context.package_root, 'web-platform', 'wptrunner.ini') + if kwargs["binary"] is None: + kwargs["binary"] = self.context.firefox_bin + if kwargs["prefs_root"] is None: + kwargs["prefs_root"] = os.path.join(self.context.package_root, 'web-platform', "prefs") + if kwargs["certutil_binary"] is None: + kwargs["certutil_binary"] = os.path.join(self.context.bin_dir, 'certutil') + if kwargs["stackfix_dir"] is None: + kwargs["stackfix_dir"] = self.context.bin_dir + if kwargs["ssl_type"] in (None, "pregenerated"): + if kwargs["ca_cert_path"] is None: + kwargs["ca_cert_path"] = os.path.join(self.context.package_root, "web-platform", "certs", "cacert.pem") + if kwargs["host_key_path"] is None: + kwargs["host_key_path"] = os.path.join(self.context.package_root, "web-platform", "certs", "web-platform.test.key") + if kwargs["host_cert_path"] is None: + kwargs["host_cert_path"] = os.path.join(self.context.package_root, "web-platform", "certs", "web-platform.test.pem") + kwargs["capture_stdio"] = True + + if kwargs["webdriver_binary"] is None: + kwargs["webdriver_binary"] = os.path.join(self.context.bin_dir, "geckodriver") + + kwargs = wptcommandline.check_args(kwargs) + + def kwargs_wptrun(self, kwargs): + raise NotImplementedError + + +@CommandProvider +class MachCommands(object): + def __init__(self, context): + self.context = context + + @Command("web-platform-tests", + category="testing", + parser=create_parser_wpt) + def run_web_platform_tests(self, **kwargs): + self.context.activate_mozharness_venv() + return WebPlatformTestsRunner(WebPlatformTestsRunnerSetup(self.context)).run(**kwargs) + + @Command("wpt", + category="testing", + parser=create_parser_wpt) + def run_wpt(self, **params): + return self.run_web_platform_tests(**params) diff --git a/testing/web-platform/moz.build b/testing/web-platform/moz.build index fa6d05b6bf9e..25d595e43311 100644 --- a/testing/web-platform/moz.build +++ b/testing/web-platform/moz.build @@ -10,6 +10,8 @@ WEB_PLATFORM_TESTS_MANIFESTS += [ ] TEST_HARNESS_FILES['web-platform'] += [ + 'mach_commands_base.py', + 'mach_test_package_commands.py', 'outbound/**', 'runtests.py', 'wptrunner.ini'