.PHONY: all test console compile
all: test

# user overridable
TESTSPEC ?= default.spec
PRESET   ?= all
CT_HOOKS ?=
PREPARE  ?= prepare
ADD_OPTS ?= -sasl sasl_error_logger false
TLS_DIST ?= false
REPO_DIR ?= ..
TEST_DIR ?= .
ABS_REPO_DIR = $(shell $(REPO_DIR)/tools/abs_dirpath.sh $(REPO_DIR))
ABS_TEST_DIR = $(shell $(REPO_DIR)/tools/abs_dirpath.sh $(TEST_DIR))
RUN = $(REPO_DIR)/tools/silent_exec.sh "$@.log"
REBAR = $(REPO_DIR)/rebar3

# autogenerated, not intended for overriding
DEPS_PATHS := $(addprefix $(REPO_DIR)/_build/test/lib/,$(addsuffix /ebin,$(DEPS)))

ifeq ($(TLS_DIST),true)
TLS_DIST_OPTS := -args_file vm.dist.args
else
TLS_DIST_OPTS :=
endif

COMMON_OPTS := -sname test -setcookie mongooseim -hidden \
               $(TLS_DIST_OPTS) \
               -env REPO_DIR "$(ABS_REPO_DIR)" \
               -env TEST_DIR "$(ABS_TEST_DIR)" \
               -pa `pwd`/_build/default/lib/*/ebin \
                   `pwd`/tests \
               $(DEPS_PATHS)

ifeq ($(shell uname), Linux)
SED := sed
else
SED := gsed
endif

test_clean: get-deps
	rm -rf tests/*.beam
	$(MAKE) test

cover_test_clean: get-deps
	rm -rf tests/*.beam
	$(MAKE) cover_test

quicktest: $(PREPARE)
	$(RUN) erl -hidden -noinput $(COMMON_OPTS) $(ADD_OPTS) \
			-s run_common_test main test=quick spec=$(TESTSPEC)

cover_quicktest: $(PREPARE)
	$(RUN) erl -noinput $(COMMON_OPTS) $(ADD_OPTS) \
			-s run_common_test main test=quick spec=$(TESTSPEC) cover=true

cover_test_preset: $(PREPARE)
	$(RUN) erl -noinput $(COMMON_OPTS) $(ADD_OPTS) \
			-s run_common_test main test=full spec=$(TESTSPEC) hooks=$(CT_HOOKS) \
			preset="$(PRESET)" cover=true

cover_test: $(PREPARE)
	$(RUN) erl -noinput $(COMMON_OPTS) $(ADD_OPTS) \
			-s run_common_test main test=full spec=$(TESTSPEC) cover=true

test_preset: $(PREPARE)
	$(RUN) erl -noinput $(COMMON_OPTS) $(ADD_OPTS) \
			-s run_common_test main test=full spec=$(TESTSPEC) hooks=$(CT_HOOKS) \
                        preset="$(PRESET)"

test: $(PREPARE)
	$(RUN) erl -noinput $(COMMON_OPTS) $(ADD_OPTS) \
			-s run_common_test main test=full spec=$(TESTSPEC)

prepare: mim_ct_rest compile vm.dist.args
	erlc -I_build/default/lib/exml/include \
		 run_common_test.erl
	mkdir -p ct_report

mim_ct_rest: \
	$(REPO_DIR)/test/mim_ct_rest.erl \
	$(REPO_DIR)/test/mim_ct_rest_handler.erl \
	$(REPO_DIR)/test/mim_ct_sup.erl
	cp $^ src/

vm.dist.args: vm.dist.args.in certs
	$(SED) -e 's%__PWD__%$(PWD)%g' $< > $@

certs: priv/ssl/cert.pem priv/ssl/key.pem priv/ssl/cacert.pem

priv/ssl/cert.pem priv/ssl/key.pem priv/ssl/cacert.pem: \
  $(REPO_DIR)/tools/ssl/mongooseim/cert.pem \
  $(REPO_DIR)/tools/ssl/mongooseim/key.pem \
  $(REPO_DIR)/tools/ssl/ca/cacert.pem
	mkdir -p $(@D)
	cp $^ $(@D)/
	cat priv/ssl/key.pem >> priv/ssl/cert.pem

console: $(PREPARE)
	erl $(COMMON_OPTS) $(ADD_OPTS) -s run_common_test init

compile: get-deps deps
	$(RUN) $(REBAR) compile

get-deps:
	$(RUN) $(REBAR) deps

clean:
	-@rm -rf _build
	-@rm priv/ssl/*
	-@rm -rf tests/*.beam > /dev/null 2>&1
	-@$(REBAR) clean > /dev/null 2>&1

# to compile esip.
# It should able to find stun.hrl. But searching paths are hardcoded
deps:
	ln -fs `pwd`/_build/default/lib deps
