From 21055a39fcca455fafcdfa7eeadee466be8f472b Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 5 Nov 2021 14:34:31 +0100 Subject: Set config.backend in pytest_configure() For now this just serves the purpose of making the information available to the pytest_report_header() hook, where we want to report, which backend is used when running tests. --- tests/conftest.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 40631af34..c00fcf6bf 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -219,6 +219,16 @@ def pytest_addoption(parser): def pytest_configure(config): + try: + # Try to use QtWebkit as the default backend + import PyQt5.QtWebKitWidgets + config.backend = 'webkit' + except ImportError: + # Try to use QtWebEngine as a fallback and fail early + # if that's also not available + import PyQt5.QtWebEngineWidgets + config.backend = 'webengine' + webengine_arg = config.getoption('--qute-bdd-webengine') webengine_env = os.environ.get('QUTE_BDD_WEBENGINE', 'false') config.webengine = webengine_arg or webengine_env == 'true' -- cgit v1.2.3-54-g00ecf From 53a1d45dd3b8eaa02dc848a8bd2d58db20d98ff6 Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 5 Nov 2021 14:43:21 +0100 Subject: Consider auto-detection when setting config.webengine Since config.webengine is widely used in the codebase, I decided to keep it instead of replacing it entirely by using config.backend. --- tests/conftest.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index c00fcf6bf..cc6cb970f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -231,10 +231,9 @@ def pytest_configure(config): webengine_arg = config.getoption('--qute-bdd-webengine') webengine_env = os.environ.get('QUTE_BDD_WEBENGINE', 'false') - config.webengine = webengine_arg or webengine_env == 'true' - # Fail early if QtWebEngine is not available - if config.webengine: - import PyQt5.QtWebEngineWidgets + config.webengine = (webengine_arg or webengine_env == 'true' or + config.backend == 'webengine') + earlyinit.configure_pyqt() -- cgit v1.2.3-54-g00ecf From 572ecd7fb1fa4463032d0dc00213ecafe2224d01 Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 5 Nov 2021 14:50:18 +0100 Subject: Report backend in pytest_report_header() --- tests/conftest.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index cc6cb970f..beab14a52 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -237,6 +237,10 @@ def pytest_configure(config): earlyinit.configure_pyqt() +def pytest_report_header(config): + return f'backend: {config.backend}' + + @pytest.fixture(scope='session', autouse=True) def check_display(request): if utils.is_linux and not os.environ.get('DISPLAY', ''): -- cgit v1.2.3-54-g00ecf From afd78ad24847a2ca340e7101505de6a04ca805b8 Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 5 Nov 2021 14:50:50 +0100 Subject: Enable backend auto-detection Setting QUTE_BDD_WEBENGINE=true overrides the auto-detection mechanism. --- tox.ini | 2 -- 1 file changed, 2 deletions(-) diff --git a/tox.ini b/tox.ini index 271bf4241..f52d7b158 100644 --- a/tox.ini +++ b/tox.ini @@ -13,7 +13,6 @@ minversion = 3.15 setenv = PYTEST_QT_API=pyqt5 pyqt{,512,513,514,515,5150}: LINK_PYQT_SKIP=true - pyqt{,512,513,514,515,5150}: QUTE_BDD_WEBENGINE=true cov: PYTEST_ADDOPTS=--cov --cov-report xml --cov-report=html --cov-report= passenv = PYTHON DISPLAY XAUTHORITY HOME USERNAME USER CI XDG_* QUTE_* DOCKER QT_QUICK_BACKEND PY_COLORS DBUS_SESSION_BUS_ADDRESS basepython = @@ -42,7 +41,6 @@ commands = basepython = {env:PYTHON:python3} setenv = PYTEST_QT_API=pyqt5 - QUTE_BDD_WEBENGINE=true pip_pre = true deps = -r{toxinidir}/misc/requirements/requirements-tests-bleeding.txt commands_pre = pip install --index-url https://www.riverbankcomputing.com/pypi/simple/ --pre --upgrade PyQt5 PyQtWebEngine -- cgit v1.2.3-54-g00ecf From 7fcfb9b6350bb5b5af6301affeb5dc63f4777196 Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 5 Nov 2021 15:50:41 +0100 Subject: Enable overriding of backend auto-detection One can override the auto-detection mechanism by passing the backend via --qute-bdd-backend= or by setting the environment variable QUTE_BDD_BACKEND=. --- tests/conftest.py | 11 ++++++----- tests/end2end/conftest.py | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index beab14a52..120c6a0f5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -214,8 +214,8 @@ def pytest_addoption(parser): help="Delay between qutebrowser commands.") parser.addoption('--qute-profile-subprocs', action='store_true', default=False, help="Run cProfile for subprocesses.") - parser.addoption('--qute-bdd-webengine', action='store_true', - help='Use QtWebEngine for BDD tests') + parser.addoption('--qute-bdd-backend', action='store', + choices=['webkit', 'webengine'], help='Set backend for BDD tests') def pytest_configure(config): @@ -229,9 +229,10 @@ def pytest_configure(config): import PyQt5.QtWebEngineWidgets config.backend = 'webengine' - webengine_arg = config.getoption('--qute-bdd-webengine') - webengine_env = os.environ.get('QUTE_BDD_WEBENGINE', 'false') - config.webengine = (webengine_arg or webengine_env == 'true' or + webengine_arg = config.getoption('--qute-bdd-backend') + webengine_env = os.environ.get('QUTE_BDD_BACKEND') + config.webengine = (webengine_arg == 'webengine' or + webengine_env == 'webengine' or config.backend == 'webengine') earlyinit.configure_pyqt() diff --git a/tests/end2end/conftest.py b/tests/end2end/conftest.py index a4a089cea..563c380f2 100644 --- a/tests/end2end/conftest.py +++ b/tests/end2end/conftest.py @@ -165,7 +165,7 @@ if not getattr(sys, 'frozen', False): def pytest_collection_modifyitems(config, items): - """Apply @qtwebengine_* markers; skip unittests with QUTE_BDD_WEBENGINE.""" + """Apply @qtwebengine_* markers; skip unittests with QUTE_BDD_BACKEND=webengine.""" # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-75884 # (note this isn't actually fixed properly before Qt 5.15) header_bug_fixed = qtutils.version_check('5.15', compiled=False) -- cgit v1.2.3-54-g00ecf From 8bb782332f3a54aa1926257f2e4139c1b7b772b3 Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Mon, 8 Nov 2021 15:01:00 +0100 Subject: Additionally report backend's version To give more information we report the version additionally to the backend's name. --- tests/conftest.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 120c6a0f5..8a5110ce4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -239,7 +239,14 @@ def pytest_configure(config): def pytest_report_header(config): - return f'backend: {config.backend}' + if config.backend == 'webkit': + backend_version = version.qWebKitVersion() + elif config.backend == 'webengine': + backend_version = version.qtwebengine_versions(avoid_init=True) + else: + raise utils.Unreachable(config.backend) + + return f'backend: {config.backend} ({backend_version})' @pytest.fixture(scope='session', autouse=True) -- cgit v1.2.3-54-g00ecf From a697e25094340d55a90cce75b4ec05c8b84eb2b6 Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 12 Nov 2021 06:47:48 +0100 Subject: Fix spelling Co-authored-by: Florian Bruhin --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 8a5110ce4..d9070df3a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -220,7 +220,7 @@ def pytest_addoption(parser): def pytest_configure(config): try: - # Try to use QtWebkit as the default backend + # Try to use QtWebKit as the default backend import PyQt5.QtWebKitWidgets config.backend = 'webkit' except ImportError: -- cgit v1.2.3-54-g00ecf From 5ea946277e9d9fb0199ed1774011591f7d13cd7b Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 12 Nov 2021 14:47:29 +0100 Subject: Rename variable Co-authored-by: Florian Bruhin --- tests/conftest.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index d9070df3a..9e1fd6f06 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -229,10 +229,10 @@ def pytest_configure(config): import PyQt5.QtWebEngineWidgets config.backend = 'webengine' - webengine_arg = config.getoption('--qute-bdd-backend') - webengine_env = os.environ.get('QUTE_BDD_BACKEND') - config.webengine = (webengine_arg == 'webengine' or - webengine_env == 'webengine' or + backend_arg = config.getoption('--qute-bdd-backend') + backend_env = os.environ.get('QUTE_BDD_BACKEND') + config.webengine = (backend_arg == 'webengine' or + backend_env == 'webengine' or config.backend == 'webengine') earlyinit.configure_pyqt() -- cgit v1.2.3-54-g00ecf From 59054e48b953bede603b2052c96a6d7de78abc7d Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 12 Nov 2021 16:13:33 +0100 Subject: Use config.webengine in pytest_report_header() --- tests/conftest.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 9e1fd6f06..840ae3752 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -239,14 +239,12 @@ def pytest_configure(config): def pytest_report_header(config): - if config.backend == 'webkit': - backend_version = version.qWebKitVersion() - elif config.backend == 'webengine': + if config.webengine: backend_version = version.qtwebengine_versions(avoid_init=True) else: - raise utils.Unreachable(config.backend) + backend_version = version.qWebKitVersion() - return f'backend: {config.backend} ({backend_version})' + return f'backend: {backend_version}' @pytest.fixture(scope='session', autouse=True) -- cgit v1.2.3-54-g00ecf From 256900b87a96485d7658ee26df8c96c16559eb0f Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 12 Nov 2021 16:19:22 +0100 Subject: Extract backend selection into functions In order to fix the issue of silently using QtWebEngine when e.g. --qute-bdd-backend=webkit is given, even though QtWebEngine is not available, I moved the selection logic into separate functions to clear things up a little. I tried to avoid the duplicate imports, in case the backend is auto-selected, but after a while of thinking I abandoned that idea in favor of moving forward with this. --- tests/conftest.py | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 840ae3752..e1787fc83 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -219,23 +219,39 @@ def pytest_addoption(parser): def pytest_configure(config): + backend = _select_backend(config) + config.webengine = backend == 'webengine' + + earlyinit.configure_pyqt() + + +def _select_backend(config): + backend_arg = config.getoption('--qute-bdd-backend') + backend_env = os.environ.get('QUTE_BDD_BACKEND') + + backend = backend_arg or backend_env or _auto_select_backend() + + # Fail early if selected backend is not available + if backend == 'webkit': + import PyQt5.QtWebKitWidgets + elif backend == 'webengine': + import PyQt5.QtWebEngineWidgets + else: + raise utils.Unreachable(backend) + + return backend + + +def _auto_select_backend(): try: # Try to use QtWebKit as the default backend import PyQt5.QtWebKitWidgets - config.backend = 'webkit' + return 'webkit' except ImportError: # Try to use QtWebEngine as a fallback and fail early # if that's also not available import PyQt5.QtWebEngineWidgets - config.backend = 'webengine' - - backend_arg = config.getoption('--qute-bdd-backend') - backend_env = os.environ.get('QUTE_BDD_BACKEND') - config.webengine = (backend_arg == 'webengine' or - backend_env == 'webengine' or - config.backend == 'webengine') - - earlyinit.configure_pyqt() + return 'webengine' def pytest_report_header(config): -- cgit v1.2.3-54-g00ecf From 437438d2422d8719028a00176a4d914ed92e1fff Mon Sep 17 00:00:00 2001 From: Philipp Albrecht Date: Fri, 12 Nov 2021 16:37:25 +0100 Subject: Add docstring to _select_backend() --- tests/conftest.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index e1787fc83..ee4572fad 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -226,6 +226,25 @@ def pytest_configure(config): def _select_backend(config): + """Select the backend for running tests. + + The backend is auto-selected in the following manner: + 1. Use QtWebKit if available + 2. Otherwise use QtWebEngine as a fallback + + Auto-selection is overridden by either passing a backend via + `--qute-bdd-backend=` or setting the environment variable + `QUTE_BDD_BACKEND=`. + + Args: + config: pytest config + + Raises: + ImportError if the selected backend is not available. + + Returns: + The selected backend as a string (e.g. 'webkit'). + """ backend_arg = config.getoption('--qute-bdd-backend') backend_env = os.environ.get('QUTE_BDD_BACKEND') -- cgit v1.2.3-54-g00ecf