aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests/Make.tests
blob: 5105d0d0186605167d879bf8f04a8640c7d58208 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# -*- makefile -*-

include $(patsubst %,$(SRCDIR)/%/Make.tests,$(TEST_SUBDIRS))

PROGS = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_PROGS))
TESTS = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_TESTS))
EXTRA_GRADES = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_EXTRA_GRADES))

ALLPUTS = $(addsuffix .allput,$(TESTS) $(EXTRA_GRADES))
OUTPUTS = $(addsuffix .output,$(TESTS) $(EXTRA_GRADES))
ERRORS = $(addsuffix .errors,$(TESTS) $(EXTRA_GRADES))
RESULTS = $(addsuffix .result,$(TESTS) $(EXTRA_GRADES))

ifdef PROGS
include ../../Makefile.userprog
endif

TIMEOUT = 60

clean::
	rm -f $(OUTPUTS) $(ERRORS) $(RESULTS) $(ALLPUTS) 

grade:: results
	$(SRCDIR)/tests/make-grade $(SRCDIR) $< $(GRADING_FILE) | tee $@

# klaar@ida 2011-01-12: new rule to re-run only failed tests
# use with care, it will mess with the file dates
recheck:: os.dsk
#	@echo "Cleaning all tests that failed on last run:";
	@for d in $(TESTS) $(EXTRA_GRADES); do			\
		if echo PASS | cmp -s $$d.result -; then	\
#			echo "TOUCH $$d";			\
			touch $$d.??????;			\
		else						\
#			echo "CLEAN $$d";			\
			rm -f $$d.??????;			\
		fi;						\
	done
	@$(MAKE) check
	@touch os.dsk
	@echo "WARNING: Only failed tests was rerun on new version."

check:: results
	@cat results
	@COUNT="`egrep '^(pass|FAIL) ' $< | wc -l | sed 's/[ 	]//g;'`"; \
	FAILURES="`egrep '^FAIL ' $< | wc -l | sed 's/[ 	]//g;'`"; \
	if [ $$FAILURES = 0 ]; then					  \
		echo "All $$COUNT tests passed.";			  \
	else								  \
		echo "$$FAILURES of $$COUNT tests failed.";		  \
		exit 1;							  \
	fi

results: $(RESULTS)
	@for d in $(TESTS) $(EXTRA_GRADES); do			\
		if echo PASS | cmp -s $$d.result -; then	\
			echo "pass $$d";			\
		else						\
			echo "FAIL $$d";			\
		fi;						\
	done > $@

outputs:: $(OUTPUTS)

$(foreach prog,$(PROGS),$(eval $(prog).output: $(prog)))
$(foreach test,$(TESTS),$(eval $(test).output: $($(test)_PUTFILES)))
$(foreach test,$(TESTS),$(eval $(test).output: TEST = $(test)))

# Prevent an environment variable VERBOSE from surprising us.
VERBOSE =

# klaar@ida 2015-05-12: to run gmake check in Solaris
ifneq (0, $(shell expr `uname -s` : 'Linux'))
TESTCMD = pintos -v -k -T $(TIMEOUT)
else
TESTCMD = spintos -v -k -T $(TIMEOUT)
endif

TESTCMD += $(SIMULATOR)
TESTCMD += $(PINTOSOPTS)
ifeq ($(filter userprog, $(KERNEL_SUBDIRS)), userprog)
TESTCMD += --fs-disk=$(FSDISK)
TESTCMD += $(foreach file,$(PUTFILES),-p $(file) -a $(notdir $(file)))
endif
ifeq ($(filter vm, $(KERNEL_SUBDIRS)), vm)
TESTCMD += --swap-disk=4
endif
TESTCMD += -- -q 
# klaar@ida 2016-05: new kernel flag
ifeq ($(filter -F=%, $(KERNELFLAGS)),)
# BUG: Why is this not filtered out?
TESTCMD += -F=10000
endif
TESTCMD += $(KERNELFLAGS)
ifeq ($(filter userprog, $(KERNEL_SUBDIRS)), userprog)
TESTCMD += -f
endif
TESTCMD += $(if $($(TEST)_ARGS),run '$(*F) $($(TEST)_ARGS)',run $(*F))
TESTCMD += < /dev/null
TESTCMD += 2> $(TEST).errors $(if $(VERBOSE),|tee,>) $(TEST).allput

# klaar@ida 2011-01-12: added "allput" to be able to strip debug
# messages before checking
%.output: os.dsk
	$(TESTCMD)
	@grep -v '^# .*$$' $(TEST).allput > $(TEST).output

%.result: %.ck %.output
	perl -I$(SRCDIR) $< $* $@