X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=conftest.py;h=9045072b115ff81caefe23813830376396af85a9;hb=0f3387865ff331b01f298a90ec6691712a27c04f;hp=14cf647bf6ed6bacd6b56c6ac274d6188019d45d;hpb=2c49a918b54aca4abc19267382e6addad880d296;p=bup.git diff --git a/conftest.py b/conftest.py index 14cf647..9045072 100644 --- a/conftest.py +++ b/conftest.py @@ -1,12 +1,15 @@ -from __future__ import absolute_import -from os.path import basename, 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'] @@ -21,6 +24,15 @@ _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'): @@ -63,11 +75,32 @@ def ephemeral_env_changes(): 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(tmp_path): - try: - yield bytes(tmp_path) - finally: - subprocess.call([b'chmod', b'-R', b'u+rwX', bytes(tmp_path)]) - # FIXME: delete only if there are no errors - #subprocess.call(['rm', '-rf', tmpdir]) +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])