summaryrefslogtreecommitdiffstats
path: root/iptables/tests/shell/run-tests.sh
blob: cf5cbdc30cf942579b0b100dca3a171cbbd11e65 (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/bash

#configuration
TESTDIR="./$(dirname $0)/"
RETURNCODE_SEPARATOR="_"
XTABLES_MULTI="$(dirname $0)/../../xtables-multi"
DIFF=$(which diff)

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

[ -z "$IPTABLES" ] && IPTABLES=$XTABLES_MULTI
if [ ! -x "$IPTABLES" ] ; then
        msg_error "no xtables-multi binary!"
else
        msg_info "using xtables-multi binary $IPTABLES"
fi

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

FIND="$(which find)"
if [ ! -x "$FIND" ] ; then
        msg_error "no find binary found"
fi

MODPROBE="$(which modprobe)"
if [ ! -x "$MODPROBE" ] ; then
        msg_error "no modprobe binary found"
fi

DEPMOD="$(which depmod)"
if [ ! -x "$DEPMOD" ] ; then
        msg_error "no depmod binary found"
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

kernel_cleanup() {
	for it in iptables ip6tables; do
	for table in filter mangle nat raw; do
		$it -t $table -nL >/dev/null 2>&1 || continue # non-existing table
		$it -t $table -F        # delete rules
		$it -t $table -X        # delete custom chains
		$it -t $table -Z        # zero counters
	done
	done
	$DEPMOD -a
	$MODPROBE -raq \
	ip_tables iptable_nat iptable_mangle ipt_REJECT
}

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


echo ""
ok=0
failed=0

for testfile in $(find_tests)
do

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

		msg_info "[EXECUTING]   $testfile"
		test_output=$(IPTABLES=$IPTABLES ${testfile} 2>&1)
		rc_got=$?
		echo -en "\033[1A\033[K" # clean the [EXECUTING] foobar line

		if [ "$rc_got" == "$rc_spec" ] ; then
			msg_info "[OK]          $testfile"
			[ "$VERBOSE" == "y" ] && [ ! -z "$test_output" ] && echo "$test_output"
			((ok++))

		else
			((failed++))
			if [ "$VERBOSE" == "y" ] ; then
				msg_warn "[FAILED]      $testfile: expected $rc_spec but got $rc_got"
				[ ! -z "$test_output" ] && echo "$test_output"
			else
				msg_warn "[FAILED]      $testfile"
			fi
		fi

	done
done

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

kernel_cleanup
exit 0