#!/usr/bin/env -S bats --report-formatter junit --formatter tap -j 4
# -*-sh-*-
# shellcheck disable=SC2030,SC2031

load ./common/test_helper_functions || exit 1
source ./common/functions || exit 1

if [ -s ./common/TEST_ENV ]; then
	source ./common/TEST_ENV
fi

setup_file() {
	NODES=2
	TASKS=$(tasks_count 8)
	ARGS=8
	LAST_TASK_INDEX=$(echo "${TASKS} -1" | bc)
	TESTNAME="perf-tools/TAU"

	check_rms

	export NODES TASKS ARGS LAST_TASK_INDEX TESTNAME
	export TAU_TRACE=0 TAU_CALLPATH=0 TAU_PROFILE=1 TAU_METRICS=GET_TIME_OF_DAY
	unset OMP_NUM_THREADS
}

setup() {
	PROFILEDIR="$(mktemp -d "${BATS_TEST_TMPDIR}/tau-profile.XXXXXX")"
	export PROFILEDIR
	export TRACEDIR="${PROFILEDIR}"
}

teardown() {
	rm -rf "${PROFILEDIR}"
}

@test "[${TESTNAME}] MPI C binary runs under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER}/${LMOD_FAMILY_MPI})" {
	if [ ! -s C_mpi_test ]; then
		flunk "C_mpi_test binary does not exist"
	fi

	run_mpi_binary "tau_exec ./C_mpi_test" "" "${NODES}" "${TASKS}"
	assert_success

	run find "${PROFILEDIR}" -name "profile.${LAST_TASK_INDEX}.0.0"
	assert_success
}

@test "[${TESTNAME}] MPI C++ binary runs under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER}/${LMOD_FAMILY_MPI})" {
	if [ -n "${SIMPLE_CI}" ]; then
		skip "Not supported on SIMPLE_CI"
	fi
	if [ "${ARCH}" == "x86_64" ]; then
		export TAU_METRICS=PAPI_LD_INS
	fi
	if [ ! -s CXX_mpi_test ]; then
		flunk "CXX_mpi_test binary does not exist"
	fi

	run_mpi_binary ./run_CXX_mpi_test.sh "${ARGS}" "${NODES}" "${TASKS}"
	assert_success

	run find "${PROFILEDIR}" -name "profile.${LAST_TASK_INDEX}.0.0"
	assert_success
}

@test "[${TESTNAME}] Hybrid OpenMP/MPI C binary runs under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER}/${LMOD_FAMILY_MPI})" {
	if [ -n "${SIMPLE_CI}" ]; then
		skip "Not supported on SIMPLE_CI"
	fi
	if [ "${LMOD_FAMILY_COMPILER}" == "intel" ]; then
		skip "intel"
	fi
	if [ "${ARCH}" == "x86_64" ]; then
		export TAU_METRICS=PAPI_L1_DCM
	fi
	if [ ! -s C_hybrid_test ]; then
		flunk "C_hybrid_test binary does not exist"
	fi

	run_mpi_binary ./run_C_hybrid_test.sh "${ARGS}" "${NODES}" "${TASKS}"
	assert_success

	# test above runs with OMP_NUM_THREADS=4 on 8 MPI tasks
	run find "${PROFILEDIR}" -name "profile.7.0.3"
	assert_success
}

@test "[${TESTNAME}] Serial FORTRAN binary runs under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER}/${LMOD_FAMILY_MPI})" {
	export TAU_TRACE=1 TAU_PROFILE=0

	if [ ! -s F_test ]; then
		flunk "F_test binary does not exist"
	fi

	run_serial_binary "tau_exec ./F_test"
	assert_success

	run find "${PROFILEDIR}" -name "tautrace.0.0.0.trc"
	assert_success
}
