From 2f246b551cca5ca7ca9187282e42650976a65cbb Mon Sep 17 00:00:00 2001
From: Kjell Winblad <kjellwinblad@gmail.com>
Date: Tue, 11 Jun 2019 17:36:04 +0200
Subject: [PATCH] Add "make test" command for root and application directories

The added make target is described in HOWTO/TESTING.md.
---
 HOWTO/TESTING.md           |  46 +++++++
 Makefile.in                |   5 +
 erts/Makefile              |   2 +
 erts/emulator/Makefile.in  |   2 +
 erts/epmd/Makefile         |   2 +
 lib/asn1/Makefile          |   2 +
 lib/common_test/Makefile   |   1 +
 lib/compiler/Makefile      |   1 +
 lib/crypto/Makefile        |   1 +
 lib/debugger/Makefile      |   2 +
 lib/dialyzer/Makefile      |   1 +
 lib/diameter/Makefile      |   2 +
 lib/edoc/Makefile          |   3 +
 lib/eldap/Makefile         |   1 +
 lib/erl_docgen/Makefile    |   1 +
 lib/erl_interface/Makefile |   2 +
 lib/et/Makefile            |   1 +
 lib/eunit/Makefile         |   2 +
 lib/ftp/Makefile           |   2 +
 lib/hipe/Makefile          |   1 +
 lib/inets/Makefile         |   2 +
 lib/jinterface/Makefile    |   1 +
 lib/kernel/Makefile        |   2 +
 lib/megaco/Makefile        |   2 +
 lib/mnesia/Makefile        |   1 +
 lib/observer/Makefile      |   1 +
 lib/odbc/Makefile          |   2 +
 lib/os_mon/Makefile        |   1 +
 lib/parsetools/Makefile    |   1 +
 lib/public_key/Makefile    |   1 +
 lib/reltool/Makefile       |   1 +
 lib/runtime_tools/Makefile |   1 +
 lib/sasl/Makefile          |   1 +
 lib/snmp/Makefile          |   4 +-
 lib/ssh/Makefile           |   1 +
 lib/ssl/Makefile           |   2 +-
 lib/stdlib/Makefile        |   2 +
 lib/syntax_tools/Makefile  |   2 +
 lib/tftp/Makefile          |   2 +
 lib/tools/Makefile         |   1 +
 lib/wx/Makefile            |   2 +
 lib/xmerl/Makefile         |   1 +
 make/app_targets.mk        |  25 ++++
 make/test_target_script.sh | 254 +++++++++++++++++++++++++++++++++++++
 44 files changed, 391 insertions(+), 2 deletions(-)
 create mode 100644 make/app_targets.mk
 create mode 100755 make/test_target_script.sh

Index: otp-OTP-22.2.7/HOWTO/TESTING.md
===================================================================
--- otp-OTP-22.2.7.orig/HOWTO/TESTING.md
+++ otp-OTP-22.2.7/HOWTO/TESTING.md
@@ -130,6 +130,52 @@ i.e.
 Running [ct_run][] from the command line still requires you to do the
 `ts:install()` step above.
 
+### Convenience for running tests without the release and configuration steps
+
+It can be convenient to run tests with a single command. This way, one
+do not need to worry about missing to run `make release_tests` after
+changing a test suite. The `make test` command can be used for this
+purpose. The `make test` command works when the current directory
+contains a directory called test and in the root directory of the
+source code tree.
+
+*(Waring)* Some test cases do not run correctly or cannot be run at
+all through the `make test` command (typically test cases that require
+test specific C code to be compiled) because `make test` runs tests
+directly by invoking the `ct_run` command instead of using the `ts`
+wrapper. One has to follow the procedure described above to run test
+cases that do not work with `make test`.
+
+Below are some examples that illustrate how `make test` can be
+used:
+
+    # ERL_TOP needs to be set correctly
+    cd /path/to/otp
+    export ERL_TOP=`pwd`
+
+    # Build Erlang/OTP
+    #
+    # Note that make test will only compile test code except when
+    # make test is executed from $ERL_TOP.
+    ./otp_build setup -a
+
+    # Run a test case (The ARGS variable is passed to ct_run)
+    (cd $ERL_TOP/erts/emulator && make ARGS="-suite binary_SUITE -case deep_bitstr_lists" test)
+
+    # Run a test suite
+    (cd $ERL_TOP/lib/stdlib && make ARGS="-suite ets_SUITE" test)
+
+    # Run all test suites for an application
+    (cd $ERL_TOP/lib/asn1 && make test)
+
+    # Run all tests
+    #
+    # When executed from $ERL_TOP, "make test" will first release and
+    # configure all tests and then attempt to run all tests with `ts:run`.
+    # This will take several hours.
+    (cd $ERL_TOP && make test)
+
+
 Examining the results
 ---------------------
 
Index: otp-OTP-22.2.7/Makefile.in
===================================================================
--- otp-OTP-22.2.7.orig/Makefile.in
+++ otp-OTP-22.2.7/Makefile.in
@@ -1206,3 +1206,8 @@ bootstrap_clean:
 		|| $(MAKE) BOOTSTRAP_ROOT=$(BOOTSTRAP_ROOT) bootstrap_root_clean
 
 # ----------------------------------------------------------------------
+
+.PHONY: test
+
+test: all release release_tests
+	$(ERL_TOP)/make/test_target_script.sh $(ERL_TOP)
Index: otp-OTP-22.2.7/erts/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/erts/Makefile
+++ otp-OTP-22.2.7/erts/Makefile
@@ -153,3 +153,5 @@ release_docs:
 .PHONY: xmllint
 xmllint:
 	$(MAKE) -C doc/src $@
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/erts/emulator/Makefile.in
===================================================================
--- otp-OTP-22.2.7.orig/erts/emulator/Makefile.in
+++ otp-OTP-22.2.7/erts/emulator/Makefile.in
@@ -1290,3 +1290,5 @@ ifndef VOID_EMULATOR
 endif
 endif
 endif
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/erts/epmd/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/erts/epmd/Makefile
+++ otp-OTP-22.2.7/erts/epmd/Makefile
@@ -31,3 +31,5 @@ SPECIAL_TARGETS =
 # Default Subdir Targets
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/asn1/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/asn1/Makefile
+++ otp-OTP-22.2.7/lib/asn1/Makefile
@@ -100,3 +100,5 @@ tar: $(APP_TAR_FILE)
 $(APP_TAR_FILE): $(APP_DIR)
 	(cd $(APP_RELEASE_DIR); gtar zcf $(APP_TAR_FILE) $(DIR_NAME))
 
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/common_test/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/common_test/Makefile
+++ otp-OTP-22.2.7/lib/common_test/Makefile
@@ -45,3 +45,4 @@ SPECIAL_TARGETS =
 #
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/compiler/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/compiler/Makefile
+++ otp-OTP-22.2.7/lib/compiler/Makefile
@@ -36,3 +36,4 @@ SPECIAL_TARGETS =
 #
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/crypto/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/crypto/Makefile
+++ otp-OTP-22.2.7/lib/crypto/Makefile
@@ -38,3 +38,4 @@ SPECIAL_TARGETS =
 include $(ERL_TOP)/make/otp_subdir.mk
 
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/debugger/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/debugger/Makefile
+++ otp-OTP-22.2.7/lib/debugger/Makefile
@@ -34,3 +34,5 @@ SPECIAL_TARGETS =
 # Default Subdir Targets
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/dialyzer/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/dialyzer/Makefile
+++ otp-OTP-22.2.7/lib/dialyzer/Makefile
@@ -42,3 +42,4 @@ SPECIAL_TARGETS =
 #
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/diameter/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/diameter/Makefile
+++ otp-OTP-22.2.7/lib/diameter/Makefile
@@ -31,3 +31,5 @@ info:
 	@echo "APP_VSN = $(APP_VSN)"
 
 .PHONY: info
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/edoc/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/edoc/Makefile
+++ otp-OTP-22.2.7/lib/edoc/Makefile
@@ -124,3 +124,6 @@ tar: $(APP_TAR_FILE)
 
 $(APP_TAR_FILE): $(APP_DIR)
 	(cd $(APP_RELEASE_DIR); gtar zcf $(APP_TAR_FILE) $(DIR_NAME))
+
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/eldap/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/eldap/Makefile
+++ otp-OTP-22.2.7/lib/eldap/Makefile
@@ -38,3 +38,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/erl_docgen/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/erl_docgen/Makefile
+++ otp-OTP-22.2.7/lib/erl_docgen/Makefile
@@ -37,3 +37,4 @@ SPECIAL_TARGETS =
 include $(ERL_TOP)/make/otp_subdir.mk
 
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/erl_interface/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/erl_interface/Makefile
+++ otp-OTP-22.2.7/lib/erl_interface/Makefile
@@ -31,3 +31,5 @@ SPECIAL_TARGETS =
 # Default Subdir Targets
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/et/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/et/Makefile
+++ otp-OTP-22.2.7/lib/et/Makefile
@@ -35,3 +35,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/eunit/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/eunit/Makefile
+++ otp-OTP-22.2.7/lib/eunit/Makefile
@@ -94,3 +94,5 @@ tar: $(APP_TAR_FILE)
 
 $(APP_TAR_FILE): $(APP_DIR)
 	(cd $(APP_RELEASE_DIR); gtar zcf $(APP_TAR_FILE) $(DIR_NAME))
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/hipe/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/hipe/Makefile
+++ otp-OTP-22.2.7/lib/hipe/Makefile
@@ -75,3 +75,4 @@ distclean:
 realclean:
 	$(V_at)$(MAKE) MAKETARGET="realclean" all-subdirs all-subdirs-x
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/inets/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/inets/Makefile
+++ otp-OTP-22.2.7/lib/inets/Makefile
@@ -76,3 +76,5 @@ dialyzer: $(DIA_PLT)
 	@dialyzer --plt $< \
                   ../$(APPLICATION)/ebin \
                   --verbose
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/jinterface/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/jinterface/Makefile
+++ otp-OTP-22.2.7/lib/jinterface/Makefile
@@ -39,3 +39,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/kernel/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/kernel/Makefile
+++ otp-OTP-22.2.7/lib/kernel/Makefile
@@ -34,3 +34,5 @@ SPECIAL_TARGETS =
 # Default Subdir Targets
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/megaco/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/megaco/Makefile
+++ otp-OTP-22.2.7/lib/megaco/Makefile
@@ -232,3 +232,5 @@ dialyzer: $(DIA_PLT)
 	@dialyzer --plt $< \
                   ../$(APPLICATION)/ebin \
                   --verbose
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/mnesia/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/mnesia/Makefile
+++ otp-OTP-22.2.7/lib/mnesia/Makefile
@@ -38,3 +38,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/observer/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/observer/Makefile
+++ otp-OTP-22.2.7/lib/observer/Makefile
@@ -37,3 +37,4 @@ SPECIAL_TARGETS =
 include $(ERL_TOP)/make/otp_subdir.mk
 
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/odbc/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/odbc/Makefile
+++ otp-OTP-22.2.7/lib/odbc/Makefile
@@ -114,3 +114,5 @@ tar: $(APP_TAR_FILE)
 
 $(APP_TAR_FILE): $(APP_DIR)
 	(cd $(APP_RELEASE_DIR); gtar zcf $(APP_TAR_FILE) $(DIR_NAME))
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/os_mon/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/os_mon/Makefile
+++ otp-OTP-22.2.7/lib/os_mon/Makefile
@@ -35,3 +35,4 @@ SPECIAL_TARGETS =
 #
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/parsetools/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/parsetools/Makefile
+++ otp-OTP-22.2.7/lib/parsetools/Makefile
@@ -37,3 +37,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/public_key/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/public_key/Makefile
+++ otp-OTP-22.2.7/lib/public_key/Makefile
@@ -38,3 +38,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/reltool/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/reltool/Makefile
+++ otp-OTP-22.2.7/lib/reltool/Makefile
@@ -36,3 +36,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/runtime_tools/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/runtime_tools/Makefile
+++ otp-OTP-22.2.7/lib/runtime_tools/Makefile
@@ -37,3 +37,4 @@ SPECIAL_TARGETS =
 include $(ERL_TOP)/make/otp_subdir.mk
 
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/sasl/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/sasl/Makefile
+++ otp-OTP-22.2.7/lib/sasl/Makefile
@@ -36,3 +36,4 @@ SPECIAL_TARGETS =
 #
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/snmp/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/snmp/Makefile
+++ otp-OTP-22.2.7/lib/snmp/Makefile
@@ -157,3 +157,4 @@ dialyzer: $(DIA_PLT)
 	@dialyzer --plt $< \
                   ../$(APPLICATION)/ebin \
                   --verbose
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/ssh/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/ssh/Makefile
+++ otp-OTP-22.2.7/lib/ssh/Makefile
@@ -38,3 +38,4 @@ SPECIAL_TARGETS =
 include $(ERL_TOP)/make/otp_subdir.mk
 
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/ssl/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/ssl/Makefile
+++ otp-OTP-22.2.7/lib/ssl/Makefile
@@ -38,4 +38,4 @@ SPECIAL_TARGETS =
 #
 include $(ERL_TOP)/make/otp_subdir.mk
 
-
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/stdlib/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/stdlib/Makefile
+++ otp-OTP-22.2.7/lib/stdlib/Makefile
@@ -35,3 +35,5 @@ SPECIAL_TARGETS =
 # Default Subdir Targets
 #
 include $(ERL_TOP)/make/otp_subdir.mk
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/syntax_tools/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/syntax_tools/Makefile
+++ otp-OTP-22.2.7/lib/syntax_tools/Makefile
@@ -91,3 +91,5 @@ tar: $(APP_TAR_FILE)
 
 $(APP_TAR_FILE): $(APP_DIR)
 	(cd $(APP_RELEASE_DIR); gtar zcf $(APP_TAR_FILE) $(DIR_NAME))
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/tools/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/tools/Makefile
+++ otp-OTP-22.2.7/lib/tools/Makefile
@@ -36,3 +36,4 @@ SPECIAL_TARGETS =
 # ----------------------------------------------------
 include $(ERL_TOP)/make/otp_subdir.mk
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/wx/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/wx/Makefile
+++ otp-OTP-22.2.7/lib/wx/Makefile
@@ -40,3 +40,5 @@ CLEANDIRS = $(SUBDIRS) api_gen
 SUB_DIRECTORIES=$(SUBDIRS)
 
 include $(ERL_TOP)/make/otp_subdir.mk
+
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/lib/xmerl/Makefile
===================================================================
--- otp-OTP-22.2.7.orig/lib/xmerl/Makefile
+++ otp-OTP-22.2.7/lib/xmerl/Makefile
@@ -97,3 +97,4 @@ tar: $(APP_TAR_FILE)
 $(APP_TAR_FILE): $(APP_DIR)
 	(cd $(APP_RELEASE_DIR); gtar zcf $(APP_TAR_FILE) $(DIR_NAME))
 
+include $(ERL_TOP)/make/app_targets.mk
Index: otp-OTP-22.2.7/make/app_targets.mk
===================================================================
--- /dev/null
+++ otp-OTP-22.2.7/make/app_targets.mk
@@ -0,0 +1,25 @@
+# 
+# %CopyrightBegin%
+# 
+# Copyright Ericsson AB 1997-2019. All Rights Reserved.
+# 
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# 
+# %CopyrightEnd%
+#
+
+
+.PHONY: test
+
+test:
+	$(ERL_TOP)/make/test_target_script.sh $(ERL_TOP)
Index: otp-OTP-22.2.7/make/test_target_script.sh
===================================================================
--- /dev/null
+++ otp-OTP-22.2.7/make/test_target_script.sh
@@ -0,0 +1,254 @@
+#!/bin/sh
+
+# 
+# %CopyrightBegin%
+# 
+# Copyright Ericsson AB 1997-2019. All Rights Reserved.
+# 
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# 
+# %CopyrightEnd%
+#
+
+
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+LIGHT_CYAN='\033[1;36m'
+BOLD='\033[1m'
+NC='\033[0m'
+
+
+print_highlighted_msg_with_printer () {
+    COLOR=$1
+    MSG_PRINTER=$2
+    printf "\n${COLOR}======================================================================${NC}\n"
+    echo
+    $MSG_PRINTER
+    echo
+    printf "${COLOR}======================================================================${NC}\n"
+}
+
+print_highlighted_msg () {
+    COLOR=$1
+    MSG=$2
+    print_msg () {
+        echo "$MSG"
+    }
+    print_highlighted_msg_with_printer $COLOR print_msg
+}
+
+print_all_tests_takes_long_time_warning () {
+    print_msg () {
+        cat << EOM
+
+WARNING
+
+All tests will require several hours to run. You may want to check the
+following text file that describes how to run tests for a specific
+application.
+
+EOM
+        echo $ERL_TOP/HOWTO/TESTING.md
+    }
+    print_highlighted_msg_with_printer $YELLOW print_msg
+}
+
+print_all_tests_for_application_notes () {
+    print_msg () {
+        cat << EOM
+
+NOTE 1
+
+ct_run will now attempt to execute tests in the test directory, which
+may take a long time to do. One can pass arguments to ct_run by
+setting the ARGS variable when invoking "make test".
+
+Example:
+
+make ARGS="-suite asn1_SUITE -case ticket_7407" test
+
+NOTE 2
+
+You may want to look at the more established way of running tests that
+is described in the following text file if you encounter strange
+errors:
+
+EOM
+        echo "$ERL_TOP/HOWTO/TESTING.md"
+    }
+    print_highlighted_msg_with_printer $LIGHT_CYAN print_msg
+}
+
+print_c_files_warning () {
+    print_msg () {
+        cat << EOM
+
+WARNING
+
+The test directory contains .c files which means that some test cases
+will probably not work correctly when run through "make test". The
+text file at the following location describes how one can compile and
+run all test cases:
+
+
+EOM
+        echo $ERL_TOP/HOWTO/TESTING.md
+    }
+    print_highlighted_msg_with_printer $YELLOW print_msg
+}
+
+
+print_on_error_note () {
+    print_msg () {
+        cat << EOM
+NOTE:
+
+Some test cases do not work correctly when run through "make test" as
+they are designed to be run through the method that is described in
+the "$ERL_TOP/HOWTO/TESTING.md" text file. You may want to check this
+text file if you encounter strange errors. Note also that you can
+rerun a specific test case by passing parameters to ct_run as in the
+example below:
+
+make ARGS="-suite asn1_SUITE -case ticket_7407" test
+
+EOM
+    }
+    print_highlighted_msg_with_printer $NC print_msg
+}
+
+# Check ERL_TOP
+
+if [ -d "$1" ]
+then
+    ERL_TOP="$1"
+    shift
+fi
+
+if [ -z $ERL_TOP ]
+then
+    ERL_TOP=`git rev-parse --show-toplevel`
+    if [ $? = 0 ]
+    then
+        print_highlighted_msg $LIGHT_CYAN "The environment variable ERL_TOP has been set to the git root"
+    else
+        echo "The ERL_TOP environment variable need to be set before this script is executed."
+        exit 1
+    fi
+fi
+
+export ERL_TOP=$ERL_TOP
+
+
+if [ -z "${ARGS}" ]
+then
+   ARGS="$@"
+fi
+
+# make test in root
+DIR=`pwd`
+if [ "$DIR" -ef "$ERL_TOP" ]
+then
+    TARGET_SYS=`$ERL_TOP/erts/autoconf/config.guess`
+    REL_DIR="$ERL_TOP/release/$TARGET_SYS"
+    cd "$REL_DIR"
+    ./Install -minimal "`pwd`"
+    export PATH="$REL_DIR/bin:$PATH"
+    cd "$ERL_TOP/release/tests/test_server"
+    print_all_tests_takes_long_time_warning
+    echo "The tests will start in a few seconds..."
+    sleep 45
+    cd "$ERL_TOP/release/tests/test_server"
+    erl -eval "ts:install(),erlang:halt()"
+    erl -noinput -eval "ts:run([all_tests,batch]),erlang:halt()"
+    exit $?
+fi
+
+# check that there is a test directory
+if [ ! -d test ]
+then
+    print_highlighted_msg $RED "This target only works in directories containing a test directory or\nin the root directory."
+    exit 1
+fi
+
+
+APPLICATION="`basename $DIR`"
+CT_RUN="$ERL_TOP/bin/ct_run"
+MAKE_TEST_DIR="`pwd`/make_test_dir"
+MAKE_TEST_REL_DIR="$MAKE_TEST_DIR/${APPLICATION}_test"
+MAKE_TEST_CT_LOGS="$MAKE_TEST_DIR/ct_logs"
+RELEASE_TEST_SPEC_LOG="$MAKE_TEST_CT_LOGS/release_tests_spec_log"
+
+cd test
+echo "The tests in test directory for $APPLICATION will be executed with ct_run"
+if [ -z "${ARGS}" ]
+then
+    if [ ! -d "$MAKE_TEST_DIR" ]
+    then
+        print_all_tests_for_application_notes
+    fi
+    if find . -type f -name '*.c' | grep -q "."
+    then
+        print_c_files_warning
+    fi
+fi
+
+mkdir -p "$MAKE_TEST_DIR"
+mkdir -p "$MAKE_TEST_REL_DIR"
+mkdir -p "$MAKE_TEST_CT_LOGS"
+make RELSYSDIR=$MAKE_TEST_REL_DIR release_tests_spec > $RELEASE_TEST_SPEC_LOG 2>&1
+
+if [ $? != 0 ]
+then
+    cat $RELEASE_TEST_SPEC_LOG
+    print_highlighted_msg $RED "\"make RELSYSDIR="$MAKE_TEST_REL_DIR" release_tests_spec\" failed."
+    exit 1
+fi
+SPEC_FLAG=""
+SPEC_FILE=""
+if [ -z "${ARGS}" ]
+then
+    SPEC_FLAG="-spec"
+    SPEC_FILE="$MAKE_TEST_REL_DIR/$APPLICATION.spec"
+    ARGS="$SPEC_FLAG $SPEC_FILE"
+fi
+# Compile test server
+(cd "$ERL_TOP/lib/common_test/test_server" && make)
+# Run ct_run
+cd $MAKE_TEST_REL_DIR
+$CT_RUN -logdir $MAKE_TEST_CT_LOGS\
+        -pa "$ERL_TOP/lib/common_test/test_server"\
+        ${ARGS}\
+        -erl_args\
+        -env "$PATH"\
+        -env ERL_CRASH_DUMP "$MAKE_TEST_DIR/${APPLICATION}_erl_crash.dump"\
+        -boot start_sasl\
+        -sasl errlog_type error\
+        -pz "$ERL_TOP/lib/common_test/test_server"\
+        -pz "."\
+        -ct_test_vars "{net_dir,\"\"}"\
+        -noshell\
+        -sname test_server\
+        -rsh ssh\
+        ${ERL_ARGS}
+CT_RUN_STATUS=$?
+if [ $CT_RUN_STATUS = "0" ]
+then
+    print_highlighted_msg $GREEN "The test(s) ran successfully (ct_run returned a success code)\nTest logs: file://$MAKE_TEST_CT_LOGS/index.html"
+    exit 0
+else
+    print_on_error_note
+    print_highlighted_msg $RED "ct_run returned the error code $CT_RUN_STATUS\nTest logs: file://$MAKE_TEST_CT_LOGS/index.html"
+    exit $CT_RUN_STATUS
+fi
