X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=conftest.py;h=9045072b115ff81caefe23813830376396af85a9;hb=6a3dea7dbaed2ffb94c020bfaf81f4fef85221cc;hp=2f28334319e85df946cd243bc286492e60c47d8f;hpb=96da3f0142c8f41fc379db4e4e31df2426d466b5;p=bup.git diff --git a/conftest.py b/conftest.py index 2f28334..9045072 100644 --- a/conftest.py +++ b/conftest.py @@ -1,10 +1,15 @@ -from __future__ import absolute_import -from os.path import dirname, realpath +from __future__ import absolute_import, print_function +from os.path import basename, dirname, realpath, relpath from time import tzset +from traceback import extract_stack +import errno import os import pytest +import re +import subprocess import sys +import tempfile sys.path[:0] = ['lib'] @@ -19,6 +24,40 @@ _bup_src_top = realpath(dirname(fsencode(__file__))) # https://groups.google.com/forum/#!topic/bup-list/9ke-Mbp10Q0 os.chdir(realpath(os.getcwd())) +# Make the test results available to fixtures +@pytest.hookimpl(tryfirst=True, hookwrapper=True) +def pytest_runtest_makereport(item, call): + other_hooks = yield + report = other_hooks.get_result() + bup = item.__dict__.setdefault('bup', {}) + bup[report.when + '-report'] = report # setup, call, teardown + item.bup = bup + +def bup_test_sort_order(item): + # Pull some slower tests forward to speed parallel runs + if item.fspath.basename in ('test_get.py', 'test-index.sh'): + return (0, str(item.fspath)) + return (1, str(item.fspath)) + +def pytest_collection_modifyitems(session, config, items): + items.sort(key=bup_test_sort_order) + +@pytest.fixture(autouse=True) +def no_lingering_errors(): + def fail_if_errors(): + if helpers.saved_errors: + bt = extract_stack() + src_file, src_line, src_func, src_txt = bt[-4] + msg = 'saved_errors ' + repr(helpers.saved_errors) + assert False, '%s:%-4d %s' % (basename(src_file), + src_line, msg) + + fail_if_errors() + helpers.clear_errors() + yield None + fail_if_errors() + helpers.clear_errors() + @pytest.fixture(autouse=True) def ephemeral_env_changes(): orig_env = environ.copy() @@ -35,3 +74,33 @@ def ephemeral_env_changes(): if k == b'TZ': tzset() os.chdir(_bup_src_top) + +# Assumes (of course) this file is at the top-level of the source tree +_bup_test_dir = realpath(dirname(fsencode(__file__))) + b'/test' +_bup_tmp = _bup_test_dir + b'/tmp' +try: + os.makedirs(_bup_tmp) +except OSError as e: + if e.errno != errno.EEXIST: + raise + +_safe_path_rx = re.compile(br'[^a-zA-Z0-9_-]') + +@pytest.fixture() +def tmpdir(request): + if sys.version_info[0] > 2: + rp = realpath(fsencode(request.fspath)) + else: + rp = realpath(str(request.fspath)) + rp = relpath(rp, _bup_test_dir) + if request.function: + rp += b'-' + fsencode(request.function.__name__) + safe = _safe_path_rx.sub(b'-', rp) + tmpdir = tempfile.mkdtemp(dir=_bup_tmp, prefix=safe) + yield tmpdir + if request.node.bup['call-report'].failed: + print('\nPreserving:', b'test/' + relpath(tmpdir, _bup_test_dir), + file=sys.stderr) + else: + subprocess.call(['chmod', '-R', 'u+rwX', tmpdir]) + subprocess.call(['rm', '-rf', tmpdir])