#!/bin/bash

##
# @file   trinity-test.sh
# @brief  execute test using unittest and apptest
# @see    https://github.sec.samsung.net/AIP/NPU_SystemService
# @author Jiho Chu <jiho.chu@samsung.com>
#

# test envs
NPU_ENGINE_BIN_PATH=/usr/lib/npu-engine/bin
TEST_DATA_PATH=/usr/share/npu-engine/testdata

# test global var
UNITTEST_PATH=$NPU_ENGINE_BIN_PATH/unittests
APPTEST_PATH=$NPU_ENGINE_BIN_PATH/apptests
TEST_PATH=$NPU_ENGINE_BIN_PATH/utils
MODEL_PATH=$TEST_DATA_PATH/TRIV240

TEST_UNITTEST_NAME=unittest*
TEST_APPTEST_NAME=apptest*
TEST_MODELTEST_NAME=*
TEST_UNITTEST=false
TEST_APPTEST=false
TEST_MODELTEST=false

TRINITY_DRIVERS=('trinity_vision2')

print_help() {
	echo -e "Usage: $0 [-u] [-a] [-m] [-n NAME] [-p MODEL_PATH]"
	echo -e "\th: show help"
	echo -e "\tu: run unittests"
	echo -e "\ta: run apptests"
	echo -e "\tm: run modeltests"
	echo -e "\tn: run specific test with name"
	echo -e "\td: disable specific test with name"
	echo -e "\tp: set model path (default: $MODEL_PATH)"
}

run_reload() {
  echo "run reload driver"

  echo "remove drivers"
  for driver in $TRINITY_DRIVERS; do
    rmmod $driver
  done

  echo "insert drivers"
  for driver in $TRINITY_DRIVERS; do
    modprobe $driver
  done

  mdev -s
  echo "2097152" > /sys/devices/platform/trinity/*.triv2/control/profile
}

run_unittest() {
	local test=$1
	local disable=$2
	echo "run unittest $UNITTEST_PATH/$test"

	local tests=$(find $UNITTEST_PATH -mindepth 1 -maxdepth 1 -name "$test")

	for t in ${tests[@]}; do
		if [[ "$(basename $t)" =~ "$disable" ]]; then
			echo $t "disabled"
			continue
		fi

		sh  -c "$t"
		[ $? -ne 0 ] && echo Failed: $t && return 1;
		echo Success: $t
	done
}

run_apptest() {
	local test=$1
	local disable=$2
	echo "run apptest $APPTEST_PATH/$test"

	local tests=$(find $APPTEST_PATH -mindepth 1 -maxdepth 1 -name "$test")

	local arg1=
	local arg2=
	for t in ${tests[@]}; do
		case $t in
		*bulk)
			arg1=$MODEL_PATH
		;;
		*aging)
			arg1=$MODEL_PATH/CONV_2D_300
			arg2="1 10"
		;;
		*preempt)
			arg1=$MODEL_PATH/
		;;
		*xml)
			arg1=$TEST_PATH/model.xml
		;;
		*interleave)
			arg1=10
			arg2=$MODEL_PATH/MAX_POOL_2D_000,$MODEL_PATH/CONV_2D_300
		;;
		*profile)
			arg1=$MODEL_PATH/ADD_000
			arg2="-p visa"
		;;
		*)
			arg1=$MODEL_PATH/ADD_000
		;;
		esac

		if [[ "$(basename $t)" =~ "$disable" ]]; then
			echo $t "disabled"
			continue
		fi

		echo "run: $t $arg1 $arg2"
		sh  -c "$t $arg1 $arg2"
		[ $? -ne 0 ] && echo Failed: $t && return 1;
		echo Success: $t
	done
}

run_modeltest() {
	local test=$1
	local disble=$2
	echo "run modeltest $MODEL_PATH/$test"

	local tests=$(find $MODEL_PATH -mindepth 1 -maxdepth 1 -name "$test")

	for t in ${tests[@]}; do
		if [[ "$(basename $t)" =~ "$disable" ]]; then
			echo $t "disabled"
			continue
		fi

		echo "run: $APPTEST_PATH/apptest_tvn_triv2 $t"
		sh  -c "$APPTEST_PATH/apptest_tvn_triv2 $t"
		[ $? -ne 0 ] && echo Failed: $t
		echo Success: $t
	done
}

while getopts "ad:hmn:p:ru" opt; do
	case $opt in
	a)
		TEST_APPTEST=true
	;;
	d)
		TEST_DISABLE_NAME=$OPTARG
	;;
	h)
		print_help
		exit 0
	;;
	m)
		TEST_MODELTEST=true
	;;
	n)
		TEST_UNITTEST_NAME=$OPTARG
		TEST_APPTEST_NAME=$OPTARG
		TEST_MODELTEST_NAME=$OPTARG
	;;
	p)
		MODEL_PATH=$OPTARG
	;;
	r)
		run_reload
		exit 0
	;;
	u)
		TEST_UNITTEST=true
	;;
	esac
done

[ ! -d "$NPU_ENGINE_BIN_PATH" ] && echo "incorrect npu-engine path: $NPU_ENGINE_BIN_PATH" && exit 1
[ ! -d "$TEST_DATA_PATH" ] && echo "incorrect testdata path: $TEST_DATA_PATH" && exit 1
[ $TEST_UNITTEST = false ] && [ $TEST_APPTEST = false ] && [ $TEST_MODELTEST = false ] && print_help && exit 0
[ $TEST_UNITTEST = true ] && run_unittest "$TEST_UNITTEST_NAME" "$TEST_DISABLE_NAME"
[ $TEST_APPTEST = true ] && run_apptest "$TEST_APPTEST_NAME" "$TEST_DISABLE_NAME"
[ $TEST_MODELTEST = true ] && run_modeltest "$TEST_MODELTEST_NAME" "$TEST_DISABLE_NAME"
