Review: names.c
[s-mailx.git] / cc-test.sh
blob24845c4120e0b160449f1f47c729754c92818769
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 awk=${AWK:-`command -v awk`}
10 cat=${CAT:-`command -v cat`}
11 # TODO cksum not fixated via mk-conf.sh, mk.mk should export variables!!
12 cksum=${cksum:-`command -v cksum`}
13 MAKE="${MAKE:-`command -v make`}"
14 rm=${RM:-`command -v rm`}
15 sed=${SED:-`command -v sed`}
17 ## -- >8 -- 8< -- ##
19 export SNAIL CONF BODY MBOX awk cat cksum MAKE rm sed
21 # NOTE! UnixWare 7.1.4 gives ISO-10646-Minimum-European-Subset for
22 # nl_langinfo(CODESET), then, so also overwrite ttycharset.
23 # (In addition this setup allows us to succeed on TinyCore 4.4 that has no
24 # other locales than C/POSIX installed by default!)
25 LC=en_US.UTF-8
26 LC_ALL=${LC} LANG=${LC}
27 ttycharset=UTF-8
28 export LC_ALL LANG ttycharset
30 ESTAT=0
32 usage() {
33 echo >&2 "Usage: ./cc-test.sh [--check-only [s-nail-binary]]"
34 exit 1
37 CHECK_ONLY=
38 [ ${#} -gt 0 ] && {
39 [ "${1}" = --check-only ] || usage
40 [ ${#} -gt 2 ] && usage
41 [ ${#} -eq 2 ] && SNAIL="${2}"
42 [ -x "${SNAIL}" ] || usage
43 CHECK_ONLY=1
46 # cc_all_configs()
47 # Test all configs TODO doesn't cover all *combinations*, stupid!
48 cc_all_configs() {
49 < ${CONF} ${awk} '
50 BEGIN {i = 0}
51 /^[[:space:]]*WANT_/ {
52 sub(/^[[:space:]]*/, "")
53 # This bails for UnixWare 7.1.4 awk(1), but preceeding = with \
54 # does not seem to be a compliant escape for =
55 #sub(/=.*$/, "")
56 $1 = substr($1, 1, index($1, "=") - 1)
57 if ($1 == "WANT_AUTOCC")
58 next
59 data[i++] = $1
61 END {
62 for (j = 0; j < i; ++j) {
63 for (k = 0; k < j; ++k)
64 printf data[k] "=1 "
65 for (k = j; k < i; ++k)
66 printf data[k] "=0 "
67 printf "WANT_AUTOCC=1\n"
68 printf "\n"
70 for (k = 0; k < j; ++k)
71 printf data[k] "=0 "
72 for (k = j; k < i; ++k)
73 printf data[k] "=1 "
74 printf "WANT_AUTOCC=1\n"
75 printf "\n"
78 ' | while read c; do
79 printf "\n\n##########\n$c\n"
80 printf "\n\n##########\n$c\n" >&2
81 sh -c "${MAKE} ${c}"
82 t_all
83 ${MAKE} distclean
84 done
87 # cksum_test()
88 # Read mailbox $2, strip non-constant headers and MIME boundaries, query the
89 # cksum(1) of the resulting data and compare against the checksum $3
90 cksum_test() {
91 tid=$1 f=$2 s=$3
92 printf "${tid}: "
93 csum="`${sed} -e '/^From /d' -e '/^Date: /d' \
94 -e '/^ boundary=/d' -e '/^--=_/d' < \"${f}\" | ${cksum}`";
95 if [ "${csum}" = "${s}" ]; then
96 printf 'ok\n'
97 else
98 ESTAT=1
99 printf 'error: checksum mismatch\n'
103 # t_behave()
104 # Basic (easily testable) behaviour tests
105 t_behave() {
106 # Test for [d1f1a19]
107 ${rm} -f "${MBOX}"
108 printf 'echo +nix\nset folder=/\necho +nix\nset nofolder\necho +nix\nx' |
109 MAILRC=/dev/null "${SNAIL}" -n -# -SPAGER="${cat}" > "${MBOX}"
110 cksum_test behave:1 "${MBOX}" '4214021069 15'
112 # POSIX: setting *noprompt*/prompt='' shall prevent prompting TODO
113 # TODO for this to be testable we need a way to echo a variable
114 # TODO or to force echo of the prompt
116 __behave_ifelse
119 __behave_ifelse() {
120 # Nestable conditions test
121 ${rm} -f "${MBOX}"
122 cat <<- '__EOT' | MAILRC=/dev/null "${SNAIL}" -n -# > "${MBOX}"
123 if 0
124 echo 1.err
125 else
126 echo 1.ok
127 endif
128 if 1
129 echo 2.ok
130 else
131 echo 2.err
132 endif
133 if $dietcurd
134 echo 3.err
135 else
136 echo 3.ok
137 endif
138 set dietcurd=yoho
139 if $dietcurd
140 echo 4.ok
141 else
142 echo 4.err
143 endif
144 if $dietcurd == 'yoho'
145 echo 5.ok
146 else
147 echo 5.err
148 endif
149 if $dietcurd != 'yoho'
150 echo 6.err
151 else
152 echo 6.ok
153 endif
154 # Nesting
155 if 0
156 echo 7.err1
157 if 1
158 echo 7.err2
159 if 1
160 echo 7.err3
161 else
162 echo 7.err4
163 endif
164 echo 7.err5
165 endif
166 echo 7.err6
167 else
168 echo 7.ok7
169 if 1
170 echo 7.ok8
171 if 0
172 echo 7.err9
173 else
174 echo 7.ok9
175 endif
176 echo 7.ok10
177 else
178 echo 7.err11
179 if 1
180 echo 7.err12
181 else
182 echo 7.err13
183 endif
184 endif
185 echo 7.ok14
186 endif
187 if r
188 echo 8.ok1
189 if R
190 echo 8.ok2
191 else
192 echo 8.err2
193 endif
194 echo 8.ok3
195 else
196 echo 8.err1
197 endif
198 if s
199 echo 9.err1
200 else
201 echo 9.ok1
202 if S
203 echo 9.err2
204 else
205 echo 9.ok2
206 endif
207 echo 9.ok3
208 endif
209 __EOT
210 cksum_test behave:2 "${MBOX}" '1909382116 98'
213 # t_content()
214 # Some basic tests regarding correct sending of mails, via STDIN / -t / -q,
215 # including basic MIME Content-Transfer-Encoding correctness (quoted-printable)
216 # Note we unfortunately need to place some statements without proper
217 # indentation because of continuation problems
218 t_content() {
219 ${rm} -f "${BODY}" "${MBOX}"
221 # MIME CTE (QP) stress message body
222 printf \
223 'Ich bin eine DÖS-Datäi mit sehr langen Zeilen und auch '\
224 'sonst bin ich ganz schön am Schleudern, da kannste denke '\
225 "wasde willst, gelle, gelle, gelle, gelle, gelle.\r\n"\
226 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst \r\n"\
227 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1\r\n"\
228 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12\r\n"\
229 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123\r\n"\
230 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234\r\n"\
231 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345\r\n"\
232 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456\r\n"\
233 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234567\r\n"\
234 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345678\r\n"\
235 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456789\r\n"\
236 "Unn ausserdem habe ich trailing SP/HT/SP/HT whitespace \r\n"\
237 "Unn ausserdem habe ich trailing HT/SP/HT/SP whitespace \r\n"\
238 "auf den zeilen vorher.\r\n"\
239 "From am Zeilenbeginn und From der Mitte gibt es auch.\r\n"\
240 ".\r\n"\
241 "Die letzte Zeile war nur ein Punkt.\r\n"\
242 "..\r\n"\
243 "Das waren deren zwei.\r\n"\
244 " \r\n"\
245 "Die letzte Zeile war ein Leerschritt.\n"\
246 "=VIER = EQUAL SIGNS=ON A LINE=\r\n"\
247 "Prösterchen.\r\n"\
248 ".\n"\
249 "Die letzte Zeile war nur ein Punkt, mit Unix Zeilenende.\n"\
250 "..\n"\
251 "Das waren deren zwei. ditto.\n"\
252 "Prösterchen.\n"\
253 "Unn ausseerdem habe ich trailing SP/HT/SP/HT whitespace \n"\
254 "Unn ausseerdem habe ich trailing HT/SP/HT/SP whitespace \n"\
255 "auf den zeilen vorher.\n"\
256 "ditto.\n"\
257 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.\n"\
258 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.1"\
259 "\n"\
260 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
261 "\n"\
262 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
263 "3\n"\
264 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
265 "34\n"\
266 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
267 "345\n"\
268 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
269 "3456\n"\
270 "=VIER = EQUAL SIGNS=ON A LINE=\n"\
271 " \n"\
272 "Die letzte Zeile war ein Leerschritt.\n"\
273 ' '\
274 > "${BODY}"
276 # MIME CTE (QP) stress message subject
277 SUB='Äbrä Kä?dä=brö Fü?di=bus? '\
278 'adadaddsssssssddddddddddddddddddddd'\
279 'ddddddddddddddddddddddddddddddddddd'\
280 'ddddddddddddddddddddddddddddddddddd'\
281 'dddddddddddddddddddd Hallelulja? Od'\
282 'er?? eeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\
283 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'\
284 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f'\
285 'fffffffffffffffffffffffffffffffffff'\
286 'fffffffffffffffffffff ggggggggggggg'\
287 'ggggggggggggggggggggggggggggggggggg'\
288 'ggggggggggggggggggggggggggggggggggg'\
289 'ggggggggggggggggggggggggggggggggggg'\
290 'gggggggggggggggg'
292 # Three tests for MIME-CTE and (a bit) content classification.
293 # At the same time testing -q FILE, < FILE and -t FILE
294 ${rm} -f "${MBOX}"
295 < "${BODY}" MAILRC=/dev/null \
296 "${SNAIL}" -n -Sstealthmua -a "${BODY}" -s "${SUB}" "${MBOX}"
297 cksum_test content:1 "${MBOX}" '2606934084 5649'
299 ${rm} -f "${MBOX}"
300 < /dev/null MAILRC=/dev/null \
301 "${SNAIL}" -n -Sstealthmua -a "${BODY}" -s "${SUB}" \
302 -q "${BODY}" "${MBOX}"
303 cksum_test content:2 "${MBOX}" '2606934084 5649'
305 ${rm} -f "${MBOX}"
306 ( echo "To: ${MBOX}" && echo "Subject: ${SUB}" && echo &&
307 ${cat} "${BODY}"
308 ) | MAILRC=/dev/null "${SNAIL}" -n -Sstealthmua -a "${BODY}" -t
309 cksum_test content:3 "${MBOX}" '799758423 5648'
311 # Test for [260e19d]. Juergen Daubert.
312 ${rm} -f "${MBOX}"
313 echo body | MAILRC=/dev/null "${SNAIL}" -n -Sstealthmua "${MBOX}"
314 cksum_test content:4 "${MBOX}" '506144051 104'
316 # Sending of multiple mails in a single invocation
317 ${rm} -f "${MBOX}"
318 ( printf "m ${MBOX}\n~s subject1\nE-Mail Körper 1\n.\n" &&
319 printf "m ${MBOX}\n~s subject2\nEmail body 2\n.\n" &&
320 echo x
321 ) | MAILRC=/dev/null "${SNAIL}" -n -# -Sstealthmua
322 cksum_test content:5 "${MBOX}" '2028749685 277'
324 ${rm} -f "${BODY}" "${MBOX}"
327 t_all() {
328 t_behave
329 t_content
332 if [ -z "${CHECK_ONLY}" ]; then
333 cc_all_configs
334 else
335 t_all
338 [ ${ESTAT} -eq 0 ] && echo Ok || echo >&2 'Errors occurred'
340 exit ${ESTAT}
341 # vim:set fenc=utf8:s-it-mode