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
This commit is contained in:
James Graham 2017-06-19 19:20:41 +01:00
Родитель 6f7e5916ce
Коммит 4480587bb8
6 изменённых файлов: 114 добавлений и 41 удалений

Просмотреть файл

@ -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"])

Просмотреть файл

@ -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',
]

Просмотреть файл

@ -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",

Просмотреть файл

@ -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)

Просмотреть файл

@ -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)

Просмотреть файл

@ -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'