test makefile overhaul
This introduces new test reporting infrastructure based on gtester and gtester-report. Also, all existing tests are moved to tests/, and tests/Makefile is reorganized to factor out the commonalities in the rules. Signed-off-by: Anthony Liguori <aliguori@linux.vnet.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
040b66f3f9
commit
b93b63f574
|
@ -47,7 +47,7 @@ quiet-command = $(if $(V),$1,$(if $(2),@echo $2 && $1, @$1))
|
||||||
cc-option = $(if $(shell $(CC) $1 $2 -S -o /dev/null -xc /dev/null \
|
cc-option = $(if $(shell $(CC) $1 $2 -S -o /dev/null -xc /dev/null \
|
||||||
>/dev/null 2>&1 && echo OK), $2, $3)
|
>/dev/null 2>&1 && echo OK), $2, $3)
|
||||||
|
|
||||||
VPATH_SUFFIXES = %.c %.h %.S %.m %.mak %.texi
|
VPATH_SUFFIXES = %.c %.h %.S %.m %.mak %.texi %.sh
|
||||||
set-vpath = $(if $1,$(foreach PATTERN,$(VPATH_SUFFIXES),$(eval vpath $(PATTERN) $1)))
|
set-vpath = $(if $1,$(foreach PATTERN,$(VPATH_SUFFIXES),$(eval vpath $(PATTERN) $1)))
|
||||||
|
|
||||||
# find-in-path
|
# find-in-path
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# Copyright IBM, Corp. 2012
|
||||||
|
#
|
||||||
|
# Authors:
|
||||||
|
# Anthony Liguori <aliguori@us.ibm.com>
|
||||||
|
#
|
||||||
|
# This work is licensed under the terms of the GNU GPLv2 or later.
|
||||||
|
# See the COPYING file in the top-level directory.
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<gtester>
|
||||||
|
<info>
|
||||||
|
<package>qemu</package>
|
||||||
|
<version>0.0</version>
|
||||||
|
<revision>rev</revision>
|
||||||
|
</info>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e '/<?xml/d' \
|
||||||
|
-e '/^<gtester>$/d' \
|
||||||
|
-e '/<info>/,/<\/info>/d' \
|
||||||
|
-e '$b' \
|
||||||
|
-e '/^<\/gtester>$/d' "$@"
|
132
tests/Makefile
132
tests/Makefile
|
@ -1,61 +1,113 @@
|
||||||
export SRC_PATH
|
export SRC_PATH
|
||||||
|
|
||||||
CHECKS = check-qdict check-qfloat check-qint check-qstring check-qlist
|
check-unit-y = tests/check-qdict$(EXESUF)
|
||||||
CHECKS += check-qjson test-qmp-output-visitor test-qmp-input-visitor
|
check-unit-y += tests/check-qfloat$(EXESUF)
|
||||||
CHECKS += test-string-input-visitor test-string-output-visitor test-coroutine
|
check-unit-y += tests/check-qint$(EXESUF)
|
||||||
CHECKS += test-qmp-commands
|
check-unit-y += tests/check-qstring$(EXESUF)
|
||||||
CHECKS += $(SRC_PATH)/tests/qemu-iotests-quick.sh
|
check-unit-y += tests/check-qlist$(EXESUF)
|
||||||
|
check-unit-y += tests/check-qjson$(EXESUF)
|
||||||
|
check-unit-y += tests/test-qmp-output-visitor$(EXESUF)
|
||||||
|
check-unit-y += tests/test-qmp-input-visitor$(EXESUF)
|
||||||
|
check-unit-y += tests/test-qmp-input-strict$(EXESUF)
|
||||||
|
check-unit-y += tests/test-qmp-commands$(EXESUF)
|
||||||
|
check-unit-y += tests/test-string-input-visitor$(EXESUF)
|
||||||
|
check-unit-y += tests/test-string-output-visitor$(EXESUF)
|
||||||
|
check-unit-y += tests/test-coroutine$(EXESUF)
|
||||||
|
|
||||||
check-qint.o check-qstring.o check-qdict.o check-qlist.o check-qfloat.o check-qjson.o test-coroutine.o: $(GENERATED_HEADERS)
|
check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
|
||||||
|
|
||||||
check-qint: check-qint.o qint.o $(tools-obj-y)
|
GENERATED_HEADERS += tests/test-qapi-types.h tests/test-qapi-visit.h tests/test-qmp-commands.h
|
||||||
check-qstring: check-qstring.o qstring.o $(tools-obj-y)
|
|
||||||
check-qdict: check-qdict.o qdict.o qfloat.o qint.o qstring.o qbool.o qlist.o $(tools-obj-y)
|
|
||||||
check-qlist: check-qlist.o qlist.o qint.o $(tools-obj-y)
|
|
||||||
check-qfloat: check-qfloat.o qfloat.o $(tools-obj-y)
|
|
||||||
check-qjson: check-qjson.o $(qobject-obj-y) $(tools-obj-y)
|
|
||||||
test-coroutine: test-coroutine.o qemu-timer-common.o async.o $(coroutine-obj-y) $(tools-obj-y)
|
|
||||||
|
|
||||||
test-qmp-input-visitor.o test-qmp-output-visitor.o test-qmp-input-strict.o \
|
test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \
|
||||||
test-string-input-visitor.o test-string-output-visitor.o \
|
tests/check-qlist.o tests/check-qfloat.o tests/check-qjson.o \
|
||||||
test-qmp-commands.o: QEMU_CFLAGS += -I $(qapi-dir)
|
tests/test-coroutine.o tests/test-string-output-visitor.o \
|
||||||
|
tests/test-string-input-visitor.o tests/test-qmp-output-visitor.o \
|
||||||
|
tests/test-qmp-input-visitor.o tests/test-qmp-input-strict.o \
|
||||||
|
tests/test-qmp-commands.o
|
||||||
|
|
||||||
$(qapi-dir)/test-qapi-types.c $(qapi-dir)/test-qapi-types.h :\
|
test-qapi-obj-y = $(qobject-obj-y) $(qapi-obj-y) $(tools-obj-y)
|
||||||
|
test-qapi-obj-y += tests/test-qapi-visit.o tests/test-qapi-types.o
|
||||||
|
test-qapi-obj-y += module.o
|
||||||
|
|
||||||
|
$(test-obj-y): $(GENERATED_HEADERS)
|
||||||
|
$(test-obj-y): QEMU_INCLUDES += -Itests
|
||||||
|
|
||||||
|
tests/check-qint$(EXESUF): tests/check-qint.o qint.o $(tools-obj-y)
|
||||||
|
tests/check-qstring$(EXESUF): tests/check-qstring.o qstring.o $(tools-obj-y)
|
||||||
|
tests/check-qdict$(EXESUF): tests/check-qdict.o qdict.o qfloat.o qint.o qstring.o qbool.o qlist.o $(tools-obj-y)
|
||||||
|
tests/check-qlist$(EXESUF): tests/check-qlist.o qlist.o qint.o $(tools-obj-y)
|
||||||
|
tests/check-qfloat$(EXESUF): tests/check-qfloat.o qfloat.o $(tools-obj-y)
|
||||||
|
tests/check-qjson$(EXESUF): tests/check-qjson.o $(qobject-obj-y) $(tools-obj-y)
|
||||||
|
tests/test-coroutine$(EXESUF): tests/test-coroutine.o $(coroutine-obj-y) $(tools-obj-y)
|
||||||
|
|
||||||
|
tests/test-qapi-types.c tests/test-qapi-types.h :\
|
||||||
$(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
|
$(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
|
||||||
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py $(gen-out-type) -o "$(qapi-dir)" -p "test-" < $<, " GEN $@")
|
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py $(gen-out-type) -o tests -p "test-" < $<, " GEN $@")
|
||||||
$(qapi-dir)/test-qapi-visit.c $(qapi-dir)/test-qapi-visit.h :\
|
tests/test-qapi-visit.c tests/test-qapi-visit.h :\
|
||||||
$(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-visit.py
|
$(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-visit.py
|
||||||
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py $(gen-out-type) -o "$(qapi-dir)" -p "test-" < $<, " GEN $@")
|
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py $(gen-out-type) -o tests -p "test-" < $<, " GEN $@")
|
||||||
$(qapi-dir)/test-qmp-commands.h $(qapi-dir)/test-qmp-marshal.c :\
|
tests/test-qmp-commands.h tests/test-qmp-marshal.c :\
|
||||||
$(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-commands.py
|
$(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-commands.py
|
||||||
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py $(gen-out-type) -o "$(qapi-dir)" -p "test-" < $<, " GEN $@")
|
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py $(gen-out-type) -o tests -p "test-" < $<, " GEN $@")
|
||||||
|
|
||||||
|
|
||||||
test-string-output-visitor.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h) $(qapi-obj-y)
|
tests/test-string-output-visitor$(EXESUF): tests/test-string-output-visitor.o $(test-qapi-obj-y)
|
||||||
test-string-output-visitor: test-string-output-visitor.o $(qobject-obj-y) $(qapi-obj-y) $(tools-obj-y) $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o
|
tests/test-string-input-visitor$(EXESUF): tests/test-string-input-visitor.o $(test-qapi-obj-y)
|
||||||
|
tests/test-qmp-output-visitor$(EXESUF): tests/test-qmp-output-visitor.o $(test-qapi-obj-y)
|
||||||
|
tests/test-qmp-input-visitor$(EXESUF): tests/test-qmp-input-visitor.o $(test-qapi-obj-y)
|
||||||
|
tests/test-qmp-input-strict$(EXESUF): tests/test-qmp-input-strict.o $(test-qapi-obj-y)
|
||||||
|
tests/test-qmp-commands$(EXESUF): tests/test-qmp-commands.o tests/test-qmp-marshal.o $(test-qapi-obj-y)
|
||||||
|
|
||||||
test-string-input-visitor.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h) $(qapi-obj-y)
|
.PHONY: check-help
|
||||||
test-string-input-visitor: test-string-input-visitor.o $(qobject-obj-y) $(qapi-obj-y) $(tools-obj-y) $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o
|
check-help:
|
||||||
|
@echo "Regression testing targets:"
|
||||||
|
@echo
|
||||||
|
@echo " make check Run all tests"
|
||||||
|
@echo " make check-unit Run qobject tests"
|
||||||
|
@echo " make check-block Run block tests"
|
||||||
|
@echo " make check-report.html Generates an HTML test report"
|
||||||
|
@echo
|
||||||
|
@echo "Please note that HTML reports do not regenerate if the unit tests"
|
||||||
|
@echo "has not changed."
|
||||||
|
@echo
|
||||||
|
@echo "The variable SPEED can be set to control the gtester speed setting."
|
||||||
|
@echo "Default options are -k and (for make V=1) --verbose; they can be"
|
||||||
|
@echo "changed with variable GTESTER_OPTIONS."
|
||||||
|
|
||||||
test-qmp-input-strict.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h) $(qapi-obj-y)
|
.SECONDARY:
|
||||||
test-qmp-input-strict: test-qmp-input-strict.o $(qobject-obj-y) $(qapi-obj-y) $(tools-obj-y) $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o
|
|
||||||
|
|
||||||
test-qmp-output-visitor.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h) $(qapi-obj-y)
|
SPEED = quick
|
||||||
test-qmp-output-visitor: test-qmp-output-visitor.o $(qobject-obj-y) $(qapi-obj-y) $(tools-obj-y) $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o
|
GTESTER_OPTIONS = -k $(if $(V),--verbose,-q)
|
||||||
|
|
||||||
test-qmp-input-visitor.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h) $(qapi-obj-y)
|
# gtester tests, possibly with verbose output
|
||||||
test-qmp-input-visitor: test-qmp-input-visitor.o $(qobject-obj-y) $(qapi-obj-y) $(tools-obj-y) $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o
|
|
||||||
|
|
||||||
test-qmp-commands.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h test-qmp-marshal.c test-qmp-commands.h) $(qapi-obj-y)
|
.PHONY: $(patsubst %, check-%, $(check-unit-y))
|
||||||
test-qmp-commands: test-qmp-commands.o $(qobject-obj-y) $(qapi-obj-y) $(tools-obj-y) $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o $(qapi-dir)/test-qmp-marshal.o module.o
|
$(patsubst %, check-%, $(check-unit-y)): check-%: %
|
||||||
|
$(call quiet-command,gtester $(GTESTER_OPTIONS) -m=$(SPEED) $*,"GTESTER $*")
|
||||||
|
|
||||||
$(SRC_PATH)/tests/qemu-iotests-quick.sh: qemu-img qemu-io
|
# gtester tests with XML output
|
||||||
|
|
||||||
|
check-report-unit.xml: $(check-unit-y)
|
||||||
|
$(call quiet-command,gtester -q $(GTESTER_OPTIONS) -o $@ -m=$(SPEED) $^, "GTESTER $@")
|
||||||
|
|
||||||
|
# Reports and overall runs
|
||||||
|
|
||||||
|
check-report.xml: check-report-unit.xml
|
||||||
|
$(call quiet-command,$(SRC_PATH)/scripts/gtester-cat $^ > $@, " GEN $@")
|
||||||
|
|
||||||
|
check-report.html: check-report.xml
|
||||||
|
$(call quiet-command,gtester-report $< > $@, " GEN $@")
|
||||||
|
|
||||||
|
|
||||||
.PHONY: check check-block
|
# Other tests
|
||||||
|
|
||||||
check: $(CHECKS)
|
.PHONY: check-tests/qemu-iotests-quick.sh
|
||||||
$(call quiet-command, gtester $(CHECKS), " CHECK")
|
check-tests/qemu-iotests-quick.sh: tests/qemu-iotests-quick.sh qemu-img$(EXESUF) qemu-io$(EXESUF)
|
||||||
|
$<
|
||||||
|
|
||||||
check-block:
|
# Consolidated targets
|
||||||
$(call quiet-command, $(SHELL) $(SRC_PATH)/tests/check-block.sh , " CHECK")
|
|
||||||
|
.PHONY: check-unit check
|
||||||
|
check-unit: $(patsubst %,check-%, $(check-unit-y))
|
||||||
|
check-block: $(patsubst %,check-%, $(check-block-y))
|
||||||
|
check: check-unit
|
||||||
|
|
Loading…
Reference in New Issue