meson: tests: add file access test setup

We need to modify check-file-access.py to be usable as wrapper for
libvirt tests. This way we can run the tests using this command:

    meson test --setup access

which will run all tests using check-file-access.py as a wrapper.

With autotools all file access are written into single file for all
tests and compared once the whole test suite is done.

With Meson we will compare the file access after every single test
because it is used as wrapper now. That requires writing the file
access into separate files for every single test as they are executed
in parallel.

Since the wrapper is used for all tests in Meson including tests outside
of tests directory we have to check for presence of the output file.
We should also cleanup after ourselves.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
This commit is contained in:
Pavel Hrdina 2020-07-28 14:29:32 +02:00
parent 59cafec0a4
commit 9d40698116
5 changed files with 32 additions and 21 deletions

View File

@ -37,9 +37,6 @@ srpm: clean
check-local: all tests check-local: all tests
check-access: all
@($(MAKE) $(AM_MAKEFLAGS) -C tests check-access)
dist-hook: gen-AUTHORS dist-hook: gen-AUTHORS
.PHONY: gen-AUTHORS .PHONY: gen-AUTHORS

View File

@ -21,22 +21,36 @@
# #
# #
import os
import re import re
import sys import sys
import tempfile
if len(sys.argv) != 3: abs_builddir = os.environ.get('abs_builddir', '')
print("syntax: %s ACCESS-FILE PERMITTED-ACCESS-FILE") abs_srcdir = os.environ.get('abs_srcdir', '')
sys.exit(1)
access_file = sys.argv[1] access_fd, access_file = tempfile.mkstemp(dir=abs_builddir,
permitted_file = sys.argv[2] prefix='file-access-',
suffix='.txt')
permitted_file = os.path.join(abs_srcdir, 'permitted_file_access.txt')
os.environ['VIR_TEST_FILE_ACCESS_OUTPUT'] = access_file
test = ' '.join(sys.argv[1:])
ret = os.system(test)
if ret != 0 or os.read(access_fd, 10) == b'':
os.close(access_fd)
os.remove(access_file)
sys.exit(ret)
known_actions = ["open", "fopen", "access", "stat", "lstat", "connect"] known_actions = ["open", "fopen", "access", "stat", "lstat", "connect"]
files = [] files = []
permitted = [] permitted = []
with open(access_file, "r") as fh: with os.fdopen(access_fd, "r") as fh:
for line in fh: for line in fh:
line = line.rstrip("\n") line = line.rstrip("\n")
@ -120,6 +134,8 @@ for file in files:
print(": %s" % file["testname"], end="") print(": %s" % file["testname"], end="")
print("") print("")
os.remove(access_file)
if err: if err:
sys.exit(1) sys.exit(1)
sys.exit(0) sys.exit(0)

View File

@ -16,17 +16,6 @@
## License along with this library. If not, see ## License along with this library. If not, see
## <http://www.gnu.org/licenses/>. ## <http://www.gnu.org/licenses/>.
if WITH_LINUX
check-access: file-access-clean
VIR_TEST_FILE_ACCESS=1 $(MAKE) $(AM_MAKEFLAGS) check
$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/check-file-access.py \
$(abs_builddir)/test_file_access.txt \
$(abs_srcdir)/permitted_file_access.txt | sort -u
file-access-clean:
> test_file_access.txt
endif WITH_LINUX
VALGRIND = valgrind --quiet --leak-check=full --trace-children=yes \ VALGRIND = valgrind --quiet --leak-check=full --trace-children=yes \
--trace-children-skip="*/tools/virsh","*/tests/commandhelper","/usr/bin/*" \ --trace-children-skip="*/tools/virsh","*/tests/commandhelper","/usr/bin/*" \
--suppressions=$(abs_srcdir)/.valgrind.supp --suppressions=$(abs_srcdir)/.valgrind.supp

View File

@ -678,3 +678,12 @@ foreach name : test_scripts
script = find_program(name) script = find_program(name)
test(name, script, env: tests_env) test(name, script, env: tests_env)
endforeach endforeach
add_test_setup(
'access',
env: [
'VIR_TEST_FILE_ACCESS=1',
runutf8,
],
exe_wrapper: [ python3_prog, check_file_access_prog.path() ],
)

View File

@ -69,7 +69,7 @@ printFile(const char *file,
output = VIR_FILE_ACCESS_DEFAULT; output = VIR_FILE_ACCESS_DEFAULT;
} }
if (!(fp = real_fopen(output, "a"))) { if (!(fp = real_fopen(output, "w"))) {
fprintf(stderr, "Unable to open %s: %s\n", output, g_strerror(errno)); fprintf(stderr, "Unable to open %s: %s\n", output, g_strerror(errno));
abort(); abort();
} }