2015-04-03 00:05:20 +02:00
|
|
|
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
|
|
|
|
|
2017-05-09 21:37:03 +02:00
|
|
|
# Copyright 2014-2017 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
|
2015-04-03 00:05:20 +02:00
|
|
|
#
|
|
|
|
# This file is part of qutebrowser.
|
|
|
|
#
|
|
|
|
# qutebrowser is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# qutebrowser is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2017-04-13 18:00:36 +02:00
|
|
|
# pylint: disable=unused-import,wildcard-import,unused-wildcard-import
|
2015-08-18 20:43:42 +02:00
|
|
|
|
2015-11-23 11:17:26 +01:00
|
|
|
"""The qutebrowser test suite conftest file."""
|
2015-04-03 00:05:20 +02:00
|
|
|
|
2015-06-28 22:58:48 +02:00
|
|
|
import os
|
|
|
|
import sys
|
2015-10-01 21:34:00 +02:00
|
|
|
import warnings
|
2015-04-13 07:47:09 +02:00
|
|
|
|
2015-04-03 00:05:20 +02:00
|
|
|
import pytest
|
2015-12-15 18:09:52 +01:00
|
|
|
import hypothesis
|
2016-11-10 22:37:53 +01:00
|
|
|
from PyQt5.QtCore import PYQT_VERSION
|
2015-04-03 00:05:20 +02:00
|
|
|
|
2016-08-26 06:22:03 +02:00
|
|
|
pytest.register_assert_rewrite('helpers')
|
|
|
|
|
2015-12-01 22:45:59 +01:00
|
|
|
from helpers import logfail
|
|
|
|
from helpers.logfail import fail_on_logging
|
|
|
|
from helpers.messagemock import message_mock
|
2017-04-13 18:00:36 +02:00
|
|
|
from helpers.fixtures import *
|
2017-09-13 11:55:52 +02:00
|
|
|
from qutebrowser.utils import qtutils, standarddir
|
2015-04-09 00:14:06 +02:00
|
|
|
|
2017-07-03 22:56:53 +02:00
|
|
|
import qutebrowser.app # To register commands
|
|
|
|
|
2015-04-09 00:14:06 +02:00
|
|
|
|
2015-12-15 18:09:52 +01:00
|
|
|
# Set hypothesis settings
|
2016-01-10 21:57:06 +01:00
|
|
|
hypothesis.settings.register_profile('default',
|
|
|
|
hypothesis.settings(strict=True))
|
|
|
|
hypothesis.settings.load_profile('default')
|
2015-12-15 18:09:52 +01:00
|
|
|
|
|
|
|
|
2017-03-29 07:56:07 +02:00
|
|
|
def _apply_platform_markers(config, item):
|
2015-10-02 09:26:33 +02:00
|
|
|
"""Apply a skip marker to a given item."""
|
|
|
|
markers = [
|
2016-02-27 02:45:34 +01:00
|
|
|
('posix', os.name != 'posix', "Requires a POSIX os"),
|
|
|
|
('windows', os.name != 'nt', "Requires Windows"),
|
|
|
|
('linux', not sys.platform.startswith('linux'), "Requires Linux"),
|
2017-07-08 11:12:43 +02:00
|
|
|
('mac', sys.platform != 'darwin', "Requires macOS"),
|
|
|
|
('not_mac', sys.platform == 'darwin', "Skipped on macOS"),
|
2016-02-27 02:45:34 +01:00
|
|
|
('not_frozen', getattr(sys, 'frozen', False),
|
|
|
|
"Can't be run when frozen"),
|
|
|
|
('frozen', not getattr(sys, 'frozen', False),
|
|
|
|
"Can only run when frozen"),
|
|
|
|
('ci', 'CI' not in os.environ, "Only runs on CI."),
|
2017-07-04 10:36:25 +02:00
|
|
|
('no_ci', 'CI' in os.environ, "Skipped on CI."),
|
2017-03-29 07:56:07 +02:00
|
|
|
('issue2478', os.name == 'nt' and config.webengine,
|
|
|
|
"Broken with QtWebEngine on Windows"),
|
2015-10-02 09:26:33 +02:00
|
|
|
]
|
|
|
|
|
2016-02-27 02:45:34 +01:00
|
|
|
for searched_marker, condition, default_reason in markers:
|
2015-10-02 09:26:33 +02:00
|
|
|
marker = item.get_marker(searched_marker)
|
2015-10-02 10:39:21 +02:00
|
|
|
if not marker or not condition:
|
2015-10-02 09:26:33 +02:00
|
|
|
continue
|
|
|
|
|
2016-02-27 02:45:34 +01:00
|
|
|
if 'reason' in marker.kwargs:
|
|
|
|
reason = '{}: {}'.format(default_reason, marker.kwargs['reason'])
|
|
|
|
del marker.kwargs['reason']
|
|
|
|
else:
|
|
|
|
reason = default_reason + '.'
|
|
|
|
skipif_marker = pytest.mark.skipif(condition, *marker.args,
|
|
|
|
reason=reason, **marker.kwargs)
|
2015-10-02 09:26:33 +02:00
|
|
|
item.add_marker(skipif_marker)
|
|
|
|
|
|
|
|
|
2016-09-05 15:32:12 +02:00
|
|
|
def pytest_collection_modifyitems(config, items):
|
2015-10-02 09:26:33 +02:00
|
|
|
"""Handle custom markers.
|
|
|
|
|
|
|
|
pytest hook called after collection has been performed.
|
|
|
|
|
|
|
|
Adds a marker named "gui" which can be used to filter gui tests from the
|
|
|
|
command line.
|
2015-04-09 06:42:34 +02:00
|
|
|
|
2015-04-09 00:14:06 +02:00
|
|
|
For example:
|
|
|
|
|
2016-08-22 07:41:10 +02:00
|
|
|
pytest -m "not gui" # run all tests except gui tests
|
|
|
|
pytest -m "gui" # run only gui tests
|
2015-04-09 00:14:06 +02:00
|
|
|
|
2015-10-02 09:26:33 +02:00
|
|
|
It also handles the platform specific markers by translating them to skipif
|
|
|
|
markers.
|
|
|
|
|
2015-04-09 00:14:06 +02:00
|
|
|
Args:
|
|
|
|
items: list of _pytest.main.Node items, where each item represents
|
2015-04-09 06:42:34 +02:00
|
|
|
a python test that will be executed.
|
2015-04-09 00:14:06 +02:00
|
|
|
|
|
|
|
Reference:
|
|
|
|
http://pytest.org/latest/plugins.html
|
|
|
|
"""
|
2016-09-05 15:32:12 +02:00
|
|
|
remaining_items = []
|
|
|
|
deselected_items = []
|
|
|
|
|
2015-04-09 00:14:06 +02:00
|
|
|
for item in items:
|
2016-09-05 15:32:12 +02:00
|
|
|
deselected = False
|
|
|
|
|
2015-08-09 20:47:50 +02:00
|
|
|
if 'qapp' in getattr(item, 'fixturenames', ()):
|
2015-04-09 00:16:45 +02:00
|
|
|
item.add_marker('gui')
|
2015-04-13 07:47:09 +02:00
|
|
|
|
2015-08-31 21:26:30 +02:00
|
|
|
if hasattr(item, 'module'):
|
|
|
|
module_path = os.path.relpath(
|
|
|
|
item.module.__file__,
|
|
|
|
os.path.commonprefix([__file__, item.module.__file__]))
|
|
|
|
|
2016-09-05 13:16:48 +02:00
|
|
|
module_root_dir = module_path.split(os.sep)[0]
|
|
|
|
assert module_root_dir in ['end2end', 'unit', 'helpers',
|
|
|
|
'test_conftest.py']
|
2016-05-29 18:20:00 +02:00
|
|
|
if module_root_dir == 'end2end':
|
|
|
|
item.add_marker(pytest.mark.end2end)
|
2015-08-31 21:26:30 +02:00
|
|
|
|
2017-03-29 07:56:07 +02:00
|
|
|
_apply_platform_markers(config, item)
|
2016-01-14 07:53:00 +01:00
|
|
|
if item.get_marker('xfail_norun'):
|
|
|
|
item.add_marker(pytest.mark.xfail(run=False))
|
2017-02-21 19:25:18 +01:00
|
|
|
if item.get_marker('js_prompt'):
|
|
|
|
if config.webengine:
|
2017-09-18 09:10:32 +02:00
|
|
|
item.add_marker(pytest.mark.skipif(
|
|
|
|
PYQT_VERSION <= 0x050700,
|
|
|
|
reason='JS prompts are not supported with PyQt 5.7'))
|
2015-08-18 20:43:42 +02:00
|
|
|
|
2016-09-05 15:32:12 +02:00
|
|
|
if deselected:
|
|
|
|
deselected_items.append(item)
|
|
|
|
else:
|
|
|
|
remaining_items.append(item)
|
|
|
|
|
|
|
|
config.hook.pytest_deselected(items=deselected_items)
|
|
|
|
items[:] = remaining_items
|
|
|
|
|
2015-08-18 20:43:42 +02:00
|
|
|
|
2015-11-02 20:32:15 +01:00
|
|
|
def pytest_ignore_collect(path):
|
2016-08-05 14:36:32 +02:00
|
|
|
"""Ignore BDD tests if we're unable to run them."""
|
2016-08-19 17:17:08 +02:00
|
|
|
skip_bdd = hasattr(sys, 'frozen')
|
2015-11-02 20:32:15 +01:00
|
|
|
rel_path = path.relto(os.path.dirname(__file__))
|
2016-08-05 14:36:32 +02:00
|
|
|
return rel_path == os.path.join('end2end', 'features') and skip_bdd
|
2015-11-02 20:32:15 +01:00
|
|
|
|
|
|
|
|
2015-09-28 21:50:04 +02:00
|
|
|
@pytest.fixture(scope='session')
|
|
|
|
def qapp(qapp):
|
2015-09-08 20:02:53 +02:00
|
|
|
"""Change the name of the QApplication instance."""
|
2015-09-08 22:14:39 +02:00
|
|
|
qapp.setApplicationName('qute_test')
|
2015-09-28 21:50:04 +02:00
|
|
|
return qapp
|
2015-09-08 20:02:53 +02:00
|
|
|
|
|
|
|
|
2015-10-07 23:05:39 +02:00
|
|
|
def pytest_addoption(parser):
|
2015-11-18 20:01:40 +01:00
|
|
|
parser.addoption('--qute-delay', action='store', default=0, type=int,
|
|
|
|
help="Delay between qutebrowser commands.")
|
2016-02-11 08:01:29 +01:00
|
|
|
parser.addoption('--qute-profile-subprocs', action='store_true',
|
|
|
|
default=False, help="Run cProfile for subprocesses.")
|
2016-07-11 17:24:03 +02:00
|
|
|
parser.addoption('--qute-bdd-webengine', action='store_true',
|
|
|
|
help='Use QtWebEngine for BDD tests')
|
2015-10-07 23:05:39 +02:00
|
|
|
|
|
|
|
|
2016-09-05 12:31:29 +02:00
|
|
|
def pytest_configure(config):
|
|
|
|
webengine_arg = config.getoption('--qute-bdd-webengine')
|
|
|
|
webengine_env = os.environ.get('QUTE_BDD_WEBENGINE', '')
|
|
|
|
config.webengine = bool(webengine_arg or webengine_env)
|
2016-09-05 16:30:23 +02:00
|
|
|
# Fail early if QtWebEngine is not available
|
2017-05-17 19:08:59 +02:00
|
|
|
# pylint: disable=unused-variable
|
2016-09-05 16:30:23 +02:00
|
|
|
if config.webengine:
|
|
|
|
import PyQt5.QtWebEngineWidgets
|
2016-09-05 12:31:29 +02:00
|
|
|
|
|
|
|
|
2016-02-16 20:36:23 +01:00
|
|
|
@pytest.fixture(scope='session', autouse=True)
|
2016-04-06 08:27:43 +02:00
|
|
|
def check_display(request):
|
2016-02-16 20:36:23 +01:00
|
|
|
if (not request.config.getoption('--no-xvfb') and
|
|
|
|
'QUTE_BUILDBOT' in os.environ and
|
|
|
|
request.config.xvfb is not None):
|
|
|
|
raise Exception("Xvfb is running on buildbot!")
|
2016-02-04 06:43:14 +01:00
|
|
|
|
2016-04-06 08:27:43 +02:00
|
|
|
if sys.platform == 'linux' and not os.environ.get('DISPLAY', ''):
|
|
|
|
raise Exception("No display and no Xvfb available!")
|
|
|
|
|
2016-02-04 06:43:14 +01:00
|
|
|
|
|
|
|
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
|
|
|
|
def pytest_runtest_makereport(item, call):
|
|
|
|
"""Make test information available in fixtures.
|
|
|
|
|
|
|
|
See http://pytest.org/latest/example/simple.html#making-test-result-information-available-in-fixtures
|
|
|
|
"""
|
|
|
|
outcome = yield
|
|
|
|
rep = outcome.get_result()
|
|
|
|
setattr(item, "rep_" + rep.when, rep)
|