From 60a6b2882ebdfca8930b6c7f130f12feb1938520 Mon Sep 17 00:00:00 2001 From: Brett Holman Date: Mon, 11 Oct 2021 15:23:09 -0600 Subject: [PATCH] Clean up smoketest and pytests. - Replace depreciated tempfile with mktemp in smoketest. - Remove unused pytest imports and variables. - Make path lookup less fragile. Allows pytest to run from any cwd. - Prevent exeptions caused by calling functions/methods on None objects. - Disable fuse tests in smoketest. These are broken and add noise. - Add missing travis CI dependency. Signed-off-by: Brett Holman --- .travis.yml | 1 + Makefile | 2 +- smoke_test | 16 +++++++--------- tests/__init__.py | 0 tests/conftest.py | 2 +- tests/test_basic.py | 2 +- tests/test_fixture.py | 21 ++++++++++----------- tests/test_fuse.py | 2 +- tests/util.py | 32 +++++++++++++++++++------------- 9 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 tests/__init__.py diff --git a/.travis.yml b/.travis.yml index 3b90b73..947997b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ addons: apt: packages: - valgrind + - python3-docutils - python3-pytest - python3-pytest-xdist - meson diff --git a/Makefile b/Makefile index 23e0508..5917a4c 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ tests: tests/test_helper .PHONY: check check: tests bcachefs - cd tests; $(PYTEST) + $(PYTEST) .PHONY: TAGS tags TAGS: diff --git a/smoke_test b/smoke_test index 15a9fce..1122808 100755 --- a/smoke_test +++ b/smoke_test @@ -21,7 +21,7 @@ set -e PYTEST="${PYTEST:-pytest-3}" -spam=$(tempfile) +spam=$(mktemp) unset BCACHEFS_FUSE BCACHEFS_TEST_USE_VALGRIND BCACHEFS_DEBUG trap "set +x; cat ${spam}; rm -f ${spam} ; echo; echo FAILED." EXIT @@ -44,7 +44,6 @@ function build() { function test() { echo Running tests. ( - cd tests ${PYTEST} -n${JOBS} ) > ${spam} 2>&1 } @@ -53,7 +52,6 @@ function test_vg() { echo Running tests with valgrind. ( export BCACHEFS_TEST_USE_VALGRIND=yes - cd tests ${PYTEST} -n${JOBS} ) > ${spam} 2>&1 } @@ -71,13 +69,13 @@ test echo -- Test: debug with valgrind -- test_vg -echo -- Test: fuse debug -- -export BCACHEFS_FUSE=1 -build -test +#echo -- Test: fuse debug -- +#export BCACHEFS_FUSE=1 +#build +#test -echo -- Test: fuse debug with valgrind -- -test_vg +#echo -- Test: fuse debug with valgrind -- +#test_vg rm -f ${spam} trap "set +x; echo; echo SUCCESS." EXIT diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py index 45c6273..ffc2bad 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,7 +3,7 @@ # pytest fixture definitions. import pytest -import util +from tests import util @pytest.fixture def bfuse(tmpdir): diff --git a/tests/test_basic.py b/tests/test_basic.py index 6b3e474..a2e95c5 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -3,7 +3,7 @@ # Basic bcachefs functionality tests. import re -import util +from tests import util def test_help(): ret = util.run_bch(valgrind=True) diff --git a/tests/test_fixture.py b/tests/test_fixture.py index d8d3819..d96ce88 100644 --- a/tests/test_fixture.py +++ b/tests/test_fixture.py @@ -2,16 +2,15 @@ # # Tests of the functions in util.py -import pytest import signal import subprocess import time +import os +import pytest -import util -from pathlib import Path +from tests import util -#helper = Path('.') / 'test_helper' -helper = './test_helper' +helper = os.path.abspath(os.path.join(util.BASE_PATH, 'test_helper')) def test_sparse_file(tmpdir): dev = util.sparse_file(tmpdir / '1k', 1024) @@ -32,32 +31,32 @@ def test_segfault(): @pytest.mark.skipif(not util.ENABLE_VALGRIND, reason="no valgrind") def test_check(): with pytest.raises(subprocess.CalledProcessError): - ret = util.run(helper, 'abort', check=True) + util.run(helper, 'abort', check=True) @pytest.mark.skipif(not util.ENABLE_VALGRIND, reason="no valgrind") def test_leak(): with pytest.raises(util.ValgrindFailedError): - ret = util.run(helper, 'leak', valgrind=True) + util.run(helper, 'leak', valgrind=True) @pytest.mark.skipif(not util.ENABLE_VALGRIND, reason="no valgrind") def test_undefined(): with pytest.raises(util.ValgrindFailedError): - ret = util.run(helper, 'undefined', valgrind=True) + util.run(helper, 'undefined', valgrind=True) @pytest.mark.skipif(not util.ENABLE_VALGRIND, reason="no valgrind") def test_undefined_branch(): with pytest.raises(util.ValgrindFailedError): - ret = util.run(helper, 'undefined_branch', valgrind=True) + util.run(helper, 'undefined_branch', valgrind=True) @pytest.mark.skipif(not util.ENABLE_VALGRIND, reason="no valgrind") def test_read_after_free(): with pytest.raises(util.ValgrindFailedError): - ret = util.run(helper, 'read_after_free', valgrind=True) + util.run(helper, 'read_after_free', valgrind=True) @pytest.mark.skipif(not util.ENABLE_VALGRIND, reason="no valgrind") def test_write_after_free(): with pytest.raises(util.ValgrindFailedError): - ret = util.run(helper, 'write_after_free', valgrind=True) + util.run(helper, 'write_after_free', valgrind=True) def test_mountpoint(tmpdir): path = util.mountpoint(tmpdir) diff --git a/tests/test_fuse.py b/tests/test_fuse.py index 69c512e..48288e6 100644 --- a/tests/test_fuse.py +++ b/tests/test_fuse.py @@ -4,7 +4,7 @@ import pytest import os -import util +from tests import util pytestmark = pytest.mark.skipif( not util.have_fuse(), reason="bcachefs not built with fuse support.") diff --git a/tests/util.py b/tests/util.py index b5e02c1..00314f4 100644 --- a/tests/util.py +++ b/tests/util.py @@ -2,18 +2,18 @@ import errno import os -import pytest import re import subprocess -import sys import tempfile import threading import time from pathlib import Path -DIR = Path('..') -BCH_PATH = DIR / 'bcachefs' +BASE_PATH= os.path.dirname(__file__) +BCH_PATH = os.path.abspath(os.path.join(BASE_PATH, '..', 'bcachefs')) +VALGRIND_PATH= os.path.abspath(os.path.join(BASE_PATH, + 'valgrind-suppressions.txt')) VPAT = re.compile(r'ERROR SUMMARY: (\d+) errors from (\d+) contexts') @@ -46,21 +46,22 @@ def run(cmd, *args, valgrind=False, check=False): cmds = [cmd] + list(args) valgrind = valgrind and ENABLE_VALGRIND + print("Running '{}'".format(cmds)) if valgrind: vout = tempfile.NamedTemporaryFile() vcmd = ['valgrind', '--leak-check=full', '--gen-suppressions=all', - '--suppressions=valgrind-suppressions.txt', + '--suppressions={}'.format(VALGRIND_PATH), '--log-file={}'.format(vout.name)] cmds = vcmd + cmds - print("Running '{}'".format(cmds)) - res = subprocess.run(cmds, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - encoding='utf-8', check=check) - - if valgrind: + res = subprocess.run(cmds, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, encoding='utf-8', check=check) check_valgrind(vout.read().decode('utf-8')) + else: + res = subprocess.run(cmds, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, encoding='utf-8', check=check) return res @@ -75,7 +76,7 @@ def sparse_file(lpath, size): This is typically used to create device files for bcachefs. """ path = Path(lpath) - f = path.touch(mode = 0o600, exist_ok = False) + path.touch(mode = 0o600, exist_ok = False) os.truncate(path, size) return path @@ -195,7 +196,8 @@ class BFuse: self.stdout = out1 + out2 self.stderr = err.read() - self.vout = vlog.read().decode('utf-8') + if vlog: + self.vout = vlog.read().decode('utf-8') def expect(self, pipe, regex): """Wait for the child process to mount.""" @@ -230,7 +232,8 @@ class BFuse: print("Waiting for thread to exit.") self.thread.join(timeout) if self.thread.is_alive(): - self.proc.kill() + if self.proc: + self.proc.kill() self.thread.join() else: print("Thread was already done.") @@ -242,6 +245,9 @@ class BFuse: check_valgrind(self.vout) def verify(self): + # avoid throwing exception in assertion + assert self.stdout is not None + assert self.stderr is not None assert self.returncode == 0 assert len(self.stdout) > 0 assert len(self.stderr) == 0 -- 2.39.5