Drop `defines', add `unaccount', rename `undefine'..
[s-mailx.git] / cc-test.sh
blob25656676dbaf1a9daee4f7f67f9b990ed9faccf7
1 #!/bin/sh -
2 #@ Usage: ./cc-test.sh [--check-only [s-nail-binary]]
4 SNAIL=./s-nail
5 CONF=./conf.rc
6 BODY=./.cc-body.txt
7 MBOX=./.cc-test.mbox
9 MAKE="${MAKE:-`command -v make`}"
10 awk=${awk:-`command -v awk`}
11 cat=${cat:-`command -v cat`}
12 # TODO cksum not fixated via mk-conf.sh, mk.mk should export variables!!
13 cksum=${cksum:-`command -v cksum`}
14 rm=${rm:-`command -v rm`}
15 sed=${sed:-`command -v sed`}
16 grep=${grep:-`command -v grep`}
18 ## -- >8 -- 8< -- ##
20 export SNAIL CONF BODY MBOX MAKE awk cat cksum rm sed grep
22 # NOTE! UnixWare 7.1.4 gives ISO-10646-Minimum-European-Subset for
23 # nl_langinfo(CODESET), then, so also overwrite ttycharset.
24 # (In addition this setup allows us to succeed on TinyCore 4.4 that has no
25 # other locales than C/POSIX installed by default!)
26 LC=en_US.UTF-8
27 LC_ALL=${LC} LANG=${LC}
28 ttycharset=UTF-8
29 export LC_ALL LANG ttycharset
31 ESTAT=0
33 usage() {
34 echo >&2 "Usage: ./cc-test.sh [--check-only [s-nail-binary]]"
35 exit 1
38 CHECK_ONLY=
39 [ ${#} -gt 0 ] && {
40 [ "${1}" = --check-only ] || usage
41 [ ${#} -gt 2 ] && usage
42 [ ${#} -eq 2 ] && SNAIL="${2}"
43 [ -x "${SNAIL}" ] || usage
44 CHECK_ONLY=1
47 # cc_all_configs()
48 # Test all configs TODO doesn't cover all *combinations*, stupid!
49 cc_all_configs() {
50 < ${CONF} ${awk} '
51 BEGIN {i = 0}
52 /^[[:space:]]*WANT_/ {
53 sub(/^[[:space:]]*/, "")
54 # This bails for UnixWare 7.1.4 awk(1), but preceeding = with \
55 # does not seem to be a compliant escape for =
56 #sub(/=.*$/, "")
57 $1 = substr($1, 1, index($1, "=") - 1)
58 if ($1 == "WANT_AUTOCC")
59 next
60 data[i++] = $1
62 END {
63 for (j = 0; j < i; ++j) {
64 for (k = 0; k < j; ++k)
65 printf data[k] "=1 "
66 for (k = j; k < i; ++k)
67 printf data[k] "=0 "
68 printf "WANT_AUTOCC=1\n"
69 printf "\n"
71 for (k = 0; k < j; ++k)
72 printf data[k] "=0 "
73 for (k = j; k < i; ++k)
74 printf data[k] "=1 "
75 printf "WANT_AUTOCC=1\n"
76 printf "\n"
79 ' | while read c; do
80 printf "\n\n##########\n$c\n"
81 printf "\n\n##########\n$c\n" >&2
82 sh -c "${MAKE} ${c}"
83 t_all
84 ${MAKE} distclean
85 done
88 # cksum_test()
89 # Read mailbox $2, strip non-constant headers and MIME boundaries, query the
90 # cksum(1) of the resulting data and compare against the checksum $3
91 cksum_test() {
92 tid=$1 f=$2 s=$3
93 printf "${tid}: "
94 csum="`${sed} -e '/^From /d' -e '/^Date: /d' \
95 -e '/^ boundary=/d' -e '/^--=_/d' < \"${f}\" \
96 -e '/^\[-- Message/d' | ${cksum}`";
97 if [ "${csum}" = "${s}" ]; then
98 printf 'ok\n'
99 else
100 ESTAT=1
101 printf 'error: checksum mismatch (got %s)\n' "${csum}"
105 # t_behave()
106 # Basic (easily testable) behaviour tests
107 t_behave() {
108 # Test for [d1f1a19]
109 ${rm} -f "${MBOX}"
110 printf 'echo +nix\nset folder=/\necho +nix\nset nofolder\necho +nix\nx' |
111 MAILRC=/dev/null "${SNAIL}" -n -# -SPAGER="${cat}" > "${MBOX}"
112 cksum_test behave:1 "${MBOX}" '4214021069 15'
114 # POSIX: setting *noprompt*/prompt='' shall prevent prompting TODO
115 # TODO for this to be testable we need a way to echo a variable
116 # TODO or to force echo of the prompt
118 __behave_ifelse
120 FEAT=`printf 'feat\n' | MAILRC=/dev/null "${SNAIL}" -n -#`
121 if { i=${FEAT}; echo "${i}"; } | ${grep} -q DEBUG &&
122 { i=${FEAT}; echo "${i}"; } | ${grep} -q 'SSL/TLS' &&
123 { i=${FEAT}; echo "${i}"; } | ${grep} -q 'S/MIME'; then
124 __behave_smime
128 __behave_ifelse() {
129 # Nestable conditions test
130 ${rm} -f "${MBOX}"
131 cat <<- '__EOT' | MAILRC=/dev/null "${SNAIL}" -n -# > "${MBOX}"
132 if 0
133 echo 1.err
134 else
135 echo 1.ok
136 endif
137 if 1
138 echo 2.ok
139 else
140 echo 2.err
141 endif
142 if $dietcurd
143 echo 3.err
144 else
145 echo 3.ok
146 endif
147 set dietcurd=yoho
148 if $dietcurd
149 echo 4.ok
150 else
151 echo 4.err
152 endif
153 if $dietcurd == 'yoho'
154 echo 5.ok
155 else
156 echo 5.err
157 endif
158 if $dietcurd != 'yoho'
159 echo 6.err
160 else
161 echo 6.ok
162 endif
163 # Nesting
164 if 0
165 echo 7.err1
166 if 1
167 echo 7.err2
168 if 1
169 echo 7.err3
170 else
171 echo 7.err4
172 endif
173 echo 7.err5
174 endif
175 echo 7.err6
176 else
177 echo 7.ok7
178 if 1
179 echo 7.ok8
180 if 0
181 echo 7.err9
182 else
183 echo 7.ok9
184 endif
185 echo 7.ok10
186 else
187 echo 7.err11
188 if 1
189 echo 7.err12
190 else
191 echo 7.err13
192 endif
193 endif
194 echo 7.ok14
195 endif
196 if r
197 echo 8.ok1
198 if R
199 echo 8.ok2
200 else
201 echo 8.err2
202 endif
203 echo 8.ok3
204 else
205 echo 8.err1
206 endif
207 if s
208 echo 9.err1
209 else
210 echo 9.ok1
211 if S
212 echo 9.err2
213 else
214 echo 9.ok2
215 endif
216 echo 9.ok3
217 endif
218 __EOT
219 cksum_test behave:2 "${MBOX}" '1909382116 98'
222 __behave_smime() { # FIXME add test/ dir, unroll tests therein, regular enable!
223 echo WARNING: behave_smime is yet debug only and not generalized
224 printf 'behave:s/mime: .. generating test key and certificate ..\n'
225 cat <<-_EOT > t.conf
226 [ req ]
227 default_bits = 1024
228 default_keyfile = keyfile.pem
229 distinguished_name = req_distinguished_name
230 attributes = req_attributes
231 prompt = no
232 output_password =
234 [ req_distinguished_name ]
235 C = GB
236 ST = Over the
237 L = rainbow
238 O = S-nail
239 OU = S-nail.smime
240 CN = S-nail.test
241 emailAddress = test@localhost
243 [ req_attributes ]
244 challengePassword =
245 _EOT
246 openssl req -x509 -nodes -days 3650 -config t.conf \
247 -newkey rsa:1024 -keyout tkey.pem -out tcert.pem >/dev/null 2>&1
248 rm -f t.conf
249 cat tkey.pem tcert.pem > tpair.pem
251 printf "behave:s/mime:sign/verify: "
252 echo bla |
253 MAILRC=/dev/null ./s-nail -n# \
254 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
255 -Ssmime-sign -Sfrom=test@localhost \
256 -s 'S/MIME test' ./VERIFY
257 # TODO CHECK
258 printf 'verify\nx\n' |
259 MAILRC=/dev/null ./s-nail -n# \
260 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
261 -Ssmime-sign -Sfrom=test@localhost \
262 -Sbatch-exit-on-error -R \
263 -f ./VERIFY >/dev/null 2>&1
264 if [ $? -eq 0 ]; then
265 printf 'ok\n'
266 else
267 ESTAT=1
268 printf 'error: verification failed\n'
269 rm -f ./VERIFY tkey.pem tcert.pem tpair.pem
270 return
272 rm -rf ./VERIFY
274 printf "behave:s/mime:encrypt/decrypt: "
275 cat <<-_EOT > tsendmail.sh
276 #!/bin/sh -
277 (echo 'From S-Postman Thu May 10 20:40:54 2012' && cat) > ./ENCRYPT
278 _EOT
279 chmod 0755 tsendmail.sh
281 echo bla |
282 MAILRC=/dev/null ./s-nail -n# \
283 -Ssmime-force-encryption \
284 -Ssmime-encrypt-recei@ver.com=tpair.pem \
285 -Ssendmail=./tsendmail.sh \
286 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
287 -Ssmime-sign -Sfrom=test@localhost \
288 -s 'S/MIME test' recei@ver.com
289 # TODO CHECK
290 printf 'decrypt ./DECRYPT\nfi ./DECRYPT\nverify\nx\n' |
291 MAILRC=/dev/null ./s-nail -n# \
292 -Ssmime-force-encryption \
293 -Ssmime-encrypt-recei@ver.com=tpair.pem \
294 -Ssendmail=./tsendmail.sh \
295 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
296 -Ssmime-sign -Sfrom=test@localhost \
297 -Sbatch-exit-on-error -R \
298 -f ./ENCRYPT >/dev/null 2>&1
299 if [ $? -eq 0 ]; then
300 printf 'ok\n'
301 else
302 ESTAT=1
303 printf 'error: decryption+verification failed\n'
305 rm -f ./tsendmail.sh ./ENCRYPT ./DECRYPT tkey.pem tcert.pem tpair.pem
308 # t_content()
309 # Some basic tests regarding correct sending of mails, via STDIN / -t / -q,
310 # including basic MIME Content-Transfer-Encoding correctness (quoted-printable)
311 # Note we unfortunately need to place some statements without proper
312 # indentation because of continuation problems
313 t_content() {
314 ${rm} -f "${BODY}" "${MBOX}"
316 # MIME CTE (QP) stress message body
317 printf \
318 'Ich bin eine DÖS-Datäi mit sehr langen Zeilen und auch '\
319 'sonst bin ich ganz schön am Schleudern, da kannste denke '\
320 "wasde willst, gelle, gelle, gelle, gelle, gelle.\r\n"\
321 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst \r\n"\
322 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1\r\n"\
323 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12\r\n"\
324 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123\r\n"\
325 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234\r\n"\
326 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345\r\n"\
327 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456\r\n"\
328 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234567\r\n"\
329 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345678\r\n"\
330 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456789\r\n"\
331 "Unn ausserdem habe ich trailing SP/HT/SP/HT whitespace \r\n"\
332 "Unn ausserdem habe ich trailing HT/SP/HT/SP whitespace \r\n"\
333 "auf den zeilen vorher.\r\n"\
334 "From am Zeilenbeginn und From der Mitte gibt es auch.\r\n"\
335 ".\r\n"\
336 "Die letzte Zeile war nur ein Punkt.\r\n"\
337 "..\r\n"\
338 "Das waren deren zwei.\r\n"\
339 " \r\n"\
340 "Die letzte Zeile war ein Leerschritt.\n"\
341 "=VIER = EQUAL SIGNS=ON A LINE=\r\n"\
342 "Prösterchen.\r\n"\
343 ".\n"\
344 "Die letzte Zeile war nur ein Punkt, mit Unix Zeilenende.\n"\
345 "..\n"\
346 "Das waren deren zwei. ditto.\n"\
347 "Prösterchen.\n"\
348 "Unn ausseerdem habe ich trailing SP/HT/SP/HT whitespace \n"\
349 "Unn ausseerdem habe ich trailing HT/SP/HT/SP whitespace \n"\
350 "auf den zeilen vorher.\n"\
351 "ditto.\n"\
352 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.\n"\
353 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.1"\
354 "\n"\
355 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
356 "\n"\
357 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
358 "3\n"\
359 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
360 "34\n"\
361 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
362 "345\n"\
363 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
364 "3456\n"\
365 "=VIER = EQUAL SIGNS=ON A LINE=\n"\
366 " \n"\
367 "Die letzte Zeile war ein Leerschritt.\n"\
368 ' '\
369 > "${BODY}"
371 # MIME CTE (QP) stress message subject
372 SUB='Äbrä Kä?dä=brö Fü?di=bus? '\
373 'adadaddsssssssddddddddddddddddddddd'\
374 'ddddddddddddddddddddddddddddddddddd'\
375 'ddddddddddddddddddddddddddddddddddd'\
376 'dddddddddddddddddddd Hallelulja? Od'\
377 'er?? eeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\
378 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\
379 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f'\
380 'fffffffffffffffffffffffffffffffffff'\
381 'fffffffffffffffffffff ggggggggggggg'\
382 'ggggggggggggggggggggggggggggggggggg'\
383 'ggggggggggggggggggggggggggggggggggg'\
384 'ggggggggggggggggggggggggggggggggggg'\
385 'gggggggggggggggg'
387 # Three tests for MIME-CTE and (a bit) content classification.
388 # At the same time testing -q FILE, < FILE and -t FILE
389 ${rm} -f "${MBOX}"
390 < "${BODY}" MAILRC=/dev/null \
391 "${SNAIL}" -nSstealthmua -a "${BODY}" -s "${SUB}" "${MBOX}"
392 cksum_test content:1 "${MBOX}" '2606934084 5649'
394 ${rm} -f "${MBOX}"
395 < /dev/null MAILRC=/dev/null \
396 "${SNAIL}" -n#Sstealthmua -a "${BODY}" -s "${SUB}" \
397 -q "${BODY}" "${MBOX}"
398 cksum_test content:2 "${MBOX}" '2606934084 5649'
400 ${rm} -f "${MBOX}"
401 ( echo "To: ${MBOX}" && echo "Subject: ${SUB}" && echo &&
402 ${cat} "${BODY}"
403 ) | MAILRC=/dev/null "${SNAIL}" -nSstealthmua -a "${BODY}" -t
404 cksum_test content:3 "${MBOX}" '799758423 5648'
406 # Test for [260e19d] (Juergen Daubert)
407 ${rm} -f "${MBOX}"
408 echo body | MAILRC=/dev/null "${SNAIL}" -n#Sstealthmua "${MBOX}"
409 cksum_test content:4 "${MBOX}" '506144051 104'
411 # Sending of multiple mails in a single invocation
412 ${rm} -f "${MBOX}"
413 ( printf "m ${MBOX}\n~s subject1\nE-Mail Körper 1\n.\n" &&
414 printf "m ${MBOX}\n~s subject2\nEmail body 2\n.\n" &&
415 echo x
416 ) | MAILRC=/dev/null "${SNAIL}" -n#Sstealthmua
417 cksum_test content:5 "${MBOX}" '2028749685 277'
419 ## $BODY CHANGED
421 # "Test for" [d6f316a] (Gavin Troy)
422 ${rm} -f "${MBOX}"
423 printf "m ${MBOX}\n~s subject1\nEmail body\n.\nfi ${MBOX}\np\nx\n" |
424 MAILRC=/dev/null "${SNAIL}" -n#Sstealthmua \
425 -SPAGER="${cat}" -Spipe-text/plain="${cat}" > "${BODY}"
426 ${sed} -e 1d < "${BODY}" > "${MBOX}"
427 cksum_test content:6 "${MBOX}" '1520300594 138'
429 ${rm} -f "${BODY}" "${MBOX}"
432 t_all() {
433 t_behave
434 t_content
437 if [ -z "${CHECK_ONLY}" ]; then
438 cc_all_configs
439 else
440 t_all
443 [ ${ESTAT} -eq 0 ] && echo Ok || echo >&2 'Errors occurred'
445 exit ${ESTAT}
446 # vim:set fenc=utf8:s-it-mode