Commit ad218023 authored by Sam Sneddon's avatar Sam Sneddon Committed by aborovova@mozilla.com
Browse files

Bug 1967685 [wpt PR 52455] - Expose the manager_number to the Browser class itself,



Automatic update from web-platform-tests
Expose the manager_number to the Browser class itself

The goal here is for browser classes to be able to have the ability to
get at data items specific to the current thread (e.g., with
--processes=X, each of the X concurrently existing Browser objects
should be able to get their own kwargs).

This avoids needing to hardcode specific browser settings in
wptrunner.testrunner, which is a layering violation.

Adding a required argument to wptrunner.browsers.base.Browser
obviously carries a risk, as shown by the number of browsers which
needed modified to correctly pass through unknown keyword arguments to
their parents, but I don't think there's a reasonable alternative to
doing this.

Co-authored-by: default avatarJonathan Lee <jonathanjlee@google.com>

--

wpt-commits: 4e4d767ead29ec6329f2a89db09d562938f691ff
wpt-pr: 52455

Differential Revision: https://phabricator.services.mozilla.com/D250957
parent abd65c6c
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -86,17 +86,9 @@ class SystemWebViewShell(ChromeAndroidBrowserBase):
    ``wptrunner.webdriver.ChromeDriverServer``.
    """

    def __init__(self, logger, binary, webdriver_binary="chromedriver",
                 adb_binary=None,
                 device_serial=None,
                 webdriver_args=None,
                 stackwalk_binary=None,
                 symbols_path=None):
    def __init__(self, logger, *, binary=None, **kwargs):
        """Creates a new representation of Chrome.  The `binary` argument gives
        the browser binary to use for testing."""
        super().__init__(logger,
                         webdriver_binary, adb_binary,
                         device_serial, webdriver_args, stackwalk_binary,
                         symbols_path)
        super().__init__(logger, **kwargs)
        self.binary = binary
        self.wptserver_ports = _wptserve_ports
+6 −5
Original line number Diff line number Diff line
@@ -103,8 +103,12 @@ class Browser:

    init_timeout: float = 30

    def __init__(self, logger: StructuredLogger):
    def __init__(self, logger: StructuredLogger, *, manager_number: int, **kwargs: Any):
        if kwargs:
            logger.warning(f"Browser.__init__ kwargs: {kwargs!r}")
        super().__init__(**kwargs)
        self.logger = logger
        self.manager_number = manager_number

    def setup(self) -> None:
        """Used for browser-specific setup that happens at the start of a test run"""
@@ -167,9 +171,6 @@ class Browser:


class NullBrowser(Browser):
    def __init__(self, logger: StructuredLogger, **kwargs: Any):
        super().__init__(logger)

    def start(self, group_metadata: GroupMetadata, **kwargs: Any) -> None:
        """No-op browser to use in scenarios where the TestRunnerManager shouldn't
        actually own the browser process (e.g. Servo where we start one browser
@@ -305,7 +306,7 @@ class WebDriverBrowser(Browser):
                 env: Optional[Mapping[str, str]] = None,
                 supports_pac: bool = True,
                 **kwargs: Any):
        super().__init__(logger)
        super().__init__(logger, **kwargs)

        if webdriver_binary is None:
            raise ValueError("WebDriver server binary must be given "
+7 −19
Original line number Diff line number Diff line
@@ -121,18 +121,15 @@ class LogcatRunner:
class ChromeAndroidBrowserBase(WebDriverBrowser):
    def __init__(self,
                 logger,
                 webdriver_binary="chromedriver",
                 *,
                 adb_binary=None,
                 device_serial=None,
                 webdriver_args=None,
                 stackwalk_binary=None,
                 symbols_path=None):
        super().__init__(logger,
                         binary=None,
                         webdriver_binary=webdriver_binary,
                         webdriver_args=webdriver_args,)
                 symbols_path=None,
                 **kwargs):
        super().__init__(logger, **kwargs)
        self.adb_binary = adb_binary or "adb"
        self.device_serial = device_serial
        self.device_serial = device_serial[self.manager_number]
        self.stackwalk_binary = stackwalk_binary
        self.symbols_path = symbols_path
        self.logcat_runner = LogcatRunner(self.logger, self)
@@ -210,16 +207,7 @@ class ChromeAndroidBrowser(ChromeAndroidBrowserBase):
    ``wptrunner.webdriver.ChromeDriverServer``.
    """

    def __init__(self, logger, package_name,
                 webdriver_binary="chromedriver",
                 adb_binary=None,
                 device_serial=None,
                 webdriver_args=None,
                 stackwalk_binary=None,
                 symbols_path=None):
        super().__init__(logger,
                         webdriver_binary, adb_binary,
                         device_serial, webdriver_args, stackwalk_binary,
                         symbols_path)
    def __init__(self, logger, *, package_name, **kwargs):
        super().__init__(logger, **kwargs)
        self.package_name = package_name
        self.wptserver_ports = _wptserve_ports
+22 −14
Original line number Diff line number Diff line
@@ -107,11 +107,8 @@ def check_args(**kwargs):
def browser_kwargs(logger, test_type, run_info_data, config, subsuite, **kwargs):
    browser_kwargs = {"binary": kwargs["binary"],
                      "package_name": None,
                      "webdriver_binary": kwargs["webdriver_binary"],
                      "webdriver_args": kwargs["webdriver_args"].copy(),
                      "prefs_root": kwargs["prefs_root"],
                      "extra_prefs": kwargs["extra_prefs"].copy(),
                      "test_type": test_type,
                      "debug_info": kwargs["debug_info"],
                      "symbols_path": kwargs["symbols_path"],
                      "stackwalk_binary": kwargs["stackwalk_binary"],
@@ -120,22 +117,35 @@ def browser_kwargs(logger, test_type, run_info_data, config, subsuite, **kwargs)
                      "e10s": kwargs["gecko_e10s"],
                      "disable_fission": kwargs["disable_fission"],
                      "stackfix_dir": kwargs["stackfix_dir"],
                      "binary_args": kwargs["binary_args"].copy(),
                      "timeout_multiplier": get_timeout_multiplier(test_type, run_info_data, **kwargs),
                      "leak_check": run_info_data["debug"] and (kwargs["leak_check"] is not False),
                      "asan": run_info_data.get("asan"),
                      "chaos_mode_flags": kwargs["chaos_mode_flags"],
                      "config": config,
                      "browser_channel": kwargs["browser_channel"],
                      "headless": kwargs["headless"],
                      "preload_browser": kwargs["preload_browser"] and not kwargs["pause_after_test"] and not kwargs["num_test_groups"] == 1,
                      "specialpowers_path": kwargs["specialpowers_path"],
                      "allow_list_paths": kwargs["allow_list_paths"],
                      "gmp_path": kwargs["gmp_path"] if "gmp_path" in kwargs else None,
                      "debug_test": kwargs["debug_test"]}
    if test_type == "wdspec" and kwargs["binary"]:

    if test_type == "wdspec":
        browser_kwargs["webdriver_binary"] = kwargs["webdriver_binary"]
        browser_kwargs["webdriver_args"] = kwargs["webdriver_args"].copy()

        if kwargs["binary"]:
            browser_kwargs["webdriver_args"].extend(["--binary", kwargs["binary"]])

    else:
        browser_kwargs["binary_args"] = kwargs["binary_args"].copy()
        browser_kwargs["binary_args"].extend(subsuite.config.get("binary_args", []))
        browser_kwargs["preload_browser"] = (
            kwargs["preload_browser"] and
            not kwargs["pause_after_test"] and
            not kwargs["num_test_groups"] == 1
        )
        browser_kwargs["specialpowers_path"] = kwargs["specialpowers_path"]
        browser_kwargs["test_type"] = test_type
        browser_kwargs["timeout_multiplier"] = get_timeout_multiplier(test_type, run_info_data, **kwargs)

    browser_kwargs["extra_prefs"].extend(subsuite.config.get("prefs", []))
    return browser_kwargs

@@ -823,9 +833,7 @@ class FirefoxBrowser(Browser):
                 browser_channel="nightly", headless=None, preload_browser=False,
                 specialpowers_path=None, debug_test=False, allow_list_paths=None,
                 gmp_path=None, **kwargs):
        Browser.__init__(self, logger)

        self.logger = logger
        super().__init__(logger, **kwargs)

        if timeout_multiplier:
            self.init_timeout = self.init_timeout * timeout_multiplier
@@ -931,7 +939,7 @@ class FirefoxWdSpecBrowser(WebDriverBrowser):
                 headless=None, debug_test=False, profile_creator_cls=ProfileCreator,
                 allow_list_paths=None, gmp_path=None, **kwargs):

        super().__init__(logger, binary, webdriver_binary, webdriver_args)
        super().__init__(logger, binary, webdriver_binary, webdriver_args, **kwargs)
        self.binary = binary
        self.package_name = package_name
        self.webdriver_binary = webdriver_binary
+45 −53
Original line number Diff line number Diff line
@@ -47,35 +47,42 @@ def check_args(**kwargs):


def browser_kwargs(logger, test_type, run_info_data, config, **kwargs):
    return {"adb_binary": kwargs["adb_binary"],
            "webdriver_binary": kwargs["webdriver_binary"],
            "webdriver_args": kwargs["webdriver_args"].copy(),
            "binary": None,
    browser_kwargs = {"adb_binary": kwargs["adb_binary"],
                      "package_name": kwargs["package_name"],
                      "device_serial": kwargs["device_serial"],
                      "prefs_root": kwargs["prefs_root"],
                      "extra_prefs": kwargs["extra_prefs"].copy(),
            "test_type": test_type,
                      "debug_info": kwargs["debug_info"],
                      "symbols_path": kwargs["symbols_path"],
                      "stackwalk_binary": kwargs["stackwalk_binary"],
                      "certutil_binary": kwargs["certutil_binary"],
                      "ca_certificate_path": config.ssl_config["ca_cert_path"],
                      "stackfix_dir": kwargs["stackfix_dir"],
            "binary_args": kwargs["binary_args"].copy(),
            "timeout_multiplier": get_timeout_multiplier(test_type,
                                                         run_info_data,
                                                         **kwargs),
                      "disable_fission": kwargs["disable_fission"],
                      # desktop only
                      "leak_check": False,
                      "chaos_mode_flags": kwargs["chaos_mode_flags"],
                      "config": config,
            "install_fonts": kwargs["install_fonts"],
            "tests_root": config.doc_root,
            "specialpowers_path": kwargs["specialpowers_path"],
                      "debug_test": kwargs["debug_test"],
            "env_extras": dict([x.split('=') for x in kwargs.get("env", [])])}
                      }

    if test_type == "wdspec":
        browser_kwargs["webdriver_binary"] = kwargs["webdriver_binary"]
        browser_kwargs["webdriver_args"] = kwargs["webdriver_args"].copy()
        browser_kwargs["binary"] = None

    else:
        browser_kwargs["test_type"] = test_type
        browser_kwargs["binary_args"] = kwargs["binary_args"].copy()
        browser_kwargs["timeout_multiplier"] = get_timeout_multiplier(test_type,
                                                                      run_info_data,
                                                                      **kwargs)
        browser_kwargs["install_fonts"] = kwargs["install_fonts"]
        browser_kwargs["tests_root"] = config.doc_root
        browser_kwargs["specialpowers_path"] = kwargs["specialpowers_path"]
        browser_kwargs["env_extras"] = dict([x.split('=') for x in kwargs.get("env", [])])

    return browser_kwargs


def executor_kwargs(logger, test_type, test_environment, run_info_data,
@@ -207,13 +214,13 @@ class FirefoxAndroidBrowser(Browser):
                 binary_args=None, timeout_multiplier=None, leak_check=False, asan=False,
                 chaos_mode_flags=None, config=None, browser_channel="nightly",
                 install_fonts=False, tests_root=None, specialpowers_path=None, adb_binary=None,
                 debug_test=False, disable_fission=False, **kwargs):
                 debug_test=False, disable_fission=False, env_extras=None, **kwargs):

        super().__init__(logger)
        super().__init__(logger, **kwargs)
        self.prefs_root = prefs_root
        self.test_type = test_type
        self.package_name = package_name
        self.device_serial = device_serial
        self.device_serial = device_serial[self.manager_number]
        self.debug_info = debug_info
        self.symbols_path = symbols_path
        self.stackwalk_binary = stackwalk_binary
@@ -249,7 +256,7 @@ class FirefoxAndroidBrowser(Browser):
        self.marionette_port = None
        self.profile = None
        self.runner = None
        self.env_extras = kwargs["env_extras"]
        self.env_extras = env_extras
        self._settings = {}

    def settings(self, test):
@@ -372,29 +379,14 @@ class FirefoxAndroidBrowser(Browser):


class FirefoxAndroidWdSpecBrowser(FirefoxWdSpecBrowser):
    def __init__(self, logger, prefs_root, webdriver_binary, webdriver_args,
                 extra_prefs=None, debug_info=None, symbols_path=None, stackwalk_binary=None,
                 certutil_binary=None, ca_certificate_path=None,
                 disable_fission=False, stackfix_dir=None, leak_check=False,
                 asan=False, chaos_mode_flags=None, config=None,
                 browser_channel="nightly", headless=None, debug_test=None,
                 binary=None, package_name="org.mozilla.geckoview.test_runner", device_serial=None,
                 adb_binary=None, profile_creator_cls=ProfileCreator, **kwargs):

        super().__init__(logger, None, package_name, prefs_root, webdriver_binary, webdriver_args,
                         extra_prefs=extra_prefs, debug_info=debug_info, symbols_path=symbols_path,
                         stackwalk_binary=stackwalk_binary, certutil_binary=certutil_binary,
                         ca_certificate_path=ca_certificate_path,
                         disable_fission=disable_fission, stackfix_dir=stackfix_dir,
                         leak_check=leak_check, asan=asan,
                         chaos_mode_flags=chaos_mode_flags, config=config,
                         browser_channel=browser_channel, headless=headless,
                         debug_test=debug_test, profile_creator_cls=profile_creator_cls, **kwargs)
    def __init__(self, logger, config=None, device_serial=None, adb_binary=None, **kwargs):

        super().__init__(logger, config=config, **kwargs)

        self.config = config
        self.device_serial = device_serial
        self.device_serial = device_serial[self.manager_number]
        # This is just to support the same adb lookup as for other test types
        context = get_app_context("fennec")(adb_path=adb_binary, device_serial=device_serial)
        context = get_app_context("fennec")(adb_path=adb_binary, device_serial=self.device_serial)
        self.device = context.get_device(context.adb, self.device_serial)

    def start(self, group_metadata, **kwargs):
Loading