Don't use PCRE if we have GRegex.
[obnox/wireshark/wip.git] / test / suite-capture.sh
old mode 100644 (file)
new mode 100755 (executable)
index 1a107bd..4033cb8
@@ -19,9 +19,9 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
+# along with this program; if not, writeto the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-# 
+#
 
 
 # common exit status values
@@ -29,33 +29,90 @@ EXIT_OK=0
 EXIT_COMMAND_LINE=1
 EXIT_ERROR=2
 
+capture_test_output_print() {
+       wait
+       for f in "$@"; do
+               if [[ -f "$f" ]]; then
+               printf " --> $f\n"
+               cat "$f"
+                printf "\n"
+               fi
+       done
+}
+
+traffic_gen_ping() {
+       # Generate some traffic for quiet networks.
+       # This will have to be adjusted for non-Windows systems.
+       
+       # the following will run in the background and return immediately
+       {
+       date
+       for (( x=28; x<=58; x++ )) # in effect: number the packets
+       do
+               # How does ping _not_ have a standard set of arguments?
+               case $WS_SYSTEM in
+                       Windows)
+                               ping -n 1 -l $x www.wireshark.org       ;;
+                       SunOS)
+                               /usr/sbin/ping www.wireshark.org $x 1           ;;
+                       *) # *BSD, Linux
+                               ping -c 1 -s $x www.wireshark.org       ;;
+               esac
+               sleep 1
+       done
+       date
+       } > ./testout_ping.txt 2>&1 &
+}
+
+ping_cleanup() {
+       wait
+       rm -f ./testout_ping.txt
+}
 
 # capture exactly 10 packets
 capture_step_10packets() {
-       $DUT -i $TRAFFIC_CAPTURE_IFACE -w ./testout.pcap -c 10  -a duration:$TRAFFIC_CAPTURE_DURATION > ./testout.txt 2>&1
+       if [ $SKIP_CAPTURE -ne 0 ] ; then
+               test_step_skipped
+               return
+       fi
+
+       traffic_gen_ping
+
+       date > ./testout.txt
+       $DUT -i $TRAFFIC_CAPTURE_IFACE $TRAFFIC_CAPTURE_PROMISC \
+               -w ./testout.pcap \
+               -c 10  \
+               -a duration:$TRAFFIC_CAPTURE_DURATION \
+               -f icmp \
+               >> ./testout.txt 2>&1
        RETURNVALUE=$?
+       date >> ./testout.txt
        if [ ! $RETURNVALUE -eq $EXIT_OK ]; then
-               test_step_failed "exit status of $DUT: $RETURNVALUE"
+               echo
+               capture_test_output_print ./testout.txt
                # part of the Prerequisite checks
-               # probably wrong interface, output the possible interfaces
+               # wrong interface ? output the possible interfaces
                $TSHARK -D
+               test_step_failed "exit status of $DUT: $RETURNVALUE"
                return
        fi
 
        # we should have an output file now
        if [ ! -f "./testout.pcap" ]; then
+       capture_test_output ./testout.txt
                test_step_failed "No output file!"
                return
        fi
-       
+
        # ok, we got a capture file, does it contain exactly 10 packets?
-       $CAPINFOS ./testout.pcap > ./testout.txt
-       grep -i 'Number of packets: 10' ./testout.txt > /dev/null
+       $CAPINFOS ./testout.pcap > ./testout2.txt
+       grep -Ei 'Number of packets:[[:blank:]]+10' ./testout2.txt > /dev/null
        if [ $? -eq 0 ]; then
                test_step_ok
        else
                echo
-               cat ./testout.txt
+                $TSHARK -ta -r ./testout.pcap >> ./testout2.txt
+               capture_test_output_print ./testout_ping.txt ./testout.txt ./testout2.txt
                # part of the Prerequisite checks
                # probably wrong interface, output the possible interfaces
                $TSHARK -D
@@ -65,11 +122,27 @@ capture_step_10packets() {
 
 # capture exactly 10 packets using "-w -" (piping to stdout)
 capture_step_10packets_stdout() {
-       $DUT -i $TRAFFIC_CAPTURE_IFACE -c 10 -a duration:$TRAFFIC_CAPTURE_DURATION -w - > ./testout.pcap 2>./testout.txt
+        if [ $SKIP_CAPTURE -ne 0 ] ; then
+                test_step_skipped
+                return
+        fi
+
+       traffic_gen_ping
+
+       date > ./testout.txt
+       $DUT -i $TRAFFIC_CAPTURE_IFACE $TRAFFIC_CAPTURE_PROMISC \
+               -c 10 \
+               -a duration:$TRAFFIC_CAPTURE_DURATION \
+               -w - \
+               -f icmp \
+               > ./testout.pcap 2>>./testout.txt
        RETURNVALUE=$?
+       date >> ./testout.txt
        if [ ! $RETURNVALUE -eq $EXIT_OK ]; then
-               test_step_failed "exit status of $DUT: $RETURNVALUE"
+               echo
+               cat ./testout.txt
                $TSHARK -D
+               test_step_failed "exit status of $DUT: $RETURNVALUE"
                return
        fi
 
@@ -78,10 +151,10 @@ capture_step_10packets_stdout() {
                test_step_failed "No output file!"
                return
        fi
-       
+
        # ok, we got a capture file, does it contain exactly 10 packets?
        $CAPINFOS ./testout.pcap > ./testout2.txt 2>&1
-       grep -i 'Number of packets: 10' ./testout2.txt > /dev/null
+       grep -Ei 'Number of packets:[[:blank:]]+10' ./testout2.txt > /dev/null
        if [ $? -eq 0 ]; then
                test_step_ok
        else
@@ -93,15 +166,65 @@ capture_step_10packets_stdout() {
        fi
 }
 
+# capture packets via a fifo
+capture_step_fifo() {
+       mkfifo 'fifo'
+       (cat $CAPFILE; sleep 1; tail -c +25 $CAPFILE) > fifo &
+       $DUT -i fifo $TRAFFIC_CAPTURE_PROMISC \
+               -w ./testout.pcap \
+               -a duration:$TRAFFIC_CAPTURE_DURATION \
+               > ./testout.txt 2>&1
+       RETURNVALUE=$?
+       rm 'fifo'
+       if [ ! $RETURNVALUE -eq $EXIT_OK ]; then
+               test_step_failed "exit status of $DUT: $RETURNVALUE"
+               return
+       fi
+
+       # we should have an output file now
+       if [ ! -f "./testout.pcap" ]; then
+               test_step_failed "No output file!"
+               return
+       fi
+
+       # ok, we got a capture file, does it contain exactly 8 packets?
+       $CAPINFOS ./testout.pcap > ./testout.txt
+       grep -Ei 'Number of packets:[[:blank:]]+8' ./testout.txt > /dev/null
+       if [ $? -eq 0 ]; then
+               test_step_ok
+       else
+               echo
+               cat ./testout.txt
+               test_step_failed "No or not enough traffic captured."
+       fi
+}
+
 # capture exactly 2 times 10 packets (multiple files)
 capture_step_2multi_10packets() {
-       $DUT -i $TRAFFIC_CAPTURE_IFACE -w ./testout.pcap -c 10  -a duration:$TRAFFIC_CAPTURE_DURATION > ./testout.txt 2>&1
+        if [ $SKIP_CAPTURE -ne 0 ] ; then
+                test_step_skipped
+                return
+        fi
+
+       traffic_gen_ping
+
+       date > ./testout.txt
+       $DUT -i $TRAFFIC_CAPTURE_IFACE $TRAFFIC_CAPTURE_PROMISC \
+               -w ./testout.pcap \
+               -c 10 \
+               -a duration:$TRAFFIC_CAPTURE_DURATION \
+               -f icmp \
+               >> ./testout.txt 2>&1
+
        RETURNVALUE=$?
+       date >> ./testout.txt
        if [ ! $RETURNVALUE -eq $EXIT_OK ]; then
-               test_step_failed "exit status of $DUT: $RETURNVALUE"
+               echo
+               cat ./testout.txt
                # part of the Prerequisite checks
                # probably wrong interface, output the possible interfaces
                $TSHARK -D
+               test_step_failed "exit status of $DUT: $RETURNVALUE"
                return
        fi
 
@@ -110,10 +233,10 @@ capture_step_2multi_10packets() {
                test_step_failed "No output file!"
                return
        fi
-       
+
        # ok, we got a capture file, does it contain exactly 10 packets?
        $CAPINFOS ./testout.pcap > ./testout.txt
-       grep -i 'Number of packets: 10' ./testout.txt > /dev/null
+       grep -Ei 'Number of packets:[[:blank:]]+10' ./testout.txt > /dev/null
        if [ $? -eq 0 ]; then
                test_step_ok
        else
@@ -125,10 +248,30 @@ capture_step_2multi_10packets() {
 
 # capture with a very unlikely read filter, packets must be zero afterwards
 capture_step_read_filter() {
+        if [ $SKIP_CAPTURE -ne 0 ] ; then
+                test_step_skipped
+                return
+        fi
+
+       traffic_gen_ping
+
        # valid, but very unlikely filter
-       $DUT -i $TRAFFIC_CAPTURE_IFACE -w ./testout.pcap -a duration:$TRAFFIC_CAPTURE_DURATION -R 'dcerpc.cn_call_id==123456' -c 10 > ./testout.txt 2>&1
+       date > ./testout.txt
+       $DUT -i $TRAFFIC_CAPTURE_IFACE $TRAFFIC_CAPTURE_PROMISC \
+               -w ./testout.pcap \
+               -a duration:$TRAFFIC_CAPTURE_DURATION \
+               -R 'dcerpc.cn_call_id==123456' \
+               -c 10 \
+               -f icmp \
+               >> ./testout.txt 2>&1
        RETURNVALUE=$?
+       date >> ./testout.txt
        if [ ! $RETURNVALUE -eq $EXIT_OK ]; then
+               echo
+               cat ./testout.txt
+               # part of the Prerequisite checks
+               # wrong interface ? output the possible interfaces
+               $TSHARK -D
                test_step_failed "exit status: $RETURNVALUE"
                return
        fi
@@ -141,7 +284,7 @@ capture_step_read_filter() {
 
        # ok, we got a capture file, does it contain exactly 0 packets?
        $CAPINFOS ./testout.pcap > ./testout.txt
-       grep -i 'Number of packets: 0' ./testout.txt > /dev/null
+       grep -Ei 'Number of packets:[[:blank:]]+0' ./testout.txt > /dev/null
        if [ $? -eq 0 ]; then
                test_step_ok
        else
@@ -154,11 +297,30 @@ capture_step_read_filter() {
 
 # capture with a snapshot length
 capture_step_snapshot() {
+        if [ $SKIP_CAPTURE -ne 0 ] ; then
+                test_step_skipped
+                return
+        fi
+
+       traffic_gen_ping
+
        # capture with a snapshot length of 68 bytes for $TRAFFIC_CAPTURE_DURATION seconds
-       # this should result in no packets
-       $DUT -i $TRAFFIC_CAPTURE_IFACE -w ./testout.pcap -s 68 -a duration:$TRAFFIC_CAPTURE_DURATION > ./testout.txt 2>&1
+       # this should result in no packets greater than 68 bytes
+       date > ./testout.txt
+       $DUT -i $TRAFFIC_CAPTURE_IFACE $TRAFFIC_CAPTURE_PROMISC \
+               -w ./testout.pcap \
+               -s 68 \
+               -a duration:$TRAFFIC_CAPTURE_DURATION \
+               -f icmp \
+               >> ./testout.txt 2>&1
        RETURNVALUE=$?
+       date >> ./testout.txt
        if [ ! $RETURNVALUE -eq $EXIT_OK ]; then
+               echo
+               cat ./testout.txt
+               # part of the Prerequisite checks
+               # wrong interface ? output the possible interfaces
+               $TSHARK -D
                test_step_failed "exit status: $RETURNVALUE"
                return
        fi
@@ -174,7 +336,7 @@ capture_step_snapshot() {
 
        # ok, we got a capture file, does it contain exactly 0 packets?
        $CAPINFOS ./testout2.pcap > ./testout.txt
-       grep -i 'Number of packets: 0' ./testout.txt > /dev/null
+       grep -Ei 'Number of packets:[[:blank:]]+0' ./testout.txt > /dev/null
        if [ $? -eq 0 ]; then
                test_step_ok
        else
@@ -185,13 +347,13 @@ capture_step_snapshot() {
        fi
 }
 
-ethereal_capture_suite() {
+wireshark_capture_suite() {
        # Q: quit after cap, k: start capture immediately
        DUT="$WIRESHARK -Q -k"
        test_step_add "Capture 10 packets" capture_step_10packets
-       # piping to stdout doesn't work with Ethereal and capturing!
+       # piping to stdout doesn't work with Wireshark and capturing!
        #test_step_add "Capture 10 packets using stdout: -w -" capture_step_10packets_stdout
-       # read filter doesn't work with Ethereal and capturing!
+       # read filter doesn't work with Wireshark and capturing!
        #test_step_add "Capture read filter (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_read_filter
        test_step_add "Capture snapshot length 68 bytes (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_snapshot
 }
@@ -200,7 +362,11 @@ tshark_capture_suite() {
        DUT=$TSHARK
        test_step_add "Capture 10 packets" capture_step_10packets
        test_step_add "Capture 10 packets using stdout: -w -" capture_step_10packets_stdout
-       test_step_add "Capture read filter (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_read_filter
+       if [ $TEST_FIFO ]; then
+               test_step_add "Capture via fifo" capture_step_fifo
+       fi
+    # tshark now using dumpcap for capturing, read filters won't work by definition
+       #test_step_add "Capture read filter (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_read_filter
        test_step_add "Capture snapshot length 68 bytes (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_snapshot
 }
 
@@ -209,12 +375,16 @@ dumpcap_capture_suite() {
        DUT=$DUMPCAP
        test_step_add "Capture 10 packets" capture_step_10packets
        test_step_add "Capture 10 packets using stdout: -w -" capture_step_10packets_stdout
+       if [ $TEST_FIFO ]; then
+               test_step_add "Capture via fifo" capture_step_fifo
+       fi
        # read (display) filters intentionally doesn't work with dumpcap!
        #test_step_add "Capture read filter (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_read_filter
        test_step_add "Capture snapshot length 68 bytes (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_snapshot
 }
 
 capture_cleanup_step() {
+       ping_cleanup
        rm -f ./testout.txt
        rm -f ./testout2.txt
        rm -f ./testout.pcap
@@ -225,7 +395,7 @@ capture_suite() {
        test_step_set_pre capture_cleanup_step
        test_step_set_post capture_cleanup_step
        test_remark_add "Capture - need some traffic on interface: \"$TRAFFIC_CAPTURE_IFACE\""
-       test_suite_add "TShark capture" tshark_capture_suite
-       test_suite_add "Ethereal capture" ethereal_capture_suite
        test_suite_add "Dumpcap capture" dumpcap_capture_suite
+       test_suite_add "TShark capture" tshark_capture_suite
+       test_suite_add "Wireshark capture" wireshark_capture_suite
 }