diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/mozilla/tests/webdriver/new_session | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/mozilla/tests/webdriver/new_session')
7 files changed, 231 insertions, 0 deletions
diff --git a/testing/web-platform/mozilla/tests/webdriver/new_session/__init__.py b/testing/web-platform/mozilla/tests/webdriver/new_session/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webdriver/new_session/__init__.py diff --git a/testing/web-platform/mozilla/tests/webdriver/new_session/bidi_disabled.py b/testing/web-platform/mozilla/tests/webdriver/new_session/bidi_disabled.py new file mode 100644 index 0000000000..eeb5a18740 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webdriver/new_session/bidi_disabled.py @@ -0,0 +1,33 @@ +from copy import deepcopy + + +def test_marionette_fallback_webdriver_session(configuration, geckodriver): + config = deepcopy(configuration) + config["capabilities"]["webSocketUrl"] = True + + prefs = config["capabilities"]["moz:firefoxOptions"].get("prefs", {}) + prefs.update({"remote.active-protocols": 2}) + config["capabilities"]["moz:firefoxOptions"]["prefs"] = prefs + + try: + driver = geckodriver(config=config) + driver.new_session() + + assert driver.session.capabilities.get("webSocketUrl") is None + + # Sanity check that Marionette works as expected and by default returns + # at least one window handle + assert len(driver.session.handles) >= 1 + + finally: + driver.stop() + + # WebDriver BiDi has to be re-enabled. Because we cannot easily + # get rid of the value let geckodriver overwrite it with the current + # default. + prefs.update({"remote.active-protocols": 3}) + + driver = geckodriver(config=config) + driver.new_session() + + assert driver.session.capabilities.get("webSocketUrl") is not None diff --git a/testing/web-platform/mozilla/tests/webdriver/new_session/binary.py b/testing/web-platform/mozilla/tests/webdriver/new_session/binary.py new file mode 100644 index 0000000000..2baa40572b --- /dev/null +++ b/testing/web-platform/mozilla/tests/webdriver/new_session/binary.py @@ -0,0 +1,40 @@ +import os +import sys + +from tests.support.asserts import assert_error, assert_success + + +def test_bad_binary(new_session): + # skipif annotations are forbidden in wpt + if os.path.exists("/bin/echo"): + response, _ = new_session( + { + "capabilities": { + "alwaysMatch": {"moz:firefoxOptions": {"binary": "/bin/echo"}} + } + } + ) + assert_error(response, "invalid argument") + + +def test_shell_script_binary(new_session, configuration): + # skipif annotations are forbidden in wpt + if sys.platform == "linux": + capabilities = configuration["capabilities"].copy() + script = ( + """#!/bin/bash + +%s $@""" + % capabilities["moz:firefoxOptions"]["binary"] + ) + path = os.path.abspath("firefox.sh") + assert not os.path.exists(path) + try: + with open("firefox.sh", "w") as f: + f.write(script) + os.chmod(path, 0o744) + capabilities["moz:firefoxOptions"]["binary"] = path + response, _ = new_session({"capabilities": capabilities}) + assert_success(response) + finally: + os.unlink(path) diff --git a/testing/web-platform/mozilla/tests/webdriver/new_session/conftest.py b/testing/web-platform/mozilla/tests/webdriver/new_session/conftest.py new file mode 100644 index 0000000000..1cab6784c2 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webdriver/new_session/conftest.py @@ -0,0 +1,58 @@ +import pytest +from webdriver.transport import HTTPWireProtocol + + +@pytest.fixture(name="configuration") +def fixture_configuration(configuration): + """Remove "acceptInsecureCerts" from capabilities if it exists. + + Some browser configurations add acceptInsecureCerts capability by default. + Remove it during new_session tests to avoid interference. + """ + if "acceptInsecureCerts" in configuration["capabilities"]: + configuration = dict(configuration) + del configuration["capabilities"]["acceptInsecureCerts"] + return configuration + + +@pytest.fixture(name="new_session") +def fixture_new_session(request, configuration, current_session): + """Start a new session for tests which themselves test creating new sessions. + + :param body: The content of the body for the new session POST request. + + :param delete_existing_session: Allows the fixture to delete an already + created custom session before the new session is getting created. This + is useful for tests which call this fixture multiple times within the + same test. + """ + custom_session = {} + + transport = HTTPWireProtocol( + configuration["host"], + configuration["port"], + url_prefix="/", + ) + + def _delete_session(session_id): + transport.send("DELETE", "session/{}".format(session_id)) + + def new_session(body, delete_existing_session=False, headers=None): + # If there is an active session from the global session fixture, + # delete that one first + if current_session is not None: + current_session.end() + + if delete_existing_session: + _delete_session(custom_session["session"]["sessionId"]) + + response = transport.send("POST", "session", body, headers=headers) + if response.status == 200: + custom_session["session"] = response.body["value"] + return response, custom_session.get("session", None) + + yield new_session + + if custom_session.get("session") is not None: + _delete_session(custom_session["session"]["sessionId"]) + custom_session = None diff --git a/testing/web-platform/mozilla/tests/webdriver/new_session/create.py b/testing/web-platform/mozilla/tests/webdriver/new_session/create.py new file mode 100644 index 0000000000..9649b938ad --- /dev/null +++ b/testing/web-platform/mozilla/tests/webdriver/new_session/create.py @@ -0,0 +1,11 @@ +# META: timeout=long +from tests.support.asserts import assert_success + + +def test_valid_content_type(new_session, configuration): + headers = {"content-type": "application/json"} + response, _ = new_session( + {"capabilities": {"alwaysMatch": dict(configuration["capabilities"])}}, + headers=headers, + ) + assert_success(response) diff --git a/testing/web-platform/mozilla/tests/webdriver/new_session/invalid.py b/testing/web-platform/mozilla/tests/webdriver/new_session/invalid.py new file mode 100644 index 0000000000..dc7a0caee9 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webdriver/new_session/invalid.py @@ -0,0 +1,53 @@ +from copy import deepcopy + +import pytest +from tests.support.asserts import assert_error + + +@pytest.mark.parametrize( + "headers", + [ + {"origin": "http://localhost"}, + {"origin": "http://localhost:8000"}, + {"origin": "http://127.0.0.1"}, + {"origin": "http://127.0.0.1:8000"}, + {"origin": "null"}, + {"ORIGIN": "https://example.org"}, + {"host": "example.org:4444"}, + {"Host": "example.org"}, + {"host": "localhost:80"}, + {"host": "localhost"}, + {"content-type": "application/x-www-form-urlencoded"}, + {"content-type": "multipart/form-data"}, + {"content-type": "text/plain"}, + {"Content-TYPE": "APPLICATION/x-www-form-urlencoded"}, + {"content-type": "MULTIPART/FORM-DATA"}, + {"CONTENT-TYPE": "TEXT/PLAIN"}, + {"content-type": "text/plain ; charset=utf-8"}, + {"content-type": "text/plain;foo"}, + {"content-type": "text/PLAIN ; foo;charset=utf8"}, + ], +) +def test_invalid(new_session, configuration, headers): + response, _ = new_session( + {"capabilities": {"alwaysMatch": dict(configuration["capabilities"])}}, + headers=headers, + ) + assert_error(response, "unknown error") + + +@pytest.mark.parametrize( + "argument", + [ + "--marionette", + "--remote-debugging-port", + "--remote-allow-hosts", + "--remote-allow-origins", + ], +) +def test_forbidden_arguments(configuration, new_session, argument): + capabilities = deepcopy(configuration["capabilities"]) + capabilities["moz:firefoxOptions"]["args"] = [argument] + + response, _ = new_session({"capabilities": {"alwaysMatch": capabilities}}) + assert_error(response, "invalid argument") diff --git a/testing/web-platform/mozilla/tests/webdriver/new_session/profile_root.py b/testing/web-platform/mozilla/tests/webdriver/new_session/profile_root.py new file mode 100644 index 0000000000..582e7124e4 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webdriver/new_session/profile_root.py @@ -0,0 +1,36 @@ +import copy +import os + +import pytest + + +def test_profile_root(tmp_path, configuration, geckodriver): + profile_path = os.path.join(tmp_path, "geckodriver-test") + os.makedirs(profile_path) + + config = copy.deepcopy(configuration) + # Ensure we don't set a profile in command line arguments + del config["capabilities"]["moz:firefoxOptions"]["args"] + + extra_args = ["--profile-root", profile_path] + + assert os.listdir(profile_path) == [] + + driver = geckodriver(config=config, extra_args=extra_args) + driver.new_session() + assert len(os.listdir(profile_path)) == 1 + driver.delete_session() + assert os.listdir(profile_path) == [] + + +def test_profile_root_missing(tmp_path, configuration, geckodriver): + profile_path = os.path.join(tmp_path, "missing-path") + + config = copy.deepcopy(configuration) + # Ensure we don't set a profile in command line arguments + del config["capabilities"]["moz:firefoxOptions"]["args"] + + extra_args = ["--profile-root", profile_path] + + with pytest.raises(Exception): + geckodriver(config=config, extra_args=extra_args) |