all: test

CWD := $(shell pwd)

# Version of postgres docker image for test database
PG_DOCKER_TAG ?= 13-alpine
# Version of pg_tap docker image
PG_TAP_DOCKER_TAG ?= 13
SQL_TEST_DB_PORT ?=
DOCKER_ARGS ?=
ifneq ($(strip $(SQL_TEST_DB_PORT)),)
	DOCKER_ARGS += -p $(SQL_TEST_DB_PORT):5432
endif

# Pass through options to pg_prove
# See: https://pgtap.org/pg_prove.html
PROVE_OPTS ?=

TESTS ?= tests/setup/*.sql \
		 tests/org/*.sql \
		 tests/wh/*/*.sql \
		 tests/sentinel/*.sql \
		 tests/credential/*/*.sql \
		 tests/session/*.sql \
		 tests/account/*/*.sql \
		 tests/target/*.sql \
		 tests/controller/*.sql \
		 tests/hcp/*/*.sql \
		 tests/census/*.sql \
		 tests/kms/*.sql \
		 tests/storage/*.sql \
		 tests/domain/*.sql \
		 tests/history/*.sql \
		 tests/recording/*.sql \
		 tests/alias/*.sql \
		 tests/auth/*/*.sql \
		 tests/purge/*.sql \
		 tests/pagination/*.sql \
		 tests/policy/*.sql \
		 tests/host/*.sql \
		 tests/server/*.sql

POSTGRES_DOCKER_IMAGE_BASE ?= postgres

POSTGRES_DOCKER_IMAGE := $(POSTGRES_DOCKER_IMAGE_BASE):$(PG_DOCKER_TAG)

PG_TAP_DOCKER_IMAGE_BASE ?= hashicorpboundary/pgtap
PG_TAP_DOCKER_IMAGE := $(PG_TAP_DOCKER_IMAGE_BASE):$(PG_TAP_DOCKER_TAG)

SQL_TEST_CONTAINER_NAME ?= boundary-sql-tests

log_cmd = true
DB_LOGS ?= 0
ifeq ($(DB_LOGS), 1)
	log_cmd = docker logs $(SQL_TEST_CONTAINER_NAME)
endif

# re-write paths for docker
dockerized_tests = $(patsubst tests/%,/test/%,$(TESTS))

test:
	@echo Using $(POSTGRES_DOCKER_IMAGE)
	@echo Using $(PG_TAP_DOCKER_IMAGE)
	@docker run -d \
		--name $(SQL_TEST_CONTAINER_NAME) \
		$(DOCKER_ARGS) \
		-e POSTGRES_PASSWORD=boundary \
		-e POSTGRES_USER=boundary \
		-e POSTGRES_DB=boundary \
		-v "$(CWD)/../schema/migrations":/migrations \
		-v "$(CWD)/initdb.d":/docker-entrypoint-initdb.d/ \
		$(POSTGRES_DOCKER_IMAGE)
	@docker run --rm \
		--name test \
		--link $(SQL_TEST_CONTAINER_NAME):db \
		-e DATABASE=boundary \
		-e HOST=db \
		-e PORT=5432 \
		-e USER=boundary \
		-e PASSWORD=boundary \
		-e TESTS="$(PROVE_OPTS) $(dockerized_tests)" \
		-v "$(CWD)/tests":/test \
		$(PG_TAP_DOCKER_IMAGE); \
		(ret=$$?; docker stop $(SQL_TEST_CONTAINER_NAME) > /dev/null 2>&1 && $(log_cmd) && docker rm -f -v $(SQL_TEST_CONTAINER_NAME) > /dev/null 2>&1 && exit $$ret)

database-up:
	@echo Using $(POSTGRES_DOCKER_IMAGE)
	@docker run -d \
		--name $(SQL_TEST_CONTAINER_NAME) \
		$(DOCKER_ARGS) \
		-e POSTGRES_PASSWORD=boundary \
		-e POSTGRES_USER=boundary \
		-e POSTGRES_DB=boundary \
		-v "$(CWD)/../schema/migrations":/migrations \
		-v "$(CWD)/initdb.d":/docker-entrypoint-initdb.d/ \
		$(POSTGRES_DOCKER_IMAGE)
ifdef SQL_TEST_DB_PORT
	@echo "Test database available at:  postgres://boundary:boundary@localhost:$(SQL_TEST_DB_PORT)/boundary?sslmode=disable"
endif

run-tests:
	@echo Using $(PG_TAP_DOCKER_IMAGE)
	@docker run -it --rm \
		--name test \
		--link $(SQL_TEST_CONTAINER_NAME):db \
		-e DATABASE=boundary \
		-e HOST=db \
		-e PORT=5432 \
		-e USER=boundary \
		-e PASSWORD=boundary \
		-e TESTS="$(PROVE_OPTS) $(dockerized_tests)" \
		-v "$(CWD)/tests":/test \
		$(PG_TAP_DOCKER_IMAGE)

clean:
	docker stop $(SQL_TEST_CONTAINER_NAME) || true
	docker rm -v $(SQL_TEST_CONTAINER_NAME) || true

.PHONY: all clean test database-up run-tests
