aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile256
1 files changed, 256 insertions, 0 deletions
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..a77b307
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,256 @@
+# Copyright (c) 2014, Viktor Söderqvist <[email protected]>
+# This file is part of erlang.mk and subject to the terms of the ISC License.
+
+# Tests for erlang.mk targets. If any test fails or if you run a target other
+# than 'all', you must probably do 'make clean' before you can test again.
+
+# Verbosity.
+
+V ?= 0
+
+# t = Verbosity control for tests
+# v = Verbosity control for erlang.mk
+# i = Command to display (or suppress) info messages
+ifeq ($V,0)
+ # Show info messages only
+ t = @
+ v = V=0 >/dev/null 2>&1
+ i = @echo
+else ifeq ($V,1)
+ # Show test commands
+ t =
+ v = V=0 >/dev/null 2>&1
+ i = @echo ==
+else ifeq ($V,2)
+ # Show briefly what erlang.mk is doing
+ t = @echo " TEST " $@;
+ v = V=0
+ i = @echo ==
+else
+ # Show all commands with maximum verbosity
+ t =
+ v = V=1
+ i = @echo ==
+endif
+
+.PHONY: all clean app ct eunit tests-cover docs
+
+.NOTPARALLEL:
+
+all: clean app ct eunit tests-cover docs pkgs
+ $i '+---------------------+'
+ $i '| All tests passed. |'
+ $i '+---------------------+'
+
+clean:
+ $t rm -rf app1
+
+app: app1
+ $i "app: Testing the 'app' target."
+ $t $(MAKE) -C app1 app $v
+ $i "Checking the modules line in the generated .app file."
+ $t [ `grep -E "{modules, *\['m'\]}" app1/ebin/app1.app | wc -l` == 1 ]
+ $t [ -e app1/ebin/m.beam ]
+ $i "Checking that '$(MAKE) clean-app' deletes ebin."
+ $t $(MAKE) -C app1 clean-app $v
+ $t [ ! -e app1/ebin ]
+ $i "Checking that '$(MAKE) app' returns non-zero on compile errors."
+ $t printf "%s\n" \
+ "-module(syntax_error)." \
+ "foo lorem_ipsum dolor sit amet." \
+ > app1/src/syntax_error.erl
+ $t if $(MAKE) -C app1 app $v ; then false ; fi
+ $t rm app1/src/syntax_error.erl
+ $i "Test 'app' passed."
+
+ct: app1
+ $i "ct: Testing ct and related targets."
+ $i "Setting up test suite."
+ $t mkdir -p app1/test
+ $t printf "%s\n" \
+ "-module(m_SUITE)." \
+ "-export([all/0, testcase1/1])." \
+ "all() -> [testcase1]." \
+ "testcase1(_) -> 2 = m:succ(1)." \
+ > app1/test/m_SUITE.erl
+ $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/logs ]
+ $i "Checking that '$(MAKE) clean' does not delete logs."
+ $t $(MAKE) -C app1 clean $v
+ $t [ -e app1/logs ]
+ $i "Testing target 'ct-mysuite' where mysuite_SUITE is a test suite."
+ $t $(MAKE) -C app1 ct-m $v
+ $i "Checking that '$(MAKE) ct' returns non-zero for a failing suite."
+ $t printf "%s\n" \
+ "-module(failing_SUITE)." \
+ "-export([all/0, testcase1/1])." \
+ "all() -> [testcase1]." \
+ "testcase1(_) -> 42 = m:succ(1)." \
+ > app1/test/failing_SUITE.erl
+ $t if $(MAKE) -C app1 ct-failing $v ; then false ; fi
+ $i "Checking that '$(MAKE) distclean-ct' deletes logs."
+ $t $(MAKE) -C app1 distclean-ct $v
+ $t [ ! -e app1/logs ]
+ $t [ -e app1/ebin/m.beam ]
+ $i "Cleaning up test data."
+ $t rm -rf app1/test
+ $i "Test 'ct' passed."
+
+eunit: app1
+ $i "eunit: Testing the 'eunit' target."
+ $i "Running eunit test case inside module src/t.erl"
+ $t $(call create-module-t)
+ $t $(MAKE) -C app1 eunit $v
+ $i "Checking that the eunit test in module t."
+ $t echo t | cmp app1/test-eunit.log -
+ $t rm app1/test-eunit.log
+ $i "Running eunit tests in a separate directory."
+ $t mkdir -p app1/eunit
+ $t printf '%s\n' \
+ '-module(t_tests).' \
+ '-include_lib("eunit/include/eunit.hrl").' \
+ 'succ_test() ->' \
+ ' ?assertEqual(2, t:succ(1)),' \
+ ' os:cmd("echo t_tests >> test-eunit.log").' \
+ > app1/eunit/t_tests.erl
+ $t printf '%s\n' \
+ '-module(x_tests).' \
+ '-include_lib("eunit/include/eunit.hrl").' \
+ 'succ_test() ->' \
+ ' ?assertEqual(2, t:succ(1)),' \
+ ' os:cmd("echo x_tests >> test-eunit.log").' \
+ > app1/eunit/x_tests.erl
+ $t $(MAKE) -C app1 eunit TEST_DIR=eunit $v
+ $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 rm app1/test-eunit.log
+ $i "Checking that '$(MAKE) eunit' returns non-zero for a failing test."
+ $t rm -f app1/eunit/*
+ $t printf "%s\n" \
+ "-module(t_tests)." \
+ '-include_lib("eunit/include/eunit.hrl").' \
+ "succ_test() ->" \
+ " ?assertEqual(42, t:succ(1))." \
+ > app1/eunit/t_tests.erl
+ $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
+ $i "Test 'eunit' passed."
+
+# TODO: do coverage for 'tests' instead of 'eunit ct' when triq is fixed
+tests-cover: app1
+ $i "tests-cover: Testing 'eunit' and 'ct' with COVER=1"
+ $i "Setting up eunit and ct suites."
+ $t $(call create-module-t)
+ $t mkdir -p app1/test
+ $t printf "%s\n" \
+ "-module(m_SUITE)." \
+ "-export([all/0, testcase1/1])." \
+ "all() -> [testcase1]." \
+ "testcase1(_) -> 2 = m:succ(1)." \
+ > app1/test/m_SUITE.erl
+ $i "Running tests with coverage analysis."
+ $t $(MAKE) -C app1 eunit ct COVER=1 $v
+ $t [ -e app1/test-eunit.log ]
+ $t [ -e app1/eunit.coverdata ]
+ $t [ -e app1/ct.coverdata ]
+ $i "Generating coverage report."
+ $t $(MAKE) -C app1 cover-report COVER=1 $v
+ $t [ -e app1/cover/m.COVER.html ]
+ $t [ -e app1/cover/t.COVER.html ]
+ $t [ -e app1/cover/index.html ]
+ $i "Checking combined coverage from eunit and ct."
+ $t [ `grep 'Total: 100%' app1/cover/index.html | wc -l` -eq 1 ]
+ $i "Checking that cover-report-clean removes cover report."
+ $t $(MAKE) -C app1 cover-report-clean $v
+ $t [ ! -e app1/cover ]
+ $i "Checking that coverdata-clean removes cover data."
+ $t $(MAKE) -C app1 coverdata-clean $v
+ $t [ ! -e app1/eunit.coverdata ]
+ @# clean up
+ $t rm -rf app1/src/t.erl app1/test app1/test-eunit.log
+ $t $(MAKE) -C app1 clean $v
+ $i "Test 'tests-cover' passed."
+
+docs: app1
+ $i "docs: Testing EDoc including DOC_DEPS."
+ $t printf "%s\n" \
+ "PROJECT = app1" \
+ "DOC_DEPS = edown" \
+ "dep_edown = git https://github.com/uwiger/edown.git 0.5" \
+ "EDOC_OPTS = {doclet, edown_doclet}" \
+ "include erlang.mk" \
+ "distclean:: distclean-doc-md" \
+ "distclean-doc-md:" \
+ " rm -rf doc/*.md" \
+ > app1/Makefile-doc
+ $i "Downloading doc deps (edown) and building docs."
+ $t $(MAKE) -C app1 -f Makefile-doc docs $v
+ $i "Checking that '$(MAKE) docs' using edown generated a markdown file."
+ $t [ -e app1/doc/m.md ]
+ $i "Checking that '$(MAKE) distclean' deletes all generated doc files."
+ $t $(MAKE) -C app1 -f Makefile-doc distclean $v
+ $t [ "`ls app1/doc/`" == "" ]
+ $i "Cleaning up test data."
+ $t rm app1/Makefile-doc
+ $i "Test 'docs' passed."
+
+define app1_setup
+ $i "Setting up app."
+ $t mkdir -p app1
+ $t cd .. && $(MAKE)
+ $t cp ../erlang.mk app1/
+ $t $(MAKE) -C app1 -f erlang.mk bootstrap-lib
+ $t printf "%s\n" \
+ "-module(m)." \
+ "-export([succ/1])." \
+ "succ(N) -> N + 1." \
+ > app1/src/m.erl
+endef
+
+define pkg_test_target
+pkg-$(1)-clean:
+ $t rm -rf app1
+
+pkg-$(1)-app1:
+ $(call app1_setup)
+
+# Running 'make' twice to make sure it recompiles fine.
+pkg-$(1): pkg-$(1)-clean pkg-$(1)-app1
+ $i
+ $i " pkgs: Checking that '$(1)' builds correctly"
+ $i
+ $t printf "%s\n" \
+ "PROJECT = app1" \
+ "DEPS = $(1)" \
+ "include erlang.mk" \
+ > app1/Makefile
+ cp ../packages.v2.tsv app1/.erlang.mk.packages.v2
+ $t $(MAKE) -C app1
+ $t $(MAKE) -C app1
+endef
+
+$(foreach pkg,$(shell awk '{print $$1}' ../packages.v2.tsv),$(eval $(call pkg_test_target,$(pkg))))
+
+pkgs: $(foreach pkg,$(shell awk '{print $$1}' ../packages.v2.tsv),pkg-$(pkg))
+
+# Test application used for testing.
+app1:
+ $(call app1_setup)
+
+# Extra module in app1 used for testing eunit
+define create-module-t
+printf '%s\n' \
+ '-module(t).' \
+ '-export([succ/1]).' \
+ 'succ(N) -> N + 1.' \
+ '-ifdef(TEST).' \
+ '-include_lib("eunit/include/eunit.hrl").' \
+ 'succ_test() ->' \
+ ' ?assertEqual(2, succ(1)),' \
+ ' os:cmd("echo t >> test-eunit.log").' \
+ '-endif.' \
+ > app1/src/t.erl
+endef