aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWojtek Kosior <koszko@koszko.org>2022-02-17 16:31:42 +0100
committerWojtek Kosior <koszko@koszko.org>2022-02-17 16:34:56 +0100
commitee0a4a935a95a9472655f85a04e1323f3d328898 (patch)
tree2a2228b138be8979f19cca334a8802e33540acbe
parent3e4bde861cdee3312e1d410dc08f67d8e7c9168c (diff)
downloadbrowser-extension-ee0a4a935a95a9472655f85a04e1323f3d328898.tar.gz
browser-extension-ee0a4a935a95a9472655f85a04e1323f3d328898.zip
automatically pick up a free port to run the HTTP proxy on
It is now possible to run multiple `make test` commands in parallel (e.g. testing abrowser and librewolf simultaneously after running `configure` for each of them in 2 different directories).
-rw-r--r--README.md2
-rw-r--r--test/haketilo_test/__main__.py14
-rw-r--r--test/haketilo_test/conftest.py6
-rw-r--r--test/haketilo_test/misc_constants.py1
-rwxr-xr-xtest/haketilo_test/profiles.py12
-rwxr-xr-xtest/haketilo_test/server.py7
6 files changed, 18 insertions, 24 deletions
diff --git a/README.md b/README.md
index 888990c..2fcd39e 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,7 @@ make all # will generate both ./mozilla-build.zip and ./chromium-build.zip
### Configuring
-*Note: like building, testing can be performed out-of-source.*
+*Note: like building, testing can be performed out-of-source; this can be useful when testing under multiple browsers simultaneously*
Running tests requires you to pass some additional information to `configure`. Relevant options are:
diff --git a/test/haketilo_test/__main__.py b/test/haketilo_test/__main__.py
index 3664e8c..18ef5b5 100644
--- a/test/haketilo_test/__main__.py
+++ b/test/haketilo_test/__main__.py
@@ -40,7 +40,7 @@ from .extension_crafting import get_extension_base_url
def fail(msg, error_code):
print('Error:', msg)
- print('Usage:', sys.argv[0], '[--load-haketilo]', '[certificates_directory] [proxy_port]')
+ print('Usage:', sys.argv[0], '[--load-haketilo]', '[certificates_directory]')
sys.exit(error_code)
load_haketilo = False
@@ -55,16 +55,8 @@ certdir = Path(sys.argv[argv_idx]).resolve() if len(sys.argv) > argv_idx \
if not certdir.is_dir():
fail('selected certificate directory does not exist.', 2)
-argv_idx += 1
-
-port = sys.argv[argv_idx] if len(sys.argv) > argv_idx \
- else str(default_proxy_port)
-
-if not port.isnumeric():
- fail('port must be an integer.', 3)
-
-httpd = do_an_internet(certdir, int(port))
-driver = firefox_safe_mode(proxy_port=int(port))
+httpd = do_an_internet(certdir)
+driver = firefox_safe_mode(proxy_port=httpd.server_port)
if load_haketilo:
driver.install_addon(str(Path.cwd() / 'mozilla-build.zip'), temporary=True)
diff --git a/test/haketilo_test/conftest.py b/test/haketilo_test/conftest.py
index 9103ac8..834f026 100644
--- a/test/haketilo_test/conftest.py
+++ b/test/haketilo_test/conftest.py
@@ -46,7 +46,7 @@ def proxy():
@pytest.fixture(scope="session")
def _driver(proxy):
- with firefox_safe_mode() as driver:
+ with firefox_safe_mode(proxy.server_port) as driver:
yield driver
driver.quit()
@@ -57,14 +57,14 @@ def close_all_but_one_window(driver):
driver.switch_to.window(driver.window_handles[0])
@pytest.fixture()
-def driver(_driver, request):
+def driver(proxy, _driver, request):
nav_target = request.node.get_closest_marker('get_page')
nav_target = nav_target.args[0] if nav_target else 'about:blank'
second_driver = request.node.get_closest_marker('second_driver')
if second_driver:
- with firefox_safe_mode() as _driver:
+ with firefox_safe_mode(proxy.server_port) as _driver:
_driver.get(nav_target)
yield _driver
_driver.quit()
diff --git a/test/haketilo_test/misc_constants.py b/test/haketilo_test/misc_constants.py
index ac34f32..d552208 100644
--- a/test/haketilo_test/misc_constants.py
+++ b/test/haketilo_test/misc_constants.py
@@ -46,7 +46,6 @@ with open(Path.cwd() / 'record.conf', 'rt') as conf:
conf_settings[match.group(1).strip()] = match.group(2)
default_proxy_host = '127.0.0.1'
-default_proxy_port = 1337
default_cert_dir = Path.cwd() / 'certs'
diff --git a/test/haketilo_test/profiles.py b/test/haketilo_test/profiles.py
index ae997fc..e1fc368 100755
--- a/test/haketilo_test/profiles.py
+++ b/test/haketilo_test/profiles.py
@@ -80,9 +80,8 @@ def set_webextension_uuid(profile, extension_id, uuid=default_extension_uuid):
profile.set_preference('extensions.webextensions.uuids',
json.dumps({extension_id: uuid}))
-def firefox_safe_mode(firefox_binary=conf_settings['BROWSER_BINARY'],
- proxy_host=default_proxy_host,
- proxy_port=default_proxy_port):
+def firefox_safe_mode(proxy_port, proxy_host=default_proxy_host,
+ firefox_binary=conf_settings['BROWSER_BINARY']):
"""
Initialize a Firefox instance controlled by selenium. The instance is
started in safe mode.
@@ -97,10 +96,9 @@ def firefox_safe_mode(firefox_binary=conf_settings['BROWSER_BINARY'],
return HaketiloFirefox(options=options, firefox_profile=profile,
firefox_binary=firefox_binary)
-def firefox_with_profile(firefox_binary=conf_settings['BROWSER_BINARY'],
- profile_dir=conf_settings['CLEAN_PROFILE'],
- proxy_host=default_proxy_host,
- proxy_port=default_proxy_port):
+def firefox_with_profile(proxy_port, proxy_host=default_proxy_host,
+ firefox_binary=conf_settings['BROWSER_BINARY'],
+ profile_dir=conf_settings['CLEAN_PROFILE']):
"""
Initialize a Firefox instance controlled by selenium. The instance is
started using an empty profile (either the default one or the one passed to
diff --git a/test/haketilo_test/server.py b/test/haketilo_test/server.py
index 0963b5b..19d4a01 100755
--- a/test/haketilo_test/server.py
+++ b/test/haketilo_test/server.py
@@ -33,6 +33,8 @@ from urllib.parse import parse_qs
from threading import Thread
import traceback
+from selenium.webdriver.common.utils import free_port
+
from .proxy_core import ProxyRequestHandler, ThreadingHTTPServer
from .misc_constants import *
from .world_wide_library import catalog as internet
@@ -99,8 +101,11 @@ class RequestHijacker(ProxyRequestHandler):
if resp_body:
self.wfile.write(resp_body)
-def do_an_internet(certdir=default_cert_dir, port=default_proxy_port):
+def do_an_internet(certdir=default_cert_dir, port=None):
"""Start up the proxy/server"""
+ if port is None:
+ port = free_port()
+
class RequestHijackerWithCertdir(RequestHijacker):
def __init__(self, *args, **kwargs):
super().__init__(*args, certdir=certdir, **kwargs)