passt/test/run

232 lines
4.2 KiB
Text
Raw Normal View History

#!/bin/sh -e
#
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# PASST - Plug A Simple Socket Transport
# for qemu/UNIX domain socket mode
#
# PASTA - Pack A Subtle Tap Abstraction
# for network namespace/tap device mode
#
# test/run - Entry point to run test cases and demo
#
# Copyright (c) 2021 Red Hat GmbH
# Author: Stefano Brivio <sbrivio@redhat.com>
# Start an X terminal and capture a video of the test run (also set for ./ci)
CI=${CI:-0}
# Start an X terminal and show the demo (also set for ./demo)
DEMO=${DEMO:-0}
# Base path for output files
BASEPATH=${BASEPATH:-"$(pwd)"}
# Location of log files for test run
LOGDIR=${LOGDIR:-"${BASEPATH}/test_logs"}
LOGFILE=${LOGFILE:-"${LOGDIR}/test.log"}
# If set, skip typing delays while issuing commands in panes
FAST=${FAST:-1}
# If set, run passt and pasta with debug options
DEBUG=${DEBUG:-0}
# If set, tell passt and pasta to take packet captures
PCAP=${PCAP:-0}
COMMIT="$(git log --oneline --no-decorate -1)"
. lib/util
. lib/setup
. lib/setup_ugly
. lib/context
. lib/term
. lib/perf_report
. lib/layout
. lib/layout_ugly
. lib/test
. lib/video
# cleanup() - Remove temporary files
cleanup() {
[ ${DEBUG} -eq 1 ] || rm -rf "${STATEBASE}"
}
# run() - Call setup functions, run tests, handle exit from test session
run() {
mkfifo $STATEBASE/log_pipe
term
perf_init
[ ${CI} -eq 1 ] && video_start ci
setup build
test build/all
test build/cppcheck
test build/clang_tidy
teardown build
setup pasta
test pasta/ndp
test pasta/dhcp
test pasta/tcp
test pasta/udp
test passt/shutdown
teardown pasta
test: Add log file tests for pasta plus corresponding layout and setup To test log files on a tmpfs mount, we need to unshare the mount namespace, which means using a context for the passt pane is not really practical at the moment, as we can't open a shell there, so we would have to encapsulate all the commands under 'unshare -rUm', plus the "inner" pasta command, running in turn a tcp_rr server. It might be worth fixing this by e.g. detecting we are trying to spawn an interactive shell and adding a special path in the context setup with some form of stdin redirection -- I'm not sure it's doable though. For this reason, add a new layout, using a context only for the host pane, while keeping the old command dispatch mechanism for the passt pane. We also need a new setup function that doesn't start pasta: we want to start and restart it with different options. Further, we need a 'pint' directive, to send an interrupt to the passt pane: add that in lib/test. All the tests before the one involving tmpfs and a detached mount namespace were also tested with the context mechanism. To make an eventual conversion easier, pass tcp_crr directly as a command on pasta's command line where feasible. While at it, fix the comment to the teardown_pasta() function. The new test set can be semi-conveniently run as: ./run pasta_options/log_to_file and it checks basic log creation, size of the log file after flooding it with debug entries, rotations, and basic consistency after rotations, on both an existing filesystem and a tmpfs, chosen as it doesn't support collapsing data ranges via fallocate(), hence triggering the fall-back mechanism for logging rotation. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
2022-10-07 02:16:08 +02:00
setup pasta_options
test pasta_options/log_to_file
teardown pasta_options
setup passt
test passt/ndp
test passt/dhcp
test passt/tcp
test passt/udp
test passt/shutdown
teardown passt
VALGRIND=1
setup passt_in_ns
test passt/ndp
test passt/dhcp
test passt_in_ns/icmp
test passt_in_ns/tcp
test passt_in_ns/udp
test passt_in_ns/shutdown
teardown passt_in_ns
setup two_guests
test two_guests/basic
teardown two_guests
VALGRIND=0
setup passt_in_ns
test passt/ndp
test passt/dhcp
test perf/passt_tcp
test perf/passt_udp
test perf/pasta_tcp
test perf/pasta_udp
test passt_in_ns/shutdown
teardown passt_in_ns
# TODO: Make those faster by at least pre-installing gcc and make on
# non-x86 images, then re-enable.
skip_distro() {
setup distro
test distro/debian
test distro/fedora
test distro/opensuse
test distro/ubuntu
teardown distro
}
perf_finish
[ ${CI} -eq 1 ] && video_stop
log "PASS: ${STATUS_PASS}, FAIL: ${STATUS_FAIL}"
pause_continue \
"Press any key to keep test session open" \
"Closing in " \
"Interrupted, press any key to quit" \
9
return 0
}
# run_selected() - Run list of tests, with setup/teardown based on test path
# $@: List of tests
run_selected() {
mkfifo $STATEBASE/log_pipe
term
VALGRIND=1
__setup=
for __test; do
if [ "${__test%%/*}" != "${__setup}" ]; then
[ -n "${__setup}" ] && teardown "${__setup}"
__setup="${__test%%/*}"
setup "${__setup}"
fi
test "${__test}"
done
teardown "${__setup}"
log "PASS: ${STATUS_PASS}, FAIL: ${STATUS_FAIL}"
pause_continue \
"Press any key to keep test session open" \
"Closing in " \
"Interrupted, press any key to quit" \
9
return 0
}
# demo() - Simpler path for demo purposes
demo() {
mkfifo $STATEBASE/log_pipe
FAST=0
term_demo
layout_demo_passt
video_start demo_passt
test demo/passt
video_stop
teardown demo_passt
layout_demo_pasta
video_start demo_pasta
test demo/pasta
video_stop
teardown demo_pasta
layout_demo_podman
video_start demo_podman
test demo/podman
video_stop
teardown_demo_podman
return 0
}
[ "$(basename "${0}")" = "ci" ] && CI=1
[ "$(basename "${0}")" = "run_demo" ] && DEMO=1
if [ "${1}" = "from_term" ]; then
shift
exec > ${LOGDIR}/script.log 2>&1
[ ${DEBUG} -eq 1 ] && set -x
cd ..
if [ ${DEMO} -eq 1 ]; then
demo
elif [ -n "${1}" ]; then
run_selected ${*}
else
run
fi
tmux kill-session -t passt_test
exit
else
rm -rf "${LOGDIR}"
mkdir -p "${LOGDIR}"
:> "${LOGFILE}"
STATEBASE="$(mktemp -d --tmpdir passt-tests-XXXXXX)"
trap "cleanup" EXIT
run_term ${*}
fi
[ ${DEMO} -eq 1 ] && exit 0
tail -n1 ${LOGFILE}
echo "Log at ${LOGFILE}"
exit $(tail -n1 ${LOGFILE} | sed -n 's/.*FAIL: \(.*\)$/\1/p')