nail.1: remove that folder-loss paragraph again; too rude
[s-mailx.git] / cc-test.sh
blob68924c46ef79ae513c6b0d566e9f73c0a729897a
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}\" | ${cksum}`";
96 if [ "${csum}" = "${s}" ]; then
97 printf 'ok\n'
98 else
99 ESTAT=1
100 printf 'error: checksum mismatch (got %s)\n' "${csum}"
104 # t_behave()
105 # Basic (easily testable) behaviour tests
106 t_behave() {
107 # Test for [d1f1a19]
108 ${rm} -f "${MBOX}"
109 printf 'echo +nix\nset folder=/\necho +nix\nset nofolder\necho +nix\nx' |
110 MAILRC=/dev/null "${SNAIL}" -n -# -SPAGER="${cat}" > "${MBOX}"
111 cksum_test behave:1 "${MBOX}" '4214021069 15'
113 # POSIX: setting *noprompt*/prompt='' shall prevent prompting TODO
114 # TODO for this to be testable we need a way to echo a variable
115 # TODO or to force echo of the prompt
117 __behave_ifelse
119 FEAT=`printf 'feat\n' | MAILRC=/dev/null "${SNAIL}" -n -#`
120 if { i=${FEAT}; echo "${i}"; } | ${grep} -q DEBUG &&
121 { i=${FEAT}; echo "${i}"; } | ${grep} -q 'SSL/TLS' &&
122 { i=${FEAT}; echo "${i}"; } | ${grep} -q 'S/MIME'; then
123 __behave_smime
127 __behave_ifelse() {
128 # Nestable conditions test
129 ${rm} -f "${MBOX}"
130 cat <<- '__EOT' | MAILRC=/dev/null "${SNAIL}" -n -# > "${MBOX}"
131 if 0
132 echo 1.err
133 else
134 echo 1.ok
135 endif
136 if 1
137 echo 2.ok
138 else
139 echo 2.err
140 endif
141 if $dietcurd
142 echo 3.err
143 else
144 echo 3.ok
145 endif
146 set dietcurd=yoho
147 if $dietcurd
148 echo 4.ok
149 else
150 echo 4.err
151 endif
152 if $dietcurd == 'yoho'
153 echo 5.ok
154 else
155 echo 5.err
156 endif
157 if $dietcurd != 'yoho'
158 echo 6.err
159 else
160 echo 6.ok
161 endif
162 # Nesting
163 if 0
164 echo 7.err1
165 if 1
166 echo 7.err2
167 if 1
168 echo 7.err3
169 else
170 echo 7.err4
171 endif
172 echo 7.err5
173 endif
174 echo 7.err6
175 else
176 echo 7.ok7
177 if 1
178 echo 7.ok8
179 if 0
180 echo 7.err9
181 else
182 echo 7.ok9
183 endif
184 echo 7.ok10
185 else
186 echo 7.err11
187 if 1
188 echo 7.err12
189 else
190 echo 7.err13
191 endif
192 endif
193 echo 7.ok14
194 endif
195 if r
196 echo 8.ok1
197 if R
198 echo 8.ok2
199 else
200 echo 8.err2
201 endif
202 echo 8.ok3
203 else
204 echo 8.err1
205 endif
206 if s
207 echo 9.err1
208 else
209 echo 9.ok1
210 if S
211 echo 9.err2
212 else
213 echo 9.ok2
214 endif
215 echo 9.ok3
216 endif
217 __EOT
218 cksum_test behave:2 "${MBOX}" '1909382116 98'
221 __behave_smime() { # FIXME add test/ dir, unroll tests therein, regular enable!
222 echo WARNING: behave_smime is yet debug only and not generalized
223 printf 'behave:s/mime: .. generating test key and certificate ..\n'
224 cat <<-_EOT > t.conf
225 [ req ]
226 default_bits = 1024
227 default_keyfile = keyfile.pem
228 distinguished_name = req_distinguished_name
229 attributes = req_attributes
230 prompt = no
231 output_password =
233 [ req_distinguished_name ]
234 C = GB
235 ST = Over the
236 L = rainbow
237 O = S-nail
238 OU = S-nail.smime
239 CN = S-nail.test
240 emailAddress = test@localhost
242 [ req_attributes ]
243 challengePassword =
244 _EOT
245 openssl req -x509 -nodes -days 3650 -config t.conf \
246 -newkey rsa:1024 -keyout tkey.pem -out tcert.pem >/dev/null 2>&1
247 rm -f t.conf
248 cat tkey.pem tcert.pem > tpair.pem
250 printf "behave:s/mime:sign/verify: "
251 echo bla |
252 MAILRC=/dev/null ./s-nail -n# \
253 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
254 -Ssmime-sign -Sfrom=test@localhost \
255 -s 'S/MIME test' ./VERIFY
256 # TODO CHECK
257 printf 'verify\nx\n' |
258 MAILRC=/dev/null ./s-nail -n# \
259 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
260 -Ssmime-sign -Sfrom=test@localhost \
261 -Sbatch-exit-on-error -R \
262 -f ./VERIFY >/dev/null 2>&1
263 if [ $? -eq 0 ]; then
264 printf 'ok\n'
265 else
266 ESTAT=1
267 printf 'error: verification failed\n'
268 rm -f ./VERIFY tkey.pem tcert.pem tpair.pem
269 return
271 rm -rf ./VERIFY
273 printf "behave:s/mime:encrypt/decrypt: "
274 cat <<-_EOT > tsendmail.sh
275 #!/bin/sh -
276 (echo 'From S-Postman Thu May 10 20:40:54 2012' && cat) > ./ENCRYPT
277 _EOT
278 chmod 0755 tsendmail.sh
280 echo bla |
281 MAILRC=/dev/null ./s-nail -n# \
282 -Ssmime-force-encryption \
283 -Ssmime-encrypt-recei@ver.com=tpair.pem \
284 -Ssendmail=./tsendmail.sh \
285 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
286 -Ssmime-sign -Sfrom=test@localhost \
287 -s 'S/MIME test' recei@ver.com
288 # TODO CHECK
289 printf 'decrypt ./DECRYPT\nfi ./DECRYPT\nverify\nx\n' |
290 MAILRC=/dev/null ./s-nail -n# \
291 -Ssmime-force-encryption \
292 -Ssmime-encrypt-recei@ver.com=tpair.pem \
293 -Ssendmail=./tsendmail.sh \
294 -Ssmime-ca-file=tcert.pem -Ssmime-sign-cert=tpair.pem \
295 -Ssmime-sign -Sfrom=test@localhost \
296 -Sbatch-exit-on-error -R \
297 -f ./ENCRYPT >/dev/null 2>&1
298 if [ $? -eq 0 ]; then
299 printf 'ok\n'
300 else
301 ESTAT=1
302 printf 'error: decryption+verification failed\n'
304 rm -f ./tsendmail.sh ./ENCRYPT ./DECRYPT tkey.pem tcert.pem tpair.pem
307 # t_content()
308 # Some basic tests regarding correct sending of mails, via STDIN / -t / -q,
309 # including basic MIME Content-Transfer-Encoding correctness (quoted-printable)
310 # Note we unfortunately need to place some statements without proper
311 # indentation because of continuation problems
312 t_content() {
313 ${rm} -f "${BODY}" "${MBOX}"
315 # MIME CTE (QP) stress message body
316 printf \
317 'Ich bin eine DÖS-Datäi mit sehr langen Zeilen und auch '\
318 'sonst bin ich ganz schön am Schleudern, da kannste denke '\
319 "wasde willst, gelle, gelle, gelle, gelle, gelle.\r\n"\
320 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst \r\n"\
321 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1\r\n"\
322 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12\r\n"\
323 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123\r\n"\
324 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234\r\n"\
325 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345\r\n"\
326 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456\r\n"\
327 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234567\r\n"\
328 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345678\r\n"\
329 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456789\r\n"\
330 "Unn ausserdem habe ich trailing SP/HT/SP/HT whitespace \r\n"\
331 "Unn ausserdem habe ich trailing HT/SP/HT/SP whitespace \r\n"\
332 "auf den zeilen vorher.\r\n"\
333 "From am Zeilenbeginn und From der Mitte gibt es auch.\r\n"\
334 ".\r\n"\
335 "Die letzte Zeile war nur ein Punkt.\r\n"\
336 "..\r\n"\
337 "Das waren deren zwei.\r\n"\
338 " \r\n"\
339 "Die letzte Zeile war ein Leerschritt.\n"\
340 "=VIER = EQUAL SIGNS=ON A LINE=\r\n"\
341 "Prösterchen.\r\n"\
342 ".\n"\
343 "Die letzte Zeile war nur ein Punkt, mit Unix Zeilenende.\n"\
344 "..\n"\
345 "Das waren deren zwei. ditto.\n"\
346 "Prösterchen.\n"\
347 "Unn ausseerdem habe ich trailing SP/HT/SP/HT whitespace \n"\
348 "Unn ausseerdem habe ich trailing HT/SP/HT/SP whitespace \n"\
349 "auf den zeilen vorher.\n"\
350 "ditto.\n"\
351 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.\n"\
352 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.1"\
353 "\n"\
354 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
355 "\n"\
356 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
357 "3\n"\
358 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
359 "34\n"\
360 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
361 "345\n"\
362 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
363 "3456\n"\
364 "=VIER = EQUAL SIGNS=ON A LINE=\n"\
365 " \n"\
366 "Die letzte Zeile war ein Leerschritt.\n"\
367 ' '\
368 > "${BODY}"
370 # MIME CTE (QP) stress message subject
371 SUB='Äbrä Kä?dä=brö Fü?di=bus? '\
372 'adadaddsssssssddddddddddddddddddddd'\
373 'ddddddddddddddddddddddddddddddddddd'\
374 'ddddddddddddddddddddddddddddddddddd'\
375 'dddddddddddddddddddd Hallelulja? Od'\
376 'er?? eeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\
377 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\
378 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f'\
379 'fffffffffffffffffffffffffffffffffff'\
380 'fffffffffffffffffffff ggggggggggggg'\
381 'ggggggggggggggggggggggggggggggggggg'\
382 'ggggggggggggggggggggggggggggggggggg'\
383 'ggggggggggggggggggggggggggggggggggg'\
384 'gggggggggggggggg'
386 # Three tests for MIME-CTE and (a bit) content classification.
387 # At the same time testing -q FILE, < FILE and -t FILE
388 ${rm} -f "${MBOX}"
389 < "${BODY}" MAILRC=/dev/null \
390 "${SNAIL}" -nSstealthmua -a "${BODY}" -s "${SUB}" "${MBOX}"
391 cksum_test content:1 "${MBOX}" '2606934084 5649'
393 ${rm} -f "${MBOX}"
394 < /dev/null MAILRC=/dev/null \
395 "${SNAIL}" -n#Sstealthmua -a "${BODY}" -s "${SUB}" \
396 -q "${BODY}" "${MBOX}"
397 cksum_test content:2 "${MBOX}" '2606934084 5649'
399 ${rm} -f "${MBOX}"
400 ( echo "To: ${MBOX}" && echo "Subject: ${SUB}" && echo &&
401 ${cat} "${BODY}"
402 ) | MAILRC=/dev/null "${SNAIL}" -nSstealthmua -a "${BODY}" -t
403 cksum_test content:3 "${MBOX}" '799758423 5648'
405 # Test for [260e19d] (Juergen Daubert)
406 ${rm} -f "${MBOX}"
407 echo body | MAILRC=/dev/null "${SNAIL}" -n#Sstealthmua "${MBOX}"
408 cksum_test content:4 "${MBOX}" '506144051 104'
410 # Sending of multiple mails in a single invocation
411 ${rm} -f "${MBOX}"
412 ( printf "m ${MBOX}\n~s subject1\nE-Mail Körper 1\n.\n" &&
413 printf "m ${MBOX}\n~s subject2\nEmail body 2\n.\n" &&
414 echo x
415 ) | MAILRC=/dev/null "${SNAIL}" -n#Sstealthmua
416 cksum_test content:5 "${MBOX}" '2028749685 277'
418 ## $BODY CHANGED
420 # "Test for" [d6f316a] (Gavin Troy)
421 ${rm} -f "${MBOX}"
422 printf "m ${MBOX}\n~s subject1\nEmail body\n.\nfi ${MBOX}\np\nx\n" |
423 MAILRC=/dev/null "${SNAIL}" -n#Sstealthmua \
424 -SPAGER="${cat}" -Spipe-text/plain="${cat}" > "${BODY}"
425 ${sed} -e 1d < "${BODY}" > "${MBOX}"
426 cksum_test content:6 "${MBOX}" '3062395510 181'
428 ${rm} -f "${BODY}" "${MBOX}"
431 t_all() {
432 t_behave
433 t_content
436 if [ -z "${CHECK_ONLY}" ]; then
437 cc_all_configs
438 else
439 t_all
442 [ ${ESTAT} -eq 0 ] && echo Ok || echo >&2 'Errors occurred'
444 exit ${ESTAT}
445 # vim:set fenc=utf8:s-it-mode