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 <bholman.devel@gmail.com>
This commit is contained in:
Brett Holman 2021-10-11 15:23:09 -06:00
parent ba1dbafc1f
commit 60a6b2882e
9 changed files with 41 additions and 37 deletions

View File

@ -9,6 +9,7 @@ addons:
apt:
packages:
- valgrind
- python3-docutils
- python3-pytest
- python3-pytest-xdist
- meson

View File

@ -85,7 +85,7 @@ tests: tests/test_helper
.PHONY: check
check: tests bcachefs
cd tests; $(PYTEST)
$(PYTEST)
.PHONY: TAGS tags
TAGS:

View File

@ -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

0
tests/__init__.py Normal file
View File

View File

@ -3,7 +3,7 @@
# pytest fixture definitions.
import pytest
import util
from tests import util
@pytest.fixture
def bfuse(tmpdir):

View File

@ -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)

View File

@ -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)

View File

@ -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.")

View File

@ -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