diff options
Diffstat (limited to 'src/tests/modules/test.mk')
-rw-r--r-- | src/tests/modules/test.mk | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/tests/modules/test.mk b/src/tests/modules/test.mk new file mode 100644 index 0000000..b217ff7 --- /dev/null +++ b/src/tests/modules/test.mk @@ -0,0 +1,165 @@ +# +# Add the module tests to the overall dependencies +# + +TESTS.MODULES_FILES := + +# If module requires test server, make sure TEST_SERVER of <MODULE>_TEST_SERVER variables are defined +# If TEST_SERVER is defined, define <MODULE>_TEST_SERVER for all modules that have CHECK_MODULE_TEST_CAN_BE_RUN +define CHECK_MODULE_TEST_CAN_BE_RUN + ifndef ${1}_require_test_server + tests.modules: ${1}.test + else + ifdef TEST_SERVER + tests.modules: ${1}.test + export $(shell echo ${1} | tr a-z A-Z)_TEST_SERVER := $(TEST_SERVER) + endif + ifdef $(shell echo ${1} | tr a-z A-Z)_TEST_SERVER + tests.modules: ${1}.test + endif + endif +endef +$(foreach x,$(TEST_BUILT) $(TEST_SUBBUILT),$(eval $(call CHECK_MODULE_TEST_CAN_BE_RUN,$x))) + +###################################################################### +# +# And now more makefile magic to automatically run the tests +# for each module. +# + +define DEFAULT_ATTRS +ifeq "$(wildcard ${1}.attrs)" +${1}.attrs +else +src/tests/modules/default-input.attrs +endif +endef + +# +# Files in the output dir depend on the unit tests +# +# src/tests/$(MODULE_DIR)/FOO.unlang unlang for the test +# src/tests/$(MODULE_DIR)/FOO.attrs input RADIUS and output filter +# build/tests/$(MODULE_DIR)/FOO.out updated if the test succeeds +# build/tests/$(MODULE_DIR)/FOO.log debug output for the test +# +# If the test fails, then look for ERROR in the input. No error +# means it's unexpected, so we die. +# +# Otherwise, check the log file for a parse error which matches the +# ERROR line in the input. +# +$(BUILD_DIR)/tests/modules/%: src/tests/modules/%.unlang $(BUILD_DIR)/tests/modules/%.attrs $(TESTBINDIR)/unittest | build.raddb + @mkdir -p $(dir $@) + @echo MODULE-TEST $(lastword $(subst /, ,$(dir $@))) $(basename $(notdir $@)) + @if ! MODULE_TEST_DIR=$(dir $<) MODULE_TEST_UNLANG=$< $(TESTBIN)/unittest -D share -d src/tests/modules/ -i $@.attrs -f $@.attrs -xxx > $@.log 2>&1; then \ + if ! grep ERROR $< 2>&1 > /dev/null; then \ + cat $@.log; \ + echo "# $@.log"; \ + echo MODULE_TEST_DIR=$(dir $<) MODULE_TEST_UNLANG=$< $(TESTBIN)/unittest -D share -d src/tests/modules/ -i $@.attrs -f $@.attrs -xx; \ + exit 1; \ + fi; \ + FOUND=$$(grep ^$< $@.log | head -1 | sed 's/:.*//;s/.*\[//;s/\].*//'); \ + EXPECTED=$$(grep -n ERROR $< | sed 's/:.*//'); \ + if [ "$$EXPECTED" != "$$FOUND" ]; then \ + cat $@.log; \ + echo "# $@.log"; \ + echo MODULE_TEST_DIR=$(dir $<) MODULE_TEST_UNLANG=$< $(TESTBIN)/unittest -D share -d src/tests/modules/ -i $@.attrs -f $@.attrs -xx; \ + exit 1; \ + fi \ + fi + @touch $@ + +# +# Sometimes we have a default input. So use that. Otherwise, use +# the input specific to the test. +# +MODULE_UNLANG := $(wildcard src/tests/modules/*/*.unlang src/tests/modules/*/*/*.unlang) +MODULE_ATTRS_REQUIRES := $(patsubst %.unlang,%.attrs,$(MODULE_UNLANG)) +MODULE_ATTRS_EXISTS := $(wildcard src/tests/modules/*/*.attrs src/tests/modules/*/*/*.attrs) +MODULE_ATTRS_NEEDS := $(filter-out $(MODULE_ATTRS_EXISTS),$(MODULE_ATTRS_REQUIRES)) + +MODULE_CONF_REQUIRES := $(patsubst %.unlang,%.conf,$(MODULE_UNLANG)) +MODULE_CONF_EXISTS := $(wildcard src/tests/modules/*/*.conf src/tests/modules/*/*/*.attrs) +MODULE_CONF_NEEDS := $(filter-out $(MODULE_CONF_EXISTS),$(MODULE_CONF_REQUIRES)) + +# +# The complete list of tests which are to be run +# +MODULE_TESTS := $(patsubst src/tests/modules/%/all.mk,%,$(wildcard src/tests/modules/*/all.mk)) + + +# +# Target-specific rules +# +define MODULE_COPY_FILE +$(BUILD_DIR)/${1}: src/${1} + @mkdir -p $$(@D) + @cp $$< $$@ + +endef + +# +# Default rules +# +define MODULE_COPY_ATTR +$(BUILD_DIR)/${1}: src/tests/modules/default-input.attrs + @mkdir -p $$(@D) + @cp $$< $$@ +endef + +# +# FIXME: get this working +# +define MODULE_COPY_CONF +$(BUILD_DIR)/${1}: src/tests/modules/${2}/module.conf + @mkdir -p $$(@D) + @cp $$< $$@ +endef + +define MODULE_FILE_TARGET +$(BUILD_DIR)/${1}: src/${1}.unlang $(BUILD_DIR)/${1}.attrs + +endef + +define MODULE_TEST_TARGET +${1}.test: $(patsubst %.unlang,%,$(subst src,$(BUILD_DIR),$(filter src/tests/modules/${1}/%,$(MODULE_UNLANG)))) + +TESTS.MODULES_FILES += $(patsubst %.unlang,%,$(subst src,$(BUILD_DIR),$(filter src/tests/modules/${1}/%,$(MODULE_UNLANG)))) +endef + +# +# Create the rules from the list of input files +# +$(foreach x,$(MODULE_ATTRS_EXISTS),$(eval $(call MODULE_COPY_FILE,$(subst src/,,$x)))) +$(foreach x,$(MODULE_CONF_EXISTS),$(eval $(call MODULE_COPY_FILE,$(subst src/,,$x)))) + +$(foreach x,$(MODULE_ATTRS_NEEDS),$(eval $(call MODULE_COPY_ATTR,$(subst src/,,$x)))) +# FIXME: copy src/tests/modules/*/module.conf to the right place, too + +$(foreach x,$(MODULE_UNLANG),$(eval $(call MODULE_FILE_TARGET,$(patsubst %.unlang,%,$(subst src/,,$x))))) +$(foreach x,$(MODULE_TESTS),$(eval $(call MODULE_TEST_TARGET,$x))) + +$(TESTS.MODULES_FILES): $(TESTS.AUTH_FILES) + +.PHONY: clean.modules.test +clean.modules.test: + @rm -rf $(BUILD_DIR)/tests/modules/ + +# +# For each file, look for precursor test. +# Ensure that each test depends on its precursors. +# +-include $(BUILD_DIR)/tests/modules/depends.mk + +$(BUILD_DIR)/tests/modules/depends.mk: $(MODULE_UNLANG) | $(BUILD_DIR)/tests/modules + @rm -f $@ + @for x in $^; do \ + y=`grep PRE $$x | awk '{ print $$3 }'`; \ + if [ "$$y" != "" ]; then \ + z=`echo $$x | sed 's,src/,$(BUILD_DIR)/', | sed 's/.unlang//'`; \ + d=$$(basename $$(dirname $$x)); \ + echo "$$z: $(BUILD_DIR)/tests/modules/$$d/$$y" >> $@; \ + echo "" >> $@; \ + fi \ + done |