tests.sh - sfeed_tests - sfeed tests and RSS and Atom files | |
git clone git://git.codemadness.org/sfeed_tests | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tests.sh (11329B) | |
--- | |
1 #!/bin/sh | |
2 # script for running tests/coverage/etc. Tuned for my system. | |
3 | |
4 #sfeed="bins/sfeed_gcc_O2_1.0" | |
5 | |
6 # installed version | |
7 #sfeed="sfeed" | |
8 | |
9 # dev version | |
10 sfeed="$HOME/p/sfeed/sfeed" | |
11 | |
12 # dev version (profiled coverage). | |
13 #sfeed="$HOME/p/sfeed/sfeed" | |
14 | |
15 #program1="bins/sfeed_gcc_O2_0.9.10" | |
16 #program1="bins/sfeed_gcc_O2_1.0" | |
17 program1="bins/sfeed_gcc_O2_2.0" | |
18 #program1="sfeed" | |
19 program2="$HOME/p/sfeed/sfeed" | |
20 | |
21 # force non-builtin printf, requires support for non-POSIX \x. | |
22 alias printf='/bin/printf' | |
23 | |
24 # fixup: expand to same amount of fields, if fields are added (TABS). | |
25 # this is useful if the format changes and fields are added. | |
26 fixup() { | |
27 awk ' | |
28 BEGIN { OFS = FS = "\t"; } | |
29 { | |
30 for (i = 1; i <= 8; i++) { | |
31 if (i > 1) | |
32 printf("\t"); | |
33 printf("%s", $i); | |
34 } | |
35 printf("\n"); | |
36 }' | |
37 } | |
38 | |
39 record_sfeed() { | |
40 $sfeed < "$1" | fixup > "$2" | |
41 } | |
42 | |
43 # run all tests, record and store all results as expected output. | |
44 record() { | |
45 count=0 | |
46 for t in input/*/; do | |
47 for d in "$t"*/; do | |
48 for f in "$d"*; do | |
49 test -f "$f" || continue | |
50 | |
51 dest="expected/${f#input/}" | |
52 mkdir -p "$(dirname "$dest")" | |
53 record_sfeed "$f" "$dest" | |
54 count=$((count+1)) | |
55 done | |
56 done | |
57 done | |
58 echo "$count results recorded." | |
59 } | |
60 | |
61 # show all results. | |
62 show() { | |
63 for t in input/*/; do | |
64 for d in "$t"*/; do | |
65 for f in "$d"*.xml; do | |
66 test -f "$f" || continue | |
67 dest="expected/${f#input/}" | |
68 test -f "$dest" || continue | |
69 | |
70 $sfeed < "$f" | fixup > /tmp/t | |
71 | |
72 echo "Input XML:" | |
73 cat "$f" | |
74 echo "" | |
75 echo "Expected ($dest):" | |
76 cat "$dest" | |
77 echo "" | |
78 echo "Result:" | |
79 cat /tmp/t | |
80 echo "" | |
81 echo "Diff:" | |
82 diff -u "$dest" /tmp/t | |
83 done | |
84 done | |
85 done | |
86 } | |
87 | |
88 # run and show only if the expected result differs. | |
89 run() { | |
90 status=0 | |
91 count=0 | |
92 for t in input/*/; do | |
93 for d in "$t"*/; do | |
94 for f in "$d"*.xml; do | |
95 test -f "$f" || continue | |
96 dest="expected/${f#input/}" | |
97 test -f "$dest" || continue | |
98 | |
99 $sfeed < "$f" | fixup > /tmp/t | |
100 if ! cmp -s "$dest" /tmp/t; then | |
101 status=1 | |
102 echo "" | |
103 echo "$f differs" | |
104 echo "Input XML:" | |
105 cat "$f" | |
106 echo "" | |
107 echo "Expected ($dest):" | |
108 cat "$dest" | |
109 echo "" | |
110 echo "Result:" | |
111 cat /tmp/t | |
112 echo "" | |
113 echo "Diff:" | |
114 diff -u "$dest" /tmp/t | |
115 fi | |
116 count=$((count+1)) | |
117 done | |
118 done | |
119 done | |
120 echo "$count results run." | |
121 exit $status | |
122 } | |
123 | |
124 # run and compare with program versions (don't compare to recorded expec… | |
125 run2() { | |
126 status=0 | |
127 count=0 | |
128 baseurl="" | |
129 # baseurl="incorrect" | |
130 # baseurl="https://codemadness.org/" # TEST baseurl | |
131 | |
132 # for param in "" "http://a/" "https://a/" "gopher://a/" "http://… | |
133 for t in input/*/; do | |
134 for d in "$t"*/; do | |
135 for f in "$d"*.xml; do | |
136 test -f "$f" || continue | |
137 | |
138 $program1 $baseurl < "$f" | fixup > /tmp… | |
139 $program2 $baseurl < "$f" | fixup > /tmp… | |
140 if ! cmp -s /tmp/t1 /tmp/t2; then | |
141 status=1 | |
142 echo "" | |
143 echo "$f differs" | |
144 echo "Input XML:" | |
145 cat "$f" | |
146 echo "" | |
147 echo "Expected:" | |
148 cat /tmp/t1 | |
149 echo "" | |
150 echo "Result:" | |
151 cat /tmp/t2 | |
152 echo "" | |
153 echo "Diff:" | |
154 diff -u /tmp/t1 /tmp/t2 | |
155 fi | |
156 count=$((count+1)) | |
157 done | |
158 done | |
159 done | |
160 echo "$count results run." | |
161 exit $status | |
162 } | |
163 | |
164 # run program on input for code coverage purposes. | |
165 # contains some specific tests (passing parameters, etc). | |
166 coverage() { | |
167 testprogram="$HOME/p/sfeed/sfeed" | |
168 | |
169 for baseurl in "" "https://codemadness.org/"; do | |
170 for t in input/*/; do | |
171 for d in "$t"*/; do | |
172 for f in "$d"*.xml; do | |
173 test -f "$f" || continue | |
174 | |
175 $testprogram $baseurl < "$f" >/dev/null … | |
176 done | |
177 done | |
178 done | |
179 done | |
180 | |
181 # some very specific-tests. | |
182 echo "" | $testprogram "" >/dev/null 2>/dev/null | |
183 echo "" | $testprogram "http://127.0.0.1:-1" >/dev/null 2>/dev/n… | |
184 echo "" | $testprogram "http://127.0.0.1:65536" >/dev/null 2>/de… | |
185 echo "" | $testprogram "http://127.0.0.1:12345678" >/dev/null 2>… | |
186 echo "" | $testprogram "http://[" >/dev/null 2>/dev/null | |
187 echo "" | $testprogram "http://[]" >/dev/null 2>/dev/null | |
188 echo "" | $testprogram "codemadness.org" >/dev/null 2>/dev/null | |
189 echo "" | $testprogram "https://codemadness.org" >/dev/null 2>/d… | |
190 echo "" | $testprogram "ftp://user:password@[2001:db8::7]:2121/r… | |
191 echo "" | $testprogram "mailto:[email protected]" >/dev/null… | |
192 | |
193 # too long URI fields. | |
194 nottoolong="0123456790123456790123456790123456790123456790123456… | |
195 long="0123456790123456790123456790123456790123456790123456790123… | |
196 echo "" | $testprogram "http://host/$long" >/dev/null 2>/dev/null | |
197 echo "" | $testprogram "http://host/?$long" >/dev/null 2>/dev/nu… | |
198 echo "" | $testprogram "http://host/#$long" >/dev/null 2>/dev/nu… | |
199 echo "" | $testprogram "mailto0123456790123456790123456790123456… | |
200 echo "" | $testprogram "http://012345679012345679012345679012345… | |
201 echo "" | $testprogram "http://[01234567901234567901234567901234… | |
202 | |
203 # truncation of path: prints original string. | |
204 echo "<item><link>$nottoolong</link></item>" | $testprogram "htt… | |
205 echo "<item><link>$long</link></item>" | $testprogram "http://ho… | |
206 echo "<item><link>$nottoolong</link></item>" | $testprogram "htt… | |
207 echo "<item><link>$nottoolong</link></item>" | $testprogram "htt… | |
208 echo "<item><link>$nottoolong</link></item>" | $testprogram "htt… | |
209 | |
210 cd "$HOME/p/sfeed" | |
211 # test empty relative path with absolute URI (sfeed doesn't proc… | |
212 printf '<link type="application/xml" href="" >' | ./sfeed_web 'h… | |
213 # HTML | |
214 ./sfeed_html nonexistant 2> /dev/null >/dev/null | |
215 printf '0\tsome title<&"%s>\n' "'" | ./sfeed_html > /dev/null | |
216 printf '0\ta\n' | ./sfeed_html > /dev/null | |
217 printf '0\ta\n' | ./sfeed_html /dev/stdin > /dev/null | |
218 printf '20000000000\ta\n' | ./sfeed_html 2> /dev/null >/dev/null… | |
219 printf '0\ta\thttp://codemadness.org\n' | ./sfeed_html 2> /dev/n… | |
220 printf '\ta\thttp://codemadness.org\n' | ./sfeed_html 2> /dev/nu… | |
221 printf '20000000000\ta\thttp://codemadness.org\n' | ./sfeed_html… | |
222 printf '20000000000\ta\thttp://codemadness.org\n' | ./sfeed_html… | |
223 | |
224 # plain | |
225 ./sfeed_plain nonexistant 2> /dev/null | |
226 # invalid timestamp and line with less fields. | |
227 printf 'invalid\ta\n' | ./sfeed_plain > /dev/null | |
228 printf 'invalid\ta\n' | ./sfeed_plain /dev/stdin > /dev/null | |
229 printf '20000000000\ta\n' | ./sfeed_plain > /dev/null # marked a… | |
230 # sfeed_plain: test padding | |
231 printf '0\t' | ./sfeed_plain > /dev/null | |
232 printf '0\t\x07' | ./sfeed_plain > /dev/null | |
233 printf '0\t\x09' | ./sfeed_plain > /dev/null | |
234 printf '0\t\xc3\xc3\xc3' | ./sfeed_plain > /dev/null | |
235 printf '0\t\xef\xbf\xba' | ./sfeed_plain > /dev/null | |
236 printf '0\t\xef\xbf\xba\xef\xbf\xba' | ./sfeed_plain > /dev/null | |
237 | |
238 printf '0\t00000000001111111111222222222233333333334444444444555… | |
239 printf '0\t00000000001111111111222222222233333333334444444444555… | |
240 printf '0\t00000000001111111111222222222233333333334444444444555… | |
241 printf '0\t00000000001111111111222222222233333333334444444444555… | |
242 printf '0\t00000000001111111111222222222233333333334444444444555… | |
243 printf '0\t00000000001111111111222222222233333333334444444444555… | |
244 printf '0\t00000000001111111111222222222233333333334444444444555… | |
245 printf '0\t00000000001111111111222222222233333333334444444444555… | |
246 printf '0\t00000000001111111111222222222233333333334444444444555… | |
247 | |
248 # test overflow checks (compiled with MAX_MEM=409600). | |
249 (echo "<entry><content>" | |
250 i=0 | |
251 while :; do | |
252 test $i = 52428 && break | |
253 echo "AAAAAAAAAA'" | |
254 i=$((i+1)) | |
255 done | |
256 echo "</content></entry>") | $testprogram >/dev/null 2>/dev/null | |
257 | |
258 # generate gcov coverage files. | |
259 for f in sfeed.c sfeed_html.c sfeed_plain.c util.c xml.c; do | |
260 gcov "$f" >/dev/null | |
261 done | |
262 | |
263 # coverage statistics. | |
264 for f in sfeed.c util.c xml.c sfeed_plain.c sfeed_html.c; do | |
265 awk ' | |
266 { | |
267 total++; | |
268 } | |
269 /^ #####:/ { | |
270 uncov++; | |
271 } | |
272 END { | |
273 cov = total - uncov; | |
274 | |
275 printf("%s: %d of %d lines covered, %.2f%%\n", | |
276 FILENAME, | |
277 cov, total, | |
278 ((cov / total) * 100.0)); | |
279 } | |
280 ' "$f.gcov" | |
281 done | |
282 } | |
283 | |
284 case "$1" in | |
285 "coverage"|"record"|"run"|"run2"|"show") | |
286 $1;; | |
287 "") | |
288 run;; | |
289 *) | |
290 echo "$0 <coverage|record|run|run2|show>" >&2 | |
291 exit 1;; | |
292 esac |