[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 012/142] meson: add testsuite Makefile generator
From: |
Paolo Bonzini |
Subject: |
[PATCH 012/142] meson: add testsuite Makefile generator |
Date: |
Tue, 28 Jan 2020 18:51:32 +0100 |
Rules to execute tests are generated by a simple Python program
that integrates into the existing "make check" mechanism. This
provides familiarity for developers, and also allows piecewise
conversion of the testsuite Makefiles to meson.
The generated rules are based on QEMU's existing test harness
Makefile and TAP parser.
---
Makefile | 4 ++
scripts/mtest2make.py | 101 +++++++++++++++++++++++++++++++++++++++++
tests/Makefile.include | 1 -
3 files changed, 105 insertions(+), 1 deletion(-)
create mode 100644 scripts/mtest2make.py
diff --git a/Makefile b/Makefile
index 9aa0808649..fee6f739fd 100644
--- a/Makefile
+++ b/Makefile
@@ -61,6 +61,10 @@ ninjatool: ninjatool.stamp
ninjatool.stamp: $(SRC_PATH)/scripts/ninjatool.py
$(MESON) setup --reconfigure . $(SRC_PATH) && touch $@
+Makefile.mtest: build.ninja scripts/mtest2make.py
+ $(MESON) introspect --tests | $(PYTHON) scripts/mtest2make.py > $@
+-include Makefile.mtest
+
.git-submodule-status: git-submodule-update config-host.mak
# Check that we're not trying to do an out-of-tree build from
diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py
new file mode 100644
index 0000000000..ac4010ff8f
--- /dev/null
+++ b/scripts/mtest2make.py
@@ -0,0 +1,101 @@
+#! /usr/bin/env python3
+
+# Create Makefile targets to run tests, from Meson's test introspection data.
+#
+# Author: Paolo Bonzini <address@hidden>
+
+from collections import defaultdict
+import json
+import os
+import shlex
+import sys
+
+class Suite(object):
+ def __init__(self):
+ self.tests = list()
+ self.slow_tests = list()
+ self.executables = set()
+
+print('''
+SPEED = quick
+
+# $1 = test command, $2 = test name
+.test-human-tap = $1 < /dev/null | ./scripts/tap-driver.pl --test-name="$2"
$(if $(V),, --show-failures-only)
+.test-human-exitcode = $1 < /dev/null $(if $(V),,> /dev/null 2>&1)
+.test-tap-tap = $1 < /dev/null | sed "s/^[a-z][a-z]* [0-9]*/& $2/" || true
+.test-tap-exitcode = printf "%s\\n" 1..1 "`$1 < /dev/null > /dev/null || echo
"not "`ok 1 $2"
+.test.print = echo $(if $(V),'$1','Running test $2') >&3
+.test.env = MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))}
+
+# $1 = test name, $2 = test target (human or tap)
+.test.run = $(call .test.print,$(.test.cmd.$1),$(.test.name.$1)) && $(call
.test-$2-$(.test.driver.$1),$(.test.cmd.$1),$(.test.name.$1))
+
+define .test.human_k
+ @exec 3>&1; rc=0; $(foreach TEST, $1, $(call .test.run,$(TEST),human)
|| rc=$$?;) \\
+ exit $$rc
+endef
+define .test.human_no_k
+ $(foreach TEST, $1, @exec 3>&1; $(call .test.run,$(TEST),human)
+)
+endef
+.test.human = \\
+ $(if $(findstring k, $(MAKEFLAGS)), $(.test.human_k),
$(.test.human_no_k))
+
+define .test.tap
+ @exec 3>&1; { $(foreach TEST, $1, $(call .test.run,$(TEST),tap); ) } \\
+ | ./scripts/tap-merge.pl | tee "$@" \\
+ | ./scripts/tap-driver.pl $(if $(V),, --show-failures-only)
+endef
+''')
+
+suites = defaultdict(Suite)
+i = 0
+for test in json.load(sys.stdin):
+ env = ' '.join(('%s=%s' % (shlex.quote(k), shlex.quote(v))
+ for k, v in test['env'].items()))
+ executable = os.path.relpath(test['cmd'][0])
+ if test['workdir'] is not None:
+ test['cmd'][0] = os.path.relpath(test['cmd'][0], test['workdir'])
+ else:
+ test['cmd'][0] = executable
+ cmd = '$(.test.env) %s %s' % (env, ' '.join((shlex.quote(x) for x in
test['cmd'])))
+ if test['workdir'] is not None:
+ cmd = '(cd %s && %s)' % (shlex.quote(test['workdir']), cmd)
+ driver = test['protocol'] if 'protocol' in test else 'exitcode'
+
+ i += 1
+ print('.test.name.%d := %s' % (i, test['name']))
+ print('.test.driver.%d := %s' % (i, driver))
+ print('.test.cmd.%d := %s' % (i, cmd))
+
+ test_suites = test['suite'] or ['default']
+ is_slow = 'slow' in test_suites
+ for s in test_suites:
+ if s == 'slow':
+ continue
+ # The suite name in the introspection info is "PROJECT:SUITE"
+ s = s.split(':')[1]
+ if is_slow:
+ suites[s].slow_tests.append(i)
+ else:
+ suites[s].tests.append(i)
+ suites[s].executables.add(executable)
+
+print('.PHONY: check check-report.tap')
+print('check:')
+print('check-report.tap:')
+print('\t$(call quiet-command, cat $^ | scripts/tap-merge.pl >$@,"GEN","$@")')
+for name, suite in suites.items():
+ executables = ' '.join(suite.executables)
+ slow_test_numbers = ' '.join((str(x) for x in suite.slow_tests))
+ test_numbers = ' '.join((str(x) for x in suite.tests))
+ print('.test.suite-quick.%s := %s' % (name, test_numbers))
+ print('.test.suite-slow.%s := $(.test.suite-quick.%s) %s' % (name, name,
slow_test_numbers))
+ print('.PHONY: check-%s' % name)
+ print('.PHONY: check-report-%s.tap' % name)
+ print('check: check-%s' % name)
+ print('check-%s: %s' % (name, executables))
+ print('\t$(call .test.human, $(.test.suite-$(SPEED).%s))' % (name, ))
+ print('check-report.tap: check-report-%s.tap' % name)
+ print('check-report-%s.tap: %s' % (name, executables))
+ print('\t$(call .test.tap, $(.test.suite-$(SPEED).%s))' % (name, ))
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 9146e1bdee..eaa57196f9 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -936,7 +936,6 @@ check-report-unit.tap: $(check-unit-y)
# Reports and overall runs
check-report.tap: $(patsubst %,check-report-qtest-%.tap, $(QTEST_TARGETS))
check-report-unit.tap
- $(call quiet-command, cat $^ | scripts/tap-merge.pl >$@,"GEN","$@")
# FPU Emulation tests (aka softfloat)
#
--
2.21.0
- [PATCH 003/142] pc-bios/s390-ccw: simplify Makefile, (continued)
- [PATCH 003/142] pc-bios/s390-ccw: simplify Makefile, Paolo Bonzini, 2020/01/28
- [PATCH 004/142] build-sys hack: ensure target directory is there, Paolo Bonzini, 2020/01/28
- [PATCH 001/142] minikconf: accept alnum identifiers, Paolo Bonzini, 2020/01/28
- [PATCH 005/142] configure: do not include $(...) variables in config-host.mak, Paolo Bonzini, 2020/01/28
- [PATCH 006/142] configure: expand path variables for meson configure, Paolo Bonzini, 2020/01/28
- [PATCH 008/142] configure: generate Meson cross file, Paolo Bonzini, 2020/01/28
- [PATCH 010/142] meson: enable pie, Paolo Bonzini, 2020/01/28
- [PATCH 009/142] build-sys: add meson submodule, Paolo Bonzini, 2020/01/28
- [PATCH 007/142] configure: integrate Meson in the build system, Paolo Bonzini, 2020/01/28
- [PATCH 011/142] meson: use coverage option, Paolo Bonzini, 2020/01/28
- [PATCH 012/142] meson: add testsuite Makefile generator,
Paolo Bonzini <=
- [PATCH 014/142] meson: add remaining generated tcg trace helpers, Paolo Bonzini, 2020/01/28
- [PATCH 016/142] contrib/libvhost-user: convert to Meson, Paolo Bonzini, 2020/01/28
- [PATCH 015/142] meson: add version.o, Paolo Bonzini, 2020/01/28
- [PATCH 017/142] contrib/vhost-user-blk: convert to Meson, Paolo Bonzini, 2020/01/28
- [PATCH 018/142] contrib/vhost-user-scsi: convert to Meson, Paolo Bonzini, 2020/01/28
- [PATCH 019/142] contrib/rdmacm-mux: convert to Meson, Paolo Bonzini, 2020/01/28
- [PATCH 020/142] contrib/vhost-user-input: convert to meson, Paolo Bonzini, 2020/01/28
- [PATCH 013/142] libqemuutil: convert to meson, Paolo Bonzini, 2020/01/28
- [PATCH 021/142] contrib/vhost-user-gpu: convert to meson, Paolo Bonzini, 2020/01/28
- [PATCH 022/142] contrib/ivshmem: convert to meson, Paolo Bonzini, 2020/01/28