diff --git a/testing/mozharness/scripts/web_platform_tests.py b/testing/mozharness/scripts/web_platform_tests.py index 3a40377a5035..11ca02e631c9 100755 --- a/testing/mozharness/scripts/web_platform_tests.py +++ b/testing/mozharness/scripts/web_platform_tests.py @@ -174,8 +174,6 @@ class WebPlatformTest(TestingMixin, MercurialScript, CodeCoverageMixin, AndroidM dirs['abs_test_bin_dir'] = os.path.join(dirs['abs_test_install_dir'], 'bin') dirs["abs_wpttest_dir"] = os.path.join(dirs['abs_test_install_dir'], "web-platform") dirs['abs_blob_upload_dir'] = os.path.join(abs_dirs['abs_work_dir'], 'blobber_upload_dir') - dirs['abs_test_extensions_dir'] = os.path.join(dirs['abs_test_install_dir'], - 'extensions') if self.is_android: dirs['abs_xre_dir'] = os.path.join(abs_dirs['abs_work_dir'], 'hostutils') if self.is_emulator: @@ -251,10 +249,7 @@ class WebPlatformTest(TestingMixin, MercurialScript, CodeCoverageMixin, AndroidM "--stackfix-dir=%s" % os.path.join(dirs["abs_test_install_dir"], "bin"), "--no-pause-after-test", "--instrument-to-file=%s" % os.path.join(dirs["abs_blob_upload_dir"], - "wpt_instruments.txt"), - "--specialpowers-path=%s" % os.path.join(dirs['abs_test_extensions_dir'], - "specialpowers@mozilla.org.xpi"), - ] + "wpt_instruments.txt")] is_windows_7 = mozinfo.info["os"] == "win" and mozinfo.info["os_version"] == "6.1" @@ -367,7 +362,6 @@ class WebPlatformTest(TestingMixin, MercurialScript, CodeCoverageMixin, AndroidM extract_dirs=["mach", "bin/*", "config/*", - "extensions/*", "mozbase/*", "marionette/*", "tools/*", diff --git a/testing/web-platform/README.md b/testing/web-platform/README.md index 730ab82ea466..44b4f4acae3b 100644 --- a/testing/web-platform/README.md +++ b/testing/web-platform/README.md @@ -82,13 +82,6 @@ FAQ [testdriver](https://web-platform-tests.org/writing-tests/testdriver.html) API. - For Gecko-specific testharness tests, the specialPowers extension is - available. Note that this should only be used when no other approach - works; such tests can't be shared with other browsers. If you're - using specialPowers for something that could be tested in other - browsers if we extended testdriver or added test-only APIs, please - file a bug. - Writing tests ------------- diff --git a/testing/web-platform/mach_commands.py b/testing/web-platform/mach_commands.py index 7c776c5a05e0..31b05ac96608 100644 --- a/testing/web-platform/mach_commands.py +++ b/testing/web-platform/mach_commands.py @@ -41,13 +41,6 @@ class WebPlatformTestsRunnerSetup(MozbuildObject): """Setup kwargs relevant for all browser products""" tests_src_path = os.path.join(self._here, "tests") - - if (kwargs["product"] in {"firefox", "firefox_android"} and - kwargs["specialpowers_path"] is None): - kwargs["specialpowers_path"] = os.path.join(self.distdir, - "xpi-stage", - "specialpowers@mozilla.org.xpi") - if kwargs["product"] == "firefox_android": # package_name may be different in the future package_name = kwargs["package_name"] @@ -94,9 +87,9 @@ class WebPlatformTestsRunnerSetup(MozbuildObject): def kwargs_firefox(self, kwargs): """Setup kwargs specific to running Firefox and other gecko browsers""" + import mozinfo from wptrunner import wptcommandline - kwargs = self.kwargs_common(kwargs) if kwargs["binary"] is None: @@ -132,6 +125,7 @@ class WebPlatformTestsRunnerSetup(MozbuildObject): def kwargs_wptrun(self, kwargs): """Setup kwargs for wpt-run which is only used for non-gecko browser products""" + from tools.wpt import run kwargs = self.kwargs_common(kwargs) @@ -351,11 +345,9 @@ class MachCommands(MachCommandBase): parser=create_parser_wpt) def run_web_platform_tests(self, **params): self.setup() - if params["product"] is None: - if conditions.is_android(self): + if conditions.is_android(self) and params["product"] != "firefox_android": + if params["product"] is None: params["product"] = "firefox_android" - else: - params["product"] = "firefox" if "test_objects" in params: include = [] test_types = set() diff --git a/testing/web-platform/mach_commands_base.py b/testing/web-platform/mach_commands_base.py index 27b2010476ff..9f6566ea19a2 100644 --- a/testing/web-platform/mach_commands_base.py +++ b/testing/web-platform/mach_commands_base.py @@ -33,7 +33,7 @@ class WebPlatformTestsRunner(object): self.update_manifest(logger) kwargs["manifest_update"] = False - if kwargs["product"] == "firefox": + if kwargs["product"] in ["firefox", None]: try: kwargs = self.setup.kwargs_firefox(kwargs) except BinaryNotFoundException as e: diff --git a/testing/web-platform/mozilla/tests/infrastructure/specialPowers/specialpowers.html b/testing/web-platform/mozilla/tests/infrastructure/specialPowers/specialpowers.html deleted file mode 100644 index 38615028d24e..000000000000 --- a/testing/web-platform/mozilla/tests/infrastructure/specialPowers/specialpowers.html +++ /dev/null @@ -1,7 +0,0 @@ -Check specialPowers is available in gecko-only tests - - - - diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/base.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/base.py index f2205b160f61..99f6e5cff4c8 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/base.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/base.py @@ -126,12 +126,6 @@ class Browser(object): pass def settings(self, test): - """Dictionary of metadata that is constant for a specific launch of a browser. - - This is used to determine when the browser instance configuration changes, requiring - a relaunch of the browser. The test runner calls this method for each test, and if the - returned value differs from that for the previous test, the browser is relaunched. - """ return {} @abstractmethod diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox.py index 75cebb9f7f10..151530897d9b 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox.py @@ -101,8 +101,7 @@ def browser_kwargs(test_type, run_info_data, config, **kwargs): "config": config, "browser_channel": kwargs["browser_channel"], "headless": kwargs["headless"], - "preload_browser": kwargs["preload_browser"], - "specialpowers_path": kwargs["specialpowers_path"]} + "preload_browser": kwargs["preload_browser"]} def executor_kwargs(test_type, server_config, cache_manager, run_info_data, @@ -541,16 +540,12 @@ class ProfileCreator(object): self.certutil_binary = certutil_binary self.ca_certificate_path = ca_certificate_path - def create(self, **kwargs): + def create(self): """Create a Firefox profile and return the mozprofile Profile object pointing at that - profile - - :param kwargs: Additional arguments to pass into the profile constructor - """ + profile""" preferences = self._load_prefs() - profile = FirefoxProfile(preferences=preferences, - **kwargs) + profile = FirefoxProfile(preferences=preferences) self._set_required_prefs(profile) if self.ca_certificate_path is not None: self._setup_ssl(profile) @@ -675,6 +670,7 @@ class ProfileCreator(object): certutil("-L", "-d", cert_db_path) + class FirefoxBrowser(Browser): init_timeout = 70 @@ -683,8 +679,7 @@ class FirefoxBrowser(Browser): ca_certificate_path=None, e10s=False, enable_webrender=False, enable_fission=False, stackfix_dir=None, binary_args=None, timeout_multiplier=None, leak_check=False, asan=False, stylo_threads=1, chaos_mode_flags=None, config=None, - browser_channel="nightly", headless=None, preload_browser=False, - specialpowers_path=None, **kwargs): + browser_channel="nightly", headless=None, preload_browser=False, **kwargs): Browser.__init__(self, logger) self.logger = logger @@ -693,7 +688,6 @@ class FirefoxBrowser(Browser): self.init_timeout = self.init_timeout * timeout_multiplier self.instance = None - self._settings = None self.stackfix_dir = stackfix_dir self.symbols_path = symbols_path @@ -702,8 +696,6 @@ class FirefoxBrowser(Browser): self.asan = asan self.leak_check = leak_check - self.specialpowers_path = specialpowers_path - profile_creator = ProfileCreator(logger, prefs_root, config, @@ -734,15 +726,14 @@ class FirefoxBrowser(Browser): symbols_path, asan) + def settings(self, test): - self._settings = {"check_leaks": self.leak_check and not test.leaks, - "lsan_disabled": test.lsan_disabled, - "lsan_allowed": test.lsan_allowed, - "lsan_max_stack_depth": test.lsan_max_stack_depth, - "mozleak_allowed": self.leak_check and test.mozleak_allowed, - "mozleak_thresholds": self.leak_check and test.mozleak_threshold, - "special_powers": self.specialpowers_path and test.url_base == "/_mozilla/"} - return self._settings + return {"check_leaks": self.leak_check and not test.leaks, + "lsan_disabled": test.lsan_disabled, + "lsan_allowed": test.lsan_allowed, + "lsan_max_stack_depth": test.lsan_max_stack_depth, + "mozleak_allowed": self.leak_check and test.mozleak_allowed, + "mozleak_thresholds": self.leak_check and test.mozleak_threshold} def start(self, group_metadata=None, **kwargs): self.instance = self.instance_manager.get() @@ -765,11 +756,7 @@ class FirefoxBrowser(Browser): def executor_browser(self): assert self.instance is not None - extensions = [] - if self._settings.get("special_powers", False): - extensions.append(self.specialpowers_path) - return ExecutorBrowser, {"marionette_port": self.instance.marionette_port, - "extensions": extensions} + return ExecutorBrowser, {"marionette_port": self.instance.marionette_port} def check_crash(self, process, test): dump_dir = os.path.join(self.instance.runner.profile.profile, "minidumps") diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py index bea0d9f4ee33..a6cb8f0dd3e0 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox_android.py @@ -62,8 +62,7 @@ def browser_kwargs(test_type, run_info_data, config, **kwargs): "chaos_mode_flags": kwargs["chaos_mode_flags"], "config": config, "install_fonts": kwargs["install_fonts"], - "tests_root": config.doc_root, - "specialpowers_path": kwargs["specialpowers_path"]} + "tests_root": config.doc_root} def env_extras(**kwargs): @@ -120,6 +119,7 @@ class ProfileCreator(FirefoxProfileCreator): }) + class FirefoxAndroidBrowser(Browser): init_timeout = 300 shutdown_timeout = 60 @@ -130,7 +130,7 @@ class FirefoxAndroidBrowser(Browser): ca_certificate_path=None, e10s=False, enable_webrender=False, stackfix_dir=None, binary_args=None, timeout_multiplier=None, leak_check=False, asan=False, stylo_threads=1, chaos_mode_flags=None, config=None, browser_channel="nightly", - install_fonts=False, tests_root=None, specialpowers_path=None, **kwargs): + install_fonts=False, tests_root=None, **kwargs): super(FirefoxAndroidBrowser, self).__init__(logger) self.prefs_root = prefs_root @@ -155,7 +155,6 @@ class FirefoxAndroidBrowser(Browser): self.browser_channel = browser_channel self.install_fonts = install_fonts self.tests_root = tests_root - self.specialpowers_path = specialpowers_path self.profile_creator = ProfileCreator(logger, prefs_root, @@ -171,23 +170,19 @@ class FirefoxAndroidBrowser(Browser): self.marionette_port = None self.profile = None self.runner = None - self._settings = {} def settings(self, test): - self._settings = {"check_leaks": self.leak_check and not test.leaks, - "lsan_allowed": test.lsan_allowed, - "lsan_max_stack_depth": test.lsan_max_stack_depth, - "mozleak_allowed": self.leak_check and test.mozleak_allowed, - "mozleak_thresholds": self.leak_check and test.mozleak_threshold, - "special_powers": self.specialpowers_path and test.url_base == "/_mozilla/"} - return self._settings + return {"check_leaks": self.leak_check and not test.leaks, + "lsan_allowed": test.lsan_allowed, + "lsan_max_stack_depth": test.lsan_max_stack_depth, + "mozleak_allowed": self.leak_check and test.mozleak_allowed, + "mozleak_thresholds": self.leak_check and test.mozleak_threshold} def start(self, **kwargs): if self.marionette_port is None: self.marionette_port = get_free_port() - addons = [self.specialpowers_path] if self._settings.get("special_powers") else None - self.profile = self.profile_creator.create(addons=addons) + self.profile = self.profile_creator.create() self.profile.set_preferences({"marionette.port": self.marionette_port}) if self.install_fonts: @@ -278,10 +273,7 @@ class FirefoxAndroidBrowser(Browser): self.stop(force) def executor_browser(self): - return ExecutorBrowser, {"marionette_port": self.marionette_port, - # We never want marionette to install extensions because - # that doesn't work on Android; instead they are in the profile - "extensions": []} + return ExecutorBrowser, {"marionette_port": self.marionette_port} def check_crash(self, process, test): if not os.environ.get("MINIDUMP_STACKWALK", "") and self.stackwalk_binary: diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executormarionette.py index 42c1e90c5f3c..e7c9726974b3 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -1,7 +1,5 @@ import json import os -import shutil -import tempfile import threading import time import traceback @@ -47,10 +45,15 @@ from ..webdriver_server import GeckoDriverServer def do_delayed_imports(): - global errors, marionette, Addons + global errors, marionette - from marionette_driver import marionette, errors - from marionette_driver.addons import Addons + # Marionette client used to be called marionette, recently it changed + # to marionette_driver for unfathomable reasons + try: + import marionette + from marionette import errors + except ImportError: + from marionette_driver import marionette, errors def _switch_to_window(marionette, handle): @@ -714,6 +717,7 @@ class MarionetteProtocol(Protocol): class ExecuteAsyncScriptRun(TimedRunner): + def set_timeout(self): timeout = self.timeout @@ -786,8 +790,6 @@ class MarionetteTestharnessExecutor(TestharnessExecutor): self.window_id = str(uuid.uuid4()) self.debug = debug - self.install_extensions = browser.extensions - self.original_pref_values = {} if marionette is None: @@ -795,11 +797,6 @@ class MarionetteTestharnessExecutor(TestharnessExecutor): def setup(self, runner): super(MarionetteTestharnessExecutor, self).setup(runner) - for extension_path in self.install_extensions: - self.logger.info("Installing extension from %s" % extension_path) - addons = Addons(self.protocol.marionette) - addons.install(extension_path) - self.protocol.testharness.load_runner(self.last_environment["protocol"]) def is_alive(self): diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/testrunner.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/testrunner.py index 961c40fc5b80..0bde5ba348ea 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/testrunner.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/testrunner.py @@ -98,12 +98,7 @@ class TestRunner(object): def run(self): """Main loop accepting commands over the pipe and triggering the associated methods""" - try: - self.setup() - except Exception: - self.logger.warning("An error occured during executor setup:\n%s" % - traceback.format_exc()) - raise + self.setup() commands = {"run_test": self.run_test, "reset": self.reset, "stop": self.stop, diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/wptcommandline.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/wptcommandline.py index bf6ee24e260f..532c795cd3c5 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/wptcommandline.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/wptcommandline.py @@ -284,8 +284,6 @@ scheme host and port.""") help="Disable fission in Gecko.") gecko_group.add_argument("--stackfix-dir", dest="stackfix_dir", action="store", help="Path to directory containing assertion stack fixing scripts") - gecko_group.add_argument("--specialpowers-path", action="store", - help="Path to specialPowers extension xpi file") gecko_group.add_argument("--setpref", dest="extra_prefs", action='append', default=[], metavar="PREF=VALUE", help="Defines an extra user preference (overrides those in prefs_root)") diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/wpttest.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/wpttest.py index 1a905da1f7e5..31b245612be0 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/wpttest.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/wpttest.py @@ -157,19 +157,15 @@ class Test(object): default_timeout = 10 # seconds long_timeout = 60 # seconds - def __init__(self, url_base, tests_root, url, inherit_metadata, test_metadata, + def __init__(self, tests_root, url, inherit_metadata, test_metadata, timeout=None, path=None, protocol="http", quic=False): - self.url_base = url_base self.tests_root = tests_root self.url = url self._inherit_metadata = inherit_metadata self._test_metadata = test_metadata self.timeout = timeout if timeout is not None else self.default_timeout self.path = path - self.environment = {"url_base": url_base, - "protocol": protocol, - "prefs": self.prefs, - "quic": quic} + self.environment = {"protocol": protocol, "prefs": self.prefs, "quic": quic} def __eq__(self, other): if not isinstance(other, Test): @@ -188,8 +184,7 @@ class Test(object): @classmethod def from_manifest(cls, manifest_file, manifest_item, inherit_metadata, test_metadata): timeout = cls.long_timeout if manifest_item.timeout == "long" else cls.default_timeout - return cls(manifest_file.url_base, - manifest_file.tests_root, + return cls(manifest_file.tests_root, manifest_item.url, inherit_metadata, test_metadata, @@ -398,10 +393,10 @@ class TestharnessTest(Test): subtest_result_cls = TestharnessSubtestResult test_type = "testharness" - def __init__(self, url_base, tests_root, url, inherit_metadata, test_metadata, + def __init__(self, tests_root, url, inherit_metadata, test_metadata, timeout=None, path=None, protocol="http", testdriver=False, jsshell=False, scripts=None, quic=False): - Test.__init__(self, url_base, tests_root, url, inherit_metadata, test_metadata, timeout, + Test.__init__(self, tests_root, url, inherit_metadata, test_metadata, timeout, path, protocol, quic) self.testdriver = testdriver @@ -417,8 +412,7 @@ class TestharnessTest(Test): script_metadata = manifest_item.script_metadata or [] scripts = [v for (k, v) in script_metadata if k == "script"] - return cls(manifest_file.url_base, - manifest_file.tests_root, + return cls(manifest_file.tests_root, manifest_item.url, inherit_metadata, test_metadata, @@ -458,10 +452,10 @@ class ReftestTest(Test): result_cls = ReftestResult test_type = "reftest" - def __init__(self, url_base, tests_root, url, inherit_metadata, test_metadata, references, + def __init__(self, tests_root, url, inherit_metadata, test_metadata, references, timeout=None, path=None, viewport_size=None, dpi=None, fuzzy=None, protocol="http", quic=False): - Test.__init__(self, url_base, tests_root, url, inherit_metadata, test_metadata, timeout, + Test.__init__(self, tests_root, url, inherit_metadata, test_metadata, timeout, path, protocol, quic) for _, ref_type in references: @@ -492,8 +486,7 @@ class ReftestTest(Test): url = manifest_test.url - node = cls(manifest_file.url_base, - manifest_file.tests_root, + node = cls(manifest_file.tests_root, manifest_test.url, inherit_metadata, test_metadata, @@ -612,7 +605,7 @@ class ReftestTest(Test): class PrintReftestTest(ReftestTest): test_type = "print-reftest" - def __init__(self, url_base, tests_root, url, inherit_metadata, test_metadata, references, + def __init__(self, tests_root, url, inherit_metadata, test_metadata, references, timeout=None, path=None, viewport_size=None, dpi=None, fuzzy=None, page_ranges=None, protocol="http", quic=False): super(PrintReftestTest, self).__init__(tests_root, url, inherit_metadata, test_metadata,