Skip to content

Instantly share code, notes, and snippets.

@lawrencejones
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lawrencejones/9076163 to your computer and use it in GitHub Desktop.
Save lawrencejones/9076163 to your computer and use it in GitHub Desktop.
Makes test output colorful- yay\!
# -*- makefile -*-
include $(patsubst %,$(SRCDIR)/%/Make.tests,$(TEST_SUBDIRS))
# Colors!
GREEN =\e[01;38;5;82m
PINK =\e[01;38;5;197m
D =\e[01;37;40m
CLRCOL =\e[0m
PROGS = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_PROGS))
TESTS = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_TESTS))
EXTRA_GRADES = $(foreach subdir,$(TEST_SUBDIRS),$($(subdir)_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
# Used for coloring test output
PERL := perl -e 'use utf8;'
HL_TEST := "s/(?<=^(PASS|FAIL) ).*$$/${D}$$&${CLRCOL}/gm"
HL_NUMS := "s/\d+/${D}$$&${CLRCOL}/gm"
HL_FAIL := "s/fail(ed)?/${PINK}\U$$&\E${CLRCOL}/gi"
HL_PASS := "s/pass(ed)?/${GREEN}\U$$&\E${CLRCOL}/gi"
HIGHLIGHT :=\
$(PERL) -pe $(HL_TEST) |\
$(PERL) -pe $(HL_PASS) |\
$(PERL) -pe $(HL_FAIL)
TIMEOUT = 60
clean::
rm -f $(OUTPUTS) $(ERRORS) $(RESULTS)
grade:: results
$(SRCDIR)/tests/make-grade $(SRCDIR) $< $(GRADING_FILE) | tee $@
check:: results
@echo "\n~~~~ RESULTS SUMMARY ~~~"
@cat $< | $(HIGHLIGHT)
@COUNT="`egrep -i '^(PASS|FAIL) ' $< | wc -l | sed 's/[ ]//g;'`"; \
FAILURES="`egrep -i '^FAIL ' $< | wc -l | sed 's/[ ]//g;'`"; \
if [ $$FAILURES = 0 ]; \
then \
echo "~~~~ All $$COUNT tests PASSED." | $(PERL) -pe $(HL_NUMS) | $(HIGHLIGHT); \
else \
echo "~~~~ $$FAILURES of $$COUNT tests FAIL." | $(PERL) -pe $(HL_NUMS) | $(HIGHLIGHT); \
exit 1; \
fi
@echo
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 =
TESTCMD = pintos -v -k -T $(TIMEOUT)
TESTCMD += $(SIMULATOR)
TESTCMD += $(PINTOSOPTS)
ifeq ($(filter userprog, $(KERNEL_SUBDIRS)), userprog)
TESTCMD += $(FILESYSSOURCE)
TESTCMD += $(foreach file,$(PUTFILES),-p $(file) -a $(notdir $(file)))
endif
ifeq ($(filter vm, $(KERNEL_SUBDIRS)), vm)
TESTCMD += --swap-size=4
endif
TESTCMD += -- -q
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).output
%.output: kernel.bin loader.bin
@echo "Testing `basename $@`" | $(PERL) -pe "s/(?<=Testing ).*/${D}$$&${CLRCOL}/g"
$(TESTCMD)
%.result: %.ck %.output
@perl -I$(SRCDIR) $< $* $@ 2>&1 | $(HIGHLIGHT)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment