Browse Source

Introduce test builds and unify testing tools interface

The general idea is that erlang.mk now keeps track of what kind
of build it generated. A test build is valid for all subsequent
test target invocations. A normal build is only valid for itself
and releases.

This rework adds the ability to specify deps to eunit.

The EUNIT_DIR variable is gone in favor of a more global TEST_DIR.

The tests-ct target got renamed to ct and documented.

Many more minor changes were done during the course of testing
these changes.
Loïc Hoguin 10 years ago
parent
commit
7ee4e7958a
9 changed files with 208 additions and 189 deletions
  1. 8 2
      README.md
  2. 1 0
      build.config
  3. 5 1
      core/core.mk
  4. 13 9
      core/erlc.mk
  5. 44 0
      core/test.mk
  6. 95 88
      erlang.mk
  7. 19 41
      plugins/ct.mk
  8. 13 37
      plugins/eunit.mk
  9. 10 11
      test/Makefile

+ 8 - 2
README.md

@@ -258,6 +258,9 @@ You can change compilation options by setting the `ERLC_OPTS`
 variable. It takes the arguments that will then be passed to
 variable. It takes the arguments that will then be passed to
 `erlc`. For more information, please see `erl -man erlc`.
 `erlc`. For more information, please see `erl -man erlc`.
 
 
+Test target compilation options can be specified in `TEST_ERLC_OPTS`.
+It will override `ERLC_OPTS`.
+
 You can specify a list of modules to be compiled first using
 You can specify a list of modules to be compiled first using
 the `COMPILE_FIRST` variable.
 the `COMPILE_FIRST` variable.
 
 
@@ -331,7 +334,10 @@ The defaults are system dependent.
 Common_test plugin
 Common_test plugin
 ------------------
 ------------------
 
 
-This plugin is available by default.
+This plugin is available by default. It adds the following
+target:
+
+`ct` runs all test suites for this application.
 
 
 There is nothing to configure to use it, simply create your
 There is nothing to configure to use it, simply create your
 test suites in the `./test/` directory and erlang.mk will
 test suites in the `./test/` directory and erlang.mk will
@@ -446,7 +452,7 @@ target:
 
 
 `eunit` which runs all the EUnit tests found in `ebin` and
 `eunit` which runs all the EUnit tests found in `ebin` and
 any of the additional EUnit directories specified in
 any of the additional EUnit directories specified in
-`EUNIT_DIR`.
+`TEST_DIR`.
 
 
 `EUNIT_OPTS` can be used to specify EUnit-specific options
 `EUNIT_OPTS` can be used to specify EUnit-specific options
 (e.g. `verbose`) that will be used when calling
 (e.g. `verbose`) that will be used when calling

+ 1 - 0
build.config

@@ -5,6 +5,7 @@
 core/core
 core/core
 core/deps
 core/deps
 core/erlc
 core/erlc
+core/test
 
 
 # Plugins.
 # Plugins.
 #
 #

+ 5 - 1
core/core.mk

@@ -46,8 +46,12 @@ all:: deps
 rel::
 rel::
 	@echo -n
 	@echo -n
 
 
-clean::
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
 	$(gen_verbose) rm -f erl_crash.dump
 	$(gen_verbose) rm -f erl_crash.dump
+endif
 
 
 distclean:: clean
 distclean:: clean
 
 

+ 13 - 9
core/erlc.mk

@@ -31,9 +31,15 @@ xyrl_verbose = $(xyrl_verbose_$(V))
 mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
 mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
 mib_verbose = $(mib_verbose_$(V))
 mib_verbose = $(mib_verbose_$(V))
 
 
-# Core targets.
+# Targets.
 
 
-app:: erlc-include ebin/$(PROJECT).app
+ifeq ($(wildcard ebin/test),)
+app:: app-build
+else
+app:: clean app-build
+endif
+
+app-build: erlc-include ebin/$(PROJECT).app
 	$(eval MODULES := $(shell find ebin -type f -name \*.beam \
 	$(eval MODULES := $(shell find ebin -type f -name \*.beam \
 		| sed "s/ebin\//'/;s/\.beam/',/" | sed '$$s/.$$//'))
 		| sed "s/ebin\//'/;s/\.beam/',/" | sed '$$s/.$$//'))
 	@if [ -z "$$(grep -E '^[^%]*{modules,' src/$(PROJECT).app.src)" ]; then \
 	@if [ -z "$$(grep -E '^[^%]*{modules,' src/$(PROJECT).app.src)" ]; then \
@@ -46,6 +52,11 @@ app:: erlc-include ebin/$(PROJECT).app
 		| sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
 		| sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
 		> ebin/$(PROJECT).app
 		> ebin/$(PROJECT).app
 
 
+erlc-include:
+	-@if [ -d ebin/ ]; then \
+		find include/ src/ -type f -name \*.hrl -newer ebin -exec touch $(shell find src/ -type f -name "*.erl") \; 2>/dev/null || printf ''; \
+	fi
+
 define compile_erl
 define compile_erl
 	$(erlc_verbose) erlc -v $(ERLC_OPTS) -o ebin/ \
 	$(erlc_verbose) erlc -v $(ERLC_OPTS) -o ebin/ \
 		-pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),\
 		-pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),\
@@ -85,13 +96,6 @@ endif
 
 
 clean:: clean-app
 clean:: clean-app
 
 
-# Extra targets.
-
-erlc-include:
-	-@if [ -d ebin/ ]; then \
-		find include/ src/ -type f -name \*.hrl -newer ebin -exec touch $(shell find src/ -type f -name "*.erl") \; 2>/dev/null || printf ''; \
-	fi
-
 clean-app:
 clean-app:
 	$(gen_verbose) rm -rf ebin/ priv/mibs/ \
 	$(gen_verbose) rm -rf ebin/ priv/mibs/ \
 		$(addprefix include/,$(addsuffix .hrl,$(notdir $(basename $(wildcard mibs/*.mib)))))
 		$(addprefix include/,$(addsuffix .hrl,$(notdir $(basename $(wildcard mibs/*.mib)))))

+ 44 - 0
core/test.mk

@@ -0,0 +1,44 @@
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+test-deps: $(ALL_TEST_DEPS_DIRS)
+	@for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+
+ifneq ($(strip $(TEST_DIR)),)
+test-dir:
+	$(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+		$(wildcard $(TEST_DIR)/*.erl $(TEST_DIR)/*/*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard ebin/test),)
+test-build: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build: clean deps test-deps
+	@$(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+	$(gen_verbose) touch ebin/test
+else
+test-build: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build: deps test-deps
+	@$(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+	$(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif

+ 95 - 88
erlang.mk

@@ -46,8 +46,12 @@ all:: deps
 rel::
 rel::
 	@echo -n
 	@echo -n
 
 
-clean::
+clean:: clean-crashdump
+
+clean-crashdump:
+ifneq ($(wildcard erl_crash.dump),)
 	$(gen_verbose) rm -f erl_crash.dump
 	$(gen_verbose) rm -f erl_crash.dump
+endif
 
 
 distclean:: clean
 distclean:: clean
 
 
@@ -249,9 +253,15 @@ xyrl_verbose = $(xyrl_verbose_$(V))
 mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
 mib_verbose_0 = @echo " MIB   " $(filter %.bin %.mib,$(?F));
 mib_verbose = $(mib_verbose_$(V))
 mib_verbose = $(mib_verbose_$(V))
 
 
-# Core targets.
+# Targets.
 
 
-app:: erlc-include ebin/$(PROJECT).app
+ifeq ($(wildcard ebin/test),)
+app:: app-build
+else
+app:: clean app-build
+endif
+
+app-build: erlc-include ebin/$(PROJECT).app
 	$(eval MODULES := $(shell find ebin -type f -name \*.beam \
 	$(eval MODULES := $(shell find ebin -type f -name \*.beam \
 		| sed "s/ebin\//'/;s/\.beam/',/" | sed '$$s/.$$//'))
 		| sed "s/ebin\//'/;s/\.beam/',/" | sed '$$s/.$$//'))
 	@if [ -z "$$(grep -E '^[^%]*{modules,' src/$(PROJECT).app.src)" ]; then \
 	@if [ -z "$$(grep -E '^[^%]*{modules,' src/$(PROJECT).app.src)" ]; then \
@@ -264,6 +274,11 @@ app:: erlc-include ebin/$(PROJECT).app
 		| sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
 		| sed "s/{id,[[:space:]]*\"git\"}/{id, \"$(GITDESCRIBE)\"}/" \
 		> ebin/$(PROJECT).app
 		> ebin/$(PROJECT).app
 
 
+erlc-include:
+	-@if [ -d ebin/ ]; then \
+		find include/ src/ -type f -name \*.hrl -newer ebin -exec touch $(shell find src/ -type f -name "*.erl") \; 2>/dev/null || printf ''; \
+	fi
+
 define compile_erl
 define compile_erl
 	$(erlc_verbose) erlc -v $(ERLC_OPTS) -o ebin/ \
 	$(erlc_verbose) erlc -v $(ERLC_OPTS) -o ebin/ \
 		-pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),\
 		-pa ebin/ -I include/ $(filter-out $(ERLC_EXCLUDE_PATHS),\
@@ -303,17 +318,55 @@ endif
 
 
 clean:: clean-app
 clean:: clean-app
 
 
-# Extra targets.
-
-erlc-include:
-	-@if [ -d ebin/ ]; then \
-		find include/ src/ -type f -name \*.hrl -newer ebin -exec touch $(shell find src/ -type f -name "*.erl") \; 2>/dev/null || printf ''; \
-	fi
-
 clean-app:
 clean-app:
 	$(gen_verbose) rm -rf ebin/ priv/mibs/ \
 	$(gen_verbose) rm -rf ebin/ priv/mibs/ \
 		$(addprefix include/,$(addsuffix .hrl,$(notdir $(basename $(wildcard mibs/*.mib)))))
 		$(addprefix include/,$(addsuffix .hrl,$(notdir $(basename $(wildcard mibs/*.mib)))))
 
 
+# Copyright (c) 2015, Loïc Hoguin <essen@ninenines.eu>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+.PHONY: test-deps test-dir test-build clean-test-dir
+
+# Configuration.
+
+TEST_DIR ?= test
+
+ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
+
+TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
+TEST_ERLC_OPTS += -DTEST=1
+
+# Targets.
+
+$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
+
+test-deps: $(ALL_TEST_DEPS_DIRS)
+	@for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
+
+ifneq ($(strip $(TEST_DIR)),)
+test-dir:
+	$(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o $(TEST_DIR) \
+		$(wildcard $(TEST_DIR)/*.erl $(TEST_DIR)/*/*.erl) -pa ebin/
+endif
+
+ifeq ($(wildcard ebin/test),)
+test-build: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build: clean deps test-deps
+	@$(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+	$(gen_verbose) touch ebin/test
+else
+test-build: ERLC_OPTS=$(TEST_ERLC_OPTS)
+test-build: deps test-deps
+	@$(MAKE) --no-print-directory app-build test-dir ERLC_OPTS="$(TEST_ERLC_OPTS)"
+endif
+
+clean:: clean-test-dir
+
+clean-test-dir:
+ifneq ($(wildcard $(TEST_DIR)/*.beam),)
+	$(gen_verbose) rm -f $(TEST_DIR)/*.beam
+endif
+
 # Copyright (c) 2014, Loïc Hoguin <essen@ninenines.eu>
 # Copyright (c) 2014, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
 
@@ -751,78 +804,56 @@ endif
 # Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
 # Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
 
-.PHONY: build-ct-deps build-ct-suites tests-ct clean-ct distclean-ct
+.PHONY: ct distclean-ct
 
 
 # Configuration.
 # Configuration.
 
 
 CT_OPTS ?=
 CT_OPTS ?=
-ifneq ($(wildcard test/),)
-	CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(shell find test -type f -name \*_SUITE.erl -exec basename {} \;)))
+ifneq ($(wildcard $(TEST_DIR)),)
+	CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(shell find $(TEST_DIR) -type f -name \*_SUITE.erl -exec basename {} \;)))
 else
 else
 	CT_SUITES ?=
 	CT_SUITES ?=
 endif
 endif
 
 
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1 -DEXTRA=1 +'{parse_transform, eunit_autoexport}'
-
 # Core targets.
 # Core targets.
 
 
-tests:: tests-ct
-
-clean:: clean-ct
+tests:: ct
 
 
 distclean:: distclean-ct
 distclean:: distclean-ct
 
 
 help::
 help::
 	@printf "%s\n" "" \
 	@printf "%s\n" "" \
+		"Common_test targets:" \
+		"  ct          Run all the common_test suites for this project" \
+		"" \
 		"All your common_test suites have their associated targets." \
 		"All your common_test suites have their associated targets." \
 		"A suite named http_SUITE can be ran using the ct-http target."
 		"A suite named http_SUITE can be ran using the ct-http target."
 
 
 # Plugin-specific targets.
 # Plugin-specific targets.
 
 
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
 CT_RUN = ct_run \
 CT_RUN = ct_run \
 	-no_auto_compile \
 	-no_auto_compile \
 	-noinput \
 	-noinput \
-	-pa $(realpath ebin) $(DEPS_DIR)/*/ebin \
-	-dir test \
+	-pa ebin $(DEPS_DIR)/*/ebin \
+	-dir $(TEST_DIR) \
 	-logdir logs
 	-logdir logs
 
 
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-ct-deps: $(ALL_TEST_DEPS_DIRS)
-	@for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-
-build-ct-suites: build-ct-deps
-	$(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o test/ \
-		$(wildcard test/*.erl test/*/*.erl) -pa ebin/
-
-tests-ct: ERLC_OPTS = $(TEST_ERLC_OPTS)
-tests-ct: clean deps app build-ct-suites
-	@if [ -d "test" ] ; \
-	then \
-		mkdir -p logs/ ; \
-		$(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS) ; \
-	fi
-	$(gen_verbose) rm -f test/*.beam
+ifeq ($(CT_SUITES),)
+ct:
+else
+ct: test-build
+	@mkdir -p logs/
+	$(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
 
 
 define ct_suite_target
 define ct_suite_target
-ct-$(1): ERLC_OPTS = $(TEST_ERLC_OPTS)
-ct-$(1): clean deps app build-ct-suites
-	@if [ -d "test" ] ; \
-	then \
-		mkdir -p logs/ ; \
-		$(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS) ; \
-	fi
-	$(gen_verbose) rm -f test/*.beam
+ct-$(1): test-build
+	@mkdir -p logs/
+	$(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
 endef
 endef
 
 
 $(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
 $(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
 
 
-clean-ct:
-	$(gen_verbose) rm -rf test/*.beam
-
 distclean-ct:
 distclean-ct:
 	$(gen_verbose) rm -rf logs/
 	$(gen_verbose) rm -rf logs/
 
 
@@ -1031,25 +1062,20 @@ distclean-escript:
 # Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
 # Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
 # This file is contributed to erlang.mk and subject to the terms of the ISC License.
 # This file is contributed to erlang.mk and subject to the terms of the ISC License.
 
 
-.PHONY: help-eunit build-eunit eunit distclean-eunit
+.PHONY: eunit
 
 
 # Configuration
 # Configuration
 
 
-EUNIT_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard -DTEST=1 -DEXTRA=1
-
-EUNIT_DIR ?=
-EUNIT_DIRS = $(sort $(EUNIT_DIR) ebin)
-
-ifeq ($(strip $(EUNIT_DIR)),)
+ifeq ($(strip $(TEST_DIR)),)
 TAGGED_EUNIT_TESTS = {dir,"ebin"}
 TAGGED_EUNIT_TESTS = {dir,"ebin"}
 else
 else
-# All modules in EUNIT_DIR
-EUNIT_DIR_MODS = $(notdir $(basename $(shell find $(EUNIT_DIR) -type f -name *.beam)))
+# All modules in TEST_DIR
+TEST_DIR_MODS = $(notdir $(basename $(shell find $(TEST_DIR) -type f -name *.beam)))
 # All modules in 'ebin'
 # All modules in 'ebin'
 EUNIT_EBIN_MODS = $(notdir $(basename $(shell find ebin -type f -name *.beam)))
 EUNIT_EBIN_MODS = $(notdir $(basename $(shell find ebin -type f -name *.beam)))
-# Only those modules in EUNIT_DIR with no matching module in 'ebin'.
+# Only those modules in TEST_DIR with no matching module in 'ebin'.
 # This is done to avoid some tests being executed twice.
 # This is done to avoid some tests being executed twice.
-EUNIT_MODS = $(filter-out $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_DIR_MODS))
+EUNIT_MODS = $(filter-out $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(TEST_DIR_MODS))
 TAGGED_EUNIT_TESTS = {dir,"ebin"} $(foreach mod,$(EUNIT_MODS),$(shell echo $(mod) | sed -e 's/\(.*\)/{module,\1}/g'))
 TAGGED_EUNIT_TESTS = {dir,"ebin"} $(foreach mod,$(EUNIT_MODS),$(shell echo $(mod) | sed -e 's/\(.*\)/{module,\1}/g'))
 endif
 endif
 
 
@@ -1063,42 +1089,23 @@ endef
 
 
 # Core targets.
 # Core targets.
 
 
-help:: help-eunit
-
 tests:: eunit
 tests:: eunit
 
 
-clean:: clean-eunit
+help::
+	@printf "%s\n" "" \
+		"EUnit targets:" \
+		"  eunit       Run all the EUnit tests for this project"
 
 
 # Plugin-specific targets.
 # Plugin-specific targets.
 
 
 EUNIT_RUN = $(ERL) \
 EUNIT_RUN = $(ERL) \
-	-no_auto_compile \
-	-pa $(realpath $(EUNIT_DIR)) $(DEPS_DIR)/*/ebin \
-	-pz $(realpath ebin) \
+	-pa $(TEST_DIR) $(DEPS_DIR)/*/ebin \
+	-pz ebin \
 	-eval 'case eunit:test([$(call str-join,$(TAGGED_EUNIT_TESTS))], [$(EUNIT_OPTS)]) of ok -> halt(0); error -> halt(1) end.'
 	-eval 'case eunit:test([$(call str-join,$(TAGGED_EUNIT_TESTS))], [$(EUNIT_OPTS)]) of ok -> halt(0); error -> halt(1) end.'
 
 
-help-eunit:
-	@printf "%s\n" "" \
-		"EUnit targets:" \
-		"  eunit       Run all the EUnit tests for this project"
-
-ifeq ($(strip $(EUNIT_DIR)),)
-build-eunit:
-else ifeq ($(strip $(EUNIT_DIR)),ebin)
-build-eunit:
-else
-build-eunit:
-	$(gen_verbose) erlc -v $(EUNIT_ERLC_OPTS) -I include/ -o $(EUNIT_DIR) \
-		$(wildcard $(EUNIT_DIR)/*.erl $(EUNIT_DIR)/*/*.erl) -pa ebin/
-endif
-
-eunit: ERLC_OPTS = $(EUNIT_ERLC_OPTS)
-eunit: clean deps app build-eunit
+eunit: test-build
 	$(gen_verbose) $(EUNIT_RUN)
 	$(gen_verbose) $(EUNIT_RUN)
 
 
-clean-eunit:
-	$(gen_verbose) $(foreach dir,$(EUNIT_DIRS),rm -rf $(dir)/*.beam)
-
 # Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
 # Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
 

+ 19 - 41
plugins/ct.mk

@@ -1,77 +1,55 @@
 # Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
 # Copyright (c) 2013-2014, Loïc Hoguin <essen@ninenines.eu>
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 # This file is part of erlang.mk and subject to the terms of the ISC License.
 
 
-.PHONY: build-ct-deps build-ct-suites tests-ct clean-ct distclean-ct
+.PHONY: ct distclean-ct
 
 
 # Configuration.
 # Configuration.
 
 
 CT_OPTS ?=
 CT_OPTS ?=
-ifneq ($(wildcard test/),)
-	CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(shell find test -type f -name \*_SUITE.erl -exec basename {} \;)))
+ifneq ($(wildcard $(TEST_DIR)),)
+	CT_SUITES ?= $(sort $(subst _SUITE.erl,,$(shell find $(TEST_DIR) -type f -name \*_SUITE.erl -exec basename {} \;)))
 else
 else
 	CT_SUITES ?=
 	CT_SUITES ?=
 endif
 endif
 
 
-TEST_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard
-TEST_ERLC_OPTS += -DTEST=1 -DEXTRA=1 +'{parse_transform, eunit_autoexport}'
-
 # Core targets.
 # Core targets.
 
 
-tests:: tests-ct
-
-clean:: clean-ct
+tests:: ct
 
 
 distclean:: distclean-ct
 distclean:: distclean-ct
 
 
 help::
 help::
 	@printf "%s\n" "" \
 	@printf "%s\n" "" \
+		"Common_test targets:" \
+		"  ct          Run all the common_test suites for this project" \
+		"" \
 		"All your common_test suites have their associated targets." \
 		"All your common_test suites have their associated targets." \
 		"A suite named http_SUITE can be ran using the ct-http target."
 		"A suite named http_SUITE can be ran using the ct-http target."
 
 
 # Plugin-specific targets.
 # Plugin-specific targets.
 
 
-ALL_TEST_DEPS_DIRS = $(addprefix $(DEPS_DIR)/,$(TEST_DEPS))
-
 CT_RUN = ct_run \
 CT_RUN = ct_run \
 	-no_auto_compile \
 	-no_auto_compile \
 	-noinput \
 	-noinput \
-	-pa $(realpath ebin) $(DEPS_DIR)/*/ebin \
-	-dir test \
+	-pa ebin $(DEPS_DIR)/*/ebin \
+	-dir $(TEST_DIR) \
 	-logdir logs
 	-logdir logs
 
 
-$(foreach dep,$(TEST_DEPS),$(eval $(call dep_target,$(dep))))
-
-build-ct-deps: $(ALL_TEST_DEPS_DIRS)
-	@for dep in $(ALL_TEST_DEPS_DIRS) ; do $(MAKE) -C $$dep; done
-
-build-ct-suites: build-ct-deps
-	$(gen_verbose) erlc -v $(TEST_ERLC_OPTS) -I include/ -o test/ \
-		$(wildcard test/*.erl test/*/*.erl) -pa ebin/
-
-tests-ct: ERLC_OPTS = $(TEST_ERLC_OPTS)
-tests-ct: clean deps app build-ct-suites
-	@if [ -d "test" ] ; \
-	then \
-		mkdir -p logs/ ; \
-		$(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS) ; \
-	fi
-	$(gen_verbose) rm -f test/*.beam
+ifeq ($(CT_SUITES),)
+ct:
+else
+ct: test-build
+	@mkdir -p logs/
+	$(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(CT_SUITES)) $(CT_OPTS)
+endif
 
 
 define ct_suite_target
 define ct_suite_target
-ct-$(1): ERLC_OPTS = $(TEST_ERLC_OPTS)
-ct-$(1): clean deps app build-ct-suites
-	@if [ -d "test" ] ; \
-	then \
-		mkdir -p logs/ ; \
-		$(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS) ; \
-	fi
-	$(gen_verbose) rm -f test/*.beam
+ct-$(1): test-build
+	@mkdir -p logs/
+	$(gen_verbose) $(CT_RUN) -suite $(addsuffix _SUITE,$(1)) $(CT_OPTS)
 endef
 endef
 
 
 $(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
 $(foreach test,$(CT_SUITES),$(eval $(call ct_suite_target,$(test))))
 
 
-clean-ct:
-	$(gen_verbose) rm -rf test/*.beam
-
 distclean-ct:
 distclean-ct:
 	$(gen_verbose) rm -rf logs/
 	$(gen_verbose) rm -rf logs/

+ 13 - 37
plugins/eunit.mk

@@ -1,25 +1,20 @@
 # Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
 # Copyright (c) 2014, Enrique Fernandez <enrique.fernandez@erlang-solutions.com>
 # This file is contributed to erlang.mk and subject to the terms of the ISC License.
 # This file is contributed to erlang.mk and subject to the terms of the ISC License.
 
 
-.PHONY: help-eunit build-eunit eunit distclean-eunit
+.PHONY: eunit
 
 
 # Configuration
 # Configuration
 
 
-EUNIT_ERLC_OPTS ?= +debug_info +warn_export_vars +warn_shadow_vars +warn_obsolete_guard -DTEST=1 -DEXTRA=1
-
-EUNIT_DIR ?=
-EUNIT_DIRS = $(sort $(EUNIT_DIR) ebin)
-
-ifeq ($(strip $(EUNIT_DIR)),)
+ifeq ($(strip $(TEST_DIR)),)
 TAGGED_EUNIT_TESTS = {dir,"ebin"}
 TAGGED_EUNIT_TESTS = {dir,"ebin"}
 else
 else
-# All modules in EUNIT_DIR
-EUNIT_DIR_MODS = $(notdir $(basename $(shell find $(EUNIT_DIR) -type f -name *.beam)))
+# All modules in TEST_DIR
+TEST_DIR_MODS = $(notdir $(basename $(shell find $(TEST_DIR) -type f -name *.beam)))
 # All modules in 'ebin'
 # All modules in 'ebin'
 EUNIT_EBIN_MODS = $(notdir $(basename $(shell find ebin -type f -name *.beam)))
 EUNIT_EBIN_MODS = $(notdir $(basename $(shell find ebin -type f -name *.beam)))
-# Only those modules in EUNIT_DIR with no matching module in 'ebin'.
+# Only those modules in TEST_DIR with no matching module in 'ebin'.
 # This is done to avoid some tests being executed twice.
 # This is done to avoid some tests being executed twice.
-EUNIT_MODS = $(filter-out $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_DIR_MODS))
+EUNIT_MODS = $(filter-out $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(TEST_DIR_MODS))
 TAGGED_EUNIT_TESTS = {dir,"ebin"} $(foreach mod,$(EUNIT_MODS),$(shell echo $(mod) | sed -e 's/\(.*\)/{module,\1}/g'))
 TAGGED_EUNIT_TESTS = {dir,"ebin"} $(foreach mod,$(EUNIT_MODS),$(shell echo $(mod) | sed -e 's/\(.*\)/{module,\1}/g'))
 endif
 endif
 
 
@@ -33,38 +28,19 @@ endef
 
 
 # Core targets.
 # Core targets.
 
 
-help:: help-eunit
-
 tests:: eunit
 tests:: eunit
 
 
-clean:: clean-eunit
+help::
+	@printf "%s\n" "" \
+		"EUnit targets:" \
+		"  eunit       Run all the EUnit tests for this project"
 
 
 # Plugin-specific targets.
 # Plugin-specific targets.
 
 
 EUNIT_RUN = $(ERL) \
 EUNIT_RUN = $(ERL) \
-	-no_auto_compile \
-	-pa $(realpath $(EUNIT_DIR)) $(DEPS_DIR)/*/ebin \
-	-pz $(realpath ebin) \
+	-pa $(TEST_DIR) $(DEPS_DIR)/*/ebin \
+	-pz ebin \
 	-eval 'case eunit:test([$(call str-join,$(TAGGED_EUNIT_TESTS))], [$(EUNIT_OPTS)]) of ok -> halt(0); error -> halt(1) end.'
 	-eval 'case eunit:test([$(call str-join,$(TAGGED_EUNIT_TESTS))], [$(EUNIT_OPTS)]) of ok -> halt(0); error -> halt(1) end.'
 
 
-help-eunit:
-	@printf "%s\n" "" \
-		"EUnit targets:" \
-		"  eunit       Run all the EUnit tests for this project"
-
-ifeq ($(strip $(EUNIT_DIR)),)
-build-eunit:
-else ifeq ($(strip $(EUNIT_DIR)),ebin)
-build-eunit:
-else
-build-eunit:
-	$(gen_verbose) erlc -v $(EUNIT_ERLC_OPTS) -I include/ -o $(EUNIT_DIR) \
-		$(wildcard $(EUNIT_DIR)/*.erl $(EUNIT_DIR)/*/*.erl) -pa ebin/
-endif
-
-eunit: ERLC_OPTS = $(EUNIT_ERLC_OPTS)
-eunit: clean deps app build-eunit
+eunit: test-build
 	$(gen_verbose) $(EUNIT_RUN)
 	$(gen_verbose) $(EUNIT_RUN)
-
-clean-eunit:
-	$(gen_verbose) $(foreach dir,$(EUNIT_DIRS),rm -rf $(dir)/*.beam)

+ 10 - 11
test/Makefile

@@ -62,7 +62,7 @@ app: app1
 	$i "Test 'app' passed."
 	$i "Test 'app' passed."
 
 
 ct: app1
 ct: app1
-	$i "ct: Testing tests-ct and related targets."
+	$i "ct: Testing ct and related targets."
 	$i "Setting up test suite."
 	$i "Setting up test suite."
 	$t mkdir -p app1/test
 	$t mkdir -p app1/test
 	$t printf "%s\n" \
 	$t printf "%s\n" \
@@ -71,17 +71,17 @@ ct: app1
 		"all() -> [testcase1]." \
 		"all() -> [testcase1]." \
 		"testcase1(_) -> 2 = m:succ(1)." \
 		"testcase1(_) -> 2 = m:succ(1)." \
 	 > app1/test/m_SUITE.erl
 	 > app1/test/m_SUITE.erl
-	$t make -C app1 tests-ct $v
-	$i "Checking files created by 'make tests-ct'."
-	$t [ ! -e app1/test/m_SUITE.beam ]
+	$t make -C app1 ct $v
+	$i "Checking files created by 'make ct'."
+	$t [ -e app1/test/m_SUITE.beam ]
 	$t [ -e app1/ebin/m.beam ]
 	$t [ -e app1/ebin/m.beam ]
 	$t [ -e app1/logs ]
 	$t [ -e app1/logs ]
-	$i "Checking that 'make clean-ct' does not delete logs."
-	$t make -C app1 clean-ct $v
+	$i "Checking that 'make clean' does not delete logs."
+	$t make -C app1 clean $v
 	$t [ -e app1/logs ]
 	$t [ -e app1/logs ]
 	$i "Testing target 'ct-mysuite' where mysuite_SUITE is a test suite."
 	$i "Testing target 'ct-mysuite' where mysuite_SUITE is a test suite."
 	$t make -C app1 ct-m $v
 	$t make -C app1 ct-m $v
-	$i "Checking that 'make tests-ct' returns non-zero for a failing suite."
+	$i "Checking that 'make ct' returns non-zero for a failing suite."
 	$t printf "%s\n" \
 	$t printf "%s\n" \
 		"-module(failing_SUITE)." \
 		"-module(failing_SUITE)." \
 		"-export([all/0, testcase1/1])." \
 		"-export([all/0, testcase1/1])." \
@@ -89,7 +89,7 @@ ct: app1
 		"testcase1(_) -> 42 = m:succ(1)." \
 		"testcase1(_) -> 42 = m:succ(1)." \
 	 > app1/test/failing_SUITE.erl
 	 > app1/test/failing_SUITE.erl
 	$t if make -C app1 ct-failing $v ; then false ; fi
 	$t if make -C app1 ct-failing $v ; then false ; fi
-	$i "Checking that 'make ct-distclean' deletes logs."
+	$i "Checking that 'make distclean-ct' deletes logs."
 	$t make -C app1 distclean-ct $v
 	$t make -C app1 distclean-ct $v
 	$t [ ! -e app1/logs ]
 	$t [ ! -e app1/logs ]
 	$t [ -e app1/ebin/m.beam ]
 	$t [ -e app1/ebin/m.beam ]
@@ -99,7 +99,6 @@ ct: app1
 
 
 eunit: app1
 eunit: app1
 	$i "eunit: Testing the 'eunit' target."
 	$i "eunit: Testing the 'eunit' target."
-	$t mkdir -p eunit
 	$i "Running eunit test case inside module src/t.erl"
 	$i "Running eunit test case inside module src/t.erl"
 	$t printf '%s\n' \
 	$t printf '%s\n' \
 		'-module(t).' \
 		'-module(t).' \
@@ -132,7 +131,7 @@ eunit: app1
 		'	?assertEqual(2, t:succ(1)),' \
 		'	?assertEqual(2, t:succ(1)),' \
 		'	os:cmd("echo x_tests >> test-eunit.log").' \
 		'	os:cmd("echo x_tests >> test-eunit.log").' \
 		> app1/eunit/x_tests.erl
 		> app1/eunit/x_tests.erl
-	$t make -C app1 eunit EUNIT_DIR=eunit $v
+	$t make -C app1 eunit TEST_DIR=eunit $v
 	$i "Checking that 'make eunit' didn't run the tests in t_tests twice, etc."
 	$i "Checking that 'make eunit' didn't run the tests in t_tests twice, etc."
 	$t printf "%s\n" t t_tests x_tests | cmp app1/test-eunit.log -
 	$t printf "%s\n" t t_tests x_tests | cmp app1/test-eunit.log -
 	$t rm app1/test-eunit.log
 	$t rm app1/test-eunit.log
@@ -144,7 +143,7 @@ eunit: app1
 		"succ_test() ->" \
 		"succ_test() ->" \
 		"	?assertEqual(42, t:succ(1))." \
 		"	?assertEqual(42, t:succ(1))." \
 		> app1/eunit/t_tests.erl
 		> app1/eunit/t_tests.erl
-	$t if make -C app1 eunit EUNIT_DIR=eunit $v ; then false ; fi
+	$t if make -C app1 eunit TEST_DIR=eunit $v ; then false ; fi
 	$t rm -rf app1/eunit app1/src/t.erl app1/test-eunit.log
 	$t rm -rf app1/eunit app1/src/t.erl app1/test-eunit.log
 	$i "Test 'eunit' passed."
 	$i "Test 'eunit' passed."