Add a new test script to run the equivalent of the tests in build/all using exeter and Avocado. This new version of the tests is more robust than the original, since it makes a temporary copy of the source tree so will not be affected by concurrent manual builds. Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au> --- test/Makefile | 15 +++++--- test/build/.gitignore | 1 + test/build/build.py | 86 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 test/build/build.py diff --git a/test/Makefile b/test/Makefile index f1632f4d..5cd5c781 100644 --- a/test/Makefile +++ b/test/Makefile @@ -64,9 +64,12 @@ LOCAL_ASSETS = mbuto.img mbuto.mem.img podman/bin/podman QEMU_EFI.fd \ $(TESTDATA_ASSETS) ASSETS = $(DOWNLOAD_ASSETS) $(LOCAL_ASSETS) +AVOCADO_ASSETS = +META_ASSETS = nstool EXETER_SH = build/static_checkers.sh -EXETER_JOBS = $(EXETER_SH:%.sh=%.json) +EXETER_PY = build/build.py +EXETER_JOBS = $(EXETER_SH:%.sh=%.json) $(EXETER_PY:%.py=%.json) AVOCADO_JOBS = $(EXETER_JOBS) avocado/static_checkers.json @@ -76,13 +79,13 @@ TASST_SRCS = __init__.py __main__.py $(TASST_MODS) EXETER_META = meta/lint.json meta/tasst.json META_JOBS = $(EXETER_META) -PYPKGS = tasst +PYPKGS = tasst $(EXETER_PY) PYTHON = python3 VENV = venv PIP = $(VENV)/bin/pip3 RUN_AVOCADO = $(VENV)/bin/python3 run_avocado -PYTHONPATH = exeter/py3 +PYTHONPATH = exeter/py3:. CFLAGS = -Wall -Werror -Wextra -pedantic -std=c99 @@ -155,11 +158,11 @@ meta/tasst.json: $(TASST_SRCS:%=tasst/%) $(VENV) pull-exeter PYTHONPATH=$(PYTHONPATH) $(PYTHON) -m tasst --avocado > $@ .PHONY: avocado -avocado: venv $(AVOCADO_JOBS) - $(RUN_AVOCADO) all $(AVOCADO_JOBS) +avocado: venv $(AVOCADO_ASSETS) $(AVOCADO_JOBS) + PYTHONPATH=$(PYTHONPATH) $(RUN_AVOCADO) all $(AVOCADO_JOBS) .PHONY: meta -meta: venv $(META_JOBS) +meta: venv $(META_ASSETS) $(META_JOBS) PYTHONPATH=$(PYTHONPATH) $(RUN_AVOCADO) meta $(META_JOBS) flake8: diff --git a/test/build/.gitignore b/test/build/.gitignore index a6c57f5f..4ef40dd0 100644 --- a/test/build/.gitignore +++ b/test/build/.gitignore @@ -1 +1,2 @@ *.json +build.exeter diff --git a/test/build/build.py b/test/build/build.py new file mode 100644 index 00000000..cc4c0819 --- /dev/null +++ b/test/build/build.py @@ -0,0 +1,86 @@ +#! /usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +# PASST - Plug A Simple Socket Transport +# for qemu/UNIX domain socket mode +# +# PASTA - Pack A Subtle Tap Abstraction +# for network namespace/tap device mode +# +# test/build/build.sh - Test build and install targets +# +# Copyright Red Hat +# Author: David Gibson <david(a)gibson.dropbear.id.au> + +import contextlib +import os +from pathlib import Path +import tempfile +from typing import Iterable, Iterator + +import exeter + +import tasst.cmdsite + + +# For convenience +sh = tasst.cmdsite.BUILD_HOST.sh + + +(a)contextlib.contextmanager +def clone_sources() -> Iterator[str]: + os.chdir('..') # Move from test/ to repo base + with tempfile.TemporaryDirectory(ignore_cleanup_errors=False) as tmpdir: + sh(f"cp --parents $(git ls-files) {tmpdir}") + os.chdir(tmpdir) + yield tmpdir + + +def test_make(target: str, outputs: Iterable[str]) -> None: + outpaths = [Path(o) for o in outputs] + with clone_sources(): + for o in outpaths: + assert not o.exists(), f"{o} existed before make" + sh(f'make {target} CFLAGS="-Werror"') + for o in outpaths: + assert o.exists(), f"{o} wasn't made" + sh('make clean') + for o in outpaths: + assert not o.exists(), f"{o} existed after make clean" + + +exeter.register('make_passt', test_make, 'passt', ['passt']) +exeter.register('make_pasta', test_make, 'pasta', ['pasta']) +exeter.register('make_qrap', test_make, 'qrap', ['qrap']) +exeter.register('make_all', test_make, 'all', ['passt', 'pasta', 'qrap']) + + +(a)exeter.test +def test_install_uninstall() -> None: + with clone_sources(): + with tempfile.TemporaryDirectory(ignore_cleanup_errors=False) \ + as prefix: + bindir = Path(prefix) / 'bin' + mandir = Path(prefix) / 'share/man' + progs = ['passt', 'pasta', 'qrap'] + + # Install + sh(f'make install CFLAGS="-Werror" prefix={prefix}') + + for prog in progs: + exe = bindir / prog + assert exe.is_file(), f"{exe} does not exist as a regular file" + sh(f'man -M {mandir} -W {prog}') + + # Uninstall + sh(f'make uninstall prefix={prefix}') + + for prog in progs: + exe = bindir / prog + assert not exe.exists(), f"{exe} exists after uninstall" + sh(f'! man -M {mandir} -W {prog}') + + +if __name__ == '__main__': + exeter.main() -- 2.46.0