From 6a764de5ff077a566b7865d0a7a8f3c4c9b0c042 Mon Sep 17 00:00:00 2001 From: nevar Date: Thu, 7 Sep 2017 21:52:30 +0700 Subject: COVER_DATA_DIR for *.coverdata Also make COVER_REPORT_DIR not override user value (if set before include erlang.mk). Use incl_app in CT cover spec. --- plugins/cover.mk | 30 +++++++++++++++++------------- plugins/eunit.mk | 8 ++++---- test/plugin_cover.mk | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 72 insertions(+), 18 deletions(-) diff --git a/plugins/cover.mk b/plugins/cover.mk index 63fd2d7..b57458a 100644 --- a/plugins/cover.mk +++ b/plugins/cover.mk @@ -2,23 +2,20 @@ # Copyright (c) 2015, Viktor Söderqvist # This file is part of erlang.mk and subject to the terms of the ISC License. -COVER_REPORT_DIR = cover +COVER_REPORT_DIR ?= cover +COVER_DATA_DIR ?= $(CURDIR) # Hook in coverage to ct ifdef COVER ifdef CT_RUN ifneq ($(wildcard $(TEST_DIR)),) -# All modules in 'ebin' -COVER_MODS = $(notdir $(basename $(call core_ls,ebin/*.beam))) - test-build:: $(TEST_DIR)/ct.cover.spec -$(TEST_DIR)/ct.cover.spec: - $(verbose) echo Cover mods: $(COVER_MODS) +$(TEST_DIR)/ct.cover.spec: cover-data-dir $(gen_verbose) printf "%s\n" \ - '{incl_mods,[$(subst $(space),$(comma),$(COVER_MODS))]}.' \ - '{export,"$(CURDIR)/ct.coverdata"}.' > $@ + "{incl_app, '$(PROJECT)', details}." \ + '{export,"$(abspath $(COVER_DATA_DIR))/ct.coverdata"}.' > $@ CT_RUN += -cover $(TEST_DIR)/ct.cover.spec endif @@ -32,6 +29,13 @@ ifneq ($(COVER_REPORT_DIR),) tests:: $(verbose) $(MAKE) --no-print-directory cover-report endif + +cover-data-dir: | $(COVER_DATA_DIR) + +$(COVER_DATA_DIR): + $(verbose) mkdir -p $(COVER_DATA_DIR) +else +cover-data-dir: endif clean:: coverdata-clean @@ -54,19 +58,19 @@ help:: # Plugin specific targets -COVERDATA = $(filter-out all.coverdata,$(wildcard *.coverdata)) +COVERDATA = $(filter-out $(COVER_DATA_DIR)/all.coverdata,$(wildcard $(COVER_DATA_DIR)/*.coverdata)) .PHONY: coverdata-clean coverdata-clean: - $(gen_verbose) rm -f *.coverdata $(TEST_DIR)/ct.cover.spec + $(gen_verbose) rm -f $(COVER_DATA_DIR)/*.coverdata $(TEST_DIR)/ct.cover.spec # Merge all coverdata files into one. define cover_export.erl $(foreach f,$(COVERDATA),cover:import("$(f)") == ok orelse halt(1),) - cover:export("$@"), halt(0). + cover:export("$(COVER_DATA_DIR)/$@"), halt(0). endef -all.coverdata: $(COVERDATA) +all.coverdata: $(COVERDATA) cover-data-dir $(gen_verbose) $(call erlang,$(cover_export.erl)) # These are only defined if COVER_REPORT_DIR is non-empty. Set COVER_REPORT_DIR to @@ -76,7 +80,7 @@ ifneq ($(COVER_REPORT_DIR),) .PHONY: cover-report-clean cover-report cover-report-clean: - $(gen_verbose) rm -rf $(COVER_REPORT_DIR) + $(gen_verbose) rm -rf $(COVER_REPORT_DIR) $(COVER_DATA_DIR) ifeq ($(COVERDATA),) cover-report: diff --git a/plugins/eunit.mk b/plugins/eunit.mk index 9739e0e..af614f6 100644 --- a/plugins/eunit.mk +++ b/plugins/eunit.mk @@ -36,7 +36,7 @@ define eunit.erl case "$(COVER)" of "" -> ok; _ -> - cover:export("eunit.coverdata") + cover:export("$(COVER_DATA_DIR)/eunit.coverdata") end, halt() endef @@ -45,10 +45,10 @@ EUNIT_ERL_OPTS += -pa $(TEST_DIR) $(DEPS_DIR)/*/ebin $(APPS_DIR)/*/ebin $(CURDIR ifdef t ifeq (,$(findstring :,$(t))) -eunit: test-build +eunit: test-build cover-data-dir $(gen_verbose) $(call erlang,$(call eunit.erl,['$(t)']),$(EUNIT_ERL_OPTS)) else -eunit: test-build +eunit: test-build cover-data-dir $(gen_verbose) $(call erlang,$(call eunit.erl,fun $(t)/0),$(EUNIT_ERL_OPTS)) endif else @@ -58,7 +58,7 @@ EUNIT_TEST_MODS = $(notdir $(basename $(call core_find,$(TEST_DIR)/,*.erl))) EUNIT_MODS = $(foreach mod,$(EUNIT_EBIN_MODS) $(filter-out \ $(patsubst %,%_tests,$(EUNIT_EBIN_MODS)),$(EUNIT_TEST_MODS)),'$(mod)') -eunit: test-build $(if $(IS_APP),,apps-eunit) +eunit: test-build $(if $(IS_APP),,apps-eunit) cover-data-dir $(gen_verbose) $(call erlang,$(call eunit.erl,[$(call comma_list,$(EUNIT_MODS))]),$(EUNIT_ERL_OPTS)) ifneq ($(ALL_APPS_DIRS),) diff --git a/test/plugin_cover.mk b/test/plugin_cover.mk index 11fec5c..905e6d2 100644 --- a/test/plugin_cover.mk +++ b/test/plugin_cover.mk @@ -1,6 +1,6 @@ # Common Test plugin. -COVER_CASES = ct eunit report-and-merge +COVER_CASES = ct custom-dir eunit report-and-merge COVER_TARGETS = $(addprefix cover-,$(COVER_CASES)) .PHONY: cover $(COVER_TARGETS) @@ -34,6 +34,56 @@ cover-ct: build clean $t test ! -e $(APP)/ct.coverdata $t test ! -e $(APP)/test/ct.cover.spec +cover-custom-dir: build clean + + $i "Bootstrap a new OTP application named $(APP)" + $t mkdir $(APP)/ + $t cp ../erlang.mk $(APP)/ + $t $(MAKE) -C $(APP) -f erlang.mk bootstrap-lib $v + + $i "Set COVER_DATA_DIR in the Makefile" + $t perl -ni.bak -e 'print;if ($$.==1) {print "COVER_DATA_DIR = custom_dir\n"}' $(APP)/Makefile + + $i "Generate a module containing EUnit tests" + $t printf "%s\n" \ + "-module($(APP))." \ + "-ifdef(TEST)." \ + "-include_lib(\"eunit/include/eunit.hrl\")." \ + "ok_test() -> ok." \ + "-endif." > $(APP)/src/$(APP).erl + + $i "Generate a Common Test suite" + $t mkdir $(APP)/test + $t printf "%s\n" \ + "-module($(APP)_SUITE)." \ + "-export([all/0, ok/1])." \ + "all() -> [ok]." \ + "ok(_) -> ok." > $(APP)/test/$(APP)_SUITE.erl + + $i "Run Common Test with code coverage enabled" + $t $(MAKE) -C $(APP) ct COVER=1 $v + + $i "Run EUnit with code coverage enabled" + $t $(MAKE) -C $(APP) eunit COVER=1 $v + + $i "Check that the generated file exists" + $t test -f $(APP)/custom_dir/ct.coverdata + $t test -f $(APP)/custom_dir/eunit.coverdata + + $i "Merge coverdata files into all.coverdata" + $t $(MAKE) -C $(APP) all.coverdata $v + $t test -f $(APP)/custom_dir/all.coverdata + + $i "Check that the generated file is removed on clean" + $t $(MAKE) -C $(APP) clean $v + $t test ! -e $(APP)/custom_dir/eunit.coverdata + $t test ! -e $(APP)/custom_dir/ct.coverdata + $t test ! -e $(APP)/custom_dir/all.coverdata + + $i "Check that the custom dir is removed on distclean" + $t $(MAKE) -C $(APP) distclean $v + $t test ! -e $(APP)/custom_dir/ + cover-eunit: build clean $i "Bootstrap a new OTP application named $(APP)" -- cgit v1.2.3