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'