updated TODO
[strongswan.git] / testing / do-tests
1 #!/bin/bash
2 # Automatically execute the strongSwan test cases
3 #
4 # Copyright (C) 2004  Eric Marchionni, Patrik Rayo
5 # Zuercher Hochschule Winterthur
6 #
7 # This program is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by the
9 # Free Software Foundation; either version 2 of the License, or (at your
10 # option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
11 #
12 # This program is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 # for more details.
16 #
17 # RCSID $Id: do-tests,v 1.20 2006/02/08 21:27:59 as Exp $
18
19 DIR=`dirname $0`
20
21 source $DIR/scripts/function.sh
22
23 [ -f $DIR/testing.conf ] || die "Configuration file 'testing.conf' not found"
24 [ -d $DIR/hosts ] || die "Directory 'hosts' not found"
25 [ -d $DIR/tests ] || die "Directory 'tests' not found"
26
27 source $DIR/testing.conf
28
29
30 ##############################################################################
31 # test if UMLs have been built at all
32 #
33
34 [ -d $BUILDDIR ] || die "Directory '$BUILDDIR' does not exist. Please run 'make-testing'first."
35
36
37 ##############################################################################
38 # take care of new path and file variables
39 #
40
41 [ -d $TESTRESULTSDIR ] || mkdir $TESTRESULTSDIR
42
43 TESTDATE=`date +%Y%m%d-%H%M`
44
45 TODAYDIR=$TESTRESULTSDIR/$TESTDATE
46 mkdir $TODAYDIR
47 TESTRESULTSHTML=$TODAYDIR/index.html
48 ALLHTML=$TODAYDIR/all.html
49 DEFAULTTESTSDIR=$UMLTESTDIR/testing/tests
50
51 testnumber="0"
52 failed_cnt="0"
53 passed_cnt="0"
54
55
56 ##############################################################################
57 # copy default tests to $BUILDDIR
58 #
59
60 TESTSDIR=$BUILDDIR/tests
61 [ -d $TESTSDIR ] || mkdir $TESTSDIR
62
63 ##############################################################################
64 # assign IP for each host to hostname
65 #
66
67 for host in $STRONGSWANHOSTS
68 do
69     eval ipv4_${host}="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $1 }' | awk '{ print $1 }'`"
70     eval ipv6_${host}="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $1 }' | awk '{ print $1 }'`"
71
72     case $host in
73     moon)
74         eval ipv4_moon1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
75         eval ipv6_moon1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
76         ;;
77     sun)
78         eval ipv4_sun1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
79         eval ipv6_sun1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
80         ;;
81     alice)
82         ;;
83     venus)
84         ;;
85     bob)
86         ;;
87     carol)
88         eval ipv4_carol1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
89         eval ipv6_carol1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
90          ;;
91     dave)
92         eval ipv4_dave1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
93         eval ipv6_dave1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
94         ;;
95     winnetou)
96         ;;
97     esac
98 done
99
100
101 ##############################################################################
102 # create header for the results html file
103 #
104
105 KERNEL_VERSION=`basename $KERNEL .tar.bz2`
106 IPSEC_VERSION=`basename $STRONGSWAN .tar.bz2`
107
108 cat > $TESTRESULTSHTML <<@EOF
109 <html>
110 <head>
111   <title>strongSwan UML Testing</title>
112 </head>
113 <body>
114   <h2>strongSwan UML Testing</h2>
115   <table border="0" cellspacing="2">
116     <tr><td><b>Host:</b></td><td>`uname -a`</td></tr>
117     <tr><td><b>UML kernel: &nbsp;</b></td><td>$KERNEL_VERSION</td></tr>
118     <tr><td><b>IPsec:</b></td><td>$IPSEC_VERSION</td></tr>
119     <tr><td><b>Date:</b></td><td>$TESTDATE</td></tr>
120   </table>
121   <p>
122   <table border="0" width="500">
123     <thead align="left"><th>Number</th><th>Test</th><th>Result</th></thead>
124 @EOF
125
126 cat > $ALLHTML <<@EOF
127 <html>
128 <head>
129   <title>strongSwan UML Testing</title>
130 </head>
131 <body>
132   <h2>strongSwan UML Testing</h2>
133   <table border="0" cellspacing="2">
134     <tr><td><b>Host:</b></td><td>`uname -a`</td></tr>
135     <tr><td><b>UML kernel: &nbsp;</b></td><td>$KERNEL_VERSION</td></tr>
136     <tr><td><b>IPsec:</b></td><td>$IPSEC_VERSION</td></tr>
137     <tr><td><b>Date:</b></td><td>$TESTDATE</td></tr>
138     <tr><td colspan="2">&nbsp;</td></tr>
139 @EOF
140
141 cecho "UML kernel: $KERNEL_VERSION"
142 cecho "IPsec:      $IPSEC_VERSION"
143 cecho "Date:       $TESTDATE"
144 cecho ""
145
146
147 ##############################################################################
148 # enter specific test directory
149 #
150
151 if [ $# -gt 0 ]
152 then
153     TESTS=$*
154 elif [ $SELECTEDTESTSONLY = "yes" ]
155 then
156     # set internal field seperator
157     TESTS=$SELECTEDTESTS
158 else
159     # set internal field seperator
160     TESTS="`ls $DEFAULTTESTSDIR`"
161 fi
162
163 for SUBDIR in $TESTS
164 do
165     SUBTESTS="`basename $SUBDIR`"
166
167     if [ $SUBTESTS = $SUBDIR ]
168     then
169         SUBTESTS="`ls $DEFAULTTESTSDIR/$SUBDIR`"
170     else
171         SUBDIR="`dirname $SUBDIR`"
172     fi
173
174     if [ ! -d $TODAYDIR/$SUBDIR ]
175     then
176         mkdir $TODAYDIR/$SUBDIR
177         echo "<tr><td>&nbsp;</td><td><a href=\"$SUBDIR\">$SUBDIR</a></td>" >> $ALLHTML
178     fi
179
180     for name in $SUBTESTS
181     do
182         let "testnumber += 1"
183         testname=$SUBDIR/$name
184         cecho-n " $testnumber $testname.."
185
186         if [ ! -d $DEFAULTTESTSDIR/${testname} ]
187         then
188             cecho "is missing..skipped"
189             continue
190         fi
191
192         [ -f $DEFAULTTESTSDIR/${testname}/description.txt ] || die "!! File 'description.txt' is missing"
193         [ -f $DEFAULTTESTSDIR/${testname}/test.conf ]       || die "!! File 'test.conf' is missing"
194         [ -f $DEFAULTTESTSDIR/${testname}/pretest.dat ]     || die "!! File 'pretest.dat' is missing"
195         [ -f $DEFAULTTESTSDIR/${testname}/posttest.dat ]    || die "!! File 'posttest.dat' is missing"
196         [ -f $DEFAULTTESTSDIR/${testname}/evaltest.dat ]    || die "!! File 'evaltest.dat' is missing"
197
198         TESTRESULTDIR=$TODAYDIR/$testname
199         mkdir -p $TESTRESULTDIR
200         CONSOLE_LOG=$TESTRESULTDIR/console.log
201         touch $CONSOLE_LOG
202
203         TESTDIR=$TESTSDIR/${testname}
204         rm -rf $TESTDIR
205         mkdir -p $TESTDIR
206         cp -rfp $DEFAULTTESTSDIR/${testname}/* $TESTDIR
207
208
209         ##############################################################################
210         # replace IP wildcards with actual IPv4 and IPv6 addresses
211         #
212
213         for host in $STRONGSWANHOSTS
214         do
215             case $host in
216             moon)
217                 searchandreplace PH_IP_MOON1     $ipv4_moon1 $TESTDIR
218                 searchandreplace PH_IP_MOON      $ipv4_moon  $TESTDIR
219                 searchandreplace PH_IP6_MOON1    $ipv6_moon1 $TESTDIR
220                 searchandreplace PH_IP6_MOON     $ipv6_moon  $TESTDIR
221                 ;;
222             sun)
223                 searchandreplace PH_IP_SUN1      $ipv4_sun1 $TESTDIR
224                 searchandreplace PH_IP_SUN       $ipv4_sun  $TESTDIR
225                 searchandreplace PH_IP6_SUN1     $ipv6_sun1 $TESTDIR
226                 searchandreplace PH_IP6_SUN      $ipv6_sun  $TESTDIR
227                 ;;
228             alice)
229                 searchandreplace PH_IP_ALICE     $ipv4_alice $TESTDIR
230                 searchandreplace PH_IP6_ALICE    $ipv6_alice $TESTDIR
231                 ;;
232             venus)
233                 searchandreplace PH_IP_VENUS     $ipv4_venus $TESTDIR
234                 searchandreplace PH_IP6_VENUS    $ipv6_venus $TESTDIR
235                 ;;
236             bob)
237                 searchandreplace PH_IP_BOB       $ipv4_bob $TESTDIR
238                 searchandreplace PH_IPV6_BOB     $ipv6_bob $TESTDIR
239                 ;;
240             carol)
241                 searchandreplace PH_IP_CAROL1    $ipv4_carol1 $TESTDIR
242                 searchandreplace PH_IP_CAROL     $ipv4_carol  $TESTDIR
243                 searchandreplace PH_IP6_CAROL1   $ipv6_carol1 $TESTDIR
244                 searchandreplace PH_IP6_CAROL    $ipv6_carol  $TESTDIR
245                 ;;
246             dave)
247                 searchandreplace PH_IP_DAVE1     $ipv4_dave1 $TESTDIR
248                 searchandreplace PH_IP_DAVE      $ipv4_dave  $TESTDIR
249                 searchandreplace PH_IP6_DAVE1    $ipv6_dave1 $TESTDIR
250                 searchandreplace PH_IP6_DAVE     $ipv6_dave  $TESTDIR
251                 ;;
252             winnetou)
253                 searchandreplace PH_IP_WINNETOU  $ipv4_winnetou $TESTDIR
254                 searchandreplace PH_IP6_WINNETOU $ipv6_winnetou $TESTDIR
255                 ;;
256             esac
257         done
258
259
260         ##########################################################################
261         # copy test specific configurations to uml hosts and clear auth.log files
262         #
263
264         $DIR/scripts/load-testconfig $testname
265         source $TESTDIR/test.conf
266
267
268         ##########################################################################
269         # run tcpdump in the background
270         #
271
272         if [ "$TCPDUMPHOSTS" != "" ]
273         then
274             echo -e "TCPDUMP\n" >> $CONSOLE_LOG 2>&1
275
276             for host_iface in $TCPDUMPHOSTS
277             do
278                 host=`echo $host_iface | awk -F ":" '{print $1}'`
279                 iface=`echo $host_iface | awk -F ":" '{if ($2 != "") { print $2 } else { printf("eth0") }}'`
280                 tcpdump_cmd="tcpdump -i $iface not port ssh and not port domain and not arp > /tmp/tcpdump.log 2>&1 &"
281                 echo "${host}# $tcpdump_cmd" >> $CONSOLE_LOG
282                 ssh root@`eval echo \\\$ipv4_$host '$tcpdump_cmd'`
283                 eval TDUP_${host}="true"
284             done
285         fi
286
287
288         ##########################################################################
289         # execute pre-test commands
290         #
291
292         cecho-n "pre.."
293         echo -e "\nPRE-TEST\n" >> $CONSOLE_LOG 2>&1
294
295         eval `awk -F "::" '{
296             if ($2 != "")
297             {
298                 printf("echo \"%s# %s\"; ", $1, $2)
299                 printf("ssh root@\044ipv4_%s \"%s\"; ", $1, $2)
300                 printf("echo;\n")
301             }
302         }' $TESTDIR/pretest.dat` >> $CONSOLE_LOG 2>&1
303
304
305         ##########################################################################
306         # stop tcpdump
307         #
308
309         function stop_tcpdump {
310             echo "${1}# killall tcpdump" >> $CONSOLE_LOG
311             eval ssh root@\$ipv4_${1} killall tcpdump
312             eval TDUP_${1}="false"
313             echo ""
314         }
315
316
317         ##########################################################################
318         # get and evaluate test results
319         #
320
321         cecho-n "test.."
322         echo -e "\nTEST\n" >> $CONSOLE_LOG 2>&1
323
324         STATUS="passed"
325
326         eval `awk -F "::" '{
327             host=$1
328             command=$2
329             pattern=$3
330             hit=$4
331             if (command != "")
332             {
333                 if (command == "tcpdump")
334                 {
335                     printf("if [ \044TDUP_%s == \"true\" ]; then stop_tcpdump %s; fi; \n", host, host)
336                     printf("echo \"%s# cat /tmp/tcpdump.log | grep \047%s\047  [%s]\"; ", host, pattern, hit)
337                     printf("ssh root@\044ipv4_%s cat /tmp/tcpdump.log | grep \"%s\"; ", host, pattern)
338                 }
339                 else
340                 {
341                     printf("echo \"%s# %s | grep \047%s\047  [%s]\"; ", host, command, pattern, hit)
342                     printf("ssh root@\044ipv4_%s %s | grep \"%s\"; ",  host, command, pattern)
343                 }
344                 printf("cmd_exit=\044?; ")
345                 printf("echo; ")
346                 printf("if [ \044cmd_exit -eq 0 -a \"%s\" = \"NO\"  ] ", hit)
347                 printf("|| [ \044cmd_exit -ne 0 -a \"%s\" = \"YES\" ] ", hit)
348                 printf("; then STATUS=\"failed\"; fi; \n")
349             }
350         }' $TESTDIR/evaltest.dat` >> $CONSOLE_LOG 2>&1
351
352
353         ##########################################################################
354         # set counters
355         #
356
357         if [ $STATUS = "failed" ]
358         then
359             let "failed_cnt += 1"
360         else
361             let "passed_cnt += 1"
362         fi
363
364
365         ##########################################################################
366         # log statusall and listall output
367         # get copies of ipsec.conf, ipsec.secrets
368         # create index.html for the given test case
369
370         cat > $TESTRESULTDIR/index.html <<@EOF
371 <html>
372 <head>
373   <title>Test $testname</title>
374 </head>
375 <body>
376 <table border="0" width="600">
377   <tr><td>
378     <h2>Test $testname</h2>
379     <h3>Description</h3>
380 @EOF
381
382         cat $TESTDIR/description.txt >> $TESTRESULTDIR/index.html
383
384         cat >> $TESTRESULTDIR/index.html <<@EOF
385     <ul>
386       <li><a href="console.log">console.log</a></li>
387     </ul>
388     <img src="../../images/$DIAGRAM" alt="$UMLHOSTS">
389 @EOF
390
391         for host in $IPSECHOSTS
392         do
393             eval HOSTLOGIN=root@\$ipv4_${host}
394
395             for command in statusall listall
396             do
397                 ssh $HOSTLOGIN ipsec $command \
398                     > $TESTRESULTDIR/${host}.$command 2>/dev/null
399             done
400
401             for file in ipsec.conf ipsec.secrets
402             do
403                 scp $HOSTLOGIN:/etc/$file \
404                     $TESTRESULTDIR/${host}.$file  > /dev/null 2>&1
405             done
406
407             ssh $HOSTLOGIN ip route list \
408                     > $TESTRESULTDIR/${host}.iproute 2>/dev/null
409             ssh $HOSTLOGIN iptables -v -n -L \
410                     > $TESTRESULTDIR/${host}.iptables 2>/dev/null
411             cat >> $TESTRESULTDIR/index.html <<@EOF
412     <h3>$host</h3>
413       <table border="0" cellspacing="0" width="400">
414       <tr>
415         <td>
416           <ul>
417             <li><a href="$host.ipsec.conf">ipsec.conf</a></li>
418             <li><a href="$host.ipsec.secrets">ipsec.secrets</a></li>
419             <li><a href="$host.statusall">ipsec statusall</a></li>
420             <li><a href="$host.listall">ipsec listall</a></li>
421           </ul>
422         </td>
423         <td>
424           <ul>
425             <li><a href="$host.auth.log">auth.log</a></li>
426             <li><a href="$host.daemon.log">daemon.log</a></li>
427             <li><a href="$host.iproute">ip route list</a></li>
428             <li><a href="$host.iptables">iptables -L</a></li>
429         </ul>
430       </td>
431     </tr>
432     </table>
433 @EOF
434
435         done
436
437         cat >> $TESTRESULTDIR/index.html <<@EOF
438   </td></tr>
439   <tr><td align="right">
440     <b><a href="../index.html">Back</a></b>
441   </td></tr>
442 </table>
443 </body>
444 </html>
445 @EOF
446
447
448         ##########################################################################
449         # execute post-test commands
450         #
451
452         cecho-n "post.."
453         echo -e "\nPOST-TEST\n" >> $CONSOLE_LOG 2>&1
454
455         eval `awk -F "::" '{
456             if ($2 != "")
457             {
458                 printf("echo \"%s# %s\"; ", $1, $2)
459                 printf("ssh root@\044ipv4_%s \"%s\"; ", $1, $2)
460                 printf("echo;\n")
461             }
462         }' $TESTDIR/posttest.dat` >> $CONSOLE_LOG 2>&1
463
464
465         ##########################################################################
466         # get a copy of /var/log/auth.log
467         #
468
469         for host in $IPSECHOSTS
470         do
471             eval HOSTLOGIN=root@\$ipv4_${host}
472             ssh $HOSTLOGIN grep pluto /var/log/auth.log \
473                 > $TESTRESULTDIR/${host}.auth.log
474             echo >> $TESTRESULTDIR/${host}.auth.log
475             ssh $HOSTLOGIN grep charon /var/log/auth.log \
476                 >> $TESTRESULTDIR/${host}.auth.log
477         done
478
479
480         ##########################################################################
481         # get a copy of /var/log/daemon.log
482         #
483
484         for host in $IPSECHOSTS
485         do
486             eval HOSTLOGIN=root@\$ipv4_${host}
487             ssh $HOSTLOGIN grep pluto /var/log/daemon.log \
488                 > $TESTRESULTDIR/${host}.daemon.log
489             echo >> $TESTRESULTDIR/${host}.daemon.log
490             ssh $HOSTLOGIN grep charon /var/log/daemon.log \
491                 >> $TESTRESULTDIR/${host}.daemon.log
492         done
493
494
495         ##########################################################################
496         # stop tcpdump if necessary
497         #
498
499         for host in $TCPDUMPHOSTS
500         do
501             if [ "`eval echo \\\$TDUP_${host}`" = "true" ]
502             then
503                 echo "${host}# killall tcpdump" >> $CONSOLE_LOG
504                 eval ssh root@\$ipv4_$host killall tcpdump
505                 eval TDUP_${host}="false"
506             fi
507         done
508
509
510         ##########################################################################
511         # copy default host config back if necessary
512         #
513
514         $DIR/scripts/restore-defaults $testname
515
516
517         ##########################################################################
518         # write test status to html file
519         #
520
521         cecho "$STATUS"
522         if [ $STATUS = "passed" ]
523         then
524             COLOR="green"
525         else
526             COLOR="red"
527         fi
528
529         cat >> $TESTRESULTSHTML << @EOF
530   <tr>
531     <td>$testnumber</td>
532     <td><a href="$testname/">$testname</a></td>
533     <td><a href="$testname/console.log"><font color="$COLOR">$STATUS</font></a></td>
534   </tr>
535 @EOF
536
537     done
538 done
539
540
541 ##############################################################################
542 # finish the results html file
543 #
544
545 cat >> $TESTRESULTSHTML << @EOF
546   </table>
547   <p>
548   <b>Passed: &nbsp; $passed_cnt</b><br>
549   <b>Failed: &nbsp; $failed_cnt</b><br>
550   <p>
551 </body>
552 </html>
553 @EOF
554
555 cat >> $ALLHTML << @EOF
556   </table>
557 </body>
558 </html>
559 @EOF
560
561 cecho ""
562 cecho "Passed:   $passed_cnt"
563 cecho "Failed:   $failed_cnt"
564 cecho ""
565
566
567 ##############################################################################
568 # copy the test results to the apache server
569 #
570
571 HTDOCS="/var/www/localhost/htdocs"
572
573 cecho-n "Copying test results to winnetou.."
574 ssh root@${ipv4_winnetou} mkdir -p $HTDOCS/testresults > /dev/null 2>&1
575 scp -r $TODAYDIR root@${ipv4_winnetou}:$HTDOCS/testresults > /dev/null 2>&1
576 ssh root@${ipv4_winnetou} ln -s $HTDOCS/images $HTDOCS/testresults/$TESTDATE/images > /dev/null 2>&1
577 cecho "done"
578 cecho ""
579 cecho "The results are available in $TODAYDIR"
580 cecho "or via the link http://$ipv4_winnetou/testresults/$TESTDATE"