#!/usr/bin/env bash

# For the license, see the LICENSE file in the root directory.

ROOT=${abs_top_builddir:-$(dirname "$0")/..}
TESTDIR=${abs_top_testdir:-$(dirname "$0")}

TPMDIR="$(mktemp -d)" || exit 1
SWTPM_CTRL_UNIX_PATH=$TPMDIR/sock
PID_FILE=$TPMDIR/swtpm.pid
LOG_FILE=$TPMDIR/swtpm.log

SWTPM_SERVER_PORT=65472
SWTPM_CTRL_PORT=65473

source "${TESTDIR}/test_common"

trap "cleanup" SIGTERM EXIT

function cleanup()
{
	rm -rf "${TPMDIR}"
	if [ -n "${SWTPM_PID}" ]; then
		kill_quiet -SIGTERM "${SWTPM_PID}" 2>/dev/null
	fi
}

source "${TESTDIR}/common"
skip_test_no_tpm12 "${SWTPM_EXE}"


if ! [[ "$(uname -s)" =~ Linux ]]; then
	echo "Need Linux to run UnixIO test for CMD_SET_DATAFD."
	echo "Test 1: Skipped"
else

	# Test CMD_SET_DATAFD
	cp "${TESTDIR}/data/tpmstate1/"* "${TPMDIR}"
	$SWTPM_EXE socket \
		--flags not-need-init \
		--ctrl "type=unixio,path=${SWTPM_CTRL_UNIX_PATH}" \
		--tpmstate dir="${TPMDIR}" \
		-t \
		--pid "file=${PID_FILE}" \
		--log "file=${LOG_FILE},level=20" \
		${SWTPM_TEST_SECCOMP_OPT:+${SWTPM_TEST_SECCOMP_OPT}} &
	SWTPM_PID=$!

	if wait_for_file "${PID_FILE}" 3; then
		echo "Error: Socket TPM did not write pidfile."
		exit 1
	fi

	LOG=$(SOCK_PATH=${SWTPM_CTRL_UNIX_PATH} exec "${TESTDIR}/test_setdatafd.py")
	res=$?

	if [ $res -ne 0 ]; then
		echo "Error: CMD_SET_DATAFD failed: $LOG"
		exit 1
	fi

	if wait_process_gone ${SWTPM_PID} 4; then
		echo "Error: TPM should not be running anymore after data channel loss."
		exit 1
	fi

	echo "Test 1: OK"
fi

# Test that loss of control channel terminates swtpm

$SWTPM_EXE socket \
	--ctrl "type=unixio,path=${SWTPM_CTRL_UNIX_PATH},terminate" \
	--server "type=tcp,port=${SWTPM_SERVER_PORT}" \
	--tpmstate "dir=${TPMDIR}" \
	--pid "file=${PID_FILE}" \
	${SWTPM_TEST_SECCOMP_OPT:+${SWTPM_TEST_SECCOMP_OPT}} &
SWTPM_PID=$!

if wait_for_file "${PID_FILE}" 3; then
	echo "Error: Socket TPM did not write pidfile."
	exit 1
fi

# Opening the data socket must NOT terminate it
exec 100<>/dev/tcp/127.0.0.1/${SWTPM_SERVER_PORT}
exec 100>&-
sleep 1

if ! kill -0 "${SWTPM_PID}"; then
	echo "Error: Opening and closing data channel must not have terminated swtpm"
	exit 1
fi

if ! socat -T1 - "UNIX-CONNECT:${SWTPM_CTRL_UNIX_PATH}"; then
	echo "Error: Socat failed"
	exit 1
fi

if wait_process_gone "${SWTPM_PID}" 4; then
	echo "Error: TPM should not be running anymore after control channel loss."
	exit 1
fi

echo "Test 2: OK"

$SWTPM_EXE socket \
	--ctrl "type=tcp,port=${SWTPM_CTRL_PORT},terminate" \
	--server "type=tcp,port=${SWTPM_SERVER_PORT}" \
	--tpmstate "dir=${TPMDIR}" \
	--pid "file=${PID_FILE}" \
	${SWTPM_TEST_SECCOMP_OPT:+${SWTPM_TEST_SECCOMP_OPT}} &
SWTPM_PID=$!

if wait_for_file "${PID_FILE}" 3; then
	echo "Error: Swtpm did not write pidfile."
	exit 1
fi

# Opening the data socket must NOT terminate it
exec 100<>/dev/tcp/127.0.0.1/${SWTPM_SERVER_PORT}
exec 100>&-
sleep 1

if ! kill -0 "${SWTPM_PID}"; then
	echo "Error: Opening and closing data channel must not have terminated swtpm"
	exit 1
fi

# Opening the ctrl socket must be enough to terminate it
exec 100<>/dev/tcp/127.0.0.1/${SWTPM_CTRL_PORT}
exec 100>&-

if wait_process_gone "${SWTPM_PID}" 4; then
	echo "Error: TPM should not be running anymore after control channel loss."
	exit 1
fi

echo "Test 3: OK"

exit 0
