swtpm/tests/test_commandline
Stefan Berger f59c33009d tests: Wait for PID file rather than reading it right away
Wait for the PID file to appear rather than reading it right away.
This addresses an issue when runnin the test suite under valgrind
(make -j $(nproc) check).

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
2020-01-13 15:03:01 -05:00

189 lines
3.5 KiB
Bash
Executable File

#!/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")}
# need SWTPM to be set
source ${TESTDIR}/common
TPMDIR=`mktemp -d`
PID_FILE=$TPMDIR/${SWTPM}.pid
LOG_FILE=$TPMDIR/${SWTPM}.log
source ${TESTDIR}/test_common
trap "cleanup" SIGTERM EXIT
function cleanup()
{
rm -rf $TPMDIR
if [ -n "$PID" ]; then
kill_quiet -SIGTERM $PID 2>/dev/null
fi
}
PORT=11234
export TCSD_TCP_DEVICE_HOSTNAME=localhost
export TCSD_TCP_DEVICE_PORT=$PORT
export TCSD_USE_TCP_DEVICE=1
function wait_port_open()
{
local port=$1
local pid=$2
sleep 0.2
for ((i = 0; i < 20; i++)); do
if [ -n "$(netstat -naptl 2>/dev/null |
grep "LISTEN" |
grep " $pid/" |
grep ":$port ")" ]; then
return 0
fi
sleep 0.2
done
return 1
}
function wait_port_closed()
{
local port=$1
local pid=$2
for ((i = 0; i < 20; i++)); do
if [ -z "$(netstat -naptl 2>/dev/null |
grep "LISTEN" |
grep " $pid/" |
grep ":$port ")" ]; then
return 0
fi
sleep 0.2
done
return 1
}
# Test 1: test port and directory command line parameters; use log level 20
FILEMODE=641
exec 100<>$LOG_FILE
$SWTPM_EXE socket \
-p $PORT \
--tpmstate dir=$TPMDIR,mode=$FILEMODE \
--pid file=$PID_FILE \
--log fd=100,level=20 \
--flags not-need-init &
PID=$!
exec 100>&-
wait_port_open $PORT $PID
kill_quiet -0 $PID
if [ $? -ne 0 ]; then
echo "Test 1 failed: TPM process not running"
exit 1
fi
if wait_for_file $PID_FILE 3; then
echo "Error: ${SWTPM_INTERFACE} TPM did not write pidfile."
exit 1
fi
validate_pidfile $PID $PID_FILE
${SWTPM_BIOS} &>/dev/null
if [ $? -ne 0 ]; then
echo "Test 1 failed: tpm_bios did not work"
exit 1
fi
filemode=$(get_filemode ${TPMDIR}/tpm-00.permall)
if [ "$filemode" != "$FILEMODE" ]; then
echo "Filemode bits are wrong"
echo "Expected: $FILEMODE"
echo "Actual : $filemode"
exit 1
fi
check_logfile_patterns_level_20 $LOG_FILE
rm -f $LOG_FILE
kill_quiet -SIGTERM $PID &>/dev/null
wait_process_gone $PID 2
exec 20<&1-; exec 21<&2-
kill_quiet -0 $PID &>/dev/null
RES=$?
exec 1<&20-; exec 2<&21-
if [ $RES -eq 0 ]; then
kill_quiet -SIGKILL $PID
echo "Test 1 failed: TPM process did not terminate on SIGTERM"
exit 1
fi
echo "Test 1 passed"
cleanup
# Test 2: test port, directory and terminate command line parameters (-t)
# that causes the swtpm process to exit upon connection close
TPMDIR=`mktemp -d`
$SWTPM_EXE socket --flags not-need-init -p $PORT --tpmstate dir=$TPMDIR -t &>/dev/null &
PID=$!
wait_port_open $PORT $PID
exec 20<&1-; exec 21<&2-
kill_quiet -0 $PID
RES=$?
exec 1<&20-; exec 2<&21-
if [ $RES -ne 0 ]; then
echo "Test 2 failed: TPM process not running"
exit 1
fi
exec 100<>/dev/tcp/localhost/$PORT
if [ $? -ne 0 ]; then
echo "Test 2 failed: Could not connect to TPM"
exit 1
fi
exec 100>&-
wait_port_closed $PORT $PID
# Give it time to fully shut down
wait_process_gone $PID 6
exec 20<&1-; exec 21<&2-
kill_quiet -0 $PID
RES=$?
exec 1<&20-; exec 2<&21-
if [ $RES -eq 0 ]; then
kill_quiet -SIGKILL $PID
echo "Test 2 failed: TPM process did not terminate on connection loss"
exit 1
fi
echo "Test 2 passed"
# Test 3: test --fd= and --ctrl type=unxio,clientfd=
# The python script execs swtpm with client sockets
exec 20<&1-; exec 21<&2-
LOG=$(PID_FILE=$TPMDIR/swtpm.pid SWTPM_EXE=$SWTPM_EXE TPMDIR=$TPMDIR exec $TESTDIR/test_clientfds.py)
RES=$?
exec 1<&20-; exec 2<&21-
if [ $RES -ne 0 ]; then
echo "Test 3 failed: $LOG"
exit 1
fi
echo "Test 3 passed"
exit 0