summaryrefslogtreecommitdiffstats
path: root/iptables/tests/shell/run-tests.sh
blob: 38f3c2d491248cc012d751b8dc7f2c84747297e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/bin/bash

#configuration
TESTDIR="./$(dirname $0)/"
RETURNCODE_SEPARATOR="_"
XTABLES_NFT_MULTI="$(dirname $0)/../../xtables-nft-multi"
XTABLES_LEGACY_MULTI="$(dirname $0)/../../xtables-legacy-multi"

export XTABLES_LIBDIR=${TESTDIR}/../../../extensions

msg_error() {
        echo "E: $1 ..." >&2
        exit 1
}

msg_warn() {
        echo "W: $1" >&2
}

msg_info() {
        echo "I: $1"
}

if [ "$(id -u)" != "0" ] ; then
        msg_error "this requires root!"
fi

if [ ! -d "$TESTDIR" ] ; then
        msg_error "missing testdir $TESTDIR"
fi

if [ "$1" == "-v" ] ; then
        VERBOSE=y
        shift
fi

for arg in "$@"; do
        if grep ^.*${RETURNCODE_SEPARATOR}[0-9]\\+$ <<< $arg >/dev/null ; then
                SINGLE+=" $arg"
                VERBOSE=y
        else
                msg_error "unknown parameter '$arg'"
        fi
done

find_tests() {
        if [ ! -z "$SINGLE" ] ; then
                echo $SINGLE
                return
        fi
        find ${TESTDIR} -executable -regex \
                .*${RETURNCODE_SEPARATOR}[0-9]+ | sort
}

ok=0
failed=0

do_test() {
	testfile="$1"
	xtables_multi="$2"

	for it in iptables ip6tables; do
		rc_spec=`echo $(basename ${testfile}) | cut -d _ -f2-`
		IPTABLES="$xtables_multi $it"

		msg_info "[EXECUTING]   $testfile"

		if [ "$VERBOSE" = "y" ]; then
			IPTABLES="$IPTABLES" unshare -n ${testfile}
		else
			IPTABLES="$IPTABLES" unshare -n ${testfile} > /dev/null 2>&1
		fi

		rc_got=$?
		echo -en "\033[1A\033[K" # clean the [EXECUTING] foobar line

		if [ "$rc_got" == "$rc_spec" ] ; then
			msg_info "[OK]          $testfile"
			((ok++))
		else
			((failed++))
			msg_warn "[FAILED]      $testfile: expected $rc_spec but got $rc_got"
		fi
	done
}

echo ""
for testfile in $(find_tests);do
	do_test "$testfile" "$XTABLES_LEGACY_MULTI"
done
msg_info "legacy results: [OK] $ok [FAILED] $failed [TOTAL] $((ok+failed))"

legacy_ok=$ok
legacy_fail=$failed
ok=0
failed=0
for testfile in $(find_tests);do
	do_test "$testfile" "$XTABLES_NFT_MULTI"
done
msg_info "nft results: [OK] $ok [FAILED] $failed [TOTAL] $((ok+failed))"

ok=$((legacy_ok+ok))
failed=$((legacy_fail+failed))

msg_info "combined results: [OK] $ok [FAILED] $failed [TOTAL] $((ok+failed))"

exit 0