#!/usr/bin/env -S bats --report-formatter junit --formatter tap -j 4
# -*-sh-*-

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

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

setup_file() {
	check_rms

	NODES=2
	TASKS=$(tasks_count 5)
	ARGS=5
	TIMEOUT="00:05:00"
	TESTNAME="perf-tools/papi"

	export NODES TASKS ARGS TIMEOUT TESTNAME
}

# Skip tests requiring hardware counters on aarch64 in SIMPLE_CI
skip_if_aarch64_ci() {
	[[ -n "${SIMPLE_CI}" && "$(uname -m)" == "aarch64" ]] && skip "Skipping on aarch64 in SIMPLE_CI"
	return 0
}

# Skip tests requiring hardware counters in SIMPLE_CI (all arches)
skip_if_simple_ci() {
	[[ -n "${SIMPLE_CI}" ]] && skip "Skipping in SIMPLE_CI mode"
	return 0
}

@test "[${TESTNAME}] C dynamic memory info under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	if [ ! -s dmem_info ]; then
		flunk "dmem_info binary does not exist"
	fi

	run_serial_binary -t "${TIMEOUT}" ./dmem_info
	assert_success
}

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

	# branches test is flaky, retry up to 3 times
	run_with_retry -n 3 -d 2 run_serial_binary -t "${TIMEOUT}" ./branches
	assert_success
}

@test "[${TESTNAME}] C Clock latency and resolution under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	if [ ! -s clockres_pthreads ]; then
		flunk "clockres_pthreads binary does not exist"
	fi

	run_serial_binary -t "${TIMEOUT}" ./clockres_pthreads
	assert_success
}

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

	run_serial_binary -t "${TIMEOUT}" ./cycle_ratio
	assert_success
}

@test "[${TESTNAME}] C start, read, stop and again under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	skip_if_simple_ci

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

	run_serial_binary -t "${TIMEOUT}" ./first
	assert_success
}

@test "[${TESTNAME}] C L1 related events under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	if [ ! -s memory ]; then
		flunk "memory binary does not exist"
	fi

	run_serial_binary -t "${TIMEOUT}" ./memory
	assert_success
}

@test "[${TESTNAME}] FORTRAN start/stop and read under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	skip_if_aarch64_ci

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

	run_serial_binary -t "${TIMEOUT}" ./cost
	assert_success
}

@test "[${TESTNAME}] FORTRAN multiplex under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	skip_if_aarch64_ci

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

	run_serial_binary -t "00:03:00" ./fmultiplex1
	assert_success
}

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

	run_serial_binary -t "${TIMEOUT}" ./avail
	assert_success
}

@test "[${TESTNAME}] FORTRAN string passing under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	if [ ! -s strtest ]; then
		flunk "strtest binary does not exist"
	fi

	run_serial_binary -t "${TIMEOUT}" ./strtest
	assert_success
}

@test "[${TESTNAME}] FORTRAN L1 cache miss under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	skip_if_aarch64_ci

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

	run_serial_binary -t "${TIMEOUT}" ./tenth
	assert_success
}

@test "[${TESTNAME}] FORTRAN start, stop and timer under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	skip_if_aarch64_ci

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

	run_serial_binary -t "${TIMEOUT}" ./zero
	assert_success
}

@test "[${TESTNAME}] C simple smoke test under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	skip_if_simple_ci

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

	run_serial_binary -t "${TIMEOUT}" ./simple
	assert_success
}

@test "[${TESTNAME}] C threaded smoke test under resource manager (${RESOURCE_MANAGER}/${LMOD_FAMILY_COMPILER})" {
	skip_if_simple_ci

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

	run_serial_binary -t "${TIMEOUT}" ./threads
	assert_success
}
