summaryrefslogtreecommitdiff
path: root/t/conftest.py
diff options
context:
space:
mode:
Diffstat (limited to 't/conftest.py')
-rw-r--r--t/conftest.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/t/conftest.py b/t/conftest.py
new file mode 100644
index 00000000..9e8e959f
--- /dev/null
+++ b/t/conftest.py
@@ -0,0 +1,98 @@
+from __future__ import absolute_import, unicode_literals
+
+import atexit
+import os
+import pytest
+import sys
+
+from kombu.exceptions import VersionMismatch
+
+
+@pytest.fixture(scope='session')
+def multiprocessing_workaround(request):
+ def fin():
+ # Workaround for multiprocessing bug where logging
+ # is attempted after global already collected at shutdown.
+ canceled = set()
+ try:
+ import multiprocessing.util
+ canceled.add(multiprocessing.util._exit_function)
+ except (AttributeError, ImportError):
+ pass
+
+ try:
+ atexit._exithandlers[:] = [
+ e for e in atexit._exithandlers if e[0] not in canceled
+ ]
+ except AttributeError: # pragma: no cover
+ pass # Py3 missing _exithandlers
+ request.addfinalizer(fin)
+
+
+@pytest.fixture(autouse=True)
+def zzzz_test_cases_calls_setup_teardown(request):
+ if request.instance:
+ # we set the .patching attribute for every test class.
+ setup = getattr(request.instance, 'setup', None)
+ # we also call .setup() and .teardown() after every test method.
+ teardown = getattr(request.instance, 'teardown', None)
+ setup and setup()
+ teardown and request.addfinalizer(teardown)
+
+
+@pytest.fixture(autouse=True)
+def test_cases_has_patching(request, patching):
+ if request.instance:
+ request.instance.patching = patching
+
+
+@pytest.fixture
+def hub(request):
+ from kombu.async import Hub, get_event_loop, set_event_loop
+ _prev_hub = get_event_loop()
+ hub = Hub()
+ set_event_loop(hub)
+
+ def fin():
+ if _prev_hub is not None:
+ set_event_loop(_prev_hub)
+ request.addfinalizer(fin)
+ return hub
+
+
+def find_distribution_modules(name=__name__, file=__file__):
+ current_dist_depth = len(name.split('.')) - 1
+ current_dist = os.path.join(os.path.dirname(file),
+ *([os.pardir] * current_dist_depth))
+ abs = os.path.abspath(current_dist)
+ dist_name = os.path.basename(abs)
+
+ for dirpath, dirnames, filenames in os.walk(abs):
+ package = (dist_name + dirpath[len(abs):]).replace('/', '.')
+ if '__init__.py' in filenames:
+ yield package
+ for filename in filenames:
+ if filename.endswith('.py') and filename != '__init__.py':
+ yield '.'.join([package, filename])[:-3]
+
+
+def import_all_modules(name=__name__, file=__file__, skip=[]):
+ for module in find_distribution_modules(name, file):
+ if module not in skip:
+ print('preimporting %r for coverage...' % (module,))
+ try:
+ __import__(module)
+ except (ImportError, VersionMismatch, AttributeError):
+ pass
+
+
+def is_in_coverage():
+ return (os.environ.get('COVER_ALL_MODULES') or
+ any('--cov' in arg for arg in sys.argv))
+
+
+@pytest.fixture(scope='session')
+def cover_all_modules():
+ # so coverage sees all our modules.
+ if is_in_coverage():
+ import_all_modules()