#!/usr/bin/env bash
#  SPDX-License-Identifier: BSD-3-Clause
#  Copyright (C) 2019 Intel Corporation
#  All rights reserved.
#
testdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $testdir/../..)

source "$rootdir/test/common/autotest_common.sh"

TEST_TIMEOUT=1200

# The term transport is used a bit loosely for vhost tests.
allowed_nvme_transports=("rdma" "tcp")
allowed_vhost_transports=("scsi" "blk" "all")
bad_transport=true
config_params="--enable-asan --enable-ubsan --enable-debug"

# These arguments are used in addition to the test arguments in autotest_common.sh
for i in "$@"; do
	case "$i" in
		--module=*)
			TEST_MODULE="${i#*=}"
			;;
		--timeout=*)
			TEST_TIMEOUT="${i#*=}"
			;;
	esac
done

timing_enter autofuzz
if [ "$TEST_MODULE" == "nvmf" ]; then
	allowed_transports=("${allowed_nvme_transports[@]}")
	if [ $TEST_TRANSPORT == "rdma" ]; then
		config_params="$config_params --with-rdma"
	fi
elif [ "$TEST_MODULE" == "vhost" ]; then
	allowed_transports=("${allowed_vhost_transports[@]}")
	config_params="$config_params --with-vhost --with-virtio"
else
	echo "Invalid module specified. Please specify either nvmf or vhost."
	exit 1
fi

for transport in "${allowed_transports[@]}"; do
	if [ $transport == "$TEST_TRANSPORT" ]; then
		bad_transport=false
	fi
done

if $bad_transport; then
	echo "invalid transport. Please supply one of the following for module: $TEST_MODULE."
	echo "${allowed_transports[@]}"
	exit 1
fi

timing_enter make
cd $rootdir
./configure $config_params
$MAKE $MAKEFLAGS
timing_exit make

# supply --iso to each test module so that it can run setup.sh.
timing_enter fuzz_module
if [ "$TEST_MODULE" == "nvmf" ]; then
	sudo $testdir/autofuzz_nvmf.sh --iso --transport=$TEST_TRANSPORT --timeout=$TEST_TIMEOUT
fi

if [ "$TEST_MODULE" == "vhost" ]; then
	sudo $testdir/autofuzz_vhost.sh --iso --transport=$TEST_TRANSPORT --timeout=$TEST_TIMEOUT
fi

if [ "$TEST_MODULE" == "iscsi" ]; then
	sudo $testdir/autofuzz_iscsi.sh --iso --transport=$TEST_TRANSPORT --timeout=$TEST_TIMEOUT
fi
timing_exit fuzz_module
timing_exit autofuzz
