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 \
 | ||||
|               >/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))) | ||||
| 
 | ||||
| # find-in-path
 | ||||
|  | ||||
							
								
								
									
										26
									
								
								scripts/gtester-cat
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								scripts/gtester-cat
									
									
									
									
									
										Executable file
									
								
							| @ -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 | ||||
| 
 | ||||
| CHECKS = check-qdict check-qfloat check-qint check-qstring check-qlist | ||||
| CHECKS += check-qjson test-qmp-output-visitor test-qmp-input-visitor | ||||
| CHECKS += test-string-input-visitor test-string-output-visitor test-coroutine | ||||
| CHECKS += test-qmp-commands | ||||
| CHECKS += $(SRC_PATH)/tests/qemu-iotests-quick.sh | ||||
| check-unit-y = tests/check-qdict$(EXESUF) | ||||
| check-unit-y += tests/check-qfloat$(EXESUF) | ||||
| check-unit-y += tests/check-qint$(EXESUF) | ||||
| check-unit-y += tests/check-qstring$(EXESUF) | ||||
| 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) | ||||
| 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) | ||||
| GENERATED_HEADERS += tests/test-qapi-types.h tests/test-qapi-visit.h tests/test-qmp-commands.h | ||||
| 
 | ||||
| test-qmp-input-visitor.o test-qmp-output-visitor.o test-qmp-input-strict.o \ | ||||
| test-string-input-visitor.o test-string-output-visitor.o \ | ||||
| 	test-qmp-commands.o: QEMU_CFLAGS += -I $(qapi-dir) | ||||
| test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \
 | ||||
| 	tests/check-qlist.o tests/check-qfloat.o tests/check-qjson.o \
 | ||||
| 	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 | ||||
| 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py $(gen-out-type) -o "$(qapi-dir)" -p "test-" < $<, "  GEN   $@") | ||||
| $(qapi-dir)/test-qapi-visit.c $(qapi-dir)/test-qapi-visit.h :\ | ||||
| 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py $(gen-out-type) -o tests -p "test-" < $<, "  GEN   $@") | ||||
| tests/test-qapi-visit.c tests/test-qapi-visit.h :\ | ||||
| $(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   $@") | ||||
| $(qapi-dir)/test-qmp-commands.h $(qapi-dir)/test-qmp-marshal.c :\ | ||||
| 	$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py $(gen-out-type) -o tests -p "test-" < $<, "  GEN   $@") | ||||
| tests/test-qmp-commands.h tests/test-qmp-marshal.c :\ | ||||
| $(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) | ||||
| 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-output-visitor$(EXESUF): tests/test-string-output-visitor.o $(test-qapi-obj-y) | ||||
| 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) | ||||
| 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 | ||||
| .PHONY: check-help | ||||
| 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) | ||||
| 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 | ||||
| .SECONDARY: | ||||
| 
 | ||||
| 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) | ||||
| 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 | ||||
| SPEED = quick | ||||
| 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) | ||||
| 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 | ||||
| # gtester tests, possibly with verbose output
 | ||||
| 
 | ||||
| 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) | ||||
| 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 | ||||
| .PHONY: $(patsubst %, check-%, $(check-unit-y)) | ||||
| $(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) | ||||
| 	$(call quiet-command, gtester $(CHECKS), "  CHECK") | ||||
| .PHONY: check-tests/qemu-iotests-quick.sh | ||||
| check-tests/qemu-iotests-quick.sh: tests/qemu-iotests-quick.sh qemu-img$(EXESUF) qemu-io$(EXESUF) | ||||
| 	$< | ||||
| 
 | ||||
| check-block: | ||||
| 	$(call quiet-command, $(SHELL) $(SRC_PATH)/tests/check-block.sh , "  CHECK") | ||||
| # Consolidated targets
 | ||||
| 
 | ||||
| .PHONY: check-unit check | ||||
| check-unit: $(patsubst %,check-%, $(check-unit-y)) | ||||
| check-block: $(patsubst %,check-%, $(check-block-y)) | ||||
| check: check-unit | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Paolo Bonzini
						Paolo Bonzini