12042edf3f75812e9c74e0cc9ec1f3cfb8f64fc2
[darkhttpd] / devel / run-tests
1 #!/bin/bash
2 #
3 # Build a coverage-enabled darkhttpd, run unit tests and calculate coverage.
4 #
5 cd $(dirname $0)
6 declare -r DIR=tmp.httpd.tests
7 declare -r PORT=12346
8 declare -r CC=gcc
9
10 if [ ! -e test.py ]; then
11         echo "fatal: can't find test.py. are you in the right directory?" >&2
12         exit 1
13 fi
14
15 runtests() {
16   if [ -e $DIR ]; then
17     rm -rf $DIR || exit 1
18   fi
19   mkdir $DIR || exit 1
20   mkdir $DIR/forbidden || exit 1
21   chmod 0 $DIR/forbidden || exit 1
22   mkdir $DIR/unreadable || exit 1
23   chmod 0100 $DIR/unreadable || exit 1
24   rm -f darkhttpd.gcda test.out.log test.out.stdout test.out.stderr
25
26   echo "===> run usage statement"
27   # Early exit if we can't even survive usage.
28   ./a.out >/dev/null 2>>test.out.stderr || exit 1
29
30   echo "===> run tests against a basic instance (generates darkhttpd.gcda)"
31   ./a.out $DIR --port $PORT --log test.out.log \
32     >>test.out.stdout 2>>test.out.stderr &
33   PID=$!
34   kill -0 $PID || exit 1
35   python test.py
36   kill $PID
37   wait $PID
38
39   echo "===> run --forward tests"
40   ./a.out $DIR --port $PORT \
41     --forward example.com http://www.example.com \
42     --forward secure.example.com https://www.example.com/secure \
43     >>test.out.stdout 2>>test.out.stderr &
44   PID=$!
45   kill -0 $PID || exit 1
46   python test_forward.py
47   kill $PID
48   wait $PID
49
50   echo "===> run --forward-all tests"
51   ./a.out $DIR --port $PORT \
52     --forward example.com http://www.example.com \
53     --forward-all http://catchall.example.com \
54     >>test.out.stdout 2>>test.out.stderr &
55   PID=$!
56   kill -0 $PID || exit 1
57   python test_forward_all.py
58   kill $PID
59   wait $PID
60
61   echo "===> run --no-server-id tests"
62   ./a.out $DIR --port $PORT --no-server-id \
63     >>test.out.stdout 2>>test.out.stderr &
64   PID=$!
65   kill -0 $PID || exit 1
66   python test_server_id.py
67   kill $PID
68   wait $PID
69
70   echo "===> run mimemap tests"
71   echo "test/type1 a1" > $DIR/mimemap
72   echo "test/this-gets-replaced  ap2" >> $DIR/mimemap
73   echo "# this is a comment" >> $DIR/mimemap
74   printf "test/type3\\tapp3\r\n" >> $DIR/mimemap
75   echo "test/type2  ap2" >> $DIR/mimemap
76   ./a.out $DIR --port $PORT \
77     --mimetypes $DIR/mimemap \
78     --default-mimetype test/default \
79     >>test.out.stdout 2>>test.out.stderr &
80   PID=$!
81   kill -0 $PID || exit 1
82   python test_mimemap.py
83   kill $PID
84   wait $PID
85
86   echo "===> run --no-listing tests"
87   ./a.out $DIR --port $PORT --no-listing \
88     >>test.out.stdout 2>>test.out.stderr &
89   PID=$!
90   kill -0 $PID || exit 1
91   python test_no_listing.py
92   kill $PID
93   wait $PID
94
95   if [[ -s test.out.stderr ]]; then
96     echo "FAIL: stderr should have been empty."
97     exit 1
98   fi
99 }
100
101 # --- main ---
102
103 # Unit test.
104 echo "===> test_make_safe_uri"
105 $CC -g -O2 -fsanitize=address -fsanitize=undefined \
106   test_make_safe_uri.c -o test_make_safe_uri || exit 1
107 if ./test_make_safe_uri | egrep '^FAIL:'; then
108   echo test_make_safe_uri failed >&2
109   exit 1
110 fi
111
112 # Check that the code builds with various defines.
113 echo "===> building without -DDEBUG"
114 $CC -O2 -Wall ../darkhttpd.c || exit 1
115 echo "===> building with -DNO_IPV6"
116 $CC -O2 -Wall -DNO_IPV6 ../darkhttpd.c || exit 1
117
118 # Do coverage and sanitizers.
119 # -fsanitize=undefined produces stderr.
120 # -fsanitize=address produces stderr and crashes.
121 # -fsanitize=memory produces stderr and crashes.
122
123 # msan first.
124 if [[ -z "$CLANG" ]]; then
125   CLANG=~/llvm/install/bin/clang
126 fi
127 if [[ ! -e "$CLANG" ]]; then
128   echo "***WARNING*** \$CLANG ($CLANG) doesn't exist."
129   echo "Skipping memory sanitizer. Try setting the env var."
130 else
131   echo "===> building a.out for msan"
132   $CLANG -g -O2 -fsanitize=memory -DDEBUG -DAPBUF_INIT=1 \
133     ../darkhttpd.c || exit 1
134   (runtests) || {
135     echo "FAILED! stderr was:"
136     echo "---"
137     cat test.out.stderr
138     echo "---"
139     exit 1
140   }
141 fi
142
143 # asan and coverage next.
144 echo "===> building a.out and darkhttpd.gcno for coverage + asan + ubsan"
145 $CC -g -O2 -fprofile-arcs -ftest-coverage -fsanitize=address \
146   -fsanitize=undefined -DDEBUG -DAPBUF_INIT=1 ../darkhttpd.c || exit 1
147 (runtests) || {
148   echo "FAILED! stderr was:"
149   echo "---"
150   cat test.out.stderr
151   echo "---"
152   exit 1
153 }
154 echo "===> generating report"
155 gcov darkhttpd
156 rm -rf $DIR
157 rm -f darkhttpd.gcda darkhttpd.gcno a.out
158 echo "===> PASSED!"
159 echo "===> read the report: less darkhttpd.c.gcov"