Blame tests/monitor/run-tests.sh

Packit Service e7ae83
#!/bin/bash
Packit Service e7ae83
Packit Service e7ae83
cd $(dirname $0)
Packit Service e7ae83
nft=../../src/nft
Packit Service e7ae83
debug=false
Packit Service e7ae83
test_json=false
Packit Service e7ae83
Packit Service e7ae83
mydiff() {
Packit Service e7ae83
	diff -w -I '^# ' "$@"
Packit Service e7ae83
}
Packit Service e7ae83
Packit Service e7ae83
if [ "$(id -u)" != "0" ] ; then
Packit Service e7ae83
	echo "this requires root!"
Packit Service e7ae83
	exit 1
Packit Service e7ae83
fi
Packit Service e7ae83
Packit Service e7ae83
testdir=$(mktemp -d)
Packit Service e7ae83
if [ ! -d $testdir ]; then
Packit Service e7ae83
	echo "Failed to create test directory" >&2
Packit Service e7ae83
	exit 1
Packit Service e7ae83
fi
Packit Service e7ae83
trap "rm -rf $testdir; $nft flush ruleset" EXIT
Packit Service e7ae83
Packit Service e7ae83
command_file=$(mktemp -p $testdir)
Packit Service e7ae83
output_file=$(mktemp -p $testdir)
Packit Service e7ae83
Packit Service e7ae83
cmd_append() {
Packit Service e7ae83
	echo "$*" >>$command_file
Packit Service e7ae83
}
Packit Service e7ae83
monitor_output_append() {
Packit Service e7ae83
	[[ "$*" == '-' ]] && {
Packit Service e7ae83
		cat $command_file >>$output_file
Packit Service e7ae83
		return
Packit Service e7ae83
	}
Packit Service e7ae83
	echo "$*" >>$output_file
Packit Service e7ae83
}
Packit Service e7ae83
echo_output_append() {
Packit Service e7ae83
	# this is a bit tricky: for replace commands, nft prints a delete
Packit Service e7ae83
	# command - so in case there is a replace command in $command_file,
Packit Service e7ae83
	# just assume any other commands in the same file are sane
Packit Service e7ae83
	grep -q '^replace' $command_file >/dev/null 2>&1 && {
Packit Service e7ae83
		monitor_output_append "$*"
Packit Service e7ae83
		return
Packit Service e7ae83
	}
Packit Service e7ae83
	[[ "$*" == '-' ]] && {
Packit Service e7ae83
		grep '^\(add\|replace\|insert\)' $command_file >>$output_file
Packit Service e7ae83
		return
Packit Service e7ae83
	}
Packit Service e7ae83
	[[ "$*" =~ ^add|replace|insert ]] && echo "$*" >>$output_file
Packit Service e7ae83
}
Packit Service e7ae83
json_output_filter() { # (filename)
Packit Service e7ae83
	# unify handle values
Packit Service e7ae83
	sed -i -e 's/\("handle":\) [0-9][0-9]*/\1 0/g' "$1"
Packit Service e7ae83
}
Packit Service e7ae83
monitor_run_test() {
Packit Service e7ae83
	monitor_output=$(mktemp -p $testdir)
Packit Service e7ae83
	monitor_args=""
Packit Service e7ae83
	$test_json && monitor_args="vm json"
Packit Service e7ae83
Packit Service e7ae83
	$nft -nn monitor $monitor_args >$monitor_output &
Packit Service e7ae83
	monitor_pid=$!
Packit Service e7ae83
Packit Service e7ae83
	sleep 0.5
Packit Service e7ae83
Packit Service e7ae83
	$debug && {
Packit Service e7ae83
		echo "command file:"
Packit Service e7ae83
		cat $command_file
Packit Service e7ae83
	}
Packit Service e7ae83
	$nft -f $command_file || {
Packit Service e7ae83
		echo "nft command failed!"
Packit Service e7ae83
		kill $monitor_pid
Packit Service e7ae83
		wait >/dev/null 2>&1
Packit Service e7ae83
		exit 1
Packit Service e7ae83
	}
Packit Service e7ae83
	sleep 0.5
Packit Service e7ae83
	kill $monitor_pid
Packit Service e7ae83
	wait >/dev/null 2>&1
Packit Service e7ae83
	$test_json && json_output_filter $monitor_output
Packit Service e7ae83
	if ! mydiff -q $monitor_output $output_file >/dev/null 2>&1; then
Packit Service e7ae83
		echo "monitor output differs!"
Packit Service e7ae83
		mydiff -u $output_file $monitor_output
Packit Service e7ae83
		exit 1
Packit Service e7ae83
	fi
Packit Service e7ae83
	rm $command_file
Packit Service e7ae83
	rm $output_file
Packit Service e7ae83
	touch $command_file
Packit Service e7ae83
	touch $output_file
Packit Service e7ae83
}
Packit Service e7ae83
Packit Service e7ae83
echo_run_test() {
Packit Service e7ae83
	echo_output=$(mktemp -p $testdir)
Packit Service e7ae83
	$debug && {
Packit Service e7ae83
		echo "command file:"
Packit Service e7ae83
		cat $command_file
Packit Service e7ae83
	}
Packit Service e7ae83
	$nft -nn -e -f $command_file >$echo_output || {
Packit Service e7ae83
		echo "nft command failed!"
Packit Service e7ae83
		exit 1
Packit Service e7ae83
	}
Packit Service e7ae83
	if ! mydiff -q $echo_output $output_file >/dev/null 2>&1; then
Packit Service e7ae83
		echo "echo output differs!"
Packit Service e7ae83
		mydiff -u $output_file $echo_output
Packit Service e7ae83
		exit 1
Packit Service e7ae83
	fi
Packit Service e7ae83
	rm $command_file
Packit Service e7ae83
	rm $output_file
Packit Service e7ae83
	touch $command_file
Packit Service e7ae83
	touch $output_file
Packit Service e7ae83
}
Packit Service e7ae83
Packit Service 624e1d
testcases=""
Packit Service e7ae83
while [ -n "$1" ]; do
Packit Service e7ae83
	case "$1" in
Packit Service e7ae83
	-d|--debug)
Packit Service e7ae83
		debug=true
Packit Service e7ae83
		shift
Packit Service e7ae83
		;;
Packit Service e7ae83
	-j|--json)
Packit Service e7ae83
		test_json=true
Packit Service e7ae83
		shift
Packit Service e7ae83
		;;
Packit Service 3c7e45
	-H|--host)
Packit Service 3c7e45
		nft=nft
Packit Service 3c7e45
		shift
Packit Service 3c7e45
		;;
Packit Service 624e1d
	testcases/*.t)
Packit Service 624e1d
		testcases+=" $1"
Packit Service 624e1d
		shift
Packit Service 624e1d
		;;
Packit Service e7ae83
	*)
Packit Service e7ae83
		echo "unknown option '$1'"
Packit Service e7ae83
		;&
Packit Service e7ae83
	-h|--help)
Packit Service 624e1d
		echo "Usage: $(basename $0) [-j|--json] [-d|--debug] [testcase ...]"
Packit Service e7ae83
		exit 1
Packit Service e7ae83
		;;
Packit Service e7ae83
	esac
Packit Service e7ae83
done
Packit Service e7ae83
Packit Service e7ae83
if $test_json; then
Packit Service e7ae83
	variants="monitor"
Packit Service e7ae83
else
Packit Service e7ae83
	variants="monitor echo"
Packit Service e7ae83
fi
Packit Service e7ae83
Packit Service e7ae83
for variant in $variants; do
Packit Service e7ae83
	run_test=${variant}_run_test
Packit Service e7ae83
	output_append=${variant}_output_append
Packit Service e7ae83
Packit Service 624e1d
	for testcase in ${testcases:-testcases/*.t}; do
Packit Service e7ae83
		echo "$variant: running tests from file $(basename $testcase)"
Packit Service e7ae83
		# files are like this:
Packit Service e7ae83
		#
Packit Service e7ae83
		# I add table ip t
Packit Service e7ae83
		# O add table ip t
Packit Service e7ae83
		# I add chain ip t c
Packit Service e7ae83
		# O add chain ip t c
Packit Service e7ae83
Packit Service e7ae83
		$nft flush ruleset
Packit Service e7ae83
Packit Service e7ae83
		input_complete=false
Packit Service e7ae83
		while read dir line; do
Packit Service e7ae83
			case $dir in
Packit Service e7ae83
			I)
Packit Service e7ae83
				$input_complete && $run_test
Packit Service e7ae83
				input_complete=false
Packit Service e7ae83
				cmd_append "$line"
Packit Service e7ae83
				;;
Packit Service e7ae83
			O)
Packit Service e7ae83
				input_complete=true
Packit Service e7ae83
				$test_json || $output_append "$line"
Packit Service e7ae83
				;;
Packit Service e7ae83
			J)
Packit Service e7ae83
				input_complete=true
Packit Service e7ae83
				$test_json && $output_append "$line"
Packit Service e7ae83
				;;
Packit Service e7ae83
			'#'|'')
Packit Service e7ae83
				# ignore comments and empty lines
Packit Service e7ae83
				;;
Packit Service e7ae83
			esac
Packit Service e7ae83
		done <$testcase
Packit Service e7ae83
		$input_complete && $run_test
Packit Service e7ae83
	done
Packit Service e7ae83
done