n_mimetype_classify_file(): tweak/fix message/rfc822 C-T-E detection..
[s-mailx.git] / cc-test.sh
blob7c26484a6539999254d7be78c50fbd1d6da4da3b
1 #!/bin/sh -
2 #@ Usage: ./cc-test.sh [--check-only s-mailx-binary]
3 #@ TODO _All_ the tests should happen in a temporary subdir.
4 # Public Domain
6 # We need *stealthmua* regardless of $SOURCE_DATE_EPOCH, the program name as
7 # such is a compile-time variable
8 ARGS='-:/ -# -Sdotlock-ignore-error -Sexpandaddr=restrict'
9 ARGS="${ARGS}"' -Smime-encoding=quoted-printable -Snosave -Sstealthmua'
10 ADDARG_UNI=-Sttycharset=UTF-8
11 CONF=./make.rc
12 BODY=./.cc-body.txt
13 MBOX=./.cc-test.mbox
14 MAIL=/dev/null
15 #UTF8_LOCALE= autodetected unless set
17 # Note valgrind has problems with FDs in forked childs, which causes some tests
18 # to fail (the FD is rewound and thus will be dumped twice)
19 MEMTESTER=
20 #MEMTESTER='valgrind --leak-check=full --log-file=.vl-%p '
22 if ( command -v command ) >/dev/null 2>&1; then :; else
23 command() {
24 shift
25 which "${@}"
29 MAKE="${MAKE:-`command -v make`}"
30 awk=${awk:-`command -v awk`}
31 cat=${cat:-`command -v cat`}
32 cksum=${cksum:-`command -v cksum`}
33 rm=${rm:-`command -v rm`}
34 sed=${sed:-`command -v sed`}
35 grep=${grep:-`command -v grep`}
37 # Problem: force $SHELL to be a real shell. It seems some testing environments
38 # use nologin(?), but we need a real shell for command execution
39 if { echo ${SHELL} | ${grep} nologin; } >/dev/null 2>&1; then
40 echo >&2 '$SHELL seems to be nologin, overwriting to /bin/sh!'
41 SHELL=/bin/sh
42 export SHELL
45 # We sometimes "fake" sendmail(1) a.k.a. *mta* with a shell wrapper, and it
46 # happens that /bin/sh is often terribly slow
47 if command -v dash >/dev/null 2>&1; then
48 MYSHELL="`command -v dash`"
49 elif command -v mksh >/dev/null 2>&1; then
50 MYSHELL="`command -v mksh`"
51 else
52 MYSHELL="${SHELL}"
55 ## -- >8 -- 8< -- ##
57 export ARGS ADDARG_UNI CONF BODY MBOX MAIL MAKE awk cat cksum rm sed grep
59 LC_ALL=C LANG=C
60 TZ=UTC
61 # Wed Oct 2 01:50:07 UTC 1996
62 SOURCE_DATE_EPOCH=844221007
64 export LC_ALL LANG TZ SOURCE_DATE_EPOCH
65 unset POSIXLY_CORRECT
67 usage() {
68 echo >&2 "Usage: ./cc-test.sh [--check-only s-mailx-binary]"
69 exit 1
72 CHECK_ONLY= MAILX=
73 if [ "${1}" = --check-only ]; then
74 CHECK_ONLY=1
75 MAILX=${2}
76 [ -x "${MAILX}" ] || usage
78 RAWMAILX=${MAILX}
79 MAILX="${MEMTESTER}${MAILX}"
80 export RAWMAILX MAILX
82 if [ -n "${CHECK_ONLY}" ] && [ -z "${UTF8_LOCALE}" ]; then
83 # Try ourselfs for nl_langinfo(CODESET) output first (requires a new version)
84 i=`LC_ALL=C.utf8 "${RAWMAILX}" ${ARGS} -X '
85 \define cset_test {
86 \if [ "${ttycharset}" @i=% utf ]
87 \echo $LC_ALL
88 \xit 0
89 \end
90 \if [ "${#}" -gt 0 ]
91 \wysh set LC_ALL=${1}
92 \shift
93 \eval xcall cset_test "${@}"
94 \end
95 \xit 1
97 \call cset_test C.UTF-8 POSIX.utf8 POSIX.UTF-8 en_EN.utf8 en_EN.UTF-8 \
98 en_US.utf8 en_US.UTF-8
100 [ $? -eq 0 ] && UTF8_LOCALE=$i
102 if [ -z "${UTF8_LOCALE}" ] && command -v locale >/dev/null 2>&1; then
103 UTF8_LOCALE=`locale -a | { m=
104 while read n; do
105 if { echo ${n} | ${grep} -i 'utf-\{0,1\}8'; } >/dev/null 2>&1; then
106 m=${n}
107 if { echo ${n} | ${grep} -e POSIX -e en_EN -e en_US; }; then
108 exit 0
111 m=${n}
112 done
113 echo ${m}
118 ESTAT=0
120 TRAP_EXIT_ADDONS=
121 trap "${rm} -rf \"${BODY}\" \"${MBOX}\" \${TRAP_EXIT_ADDONS}" EXIT
122 trap "exit 1" HUP INT TERM
124 # cc_all_configs()
125 # Test all configs TODO doesn't cover all *combinations*, stupid!
126 cc_all_configs() {
127 < ${CONF} ${awk} '
128 BEGIN {
129 NOTME["OPT_AUTOCC"] = 1
130 NOTME["OPT_DEBUG"] = 1
131 NOTME["OPT_DEVEL"] = 1
132 NOTME["OPT_NOEXTMD5"] = 1
133 NOTME["OPT_ASAN_ADDRESS"] = 1
134 NOTME["OPT_ASAN_MEMORY"] = 1
135 NOTME["OPT_FORCED_STACKPROT"] = 1
136 NOTME["OPT_NOMEMDBG"] = 1
137 NOTME["OPT_NYD2"] = 1
138 i = 0
140 /^[[:space:]]*OPT_/ {
141 sub(/^[[:space:]]*/, "")
142 # This bails for UnixWare 7.1.4 awk(1), but preceeding = with \
143 # does not seem to be a compliant escape for =
144 #sub(/=.*$/, "")
145 $1 = substr($1, 1, index($1, "=") - 1)
146 if (NOTME[$1])
147 next
148 data[i++] = $1
150 END {
151 # Doing this completely sequentially and not doing make distclean in
152 # between runs should effectively result in lesser compilations.
153 # It is completely dumb nonetheless... TODO
154 for (j = 1; j < i; ++j) {
155 for (k = 1; k < j; ++k)
156 printf data[k] "=1 "
157 for (k = j; k < i; ++k)
158 printf data[k] "=0 "
159 printf "OPT_AUTOCC=1\n"
161 for (j = 1; j < i; ++j) {
162 for (k = 1; k < j; ++k)
163 printf data[k] "=0 "
164 for (k = j; k < i; ++k)
165 printf data[k] "=1 "
166 printf "OPT_AUTOCC=1\n"
168 # With debug
169 for (j = 1; j < i; ++j) {
170 for (k = 1; k < j; ++k)
171 printf data[k] "=1 "
172 for (k = j; k < i; ++k)
173 printf data[k] "=0 "
174 printf "OPT_AUTOCC=1\n"
175 printf "OPT_DEBUG=1\n"
177 for (j = 1; j < i; ++j) {
178 for (k = 1; k < j; ++k)
179 printf data[k] "=0 "
180 for (k = j; k < i; ++k)
181 printf data[k] "=1 "
182 printf "OPT_AUTOCC=1\n"
183 printf "OPT_DEBUG=1\n"
186 printf "CONFIG=NULL OPT_AUTOCC=0\n"
187 printf "CONFIG=NULL OPT_AUTOCC=1\n"
188 printf "CONFIG=NULLI OPT_AUTOCC=0\n"
189 printf "CONFIG=NULLI OPT_AUTOCC=1\n"
190 printf "CONFIG=MINIMAL OPT_AUTOCC=0\n"
191 printf "CONFIG=MINIMAL OPT_AUTOCC=1\n"
192 printf "CONFIG=NETSEND OPT_AUTOCC=0\n"
193 printf "CONFIG=NETSEND OPT_AUTOCC=1\n"
194 printf "CONFIG=MAXIMAL OPT_AUTOCC=0\n"
195 printf "CONFIG=MAXIMAL OPT_AUTOCC=1\n"
196 printf "CONFIG=DEVEL OPT_AUTOCC=0\n"
197 printf "CONFIG=DEVEL OPT_AUTOCC=1\n"
198 printf "CONFIG=ODEVEL OPT_AUTOCC=0\n"
199 printf "CONFIG=ODEVEL OPT_AUTOCC=1\n"
201 ' | while read c; do
202 printf "\n\n##########\n$c\n"
203 printf "\n\n##########\n$c\n" >&2
204 sh -c "${MAKE} ${c} all test"
205 done
206 ${MAKE} distclean
209 have_feat() {
210 ( "${RAWMAILX}" ${ARGS} -X'echo $features' -Xx |
211 ${grep} +${1} ) >/dev/null 2>&1
214 t_prolog() {
215 ${rm} -rf "${BODY}" "${MBOX}" ${TRAP_EXIT_ADDONS}
216 TRAP_EXIT_ADDONS=
218 t_epilog() {
219 t_prolog
222 check() {
223 restat=${?} tid=${1} eestat=${2} f=${3} s=${4}
224 #x=`echo ${tid} | tr "/:=" "__-"`
225 #cp -f "${f}" "${TMPDIR}/${x}"
226 [ "${eestat}" != - ] && [ "${restat}" != "${eestat}" ] &&
227 err "${tid}" 'unexpected exit status: '"${restat} != ${eestat}"
228 csum="`${cksum} < ${f}`"
229 if [ "${csum}" = "${s}" ]; then
230 printf '%s: ok\n' "${tid}"
231 else
232 ESTAT=1
233 printf '%s: error: checksum mismatch (got %s)\n' "${tid}" "${csum}"
237 err() {
238 ESTAT=1
239 printf '%s: error: %s\n' ${1} "${2}"
242 ex0_test() {
243 [ $? -ne 0 ] && err $1 'unexpected non-0 exit status'
246 exn0_test() {
247 [ $? -eq 0 ] && err $1 'unexpected 0 exit status'
250 if ( [ "$((1 + 1))" = 2 ] ) >/dev/null 2>&1; then
251 add() {
252 echo "$((${1} + ${2}))"
254 elif command -v expr >/dev/null 2>&1; then
255 add() {
256 echo `expr ${1} + ${2}`
258 else
259 add() {
260 echo `${awk} 'BEGIN{print '${1}' + '${2}'}'`
264 if ( [ "$((2 % 3))" = 2 ] ) >/dev/null 2>&1; then
265 modulo() {
266 echo "$((${1} % ${2}))"
268 elif command -v expr >/dev/null 2>&1; then
269 modulo() {
270 echo `expr ${1} % ${2}`
272 else
273 modulo() {
274 echo `${awk} 'BEGIN{print '${1}' % '${2}'}'`
278 # t_behave()
279 # Basic (easily testable) behaviour tests
280 t_behave() {
281 t_behave_X_opt_input_command_stack
282 t_behave_X_errexit
283 t_behave_wysh
284 t_behave_input_inject_semicolon_seq
285 t_behave_commandalias
286 t_behave_ifelse
287 t_behave_localopts
288 t_behave_macro_param_shift
289 t_behave_addrcodec
290 t_behave_vexpr
291 t_behave_call_ret
292 t_behave_xcall
293 t_behave_vpospar
294 t_behave_atxplode
296 t_behave_mbox
298 t_behave_alternates
299 t_behave_alias
300 # FIXME t_behave_mlist
301 t_behave_filetype
303 t_behave_record_a_resend
305 t_behave_e_H_L_opts
306 t_behave_compose_hooks
307 t_behave_message_injections
308 t_behave_mime_types_load_control
310 t_behave_smime
312 t_behave_maildir
313 t_behave_mass_recipients
314 t_behave_lreply_futh_rth_etc
315 t_behave_iconv_mbyte_base64
318 t_behave_X_opt_input_command_stack() {
319 t_prolog
321 ${cat} <<- '__EOT' > "${BODY}"
322 echo 1
323 define mac0 {
324 echo mac0-1 via1 $0
326 call mac0
327 echo 2
328 source '\
329 echo "define mac1 {";\
330 echo " echo mac1-1 via1 \$0";\
331 echo " call mac0";\
332 echo " echo mac1-2";\
333 echo " call mac2";\
334 echo " echo mac1-3";\
335 echo "}";\
336 echo "echo 1-1";\
337 echo "define mac2 {";\
338 echo " echo mac2-1 via1 \$0";\
339 echo " call mac0";\
340 echo " echo mac2-2";\
341 echo "}";\
342 echo "echo 1-2";\
343 echo "call mac1";\
344 echo "echo 1-3";\
345 echo "source \"\
346 echo echo 1-1-1 via1 \$0;\
347 echo call mac0;\
348 echo echo 1-1-2;\
349 | \"";\
350 echo "echo 1-4";\
352 echo 3
353 call mac2
354 echo 4
355 undefine *
356 __EOT
358 # The -X option supports multiline arguments, and those can internally use
359 # reverse solidus newline escaping. And all -X options are joined...
360 APO=\'
361 < "${BODY}" ${MAILX} ${ARGS} \
362 -X 'e\' \
363 -X ' c\' \
364 -X ' h\' \
365 -X ' o \' \
366 -X 1 \
368 define mac0 {
369 echo mac0-1 via2 $0
371 call mac0
372 echo 2
375 source '${APO}'\
376 echo "define mac1 {";\
377 echo " echo mac1-1 via2 \$0";\
378 echo " call mac0";\
379 echo " echo mac1-2";\
380 echo " call mac2";\
381 echo " echo mac1-3";\
382 echo "}";\
383 echo "echo 1-1";\
384 echo "define mac2 {";\
385 echo " echo mac2-1 via2 \$0";\
386 echo " call mac0";\
387 echo " echo mac2-2";\
388 echo "}";\
389 echo "echo 1-2";\
390 echo "call mac1";\
391 echo "echo 1-3";\
392 echo "source \"\
393 echo echo 1-1-1 via2 \$0;\
394 echo call mac0;\
395 echo echo 1-1-2;\
396 | \"";\
397 echo "echo 1-4";\
398 | '${APO}'
399 echo 3
402 call mac2
403 echo 4
404 undefine *
405 ' > "${MBOX}"
407 check behave:x_opt_input_command_stack 0 "${MBOX}" '1786542668 416'
409 t_epilog
412 t_behave_X_errexit() {
413 t_prolog
415 ${cat} <<- '__EOT' > "${BODY}"
416 echo one
417 echos nono
418 echo two
419 __EOT
421 </dev/null ${MAILX} ${ARGS} -Snomemdebug \
422 -X'echo one' -X' echos nono ' -X'echo two' \
423 > "${MBOX}" 2>&1
424 check behave:x_errexit-1 0 "${MBOX}" '916157812 53'
426 </dev/null ${MAILX} ${ARGS} -X'source '"${BODY}" -Snomemdebug \
427 > "${MBOX}" 2>&1
428 check behave:x_errexit-2 0 "${MBOX}" '916157812 53'
430 </dev/null MAILRC="${BODY}" ${MAILX} ${ARGS} -:u -Snomemdebug \
431 > "${MBOX}" 2>&1
432 check behave:x_errexit-3 0 "${MBOX}" '916157812 53'
436 </dev/null ${MAILX} ${ARGS} -Serrexit -Snomemdebug \
437 -X'echo one' -X' echos nono ' -X'echo two' \
438 > "${MBOX}" 2>&1
439 check behave:x_errexit-4 1 "${MBOX}" '2118430867 49'
441 </dev/null ${MAILX} ${ARGS} -X'source '"${BODY}" -Serrexit -Snomemdebug \
442 > "${MBOX}" 2>&1
443 check behave:x_errexit-5 1 "${MBOX}" '2118430867 49'
445 </dev/null MAILRC="${BODY}" ${MAILX} ${ARGS} -:u -Serrexit -Snomemdebug \
446 > "${MBOX}" 2>&1
447 check behave:x_errexit-6 1 "${MBOX}" '12955965 172'
449 </dev/null MAILRC="${BODY}" ${MAILX} ${ARGS} -:u -Sposix -Snomemdebug \
450 > "${MBOX}" 2>&1
451 check behave:x_errexit-7 1 "${MBOX}" '12955965 172'
453 ## Repeat 4-7 with ignerr set
455 ${sed} -e 's/^echos /ignerr echos /' < "${BODY}" > "${MBOX}"
457 </dev/null ${MAILX} ${ARGS} -Serrexit -Snomemdebug \
458 -X'echo one' -X'ignerr echos nono ' -X'echo two' \
459 > "${BODY}" 2>&1
460 check behave:x_errexit-8 0 "${BODY}" '916157812 53'
462 </dev/null ${MAILX} ${ARGS} -X'source '"${MBOX}" -Serrexit -Snomemdebug \
463 > "${BODY}" 2>&1
464 check behave:x_errexit-9 0 "${BODY}" '916157812 53'
466 </dev/null MAILRC="${MBOX}" ${MAILX} ${ARGS} -:u -Serrexit -Snomemdebug \
467 > "${BODY}" 2>&1
468 check behave:x_errexit-10 0 "${BODY}" '916157812 53'
470 </dev/null MAILRC="${MBOX}" ${MAILX} ${ARGS} -:u -Sposix -Snomemdebug \
471 > "${BODY}" 2>&1
472 check behave:x_errexit-11 0 "${BODY}" '916157812 53'
474 t_epilog
477 t_behave_wysh() {
478 t_prolog
480 ${cat} <<- '__EOT' > "${BODY}"
482 echo abcd
483 echo a'b'c'd'
484 echo a"b"c"d"
485 echo a$'b'c$'d'
486 echo 'abcd'
487 echo "abcd"
488 echo $'abcd'
489 echo a\ b\ c\ d
490 echo a 'b c' d
491 echo a "b c" d
492 echo a $'b c' d
494 echo 'a$`"\'
495 echo "a\$\`'\"\\"
496 echo $'a\$`\'\"\\'
497 echo $'a\$`\'"\\'
498 # DIET=CURD TIED=
499 echo 'a${DIET}b${TIED}c\${DIET}d\${TIED}e' # COMMENT
500 echo "a${DIET}b${TIED}c\${DIET}d\${TIED}e"
501 echo $'a${DIET}b${TIED}c\${DIET}d\${TIED}e'
503 echo a$'\101\0101\x41\u0041\u41\U00000041\U41'c
504 echo a$'\u0041\u41\u0C1\U00000041\U41'c
505 echo a$'\377'c
506 echo a$'\0377'c
507 echo a$'\400'c
508 echo a$'\0400'c
509 echo a$'\U1100001'c
511 echo a$'b\0c'd
512 echo a$'b\00c'de
513 echo a$'b\000c'df
514 echo a$'b\0000c'dg
515 echo a$'b\x0c'dh
516 echo a$'b\x00c'di
517 echo a$'b\u0'dj
518 echo a$'b\u00'dk
519 echo a$'b\u000'dl
520 echo a$'b\u0000'dm
521 echo a$'b\U0'dn
522 echo a$'b\U00'do
523 echo a$'b\U000'dp
524 echo a$'b\U0000'dq
525 echo a$'b\U00000'dr
526 echo a$'b\U000000'ds
527 echo a$'b\U0000000'dt
528 echo a$'b\U00000000'du
530 echo a$'\cI'b
531 echo a$'\011'b
532 echo a$'\x9'b
533 echo a$'\u9'b
534 echo a$'\U9'b
535 echo a$'\c@'b c d
536 __EOT
538 if [ -z "${UTF8_LOCALE}" ]; then
539 echo 'Skip behave:wysh_unicode, no UTF8_LOCALE'
540 else
541 < "${BODY}" DIET=CURD TIED= \
542 LC_ALL=${UTF8_LOCALE} ${MAILX} ${ARGS} 2>/dev/null > "${MBOX}"
543 check behave:wysh_unicode 0 "${MBOX}" '475805847 317'
546 < "${BODY}" DIET=CURD TIED= ${MAILX} ${ARGS} > "${MBOX}" 2>/dev/null
547 check behave:wysh_c 0 "${MBOX}" '1473887148 321'
549 t_epilog
552 t_behave_input_inject_semicolon_seq() {
553 t_prolog
555 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}"
556 define mydeepmac {
557 echon '(mydeepmac)';
559 define mymac {
560 echon this_is_mymac;call mydeepmac;echon ';';
562 echon one';';call mymac;echon two";";call mymac;echo three$';';
563 define mymac {
564 echon this_is_mymac;call mydeepmac;echon ,TOO'!;';
566 echon one';';call mymac;echon two";";call mymac;echo three$';';
567 __EOT
569 check behave:input_inject_semicolon_seq 0 "${MBOX}" '512117110 140'
571 t_epilog
574 t_behave_commandalias() {
575 t_prolog
577 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}"
578 commandalias echo echo hoho
579 echo stop.
580 commandalias X Xx
581 commandalias Xx XxX
582 commandalias XxX XxXx
583 commandalias XxXx XxXxX
584 commandalias XxXxX XxXxXx
585 commandalias XxXxXx echo huhu
586 commandalias XxXxXxX echo huhu
588 commandalias XxXxXx XxXxXxX
590 uncommandalias echo
591 commandalias XxXxXx echo huhu
593 __EOT
595 check behave:commandalias 0 "${MBOX}" '3694143612 31'
597 t_epilog
600 t_behave_ifelse() {
601 t_prolog
603 # Nestable conditions test
604 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}"
605 if 0
606 echo 1.err
607 else
608 echo 1.ok
609 endif
610 if 1
611 echo 2.ok
612 else
613 echo 2.err
614 endif
615 if $dietcurd
616 echo 3.err
617 else
618 echo 3.ok
619 endif
620 set dietcurd=yoho
621 if $dietcurd
622 echo 4.ok
623 else
624 echo 4.err
625 endif
626 if $dietcurd == 'yoho'
627 echo 5.ok
628 else
629 echo 5.err
630 endif
631 if $dietcurd @== 'Yoho'
632 echo 5-1.ok
633 else
634 echo 5-1.err
635 endif
636 if $dietcurd == 'Yoho'
637 echo 5-2.err
638 else
639 echo 5-2.ok
640 endif
641 if $dietcurd != 'yoho'
642 echo 6.err
643 else
644 echo 6.ok
645 endif
646 if $dietcurd @!= 'Yoho'
647 echo 6-1.err
648 else
649 echo 6-1.ok
650 endif
651 if $dietcurd != 'Yoho'
652 echo 6-2.ok
653 else
654 echo 6-2.err
655 endif
656 # Nesting
657 if faLse
658 echo 7.err1
659 if tRue
660 echo 7.err2
661 if yEs
662 echo 7.err3
663 else
664 echo 7.err4
665 endif
666 echo 7.err5
667 endif
668 echo 7.err6
669 else
670 echo 7.ok7
671 if YeS
672 echo 7.ok8
673 if No
674 echo 7.err9
675 else
676 echo 7.ok9
677 endif
678 echo 7.ok10
679 else
680 echo 7.err11
681 if yeS
682 echo 7.err12
683 else
684 echo 7.err13
685 endif
686 endif
687 echo 7.ok14
688 endif
689 if r
690 echo 8.ok1
691 if R
692 echo 8.ok2
693 else
694 echo 8.err2
695 endif
696 echo 8.ok3
697 else
698 echo 8.err1
699 endif
700 if s
701 echo 9.err1
702 else
703 echo 9.ok1
704 if S
705 echo 9.err2
706 else
707 echo 9.ok2
708 endif
709 echo 9.ok3
710 endif
711 # `elif'
712 if $dietcurd == 'yohu'
713 echo 10.err1
714 elif $dietcurd == 'yoha'
715 echo 10.err2
716 elif $dietcurd == 'yohe'
717 echo 10.err3
718 elif $dietcurd == 'yoho'
719 echo 10.ok1
720 if $dietcurd == 'yohu'
721 echo 10.err4
722 elif $dietcurd == 'yoha'
723 echo 10.err5
724 elif $dietcurd == 'yohe'
725 echo 10.err6
726 elif $dietcurd == 'yoho'
727 echo 10.ok2
728 if $dietcurd == 'yohu'
729 echo 10.err7
730 elif $dietcurd == 'yoha'
731 echo 10.err8
732 elif $dietcurd == 'yohe'
733 echo 10.err9
734 elif $dietcurd == 'yoho'
735 echo 10.ok3
736 else
737 echo 10.err10
738 endif
739 else
740 echo 10.err11
741 endif
742 else
743 echo 10.err12
744 endif
745 # integer
746 set dietcurd=10
747 if $dietcurd -lt 11
748 echo 11.ok1
749 if $dietcurd -gt 9
750 echo 11.ok2
751 else
752 echo 11.err2
753 endif
754 if $dietcurd -eq 10
755 echo 11.ok3
756 else
757 echo 11.err3
758 endif
759 if $dietcurd -ge 10
760 echo 11.ok4
761 else
762 echo 11.err4
763 endif
764 if $dietcurd -le 10
765 echo 11.ok5
766 else
767 echo 11.err5
768 endif
769 if $dietcurd -ge 11
770 echo 11.err6
771 else
772 echo 11.ok6
773 endif
774 if $dietcurd -le 9
775 echo 11.err7
776 else
777 echo 11.ok7
778 endif
779 else
780 echo 11.err1
781 endif
782 set dietcurd=Abc
783 if $dietcurd < aBd
784 echo 12.ok1
785 if $dietcurd @> abB
786 echo 12.ok2
787 else
788 echo 12.err2
789 endif
790 if $dietcurd @== aBC
791 echo 12.ok3
792 else
793 echo 12.err3
794 endif
795 if $dietcurd @>= AbC
796 echo 12.ok4
797 else
798 echo 12.err4
799 endif
800 if $dietcurd @<= ABc
801 echo 12.ok5
802 else
803 echo 12.err5
804 endif
805 if $dietcurd @>= abd
806 echo 12.err6
807 else
808 echo 12.ok6
809 endif
810 if $dietcurd @<= abb
811 echo 12.err7
812 else
813 echo 12.ok7
814 endif
815 else
816 echo 12.err1
817 endif
818 if $dietcurd < aBc
819 echo 12-1.ok
820 else
821 echo 12-1.err
822 endif
823 if $dietcurd @< aBc
824 echo 12-2.err
825 else
826 echo 12-2.ok
827 endif
828 if $dietcurd > ABc
829 echo 12-3.ok
830 else
831 echo 12-3.err
832 endif
833 if $dietcurd @> ABc
834 echo 12-3.err
835 else
836 echo 12-3.ok
837 endif
838 if $dietcurd @i=% aB
839 echo 13.ok
840 else
841 echo 13.err
842 endif
843 if $dietcurd =% aB
844 echo 13-1.err
845 else
846 echo 13-1.ok
847 endif
848 if $dietcurd @=% bC
849 echo 14.ok
850 else
851 echo 14.err
852 endif
853 if $dietcurd !% aB
854 echo 15-1.ok
855 else
856 echo 15-1.err
857 endif
858 if $dietcurd @!% aB
859 echo 15-2.err
860 else
861 echo 15-2.ok
862 endif
863 if $dietcurd !% bC
864 echo 15-3.ok
865 else
866 echo 15-3.err
867 endif
868 if $dietcurd @!% bC
869 echo 15-4.err
870 else
871 echo 15-4.ok
872 endif
873 if $dietcurd =% Cd
874 echo 16.err
875 else
876 echo 16.ok
877 endif
878 if $dietcurd !% Cd
879 echo 17.ok
880 else
881 echo 17.err
882 endif
883 set diet=abc curd=abc
884 if $diet == $curd
885 echo 18.ok
886 else
887 echo 18.err
888 endif
889 set diet=abc curd=abcd
890 if $diet != $curd
891 echo 19.ok
892 else
893 echo 19.err
894 endif
895 # 1. Shitty grouping capabilities as of today
896 unset diet curd ndefined
897 if [ [ false ] || [ false ] || [ true ] ] && [ [ false ] || [ true ] ] && \
898 [ yes ]
899 echo 20.ok
900 else
901 echo 20.err
902 endif
903 if [ [ [ [ 0 ] || [ 1 ] ] && [ [ 1 ] || [ 0 ] ] ] && [ 1 ] ] && [ yes ]
904 echo 21.ok
905 else
906 echo 21.err
907 endif
908 if [ [ 1 ] || [ 0 ] || [ 0 ] || [ 0 ] ]
909 echo 22.ok
910 else
911 echo 22.err
912 endif
913 if [ [ 1 ] || [ 0 ] || [ 0 ] || [ 0 ] || [ [ 1 ] ] ]
914 echo 23.ok
915 else
916 echo 23.err
917 endif
918 if [ [ 1 ] || [ 0 ] || [ 0 ] || [ 0 ] || [ [ 1 ] ] || [ 1 ] ] && [ no ]
919 echo 24.err
920 else
921 echo 24.ok
922 endif
923 if [ [ 1 ] || [ 0 ] || [ 0 ] || [ 0 ] || [ [ 1 ] ] || [ 1 ] ] \
924 && [ no ] || [ yes ]
925 echo 25.ok
926 else
927 echo 25.err
928 endif
929 if [ [ [ [ [ [ [ 1 ] ] && [ 1 ] ] && [ 1 ] ] && [ 1 ] ] ] && [ 1 ] ]
930 echo 26.ok
931 else
932 echo 26.err
933 endif
934 if [ [ [ [ [ [ [ 1 ] ] && [ 1 ] ] && [ 1 ] ] && [ 1 ] ] ] && [ 0 ] ]
935 echo 27.err
936 else
937 echo 27.ok
938 endif
939 if [ [ [ [ [ [ [ 1 ] ] && [ 1 ] ] && [ 0 ] ] && [ 1 ] ] ] && [ 1 ] ]
940 echo 28.err
941 else
942 echo 28.ok
943 endif
944 if [ [ [ [ [ [ [ 0 ] ] && [ 1 ] ] && [ 1 ] ] && [ 1 ] ] ] && [ 1 ] ]
945 echo 29.err
946 else
947 echo 29.ok
948 endif
949 if [ 1 ] || [ 0 ] || [ 0 ] || [ 0 ] && [ 0 ]
950 echo 30.err
951 else
952 echo 30.ok
953 endif
954 if [ 1 ] || [ 0 ] || [ 0 ] || [ 0 ] && [ 1 ]
955 echo 31.ok
956 else
957 echo 31.err
958 endif
959 if [ 0 ] || [ 0 ] || [ 0 ] || [ 1 ] && [ 0 ]
960 echo 32.err
961 else
962 echo 32.ok
963 endif
964 if [ 0 ] || [ 0 ] || [ 0 ] || [ 1 ] && [ 1 ]
965 echo 33.ok
966 else
967 echo 33.err
968 endif
969 if [ 0 ] || [ 0 ] || [ 0 ] || [ 1 ] && [ 0 ] || [ 1 ] && [ 0 ]
970 echo 34.err
971 else
972 echo 34.ok
973 endif
974 if [ 0 ] || [ 0 ] || [ 0 ] || [ 1 ] && [ 0 ] || [ 1 ] && [ 1 ]
975 echo 35.ok
976 else
977 echo 35.err
978 endif
979 set diet=yo curd=ho
980 if [ [ $diet == 'yo' ] && [ $curd == 'ho' ] ] && [ $ndefined ]
981 echo 36.err
982 else
983 echo 36.ok
984 endif
985 set ndefined
986 if [ [ $diet == 'yo' ] && [ $curd == 'ho' ] ] && [ $ndefined ]
987 echo 37.ok
988 else
989 echo 37.err
990 endif
991 # 2. Shitty grouping capabilities as of today
992 unset diet curd ndefined
993 if [ false || false || true ] && [ false || true ] && yes
994 echo 40.ok
995 else
996 echo 40.err
997 endif
998 if [ [ [ 0 || 1 ] && [ 1 || 0 ] ] && 1 ] && [ yes ]
999 echo 41.ok
1000 else
1001 echo 41.err
1002 endif
1003 if [ 1 || 0 || 0 || 0 ]
1004 echo 42.ok
1005 else
1006 echo 42.err
1007 endif
1008 if [ 1 || 0 || 0 || 0 || [ 1 ] ]
1009 echo 43.ok
1010 else
1011 echo 43.err
1012 endif
1013 if [ 1 || 0 || 0 || 0 || [ 1 ] || 1 ] && no
1014 echo 44.err
1015 else
1016 echo 44.ok
1017 endif
1018 if [ 1 || 0 || 0 || 0 || 1 || [ 1 ] ] && no || [ yes ]
1019 echo 45.ok
1020 else
1021 echo 45.err
1022 endif
1023 if [ [ [ [ [ [ 1 ] && 1 ] && 1 ] && 1 ] ] && [ 1 ] ]
1024 echo 46.ok
1025 else
1026 echo 46.err
1027 endif
1028 if [ [ [ [ [ [ 1 ] && 1 ] && 1 ] && [ 1 ] ] ] && 0 ]
1029 echo 47.err
1030 else
1031 echo 47.ok
1032 endif
1033 if [ [ [ [ [ [ [ 1 ] ] && 1 ] && 0 ] && [ 1 ] ] ] && 1 ]
1034 echo 48.err
1035 else
1036 echo 48.ok
1037 endif
1038 if [ [ [ [ [ [ 0 ] && 1 ] && 1 ] && 1 ] ] && 1 ]
1039 echo 49.err
1040 else
1041 echo 49.ok
1042 endif
1043 if 1 || 0 || 0 || 0 && 0
1044 echo 50.err
1045 else
1046 echo 50.ok
1047 endif
1048 if 1 || 0 || 0 || 0 && 1
1049 echo 51.ok
1050 else
1051 echo 51.err
1052 endif
1053 if 0 || 0 || 0 || 1 && 0
1054 echo 52.err
1055 else
1056 echo 52.ok
1057 endif
1058 if 0 || 0 || 0 || 1 && 1
1059 echo 53.ok
1060 else
1061 echo 53.err
1062 endif
1063 if 0 || 0 || 0 || 1 && 0 || 1 && 0
1064 echo 54.err
1065 else
1066 echo 54.ok
1067 endif
1068 if 0 || 0 || 0 || 1 && 0 || 1 && 1
1069 echo 55.ok
1070 else
1071 echo 55.err
1072 endif
1073 set diet=yo curd=ho
1074 if [ $diet == 'yo' && $curd == 'ho' ] && $ndefined
1075 echo 56.err
1076 else
1077 echo 56.ok
1078 endif
1079 if $diet == 'yo' && $curd == 'ho' && $ndefined
1080 echo 57.err
1081 else
1082 echo 57.ok
1083 endif
1084 set ndefined
1085 if [ $diet == 'yo' && $curd == 'ho' ] && $ndefined
1086 echo 57.ok
1087 else
1088 echo 57.err
1089 endif
1090 if $diet == 'yo' && $curd == 'ho' && $ndefined
1091 echo 58.ok
1092 else
1093 echo 58.err
1094 endif
1095 if [ [ [ [ [ [ $diet == 'yo' && $curd == 'ho' && $ndefined ] ] ] ] ] ]
1096 echo 59.ok
1097 else
1098 echo 59.err
1099 endif
1100 # Some more en-braced variables
1101 set diet=yo curd=ho
1102 if ${diet} == ${curd}
1103 echo 70.err
1104 else
1105 echo 70.ok
1106 endif
1107 if ${diet} != ${curd}
1108 echo 71.ok
1109 else
1110 echo 71.err
1111 endif
1112 if $diet == ${curd}
1113 echo 72.err
1114 else
1115 echo 72.ok
1116 endif
1117 if ${diet} == $curd
1118 echo 73.err
1119 else
1120 echo 73.ok
1121 endif
1122 # Unary !
1123 if ! 0 && ! ! 1 && ! ! ! ! 2 && 3
1124 echo 80.ok
1125 else
1126 echo 80.err
1127 endif
1128 if ! 0 && ! [ ! 1 ] && ! [ ! [ ! [ ! 2 ] ] ] && 3
1129 echo 81.ok
1130 else
1131 echo 81.err
1132 endif
1133 if [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ ! [ 2 ] ] ] ] ] && 3
1134 echo 82.ok
1135 else
1136 echo 82.err
1137 endif
1138 if [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ ! [ 2 ] ] ] ] ] && ! 3
1139 echo 83.err
1140 else
1141 echo 83.ok
1142 endif
1143 if [ ! 0 ] && [ ! [ ! 1 ] ] && ! [ [ ! [ ! [ ! [ 2 ] ] ] ] ] && ! 3
1144 echo 84.err
1145 else
1146 echo 84.ok
1147 endif
1148 if [ ! 0 ] && ! [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ ! [ 2 ] ] ] ] ] && 3
1149 echo 85.err
1150 else
1151 echo 85.ok
1152 endif
1153 if ! [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ ! [ 2 ] ] ] ] ] && 3
1154 echo 86.err
1155 else
1156 echo 86.ok
1157 endif
1158 if [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ ! [ 2 ] ] ] ] ] || 3
1159 echo 87.ok
1160 else
1161 echo 87.err
1162 endif
1163 if [ ! 0 ] && [ ! ! [ ! ! 1 ] ] && [ ! ! [ ! ! [ ! ! [ ! ! [ 2 ] ] ] ] ]
1164 echo 88.ok
1165 else
1166 echo 88.err
1167 endif
1168 # Unary !, odd
1169 if ! 0 && ! ! 1 && ! ! ! 0 && 3
1170 echo 90.ok
1171 else
1172 echo 90.err
1173 endif
1174 if ! 0 && ! [ ! 1 ] && ! [ ! [ ! [ 0 ] ] ] && 3
1175 echo 91.ok
1176 else
1177 echo 91.err
1178 endif
1179 if [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ [ 0 ] ] ] ] ] && 3
1180 echo 92.ok
1181 else
1182 echo 92.err
1183 endif
1184 if [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! ! [ ! [ ! 0 ] ] ] ] && ! 3
1185 echo 93.err
1186 else
1187 echo 93.ok
1188 endif
1189 if [ ! 0 ] && [ ! [ ! 1 ] ] && ! [ ! [ ! [ ! [ ! 0 ] ] ] ] && 3
1190 echo 94.ok
1191 else
1192 echo 94.err
1193 endif
1194 if [ ! 0 ] && ! [ ! [ ! 1 ] ] && [ ! ! [ ! [ ! [ ! [ 0 ] ] ] ] ] && 3
1195 echo 95.err
1196 else
1197 echo 95.ok
1198 endif
1199 if ! [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ ! ! 0 ] ] ] ] && 3
1200 echo 96.err
1201 else
1202 echo 96.ok
1203 endif
1204 if [ ! 0 ] && [ ! [ ! 1 ] ] && [ ! [ ! [ ! [ ! [ ! 0 ] ] ] ] ] || 3
1205 echo 97.ok
1206 else
1207 echo 97.err
1208 endif
1209 if [ ! 0 ] && [ ! ! [ ! ! 1 ] ] && [ ! ! [ ! ! [ ! ! [ ! [ 0 ] ] ] ] ]
1210 echo 98.ok
1211 else
1212 echo 98.err
1213 endif
1214 __EOT
1216 check behave:if-normal 0 "${MBOX}" '1688759742 719'
1218 if have_feat regex; then
1219 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}"
1220 set dietcurd=yoho
1221 if $dietcurd =~ '^yo.*'
1222 echo 1.ok
1223 else
1224 echo 1.err
1225 endif
1226 if $dietcurd =~ '^Yo.*'
1227 echo 1-1.err
1228 else
1229 echo 1-1.ok
1230 endif
1231 if $dietcurd @=~ '^Yo.*'
1232 echo 1-2.ok
1233 else
1234 echo 1-2.err
1235 endif
1236 if $dietcurd =~ '^yOho.+'
1237 echo 2.err
1238 else
1239 echo 2.ok
1240 endif
1241 if $dietcurd @!~ '.*Ho$'
1242 echo 3.err
1243 else
1244 echo 3.ok
1245 endif
1246 if $dietcurd !~ '.+yohO$'
1247 echo 4.ok
1248 else
1249 echo 4.err
1250 endif
1251 if [ $dietcurd @i!~ '.+yoho$' ]
1252 echo 5.ok
1253 else
1254 echo 5.err
1255 endif
1256 if ! [ $dietcurd @i=~ '.+yoho$' ]
1257 echo 6.ok
1258 else
1259 echo 6.err
1260 endif
1261 if ! ! [ $dietcurd @i!~ '.+yoho$' ]
1262 echo 7.ok
1263 else
1264 echo 7.err
1265 endif
1266 if ! [ ! [ $dietcurd @i!~ '.+yoho$' ] ]
1267 echo 8.ok
1268 else
1269 echo 8.err
1270 endif
1271 if [ ! [ ! [ $dietcurd @i!~ '.+yoho$' ] ] ]
1272 echo 9.ok
1273 else
1274 echo 9.err
1275 endif
1276 if ! [ ! [ ! [ $dietcurd !~ '.+yoho$' ] ] ]
1277 echo 10.err
1278 else
1279 echo 10.ok
1280 endif
1281 if ! ! ! $dietcurd !~ '.+yoho$'
1282 echo 11.err
1283 else
1284 echo 11.ok
1285 endif
1286 if ! ! ! $dietcurd =~ '.+yoho$'
1287 echo 12.ok
1288 else
1289 echo 12.err
1290 endif
1291 if ! [ ! ! [ ! [ $dietcurd !~ '.+yoho$' ] ] ]
1292 echo 13.ok
1293 else
1294 echo 13.err
1295 endif
1296 set diet=abc curd='^abc$'
1297 if $diet =~ $curd
1298 echo 14.ok
1299 else
1300 echo 14.err
1301 endif
1302 set diet=abc curd='^abcd$'
1303 if $diet !~ $curd
1304 echo 15.ok
1305 else
1306 echo 15.err
1307 endif
1308 __EOT
1310 check behave:if-regex 0 "${MBOX}" '1115671789 95'
1311 else
1312 printf 'behave:if-regex: unsupported, skipped\n'
1315 t_epilog
1318 t_behave_localopts() {
1319 t_prolog
1321 # Nestable conditions test
1322 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}" 2>&1
1323 define t2 {
1324 echo in: t2
1325 set t2=t2
1326 echo $t2
1328 define t1 {
1329 echo in: t1
1330 set gv1=gv1
1331 localopts on
1332 set lv1=lv1 lv2=lv2
1333 set lv3=lv3
1334 call t2
1335 localopts off
1336 set gv2=gv2
1337 echo $gv1 $lv1 ${lv2} ${lv3} ${gv2}, $t2
1339 define t0 {
1340 echo in: t0
1341 call t1
1342 echo $gv1 $lv1 ${lv2} ${lv3} ${gv2}, $t2
1343 echo "$gv1 $lv1 ${lv2} ${lv3} ${gv2}, $t2"
1345 account trouble {
1346 echo in: trouble
1347 call t0
1349 call t0
1350 unset gv1 gv2
1351 account trouble
1352 echo active trouble: $gv1 $lv1 ${lv2} ${lv3} ${gv2}, $t3
1353 account null
1354 echo active null: $gv1 $lv1 ${lv2} ${lv3} ${gv2}, $t3
1357 define ll2 {
1358 localopts $1
1359 set x=2
1360 echo ll2=$x
1362 define ll1 {
1363 wysh set y=$1; shift; eval localopts $y; localopts $1; shift
1364 set x=1
1365 echo ll1.1=$x
1366 call ll2 $1
1367 echo ll1.2=$x
1369 define ll0 {
1370 wysh set y=$1; shift; eval localopts $y; localopts $1; shift
1371 set x=0
1372 echo ll0.1=$x
1373 call ll1 $y "$@"
1374 echo ll0.2=$x
1376 define llx {
1377 echo ----- $1: $2 -> $3 -> $4
1378 echo ll-1.1=$x
1379 eval localopts $1
1380 call ll0 "$@"
1381 echo ll-1.2=$x
1382 unset x
1384 define lly {
1385 call llx 'call off' on on on
1386 call llx 'call off' off on on
1387 call llx 'call off' on off on
1388 call llx 'call off' on off off
1389 localopts call-fixate on
1390 call llx 'call-fixate on' on on on
1391 call llx 'call-fixate on' off on on
1392 call llx 'call-fixate on' on off on
1393 call llx 'call-fixate on' on off off
1394 unset x;localopts call on
1395 call llx 'call on' on on on
1396 call llx 'call on' off on on
1397 call llx 'call on' on off on
1398 call llx 'call on' on off off
1400 call lly
1401 __EOT
1403 check behave:localopts 0 "${MBOX}" '4016155249 1246'
1405 t_epilog
1408 t_behave_macro_param_shift() {
1409 t_prolog
1411 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}" 2>/dev/null
1412 define t2 {
1413 echo in: t2
1414 echo t2.0 has $#/${#} parameters: "$1,${2},$3" (${*}) [$@]
1415 localopts on
1416 wysh set ignerr=$1
1417 shift
1418 localopts off
1419 echo t2.1 has $#/${#} parameters: "$1,${2},$3" (${*}) [$@]
1420 if [ $# > 1 ] || [ $ignerr == '' ]
1421 shift 2
1422 else
1423 ignerr shift 2
1424 endif
1425 echo t2.2:$? has $#/${#} parameters: "$1,${2},$3" (${*}) [$@]
1426 shift 0
1427 echo t2.3:$? has $#/${#} parameters: "$1,${2},$3" (${*}) [$@]
1428 if [ $# > 0 ]
1429 shift
1430 endif
1431 echo t2.4:$? has $#/${#} parameters: "$1,${2},$3" (${*}) [$@]
1433 define t1 {
1434 set errexit
1435 echo in: t1
1436 call t2 1 you get four args
1437 echo t1.1: $?';' ignerr ($ignerr) should not exist
1438 call t2 1 you get 'three args'
1439 echo t1.2: $?';' ignerr ($ignerr) should not exist
1440 call t2 1 you 'get two args'
1441 echo t1.3: $?';' ignerr ($ignerr) should not exist
1442 call t2 1 'you get one arg'
1443 echo t1.4: $?';' ignerr ($ignerr) should not exist
1444 ignerr call t2 '' 'you get one arg'
1445 echo t1.5: $?';' ignerr ($ignerr) should not exist
1447 call t1
1448 __EOT
1450 check behave:macro_param_shift 0 "${MBOX}" '1402489146 1682'
1452 t_epilog
1455 t_behave_addrcodec() {
1456 t_prolog
1458 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}"
1459 vput addrcodec res e 1 <doog@def>
1460 echo $?/$^ERRNAME $res
1461 eval vput addrcodec res d $res
1462 echo $?/$^ERRNAME $res
1463 vput addrcodec res e 2 . <doog@def>
1464 echo $?/$^ERRNAME $res
1465 eval vput addrcodec res d $res
1466 echo $?/$^ERRNAME $res
1467 vput addrcodec res e 3 Sauer Dr. <doog@def>
1468 echo $?/$^ERRNAME $res
1469 eval vput addrcodec res d $res
1470 echo $?/$^ERRNAME $res
1471 vput addrcodec res e 3.50 Sauer (Ma) Dr. <doog@def>
1472 echo $?/$^ERRNAME $res
1473 eval vput addrcodec res d $res
1474 echo $?/$^ERRNAME $res
1475 vput addrcodec res e 3.51 Sauer (Ma) "Dr." <doog@def>
1476 echo $?/$^ERRNAME $res
1477 eval vput addrcodec res d $res
1478 echo $?/$^ERRNAME $res
1480 vput addrcodec res +e 4 Sauer (Ma) Dr. <doog@def>
1481 echo $?/$^ERRNAME $res
1482 eval vput addrcodec res d $res
1483 echo $?/$^ERRNAME $res
1484 vput addrcodec res +e 5 Sauer (Ma) Braten Dr. <doog@def>
1485 echo $?/$^ERRNAME $res
1486 eval vput addrcodec res d $res
1487 echo $?/$^ERRNAME $res
1488 vput addrcodec res +e 6 Sauer (Ma) Braten Dr. (Heu) <doog@def>
1489 echo $?/$^ERRNAME $res
1490 eval vput addrcodec res d $res
1491 echo $?/$^ERRNAME $res
1492 vput addrcodec res +e 7 Sauer (Ma) Braten Dr. (Heu) <doog@def> (bu)
1493 echo $?/$^ERRNAME $res
1494 eval vput addrcodec res d $res
1495 echo $?/$^ERRNAME $res
1496 vput addrcodec res +e 8 \
1497 Dr. Sauer (Ma) Braten Dr. (Heu) <doog@def> (bu) Boom. Boom
1498 echo $?/$^ERRNAME $res
1499 eval vput addrcodec res d $res
1500 echo $?/$^ERRNAME $res
1501 vput addrcodec res +e 9 Dr.Sauer(Ma)Braten Dr. (Heu) <doog@def>
1502 echo $?/$^ERRNAME $res
1503 eval vput addrcodec res d $res
1504 echo $?/$^ERRNAME $res
1505 vput addrcodec res +e 10 (Ma)Braten Dr. (Heu) <doog@def>
1506 echo $?/$^ERRNAME $res
1507 eval vput addrcodec res d $res
1508 echo $?/$^ERRNAME $res
1509 vput addrcodec res +e 11 (Ma)Braten Dr"." (Heu) <doog@def>
1510 echo $?/$^ERRNAME $res
1511 eval vput addrcodec res d $res
1512 echo $?/$^ERRNAME $res
1513 vput addrcodec res +e 12 Dr. Sauer (Ma) Braten Dr. (u) <doog@def>
1514 echo $?/$^ERRNAME $res
1515 eval vput addrcodec res d $res
1516 echo $?/$^ERRNAME $res
1517 vput addrcodec res +e 13(Ma)Braten Dr. (Heu) <doog@def>
1518 echo $?/$^ERRNAME $res
1519 eval vput addrcodec res d $res
1520 echo $?/$^ERRNAME $res
1521 vput addrcodec res +e 14 Hey, Du <doog@def> Wie() findet Dr. das? ()
1522 echo $?/$^ERRNAME $res
1523 eval vput addrcodec res d $res
1524 echo $?/$^ERRNAME $res
1525 vput addrcodec res +e 15 \
1526 Hey, Du <doog@def> Wie() findet "" Dr. "" das? ()
1527 echo $?/$^ERRNAME $res
1528 eval vput addrcodec res d $res
1529 echo $?/$^ERRNAME $res
1530 vput addrcodec res +e 16 \
1531 "Hey," "Du" <doog@def> "Wie()" findet "" Dr. "" das? ()
1532 echo $?/$^ERRNAME $res
1533 eval vput addrcodec res d $res
1534 echo $?/$^ERRNAME $res
1535 vput addrcodec res +e 17 \
1536 "Hey" Du <doog@def> "Wie() findet " " Dr. """ das? ()
1537 echo $?/$^ERRNAME $res
1538 eval vput addrcodec res d $res
1539 echo $?/$^ERRNAME $res
1540 vput addrcodec res +e 18 \
1541 <doog@def> "Hey" Du "Wie() findet " " Dr. """ das? ()
1542 echo $?/$^ERRNAME $res
1543 eval vput addrcodec res d $res
1544 echo $?/$^ERRNAME $res
1545 vput addrcodec res +e 19 Hey\,\" <doog@def> "Wie()" findet \" Dr. \" das?
1546 echo $?/$^ERRNAME $res
1547 eval vput addrcodec res d $res
1548 echo $?/$^ERRNAME $res
1550 vput addrcodec res ++e 20 Hey\,\" <doog@def> "Wie()" findet \" Dr. \" das?
1551 echo $?/$^ERRNAME $res
1552 vput addrcodec res ++e 21 Hey\,\"" <doog@def> "Wie()" findet \" Dr. \" das?
1553 echo $?/$^ERRNAME $res
1554 eval vput addrcodec res d $res
1555 echo $?/$^ERRNAME $res
1557 vput addrcodec res +++e 22 Hey\\,\" <doog@def> "Wie()" findet \" Dr. \" das?
1558 echo $?/$^ERRNAME $res
1559 eval vput addrcodec res d $res
1560 echo $?/$^ERRNAME $res
1562 vput addrcodec res s \
1563 "23 Hey\\,\\\" \"Wie" () "\" findet \\\" Dr. \\\" das?" <doog@def>
1564 echo $?/$^ERRNAME $res
1565 __EOT
1567 check behave:addrcodec 0 "${MBOX}" '429099645 2414'
1569 t_epilog
1572 t_behave_vexpr() {
1573 t_prolog
1575 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}" 2>/dev/null
1576 vput vexpr res = 9223372036854775807
1577 echo $?/$^ERRNAME $res
1578 vput vexpr res = 9223372036854775808
1579 echo $?/$^ERRNAME $res
1580 vput vexpr res =@ 9223372036854775808
1581 echo $?/$^ERRNAME $res
1582 vput vexpr res = -9223372036854775808
1583 echo $?/$^ERRNAME $res
1584 vput vexpr res = -9223372036854775809
1585 echo $?/$^ERRNAME $res
1586 vput vexpr res =@ -9223372036854775809
1587 echo $?/$^ERRNAME $res
1588 echo ' #1'
1589 vput vexpr res ~ 0
1590 echo $?/$^ERRNAME $res
1591 vput vexpr res ~ 1
1592 echo $?/$^ERRNAME $res
1593 vput vexpr res ~ -1
1594 echo $?/$^ERRNAME $res
1595 echo ' #2'
1596 vput vexpr res + 0 0
1597 echo $?/$^ERRNAME $res
1598 vput vexpr res + 0 1
1599 echo $?/$^ERRNAME $res
1600 vput vexpr res + 1 1
1601 echo $?/$^ERRNAME $res
1602 echo ' #3'
1603 vput vexpr res + 9223372036854775807 0
1604 echo $?/$^ERRNAME $res
1605 vput vexpr res + 9223372036854775807 1
1606 echo $?/$^ERRNAME $res
1607 vput vexpr res +@ 9223372036854775807 1
1608 echo $?/$^ERRNAME $res
1609 vput vexpr res + 0 9223372036854775807
1610 echo $?/$^ERRNAME $res
1611 vput vexpr res + 1 9223372036854775807
1612 echo $?/$^ERRNAME $res
1613 vput vexpr res +@ 1 9223372036854775807
1614 echo $?/$^ERRNAME $res
1615 echo ' #4'
1616 vput vexpr res + -9223372036854775808 0
1617 echo $?/$^ERRNAME $res
1618 vput vexpr res + -9223372036854775808 -1
1619 echo $?/$^ERRNAME $res
1620 vput vexpr res +@ -9223372036854775808 -1
1621 echo $?/$^ERRNAME $res
1622 vput vexpr res + 0 -9223372036854775808
1623 echo $?/$^ERRNAME $res
1624 vput vexpr res + -1 -9223372036854775808
1625 echo $?/$^ERRNAME $res
1626 vput vexpr res +@ -1 -9223372036854775808
1627 echo $?/$^ERRNAME $res
1628 echo ' #5'
1629 vput vexpr res - 0 0
1630 echo $?/$^ERRNAME $res
1631 vput vexpr res - 0 1
1632 echo $?/$^ERRNAME $res
1633 vput vexpr res - 1 1
1634 echo $?/$^ERRNAME $res
1635 echo ' #6'
1636 vput vexpr res - 9223372036854775807 0
1637 echo $?/$^ERRNAME $res
1638 vput vexpr res - 9223372036854775807 -1
1639 echo $?/$^ERRNAME $res
1640 vput vexpr res -@ 9223372036854775807 -1
1641 echo $?/$^ERRNAME $res
1642 vput vexpr res - 0 9223372036854775807
1643 echo $?/$^ERRNAME $res
1644 vput vexpr res - -1 9223372036854775807
1645 echo $?/$^ERRNAME $res
1646 vput vexpr res - -2 9223372036854775807
1647 echo $?/$^ERRNAME $res
1648 vput vexpr res -@ -2 9223372036854775807
1649 echo $?/$^ERRNAME $res
1650 echo ' #7'
1651 vput vexpr res - -9223372036854775808 +0
1652 echo $?/$^ERRNAME $res
1653 vput vexpr res - -9223372036854775808 +1
1654 echo $?/$^ERRNAME $res
1655 vput vexpr res -@ -9223372036854775808 +1
1656 echo $?/$^ERRNAME $res
1657 vput vexpr res - 0 -9223372036854775808
1658 echo $?/$^ERRNAME $res
1659 vput vexpr res - +1 -9223372036854775808
1660 echo $?/$^ERRNAME $res
1661 vput vexpr res -@ +1 -9223372036854775808
1662 echo $?/$^ERRNAME $res
1663 echo ' #8'
1664 vput vexpr res + -13 -2
1665 echo $?/$^ERRNAME $res
1666 vput vexpr res - 0 0
1667 echo $?/$^ERRNAME $res
1668 vput vexpr res - 0 1
1669 echo $?/$^ERRNAME $res
1670 vput vexpr res - 1 1
1671 echo $?/$^ERRNAME $res
1672 vput vexpr res - -13 -2
1673 echo $?/$^ERRNAME $res
1674 echo ' #9'
1675 vput vexpr res * 0 0
1676 echo $?/$^ERRNAME $res
1677 vput vexpr res * 0 1
1678 echo $?/$^ERRNAME $res
1679 vput vexpr res * 1 1
1680 echo $?/$^ERRNAME $res
1681 vput vexpr res * -13 -2
1682 echo $?/$^ERRNAME $res
1683 echo ' #10'
1684 vput vexpr res / 0 0
1685 echo $?/$^ERRNAME $res
1686 vput vexpr res / 0 1
1687 echo $?/$^ERRNAME $res
1688 vput vexpr res / 1 1
1689 echo $?/$^ERRNAME $res
1690 vput vexpr res / -13 -2
1691 echo $?/$^ERRNAME $res
1692 echo ' #11'
1693 vput vexpr res % 0 0
1694 echo $?/$^ERRNAME $res
1695 vput vexpr res % 0 1
1696 echo $?/$^ERRNAME $res
1697 vput vexpr res % 1 1
1698 echo $?/$^ERRNAME $res
1699 vput vexpr res % -13 -2
1700 echo $?/$^ERRNAME $res
1701 __EOT
1703 check behave:vexpr-numeric 0 "${MBOX}" '1723609217 1048'
1705 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}" #2>/dev/null
1706 vput vexpr res find 'bananarama' 'nana'
1707 echo $?/$^ERRNAME :$res:
1708 vput vexpr res find 'bananarama' 'bana'
1709 echo $?/$^ERRNAME :$res:
1710 vput vexpr res find 'bananarama' 'Bana'
1711 echo $?/$^ERRNAME :$res:
1712 vput vexpr res find 'bananarama' 'rama'
1713 echo $?/$^ERRNAME :$res:
1714 echo ' #1'
1715 vput vexpr res ifind 'bananarama' 'nana'
1716 echo $?/$^ERRNAME :$res:
1717 vput vexpr res ifind 'bananarama' 'bana'
1718 echo $?/$^ERRNAME :$res:
1719 vput vexpr res ifind 'bananarama' 'Bana'
1720 echo $?/$^ERRNAME :$res:
1721 vput vexpr res ifind 'bananarama' 'rama'
1722 echo $?/$^ERRNAME :$res:
1723 echo ' #2'
1724 vput vexpr res substring 'bananarama' 1
1725 echo $?/$^ERRNAME :$res:
1726 vput vexpr res substring 'bananarama' 3
1727 echo $?/$^ERRNAME :$res:
1728 vput vexpr res substring 'bananarama' 5
1729 echo $?/$^ERRNAME :$res:
1730 vput vexpr res substring 'bananarama' 7
1731 echo $?/$^ERRNAME :$res:
1732 vput vexpr res substring 'bananarama' 9
1733 echo $?/$^ERRNAME :$res:
1734 vput vexpr res substring 'bananarama' 10
1735 echo $?/$^ERRNAME :$res:
1736 vput vexpr res substring 'bananarama' 1 3
1737 echo $?/$^ERRNAME :$res:
1738 vput vexpr res substring 'bananarama' 3 3
1739 echo $?/$^ERRNAME :$res:
1740 vput vexpr res substring 'bananarama' 5 3
1741 echo $?/$^ERRNAME :$res:
1742 vput vexpr res substring 'bananarama' 7 3
1743 echo $?/$^ERRNAME :$res:
1744 vput vexpr res substring 'bananarama' 9 3
1745 echo $?/$^ERRNAME :$res:
1746 vput vexpr res substring 'bananarama' 10 3
1747 echo $?/$^ERRNAME :$res:
1748 echo ' #3'
1749 __EOT
1751 check behave:vexpr-string 0 "${MBOX}" '265398700 267'
1753 if have_feat regex; then
1754 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}" #2>/dev/null
1755 vput vexpr res regex 'bananarama' 'nana'
1756 echo $?/$^ERRNAME :$res:
1757 vput vexpr res regex 'bananarama' 'bana'
1758 echo $?/$^ERRNAME :$res:
1759 vput vexpr res regex 'bananarama' 'Bana'
1760 echo $?/$^ERRNAME :$res:
1761 vput vexpr res regex 'bananarama' 'rama'
1762 echo $?/$^ERRNAME :$res:
1763 echo ' #1'
1764 vput vexpr res iregex 'bananarama' 'nana'
1765 echo $?/$^ERRNAME :$res:
1766 vput vexpr res iregex 'bananarama' 'bana'
1767 echo $?/$^ERRNAME :$res:
1768 vput vexpr res iregex 'bananarama' 'Bana'
1769 echo $?/$^ERRNAME :$res:
1770 vput vexpr res iregex 'bananarama' 'rama'
1771 echo $?/$^ERRNAME :$res:
1772 echo ' #2'
1773 vput vexpr res regex 'bananarama' '(.*)nana(.*)' '\${1}a\${0}u{\$2}'
1774 echo $?/$^ERRNAME :$res:
1775 vput vexpr res regex 'bananarama' '(.*)bana(.*)' '\${1}a\${0}u\$2'
1776 echo $?/$^ERRNAME :$res:
1777 vput vexpr res regex 'bananarama' 'Bana(.+)' '\$1\$0'
1778 echo $?/$^ERRNAME :$res:
1779 vput vexpr res regex 'bananarama' '(.+)rama' '\$1\$0'
1780 echo $?/$^ERRNAME :$res:
1781 echo ' #3'
1782 vput vexpr res iregex 'bananarama' '(.*)nana(.*)' '\${1}a\${0}u{\$2}'
1783 echo $?/$^ERRNAME :$res:
1784 vput vexpr res iregex 'bananarama' '(.*)bana(.*)' '\${1}a\${0}u\$2'
1785 echo $?/$^ERRNAME :$res:
1786 vput vexpr res iregex 'bananarama' 'Bana(.+)' '\$1\$0'
1787 echo $?/$^ERRNAME :$res:
1788 vput vexpr res iregex 'bananarama' '(.+)rama' '\$1\$0'
1789 echo $?/$^ERRNAME :$res:
1790 echo ' #4'
1791 __EOT
1793 check behave:vexpr-regex 0 "${MBOX}" '3270360157 311'
1794 else
1795 printf 'behave:vexpr-regex: unsupported, skipped\n'
1798 t_epilog
1801 t_behave_call_ret() {
1802 t_prolog
1804 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} -Snomemdebug > "${MBOX}" 2>&1
1805 define w1 {
1806 echon ">$1 "
1807 vput vexpr i + $1 1
1808 if [ $i -le 42 ]
1809 vput vexpr j '&' $i 7
1810 if [ $j -eq 7 ]
1811 echo .
1813 call w1 $i
1814 wysh set i=$? k=$!
1815 vput vexpr j '&' $i 7
1816 echon "<$1/$i/$k "
1817 if [ $j -eq 7 ]
1818 echo .
1820 else
1821 echo ! The end for $1
1823 return $1
1825 # Transport $?/$! up the call chain
1826 define w2 {
1827 echon ">$1 "
1828 vput vexpr i + $1 1
1829 if [ $1 -lt 42 ]
1830 call w2 $i
1831 wysh set i=$? j=$! k=$^ERRNAME
1832 echon "<$1/$i/$k "
1833 return $i $j
1834 else
1835 echo ! The end for $1
1836 return $i $^ERR-BUSY
1838 echoerr au
1840 # Up and down it goes
1841 define w3 {
1842 echon ">$1/$2 "
1843 vput vexpr i + $1 1
1844 if [ $1 -lt 42 ]
1845 call w3 $i $2
1846 wysh set i=$? j=$!
1847 vput vexpr k - $1 $2
1848 if [ $k -eq 21 ]
1849 vput vexpr i + $1 1
1850 vput vexpr j + $2 1
1851 echo "# <$i/$j> .. "
1852 call w3 $i $j
1853 wysh set i=$? j=$!
1855 eval echon "<\$1=\$i/\$^ERRNAME-$j "
1856 return $i $j
1857 else
1858 echo ! The end for $1=$i/$2
1859 if [ "$2" != "" ]
1860 return $i $^ERR-DOM
1861 else
1862 return $i $^ERR-BUSY
1865 echoerr au
1868 call w1 0; echo ?=$? !=$!; echo -----;
1869 call w2 0; echo ?=$? !=$^ERRNAME; echo -----;
1870 call w3 0 1; echo ?=$? !=$^ERRNAME; echo -----;
1871 __EOT
1873 check behave:call_ret 0 "${MBOX}" '1572045517 5922'
1875 t_epilog
1878 t_behave_xcall() {
1879 t_prolog
1881 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} -Snomemdebug > "${MBOX}" 2>&1
1882 define work {
1883 echon "$1 "
1884 vput vexpr i + $1 1
1885 if [ $i -le 1111 ]
1886 vput vexpr j '&' $i 7
1887 if [ $j -eq 7 ]
1888 echo .
1890 \xcall work $i $2
1892 echo ! The end for $1/$2
1893 if [ "$2" != "" ]
1894 return $i $^ERR-BUSY
1897 define xwork {
1898 \xcall work 0 $2
1900 call work 0
1901 echo ?=$? !=$!
1902 call xwork
1903 echo ?=$? !=$!
1904 xcall xwork
1905 echo ?=$? !=$^ERRNAME
1907 call work 0 yes
1908 echo ?=$? !=$^ERRNAME
1909 call xwork 0 yes
1910 echo ?=$? !=$^ERRNAME
1911 __EOT
1913 check behave:xcall-1 0 "${MBOX}" '2401702082 23801'
1917 ${cat} <<- '__EOT' > "${BODY}"
1918 define __w {
1919 echon "$1 "
1920 vput vexpr i + $1 1
1921 if [ $i -le 111 ]
1922 vput vexpr j '&' $i 7
1923 if [ $j -eq 7 ]
1924 echo .
1926 \xcall __w $i $2
1928 echo ! The end for $1
1929 if [ $2 -eq 0 ]
1930 nonexistingcommand
1931 echo would be err with errexit
1932 return
1934 echo calling exit
1935 exit
1937 define work {
1938 echo eins
1939 call __w 0 0
1940 echo zwei, ?=$? !=$!
1941 localopts yes; set errexit
1942 ignerr call __w 0 0
1943 echo drei, ?=$? !=$^ERRNAME
1944 call __w 0 $1
1945 echo vier, ?=$? !=$^ERRNAME, this is an error
1947 ignerr call work 0
1948 echo outer 1, ?=$? !=$^ERRNAME
1949 xxxign call work 0
1950 echo outer 2, ?=$? !=$^ERRNAME, could be error if xxxign non-empty
1951 call work 1
1952 echo outer 3, ?=$? !=$^ERRNAME
1953 echo this is definitely an error
1954 __EOT
1956 < "${BODY}" ${MAILX} ${ARGS} -X'commandalias xxxign ignerr' -Snomemdebug \
1957 > "${MBOX}" 2>&1
1958 check behave:xcall-2 0 "${MBOX}" '3900716531 4200'
1960 < "${BODY}" ${MAILX} ${ARGS} -X'commandalias xxxign " "' -Snomemdebug \
1961 > "${MBOX}" 2>&1
1962 check behave:xcall-3 1 "${MBOX}" '1006776201 2799'
1964 t_epilog
1967 t_behave_vpospar() {
1968 t_prolog
1970 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}" 2>&1
1971 vpospar set hey, "'you ", world!
1972 echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
1973 vput vpospar x quote; echo x<$x>
1974 vpospar clear;echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
1975 vput vpospar y quote;echo y<$y>
1976 eval vpospar set ${x};echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
1977 eval vpospar set ${y};echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
1978 eval vpospar set ${x};echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
1980 define infun2 {
1981 echo infun2:$?/$^ERRNAME/$#:$*/"$@"/<$1><$2><$3><$4>
1982 vput vpospar z quote;echo infun2:z<$z>
1985 define infun {
1986 echo infun:$?/$^ERRNAME/$#:$*/"$@"/<$1><$2><$3><$4>
1987 vput vpospar y quote;echo infun:y<$y>
1988 eval vpospar set ${x};echo infun:$?/$^ERRNAME/$#:$*/"$@"/<$1><$2><$3><$4>
1989 vpospar clear;echo infun:$?/$^ERRNAME/$#:$*/"$@"/<$1><$2><$3><$4>
1990 eval call infun2 $x
1991 echo infun:$?/$^ERRNAME/$#:$*/"$@"/<$1><$2><$3><$4>
1992 eval vpospar set ${y};echo infun:$?/$^ERRNAME/$#:$*/"$@"/<$1><$2><$3><$4>
1995 call infun This "in a" fun
1996 echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
1997 vpospar clear;echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
1998 __EOT
1999 check behave:vpospar-1 0 "${MBOX}" '155175639 866'
2002 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} > "${MBOX}" 2>&1
2003 set ifs=\'
2004 echo ifs<$ifs> ifs-ws<$ifs-ws>
2005 vpospar set hey, "'you ", world!
2006 echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2007 vput vpospar x quote; echo x<$x>
2008 vpospar clear;echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2009 eval vpospar set ${x};echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2011 set ifs=,
2012 echo ifs<$ifs> ifs-ws<$ifs-ws>
2013 vpospar set hey, "'you ", world!
2014 echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2015 vput vpospar x quote; echo x<$x>
2016 vpospar clear;echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2017 eval vpospar set ${x};echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2019 wysh set ifs=$',\t'
2020 echo ifs<$ifs> ifs-ws<$ifs-ws>
2021 vpospar set hey, "'you ", world!
2022 echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2023 vput vpospar x quote; echo x<$x>
2024 vpospar clear;echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2025 eval vpospar set ${x};echo $?/$^ERRNAME/$#: $* / "$@" / <$1><$2><$3><$4>
2026 __EOT
2027 check behave:vpospar-ifs 0 "${MBOX}" '2015927702 706'
2029 t_epilog
2032 t_behave_atxplode() {
2033 t_prolog
2034 TRAP_EXIT_ADDONS="./.t*"
2036 ${cat} > ./.t.sh <<- '___'; ${cat} > ./.t.rc <<- '___'
2037 x() { echo $#; }
2038 xxx() {
2039 printf " (1/$#: <$1>)"
2040 shift
2041 if [ $# -gt 0 ]; then
2042 xxx "$@"
2043 else
2044 echo
2047 yyy() {
2048 eval "$@ ' ball"
2050 set --
2051 x "$@"
2052 x "$@"''
2053 x " $@"
2054 x "$@ "
2055 printf yyy;yyy 'xxx' "b\$'\t'u ' "
2056 printf xxx;xxx arg ,b u.
2057 printf xxx;xxx arg , .
2058 printf xxx;xxx arg ,ball.
2060 define x {
2061 echo $#
2063 define xxx {
2064 echon " (1/$#: <$1>)"
2065 shift
2066 if [ $# -gt 0 ]
2067 \xcall xxx "$@"
2068 endif
2069 echo
2071 define yyy {
2072 eval "$@ ' ball"
2074 vpospar set
2075 call x "$@"
2076 call x "$@"''
2077 call x " $@"
2078 call x "$@ "
2079 echon yyy;call yyy '\call xxx' "b\$'\t'u ' "
2080 echon xxx;call xxx arg ,b u.
2081 echon xxx;call xxx arg , .
2082 echon xxx;call xxx arg ,ball.
2085 ${MAILX} ${ARGS} -X'source ./.t.rc' -Xx > "${MBOX}" 2>&1
2086 check behave:atxplode-1 0 "${MBOX}" '41566293 164'
2088 #${SHELL} ./.t.sh > ./.tshout 2>&1
2089 #check behave:atxplode:disproof-1 0 ./.tshout '41566293 164'
2091 t_epilog
2094 t_behave_read() {
2095 t_prolog
2096 TRAP_EXIT_ADDONS="./.t*"
2098 ${cat} <<- '__EOT' > .tin
2099 hey1, "'you ", world!
2100 hey2, "'you ", bugs bunny!
2101 hey3, "'you ",
2102 hey4, "'you "
2103 __EOT
2105 ${cat} <<- '__EOT' |\
2106 ${MAILX} ${ARGS} -X'readctl create ./.tin' > "${MBOX}" 2>&1
2107 read a b c
2108 echo $?/$^ERRNAME / <$a><$b><$c>
2109 read a b c
2110 echo $?/$^ERRNAME / <$a><$b><$c>
2111 read a b c
2112 echo $?/$^ERRNAME / <$a><$b><$c>
2113 read a b c
2114 echo $?/$^ERRNAME / <$a><$b><$c>
2115 unset a b c;read a b c
2116 echo $?/$^ERRNAME / <$a><$b><$c>
2117 readctl remove ./.tin;echo readctl remove:$?/$^ERRNAME
2118 __EOT
2119 check behave:read-1 0 "${MBOX}" '1527910147 173'
2121 ${cat} <<- '__EOT' > .tin2
2122 hey2.0,:"'you ",:world!:mars.:
2123 hey2.1,:"'you ",:world!
2124 hey2.2,:"'you ",:bugs bunny!
2125 hey2.3,:"'you ",:
2126 hey2.4,:"'you ":
2128 __EOT
2130 ${cat} <<- '__EOT' |\
2131 6< .tin2 ${MAILX} ${ARGS} -X 'readctl create 6' > "${MBOX}" 2>&1
2132 set ifs=:
2133 read a b c
2134 echo $?/$^ERRNAME / <$a><$b><$c>
2135 read a b c
2136 echo $?/$^ERRNAME / <$a><$b><$c>
2137 read a b c
2138 echo $?/$^ERRNAME / <$a><$b><$c>
2139 read a b c
2140 echo $?/$^ERRNAME / <$a><$b><$c>
2141 read a b c
2142 echo $?/$^ERRNAME / <$a><$b><$c>
2143 read a b c
2144 echo $?/$^ERRNAME / <$a><$b><$c>
2145 unset a b c;read a b c
2146 echo $?/$^ERRNAME / <$a><$b><$c>
2147 read a b c
2148 echo $?/$^ERRNAME / <$a><$b><$c>
2149 readctl remove 6;echo readctl remove:$?/$^ERRNAME
2150 __EOT
2151 check behave:read-ifs 0 "${MBOX}" '890153490 298'
2153 t_epilog
2156 t_behave_mbox() {
2157 t_prolog
2158 TRAP_EXIT_ADDONS="./.t*"
2162 while [ ${i} -lt 112 ]; do
2163 printf 'm file://%s\n~s Subject %s\nHello %s!\n~.\n' \
2164 "${MBOX}" "${i}" "${i}"
2165 i=`add ${i} 1`
2166 done
2167 ) | ${MAILX} ${ARGS}
2168 check behave:mbox-1 0 "${MBOX}" '1140119864 13780'
2170 printf 'File "%s"
2171 copy * "%s"
2172 File "%s"
2173 from*
2174 ' "${MBOX}" .tmbox1 .tmbox1 |
2175 ${MAILX} ${ARGS} > .tlst
2176 check behave:mbox-2 0 .tlst '2739893312 9103'
2178 printf 'File "%s"
2179 copy * "file://%s"
2180 File "file://%s"
2181 from*
2182 ' "${MBOX}" .tmbox2 .tmbox2 |
2183 ${MAILX} ${ARGS} > .tlst
2184 check behave:mbox-3 0 .tlst '1702194178 9110'
2186 # only the odd (even)
2188 printf 'File "file://%s"
2189 copy ' .tmbox2
2191 while [ ${i} -lt 112 ]; do
2192 j=`modulo ${i} 2`
2193 [ ${j} -eq 1 ] && printf '%s ' "${i}"
2194 i=`add ${i} 1`
2195 done
2196 printf ' file://%s
2197 File "file://%s"
2198 from*
2199 ' .tmbox3 .tmbox3
2200 ) | ${MAILX} ${ARGS} > .tlst
2201 check behave:mbox-4 0 .tmbox3 '631132924 6890'
2202 check behave:mbox-5 - .tlst '2960975049 4573'
2203 # ...
2205 printf 'file "file://%s"
2206 move ' .tmbox2
2208 while [ ${i} -lt 112 ]; do
2209 j=`modulo ${i} 2`
2210 [ ${j} -eq 0 ] && [ ${i} -ne 0 ] && printf '%s ' "${i}"
2211 i=`add ${i} 1`
2212 done
2213 printf ' file://%s
2214 File "file://%s"
2215 from*
2216 File "file://%s"
2217 from*
2218 ' .tmbox3 .tmbox3 .tmbox2
2219 ) | ${MAILX} ${ARGS} > .tlst
2220 check behave:mbox-6 0 .tmbox3 '1387070539 13655'
2221 ${sed} 2d < .tlst > .tlstx
2222 check behave:mbox-7 - .tlstx '2729940494 13645'
2224 t_epilog
2227 t_behave_alternates() {
2228 t_prolog
2229 TRAP_EXIT_ADDONS="./.t*"
2231 ${cat} <<-_EOT > ./.tsendmail.sh
2232 #!${MYSHELL} -
2233 (echo 'From Valeriana Sat Jul 08 15:54:03 2017' && ${cat} && echo
2234 ) >> "${MBOX}"
2235 _EOT
2236 chmod 0755 ./.tsendmail.sh
2238 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} -Smta=./.tsendmail.sh > ./.tall 2>&1
2239 echo --0
2240 alternates
2241 echo $?/$^ERRNAME
2242 alternates a1@b1 a2@b2 a3@b3
2243 echo $?/$^ERRNAME
2244 alternates
2245 echo $?/$^ERRNAME
2246 vput alternates rv
2247 echo $?/$^ERRNAME <$rv>
2249 echo --1
2250 unalternates a2@b2
2251 vput alternates rv
2252 echo $?/$^ERRNAME <$rv>
2253 unalternates a3@b3
2254 vput alternates rv
2255 echo $?/$^ERRNAME <$rv>
2256 unalternates a1@b1
2257 vput alternates rv
2258 echo $?/$^ERRNAME <$rv>
2260 echo --2
2261 unalternates *
2262 alternates a1@b1 a2@b2 a3@b3
2263 unalternates a3@b3
2264 vput alternates rv
2265 echo $?/$^ERRNAME <$rv>
2266 unalternates a2@b2
2267 vput alternates rv
2268 echo $?/$^ERRNAME <$rv>
2269 unalternates a1@b1
2270 vput alternates rv
2271 echo $?/$^ERRNAME <$rv>
2273 echo --3
2274 alternates a1@b1 a2@b2 a3@b3
2275 unalternates a1@b1
2276 vput alternates rv
2277 echo $?/$^ERRNAME <$rv>
2278 unalternates a2@b2
2279 vput alternates rv
2280 echo $?/$^ERRNAME <$rv>
2281 unalternates a3@b3
2282 vput alternates rv
2283 echo $?/$^ERRNAME <$rv>
2285 echo --4
2286 unalternates *
2287 alternates a1@b1 a2@b2 a3@b3
2288 unalternates *
2289 vput alternates rv
2290 echo $?/$^ERRNAME <$rv>
2292 echo --5
2293 unalternates *
2294 alternates a1@b1 a1@c1 a1@d1 a2@b2 a3@b3 a3@c3 a3@d3
2295 m a1@b1 a1@c1 a1@d1
2296 ~s all alternates, only a1@b1 remains
2297 ~c a2@b2
2298 ~b a3@b3 a3@c3 a3@d3
2299 ~r - '_EOT'
2300 This body is!
2301 This also body is!!
2302 _EOT
2305 echo --6
2306 unalternates *
2307 alternates a1@b1 a1@c1 a2@b2 a3@b3
2308 m a1@b1 a1@c1 a1@d1
2309 ~s a1@b1 a1@d1, and a3@c3 a3@d3 remain
2310 ~c a2@b2
2311 ~b a3@b3 a3@c3 a3@d3
2312 ~r - '_EOT'
2313 This body2 is!
2314 _EOT
2317 echo --7
2318 alternates a1@b1 a2@b2 a3; set allnet
2319 m a1@b1 a1@c1 a1@d1
2320 ~s all alternates via allnet, only a1@b1 remains
2321 ~c a2@b2
2322 ~b a3@b3 a3@c3 a3@d3
2323 ~r - '_EOT'
2324 This body3 is!
2325 _EOT
2328 echo --10
2329 unalternates *
2330 alternates a1@b1
2331 echo $?/$^ERRNAME
2332 vput alternates rv
2333 echo $?/$^ERRNAME <$rv>
2334 alternates a2@b2
2335 echo $?/$^ERRNAME
2336 vput alternates rv
2337 echo $?/$^ERRNAME <$rv>
2338 alternates a3@b3
2339 echo $?/$^ERRNAME
2340 vput alternates rv
2341 echo $?/$^ERRNAME <$rv>
2342 alternates a4@b4
2343 echo $?/$^ERRNAME
2344 vput alternates rv
2345 echo $?/$^ERRNAME <$rv>
2347 unalternates *
2348 vput alternates rv
2349 echo $?/$^ERRNAME <$rv>
2351 echo --11
2352 set posix
2353 alternates a1@b1 a2@b2
2354 echo $?/$^ERRNAME
2355 vput alternates rv
2356 echo $?/$^ERRNAME <$rv>
2357 alternates a3@b3 a4@b4
2358 echo $?/$^ERRNAME
2359 vput alternates rv
2360 echo $?/$^ERRNAME <$rv>
2361 __EOT
2362 check behave:alternates-1 0 "${MBOX}" '142184864 515'
2363 check behave:alternates-2 - .tall '1878598364 505'
2365 t_epilog
2368 t_behave_alias() {
2369 t_prolog
2370 TRAP_EXIT_ADDONS="./.t*"
2372 ${cat} <<-_EOT > ./.tsendmail.sh
2373 #!${MYSHELL} -
2374 (echo 'From Hippocastanum Mon Jun 19 15:07:07 2017' && ${cat} && echo
2375 ) >> "${MBOX}"
2376 _EOT
2377 chmod 0755 ./.tsendmail.sh
2379 ${cat} <<- '__EOT' | ${MAILX} ${ARGS} -Smta=./.tsendmail.sh > ./.tall 2>&1
2380 alias a1 ex1@a1.ple
2381 alias a1 ex2@a1.ple "EX3 <ex3@a1.ple>"
2382 alias a1 ex4@a1.ple
2383 alias a2 ex1@a2.ple ex2@a2.ple ex3@a2.ple ex4@a2.ple
2384 alias a3 a4
2385 alias a4 a5 ex1@a4.ple
2386 alias a5 a6
2387 alias a6 a7 ex1@a6.ple
2388 alias a7 a8
2389 alias a8 ex1@a8.ple
2390 alias a1
2391 alias a2
2392 alias a3
2393 m a1
2394 ~c a2
2395 ~b a3
2396 ~r - '_EOT'
2397 This body is!
2398 This also body is!!
2399 _EOT
2400 __EOT
2401 check behave:alias-1 0 "${MBOX}" '2496925843 272'
2402 check behave:alias-2 - .tall '3548953204 152'
2404 # TODO t_behave_alias: n_ALIAS_MAXEXP is compile-time constant,
2405 # TODO need to somehow provide its contents to the test, then test
2407 t_epilog
2410 t_behave_filetype() {
2411 t_prolog
2412 TRAP_EXIT_ADDONS="./.t*"
2414 ${cat} <<-_EOT > ./.tsendmail.sh
2415 #!${MYSHELL} -
2416 (echo 'From Alchemilla Wed Apr 25 15:12:13 2017' && ${cat} && echo
2417 ) >> "${MBOX}"
2418 _EOT
2419 chmod 0755 ./.tsendmail.sh
2421 printf 'm m1@e.t\nL1\nHy1\n~.\nm m2@e.t\nL2\nHy2\n~@ %s\n~.\n' \
2422 "${SRCDIR}snailmail.jpg" | ${MAILX} ${ARGS} -Smta=./.tsendmail.sh
2423 check behave:filetype-1 0 "${MBOX}" '1645747150 13536'
2425 if command -v gzip >/dev/null 2>&1; then
2426 ${rm} -f ./.t.mbox*
2428 printf 'File "%s"\ncopy 1 ./.t.mbox.gz
2429 copy 2 ./.t.mbox.gz' "${MBOX}" |
2430 ${MAILX} ${ARGS} \
2431 -X'filetype gz gzip\ -dc gzip\ -c'
2432 printf 'File ./.t.mbox.gz\ncopy * ./.t.mbox\n' |
2433 ${MAILX} ${ARGS} \
2434 -X'filetype gz gzip\ -dc gzip\ -c'
2435 } >/dev/null 2>&1
2436 check behave:filetype-2 0 "./.t.mbox" '1645747150 13536'
2437 else
2438 echo 'behave:filetype-2: unsupported, skipped'
2442 ${rm} -f ./.t.mbox*
2443 printf 'File "%s"\ncopy 1 ./.t.mbox.gz
2444 copy 2 ./.t.mbox.gz
2445 copy 1 ./.t.mbox.gz
2446 copy 2 ./.t.mbox.gz
2447 ' "${MBOX}" |
2448 ${MAILX} ${ARGS} \
2449 -X'filetype gz gzip\ -dc gzip\ -c' \
2450 -X'filetype mbox.gz "${sed} 1,3d|${cat}" \
2451 "echo eins;echo zwei;echo und mit ${sed} bist Du dabei;${cat}"'
2452 printf 'File ./.t.mbox.gz\ncopy * ./.t.mbox\n' |
2453 ${MAILX} ${ARGS} \
2454 -X'filetype gz gzip\ -dc gzip\ -c' \
2455 -X'filetype mbox.gz "${sed} 1,3d|${cat}" kill\ 0'
2456 } >/dev/null 2>&1
2458 check behave:filetype-3 - "./.t.mbox" '238021003 27092'
2460 t_epilog
2463 t_behave_record_a_resend() {
2464 t_prolog
2465 TRAP_EXIT_ADDONS="./.t.record ./.t.resent"
2467 printf '
2468 set record=%s
2469 m %s\n~s Subject 1.\nHello.\n~.
2470 set record-files add-file-recipients
2471 m %s\n~s Subject 2.\nHello.\n~.
2472 File %s
2473 resend 2 ./.t.resent
2474 Resend 1 ./.t.resent
2475 set record-resent
2476 resend 2 ./.t.resent
2477 Resend 1 ./.t.resent
2478 ' ./.t.record "${MBOX}" "${MBOX}" "${MBOX}" |
2479 ${MAILX} ${ARGS}
2481 check behave:record_a_resend-1 0 "${MBOX}" '3057873538 256'
2482 check behave:record_a_resend-2 - .t.record '391356429 460'
2483 check behave:record_a_resend-3 - .t.resent '2685231691 648'
2485 t_epilog
2488 t_behave_e_H_L_opts() {
2489 t_prolog
2490 TRAP_EXIT_ADDONS="./.tsendmail.sh ./.t.mbox"
2492 touch ./.t.mbox
2493 ${MAILX} ${ARGS} -ef ./.t.mbox
2494 echo ${?} > "${MBOX}"
2496 ${cat} <<-_EOT > ./.tsendmail.sh
2497 #!${MYSHELL} -
2498 (echo 'From Alchemilla Wed Apr 07 17:03:33 2017' && ${cat} && echo
2499 ) >> "./.t.mbox"
2500 _EOT
2501 chmod 0755 ./.tsendmail.sh
2502 printf 'm me@exam.ple\nLine 1.\nHello.\n~.\n' |
2503 ${MAILX} ${ARGS} -Smta=./.tsendmail.sh
2504 printf 'm you@exam.ple\nLine 1.\nBye.\n~.\n' |
2505 ${MAILX} ${ARGS} -Smta=./.tsendmail.sh
2507 ${MAILX} ${ARGS} -ef ./.t.mbox
2508 echo ${?} >> "${MBOX}"
2509 ${MAILX} ${ARGS} -efL @t@me ./.t.mbox
2510 echo ${?} >> "${MBOX}"
2511 ${MAILX} ${ARGS} -efL @t@you ./.t.mbox
2512 echo ${?} >> "${MBOX}"
2513 ${MAILX} ${ARGS} -efL '@>@Line 1' ./.t.mbox
2514 echo ${?} >> "${MBOX}"
2515 ${MAILX} ${ARGS} -efL '@>@Hello.' ./.t.mbox
2516 echo ${?} >> "${MBOX}"
2517 ${MAILX} ${ARGS} -efL '@>@Bye.' ./.t.mbox
2518 echo ${?} >> "${MBOX}"
2519 ${MAILX} ${ARGS} -efL '@>@Good bye.' ./.t.mbox
2520 echo ${?} >> "${MBOX}"
2522 ${MAILX} ${ARGS} -fH ./.t.mbox >> "${MBOX}"
2523 echo ${?} >> "${MBOX}"
2524 ${MAILX} ${ARGS} -fL @t@me ./.t.mbox >> "${MBOX}"
2525 echo ${?} >> "${MBOX}"
2526 ${MAILX} ${ARGS} -fL @t@you ./.t.mbox >> "${MBOX}"
2527 echo ${?} >> "${MBOX}"
2528 ${MAILX} ${ARGS} -fL '@>@Line 1' ./.t.mbox >> "${MBOX}"
2529 echo ${?} >> "${MBOX}"
2530 ${MAILX} ${ARGS} -fL '@>@Hello.' ./.t.mbox >> "${MBOX}"
2531 echo ${?} >> "${MBOX}"
2532 ${MAILX} ${ARGS} -fL '@>@Bye.' ./.t.mbox >> "${MBOX}"
2533 echo ${?} >> "${MBOX}"
2534 ${MAILX} ${ARGS} -fL '@>@Good bye.' ./.t.mbox >> "${MBOX}" 2>/dev/null
2535 echo ${?} >> "${MBOX}"
2537 check behave:e_H_L_opts - "${MBOX}" '1708955574 678'
2539 t_epilog
2542 t_behave_compose_hooks() { # TODO monster
2543 t_prolog
2544 TRAP_EXIT_ADDONS="./.t*"
2546 (echo line one&&echo line two&&echo line three) > ./.treadctl
2547 (echo echo four&&echo echo five&&echo echo six) > ./.tattach
2549 ${cat} <<-_EOT > ./.tsendmail.sh
2550 #!${MYSHELL} -
2551 (echo 'From PrimulaVeris Wed Apr 10 22:59:00 2017' && ${cat} && echo
2552 ) >> "${MBOX}"
2553 _EOT
2554 chmod 0755 ./.tsendmail.sh
2556 ${cat} <<'__EOT__' > ./.trc
2557 define bail {
2558 echoerr "Failed: $1. Bailing out"; echo "~x"; xit
2560 define xerr {
2561 vput vexpr es substr "$1" 0 1
2562 if [ "$es" != 2 ]
2563 xcall bail "$2"
2566 define read_mline_res {
2567 read hl; wysh set len=$? es=$! en=$^ERRNAME;\
2568 echo $len/$es/$^ERRNAME: $hl
2569 if [ $es -ne $^ERR-NONE ]
2570 xcall bail read_mline_res
2571 elif [ $len -ne 0 ]
2572 \xcall read_mline_res
2575 define ins_addr {
2576 wysh set xh=$1
2577 echo "~^header list"; read hl; echo $hl;\
2578 call xerr "$hl" "in_addr ($xh) 0-1"
2580 echo "~^header insert $xh diet <$xh@exam.ple> spliced";\
2581 read es; echo $es; call xerr "$es" "ins_addr $xh 1-1"
2582 echo "~^header insert $xh <${xh}2@exam.ple>";\
2583 read es; echo $es; call xerr "$es" "ins_addr $xh 1-2"
2584 echo "~^header insert $xh ${xh}3@exam.ple";\
2585 read es; echo $es; call xerr "$es" "ins_addr $xh 1-3"
2586 echo "~^header list $xh"; read hl; echo $hl;\
2587 call xerr "$hl" "ins_addr $xh 1-4"
2588 echo "~^header show $xh"; read es; call xerr $es "ins_addr $xh 1-5"
2589 call read_mline_res
2591 if [ "$t_remove" == "" ]
2592 return
2595 echo "~^header remove $xh"; read es; call xerr $es "ins_addr $xh 2-1"
2596 echo "~^header remove $xh"; read es; vput vexpr es substr $es 0 3
2597 if [ $es != 501 ]
2598 xcall bail "ins_addr $xh 2-2"
2600 echo "~^header list $xh"; read es; vput vexpr es substr $es 0 3
2601 if [ $es != 501 ]
2602 xcall bail "ins_addr $xh 2-3"
2604 echo "~^header show $xh"; read es; vput vexpr es substr $es 0 3
2605 if [ $es != 501 ]
2606 xcall bail "ins_addr $xh 2-4"
2610 echo "~^header insert $xh diet <$xh@exam.ple> spliced";\
2611 read es; echo $es; call xerr "$es" "ins_addr $xh 3-1"
2612 echo "~^header insert $xh <${xh}2@exam.ple>";\
2613 read es; echo $es; call xerr "$es" "ins_addr $xh 3-2"
2614 echo "~^header insert $xh ${xh}3@exam.ple";\
2615 read es; echo $es; call xerr "$es" "ins_addr $xh 3-3"
2616 echo "~^header list $xh"; read hl; echo $hl;\
2617 call xerr "$hl" "ins_addr $xh 3-4"
2618 echo "~^header show $xh"; read es; call xerr $es "ins_addr $xh 3-5"
2619 call read_mline_res
2621 echo "~^header remove-at $xh 1"; read es;\
2622 call xerr $es "ins_addr $xh 3-6"
2623 echo "~^header remove-at $xh 1"; read es;\
2624 call xerr $es "ins_addr $xh 3-7"
2625 echo "~^header remove-at $xh 1"; read es;\
2626 call xerr $es "ins_addr $xh 3-8"
2627 echo "~^header remove-at $xh 1"; read es;\
2628 vput vexpr es substr $es 0 3
2629 if [ $es != 501 ]
2630 xcall bail "ins_addr $xh 3-9"
2632 echo "~^header remove-at $xh T"; read es;\
2633 vput vexpr es substr $es 0 3
2634 if [ $es != 505 ]
2635 xcall bail "ins_addr $xh 3-10"
2637 echo "~^header list $xh"; read es;\
2638 vput vexpr es substr $es 0 3
2639 if [ $es != 501 ]
2640 xcall bail "ins_addr $xh 3-11"
2642 echo "~^header show $xh"; read es;\
2643 vput vexpr es substr $es 0 3
2644 if [ $es != 501 ]
2645 xcall bail "ins_addr $xh 3-12"
2649 echo "~^header insert $xh diet <$xh@exam.ple> spliced";\
2650 read es; echo $es; call xerr "$es" "ins_addr $xh 4-1"
2651 echo "~^header insert $xh <${xh}2@exam.ple> (comment) \"Quot(e)d\"";\
2652 read es; echo $es; call xerr "$es" "ins_addr $xh 4-2"
2653 echo "~^header insert $xh ${xh}3@exam.ple";\
2654 read es; echo $es; call xerr "$es" "ins_addr $xh 4-3"
2655 echo "~^header list $xh"; read hl; echo $hl;\
2656 call xerr "$hl" "header list $xh 3-4"
2657 echo "~^header show $xh"; read es; call xerr $es "ins_addr $xh 4-5"
2658 call read_mline_res
2660 echo "~^header remove-at $xh 3"; read es;\
2661 call xerr $es "ins_addr $xh 4-6"
2662 echo "~^header remove-at $xh 2"; read es;\
2663 call xerr $es "ins_addr $xh 4-7"
2664 echo "~^header remove-at $xh 1"; read es;\
2665 call xerr $es "ins_addr $xh 4-8"
2666 echo "~^header remove-at $xh 1"; read es;\
2667 vput vexpr es substr $es 0 3
2668 if [ $es != 501 ]
2669 xcall bail "ins_addr $xh 4-9"
2671 echo "~^header remove-at $xh T"; read es;\
2672 vput vexpr es substr $es 0 3
2673 if [ $es != 505 ]
2674 xcall bail "ins_addr $xh 4-10"
2676 echo "~^header list $xh"; read es;\
2677 vput vexpr es substr $es 0 3
2678 if [ $es != 501 ]
2679 xcall bail "ins_addr $xh 4-11"
2681 echo "~^header show $xh"; read es;\
2682 vput vexpr es substr $es 0 3
2683 if [ $es != 501 ]
2684 xcall bail "ins_addr $xh 4-12"
2687 define ins_ref {
2688 wysh set xh=$1 mult=$2
2689 echo "~^header list"; read hl; echo $hl;\
2690 call xerr "$hl" "ins_ref ($xh) 0-1"
2692 echo "~^header insert $xh <$xh@exam.ple>";\
2693 read es; echo $es; call xerr "$es" "ins_ref $xh 1-1"
2694 if [ $mult -ne 0 ]
2695 echo "~^header insert $xh <${xh}2@exam.ple>";\
2696 read es; echo $es; call xerr "$es" "ins_ref $xh 1-2"
2697 echo "~^header insert $xh ${xh}3@exam.ple";\
2698 read es; echo $es; call xerr "$es" "ins_ref $xh 1-3"
2699 else
2700 echo "~^header insert $xh <${xh}2@exam.ple>"; read es;\
2701 vput vexpr es substr $es 0 3
2702 if [ $es != 506 ]
2703 xcall bail "ins_ref $xh 1-4"
2707 echo "~^header list $xh"; read hl; echo $hl;\
2708 call xerr "$hl" "ins_ref $xh 1-5"
2709 echo "~^header show $xh"; read es; call xerr $es "ins_ref $xh 1-6"
2710 call read_mline_res
2712 if [ "$t_remove" == "" ]
2713 return
2716 echo "~^header remove $xh"; read es;\
2717 call xerr $es "ins_ref $xh 2-1"
2718 echo "~^header remove $xh"; read es;\
2719 vput vexpr es substr $es 0 3
2720 if [ $es != 501 ]
2721 xcall bail "ins_ref $xh 2-2"
2723 echo "~^header list $xh"; read es;\
2724 vput vexpr es substr $es 0 3
2725 if [ $es != 501 ]
2726 xcall bail "$es ins_ref $xh 2-3"
2728 echo "~^header show $xh"; read es;\
2729 vput vexpr es substr $es 0 3
2730 if [ $es != 501 ]
2731 xcall bail "ins_ref $xh 2-4"
2735 echo "~^header insert $xh <$xh@exam.ple>";\
2736 read es; echo $es; call xerr "$es" "ins_ref $xh 3-1"
2737 if [ $mult -ne 0 ]
2738 echo "~^header insert $xh <${xh}2@exam.ple>";\
2739 read es; echo $es; call xerr "$es" "ins_ref $xh 3-2"
2740 echo "~^header insert $xh ${xh}3@exam.ple";\
2741 read es; echo $es; call xerr "$es" "ins_ref $xh 3-3"
2743 echo "~^header list $xh";\
2744 read hl; echo $hl; call xerr "$hl" "ins_ref $xh 3-4"
2745 echo "~^header show $xh";\
2746 read es; call xerr $es "ins_ref $xh 3-5"
2747 call read_mline_res
2749 echo "~^header remove-at $xh 1"; read es;\
2750 call xerr $es "ins_ref $xh 3-6"
2751 if [ $mult -ne 0 ] && [ $xh != subject ]
2752 echo "~^header remove-at $xh 1"; read es;\
2753 call xerr $es "ins_ref $xh 3-7"
2754 echo "~^header remove-at $xh 1"; read es;\
2755 call xerr $es "ins_ref $xh 3-8"
2757 echo "~^header remove-at $xh 1"; read es;\
2758 vput vexpr es substr $es 0 3
2759 if [ $es != 501 ]
2760 xcall bail "ins_ref $xh 3-9"
2762 echo "~^header remove-at $xh T"; read es;\
2763 vput vexpr es substr $es 0 3
2764 if [ $es != 505 ]
2765 xcall bail "ins_ref $xh 3-10"
2767 echo "~^header show $xh"; read es;\
2768 vput vexpr es substr $es 0 3
2769 if [ $es != 501 ]
2770 xcall bail "ins_ref $xh 3-11"
2774 echo "~^header insert $xh <$xh@exam.ple> ";\
2775 read es; echo $es; call xerr "$es" "ins_ref $xh 4-1"
2776 if [ $mult -ne 0 ]
2777 echo "~^header insert $xh <${xh}2@exam.ple> ";\
2778 read es; echo $es; call xerr "$es" "ins_ref $xh 4-2"
2779 echo "~^header insert $xh ${xh}3@exam.ple";\
2780 read es; echo $es; call xerr "$es" "ins_ref $xh 4-3"
2782 echo "~^header list $xh"; read hl; echo $hl;\
2783 call xerr "$hl" "ins_ref $xh 4-4"
2784 echo "~^header show $xh"; read es; call xerr $es "ins_ref $xh 4-5"
2785 call read_mline_res
2787 if [ $mult -ne 0 ] && [ $xh != subject ]
2788 echo "~^header remove-at $xh 3"; read es;\
2789 call xerr $es "ins_ref $xh 4-6"
2790 echo "~^header remove-at $xh 2"; read es;\
2791 call xerr $es "ins_ref $xh 4-7"
2793 echo "~^header remove-at $xh 1"; read es;\
2794 call xerr $es "ins_ref $xh 4-8"
2795 echo "~^header remove-at $xh 1"; read es;\
2796 vput vexpr es substr $es 0 3
2797 if [ $es != 501 ]
2798 xcall bail "ins_ref $xh 4-9"
2800 echo "~^header remove-at $xh T"; read es;\
2801 vput vexpr es substr $es 0 3
2802 if [ $es != 505 ]
2803 xcall bail "ins_ref $xh 4-10"
2805 echo "~^header show $xh"; read es;\
2806 vput vexpr es substr $es 0 3
2807 if [ $es != 501 ]
2808 xcall bail "ins_ref $xh 4-11"
2811 define t_header {
2812 echo t_header ENTER
2813 # In collect.c order
2814 call ins_addr from
2815 call ins_ref sender 0 # Not a "ref", but works
2816 call ins_addr To
2817 call ins_addr cC
2818 call ins_addr bCc
2819 call ins_addr reply-To
2820 call ins_addr mail-Followup-to
2821 call ins_ref messAge-id 0
2822 call ins_ref rEfErEncEs 1
2823 call ins_ref in-Reply-to 1
2824 call ins_ref subject 1 # Not a "ref", but works (with tweaks)
2825 call ins_addr freeForm1
2826 call ins_addr freeform2
2828 echo "~^header show MAILX-Command"; read es; call xerr $es "t_header 1000"
2829 call read_mline_res
2830 echo "~^header show MAILX-raw-TO"; read es; call xerr $es "t_header 1001"
2831 call read_mline_res
2833 echo t_header LEAVE
2835 define t_attach {
2836 echo t_attach ENTER
2838 echo "~^attachment";\
2839 read hl; echo $hl; vput vexpr es substr "$hl" 0 3
2840 if [ "$es" != 501 ]
2841 xcall bail "attach 0-1"
2844 echo "~^attach attribute ./.treadctl";\
2845 read hl; echo $hl; vput vexpr es substr "$hl" 0 3
2846 if [ "$es" != 501 ]
2847 xcall bail "attach 0-2"
2849 echo "~^attachment attribute-at 1";\
2850 read hl; echo $hl; vput vexpr es substr "$hl" 0 3
2851 if [ "$es" != 501 ]
2852 xcall bail "attach 0-3"
2855 echo "~^attachment insert ./.treadctl=ascii";\
2856 read hl; echo $hl; call xerr "$hl" "attach 1-1"
2857 echo "~^attachment list";\
2858 read es; echo $es;call xerr "$es" "attach 1-2"
2859 call read_mline_res
2860 echo "~^attachment attribute ./.treadctl";\
2861 read es; echo $es;call xerr "$es" "attach 1-3"
2862 call read_mline_res
2863 echo "~^attachment attribute .treadctl";\
2864 read es; echo $es;call xerr "$es" "attach 1-4"
2865 call read_mline_res
2866 echo "~^attachment attribute-at 1";\
2867 read es; echo $es;call xerr "$es" "attach 1-5"
2868 call read_mline_res
2870 echo "~^attachment attribute-set ./.treadctl filename rctl";\
2871 read es; echo $es;call xerr "$es" "attach 1-6"
2872 echo "~^attachment attribute-set .treadctl content-description Au";\
2873 read es; echo $es;call xerr "$es" "attach 1-7"
2874 echo "~^attachment attribute-set-at 1 content-id <10.du@ich>";\
2875 read es; echo $es;call xerr "$es" "attach 1-8"
2877 echo "~^attachment attribute ./.treadctl";\
2878 read es; echo $es;call xerr "$es" "attach 1-9"
2879 call read_mline_res
2880 echo "~^attachment attribute .treadctl";\
2881 read es; echo $es;call xerr "$es" "attach 1-10"
2882 call read_mline_res
2883 echo "~^attachment attribute rctl";\
2884 read es; echo $es;call xerr "$es" "attach 1-11"
2885 call read_mline_res
2886 echo "~^attachment attribute-at 1";\
2887 read es; echo $es;call xerr "$es" "attach 1-12"
2888 call read_mline_res
2891 echo "~^attachment insert ./.tattach=latin1";\
2892 read hl; echo $hl; call xerr "$hl" "attach 2-1"
2893 echo "~^attachment list";\
2894 read es; echo $es;call xerr "$es" "attach 2-2"
2895 call read_mline_res
2896 echo "~^attachment attribute ./.tattach";\
2897 read es; echo $es;call xerr "$es" "attach 2-3"
2898 call read_mline_res
2899 echo "~^attachment attribute .tattach";\
2900 read es; echo $es;call xerr "$es" "attach 2-4"
2901 call read_mline_res
2902 echo "~^attachment attribute-at 2";\
2903 read es; echo $es;call xerr "$es" "attach 2-5"
2904 call read_mline_res
2906 echo "~^attachment attribute-set ./.tattach filename tat";\
2907 read es; echo $es;call xerr "$es" "attach 2-6"
2908 echo \
2909 "~^attachment attribute-set .tattach content-description Au2";\
2910 read es; echo $es;call xerr "$es" "attach 2-7"
2911 echo "~^attachment attribute-set-at 2 content-id <20.du@wir>";\
2912 read es; echo $es;call xerr "$es" "attach 2-8"
2913 echo \
2914 "~^attachment attribute-set-at 2 content-type application/x-sh";\
2915 read es; echo $es;call xerr "$es" "attach 2-9"
2917 echo "~^attachment attribute ./.tattach";\
2918 read es; echo $es;call xerr "$es" "attach 2-10"
2919 call read_mline_res
2920 echo "~^attachment attribute .tattach";\
2921 read es; echo $es;call xerr "$es" "attach 2-11"
2922 call read_mline_res
2923 echo "~^attachment attribute tat";\
2924 read es; echo $es;call xerr "$es" "attach 2-12"
2925 call read_mline_res
2926 echo "~^attachment attribute-at 2";\
2927 read es; echo $es;call xerr "$es" "attach 2-13"
2928 call read_mline_res
2931 if [ "$t_remove" == "" ]
2932 return
2935 echo "~^attachment remove ./.treadctl"; read es;\
2936 call xerr $es "attach 3-1"
2937 echo "~^attachment remove ./.tattach"; read es;\
2938 call xerr $es "attach 3-2"
2939 echo "~^ attachment remove ./.treadctl"; read es;\
2940 vput vexpr es substr $es 0 3
2941 if [ $es != 501 ]
2942 xcall bail "attach 3-3"
2944 echo "~^ attachment remove ./.tattach"; read es;\
2945 vput vexpr es substr $es 0 3
2946 if [ $es != 501 ]
2947 xcall bail "attach 3-4"
2949 echo "~^attachment list"; read es;\
2950 vput vexpr es substr $es 0 3
2951 if [ $es != 501 ]
2952 xcall bail "attach 3-5"
2956 echo "~^attachment insert ./.tattach=latin1";\
2957 read hl; echo $hl; call xerr "$hl" "attach 4-1"
2958 echo "~^attachment insert ./.tattach=latin1";\
2959 read hl; echo $hl; call xerr "$hl" "attach 4-2"
2960 echo "~^attachment list";\
2961 read es; echo $es;call xerr "$es" "attach 4-3"
2962 call read_mline_res
2963 echo "~^ attachment remove .tattach"; read es;\
2964 vput vexpr es substr $es 0 3
2965 if [ $es != 506 ]
2966 xcall bail "attach 4-4 $es"
2968 echo "~^attachment remove-at T"; read es;\
2969 vput vexpr es substr $es 0 3
2970 if [ $es != 505 ]
2971 xcall bail "attach 4-5"
2973 echo "~^attachment remove ./.tattach"; read es;\
2974 call xerr $es "attach 4-6"
2975 echo "~^attachment remove ./.tattach"; read es;\
2976 call xerr $es "attach 4-7"
2977 echo "~^ attachment remove ./.tattach"; read es;\
2978 vput vexpr es substr $es 0 3
2979 if [ $es != 501 ]
2980 xcall bail "attach 4-8 $es"
2982 echo "~^attachment list"; read es;\
2983 vput vexpr es substr $es 0 3
2984 if [ $es != 501 ]
2985 xcall bail "attach 4-9"
2989 echo "~^attachment insert ./.tattach=latin1";\
2990 read hl; echo $hl; call xerr "$hl" "attach 5-1"
2991 echo "~^attachment insert ./.tattach=latin1";\
2992 read hl; echo $hl; call xerr "$hl" "attach 5-2"
2993 echo "~^attachment insert ./.tattach=latin1";\
2994 read hl; echo $hl; call xerr "$hl" "attach 5-3"
2995 echo "~^attachment list";\
2996 read es; echo $es;call xerr "$es" "attach 5-4"
2997 call read_mline_res
2999 echo "~^attachment remove-at 3"; read es;\
3000 call xerr $es "attach 5-5"
3001 echo "~^attachment remove-at 3"; read es;\
3002 vput vexpr es substr $es 0 3
3003 if [ $es != 501 ]
3004 xcall bail "attach 5-6"
3006 echo "~^attachment remove-at 2"; read es;\
3007 call xerr $es "attach 5-7"
3008 echo "~^attachment remove-at 2"; read es;\
3009 vput vexpr es substr $es 0 3
3010 if [ $es != 501 ]
3011 xcall bail "attach 5-8"
3013 echo "~^attachment remove-at 1"; read es;\
3014 call xerr $es "attach 5-9"
3015 echo "~^attachment remove-at 1"; read es;\
3016 vput vexpr es substr $es 0 3
3017 if [ $es != 501 ]
3018 xcall bail "attach 5-10"
3021 echo "~^attachment list"; read es;\
3022 vput vexpr es substr $es 0 3
3023 if [ $es != 501 ]
3024 xcall bail "attach 5-11"
3028 echo "~^attachment insert ./.tattach=latin1";\
3029 read hl; echo $hl; call xerr "$hl" "attach 6-1"
3030 echo "~^attachment insert ./.tattach=latin1";\
3031 read hl; echo $hl; call xerr "$hl" "attach 6-2"
3032 echo "~^attachment insert ./.tattach=latin1";\
3033 read hl; echo $hl; call xerr "$hl" "attach 6-3"
3034 echo "~^attachment list";\
3035 read es; echo $es;call xerr "$es" "attach 6-4"
3036 call read_mline_res
3038 echo "~^attachment remove-at 1"; read es;\
3039 call xerr $es "attach 6-5"
3040 echo "~^attachment remove-at 1"; read es;\
3041 call xerr $es "attach 6-6"
3042 echo "~^attachment remove-at 1"; read es;\
3043 call xerr $es "attach 6-7"
3044 echo "~^attachment remove-at 1"; read es;\
3045 vput vexpr es substr $es 0 3
3046 if [ $es != 501 ]
3047 xcall bail "attach 6-8"
3050 echo "~^attachment list"; read es;\
3051 vput vexpr es substr $es 0 3
3052 if [ $es != 501 ]
3053 xcall bail "attach 6-9"
3056 echo t_attach LEAVE
3058 define t_ocs {
3059 read ver
3060 echo t_ocs
3061 call t_header
3062 call t_attach
3064 define t_oce {
3065 echo on-compose-enter, mailx-command<$mailx-command>
3066 alternates alter1@exam.ple alter2@exam.ple
3067 alternates
3068 set autocc='alter1@exam.ple alter2@exam.ple'
3069 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3070 echo mailx-subject<$mailx-subject>
3071 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3072 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3073 mailx-raw-bcc<$mailx-raw-bcc>
3074 echo mailx-orig-from<$mailx-orig-from> mailx-orig-to<$mailx-orig-to> \
3075 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3077 define t_ocl {
3078 echo on-compose-leave, mailx-command<$mailx-command>
3079 vput alternates al
3080 eval alternates $al alter3@exam.ple alter4@exam.ple
3081 alternates
3082 set autobcc='alter3@exam.ple alter4@exam.ple'
3083 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3084 echo mailx-subject<$mailx-subject>
3085 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3086 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3087 mailx-raw-bcc<$mailx-raw-bcc>
3088 echo mailx-orig-from<$mailx-orig-from> mailx-orig-to<$mailx-orig-to> \
3089 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3091 define t_occ {
3092 echo on-compose-cleanup, mailx-command<$mailx-command>
3093 unalternates *
3094 alternates
3095 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3096 echo mailx-subject<$mailx-subject>
3097 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3098 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3099 mailx-raw-bcc<$mailx-raw-bcc>
3100 echo mailx-orig-from<$mailx-orig-from> mailx-orig-to<$mailx-orig-to> \
3101 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3103 wysh set on-compose-splice=t_ocs \
3104 on-compose-enter=t_oce on-compose-leave=t_ocl \
3105 on-compose-cleanup=t_occ
3106 __EOT__
3108 ${rm} -f "${MBOX}"
3109 printf 'm this-goes@nowhere\nbody\n!.\n' |
3110 ${MAILX} ${ARGS} -Snomemdebug -Sescape=! -Sstealthmua=noagent \
3111 -X'source ./.trc' -Smta=./.tsendmail.sh \
3112 >./.tall 2>&1
3113 ${cat} ./.tall >> "${MBOX}"
3114 check behave:compose_hooks-1 0 "${MBOX}" '3479456964 10101'
3116 ${rm} -f "${MBOX}"
3117 printf 'm this-goes@nowhere\nbody\n!.\n' |
3118 ${MAILX} ${ARGS} -Snomemdebug -Sescape=! -Sstealthmua=noagent \
3119 -St_remove=1 -X'source ./.trc' -Smta=./.tsendmail.sh \
3120 >./.tall 2>&1
3121 ${cat} ./.tall >> "${MBOX}"
3122 check behave:compose_hooks-2 0 "${MBOX}" '3654000499 12535'
3126 # Some state machine stress, shell compose hook, localopts for hook, etc.
3127 # readctl in child. ~r as HERE document
3128 ${rm} -f "${MBOX}"
3129 printf 'm ex@am.ple\nbody\n!.\nvar t_oce t_ocs t_ocs_sh t_ocl t_occ autocc' |
3130 ${MAILX} ${ARGS} -Snomemdebug -Sescape=! \
3131 -Smta=./.tsendmail.sh \
3133 define bail {
3134 echoerr "Failed: $1. Bailing out"; echo "~x"; xit
3136 define xerr {
3137 vput vexpr es substr "$1" 0 1
3138 if [ "$es" != 2 ]
3139 xcall bail "$2"
3142 define read_mline_res {
3143 read hl; wysh set len=$? es=$! en=$^ERRNAME;\
3144 echo $len/$es/$^ERRNAME: $hl
3145 if [ $es -ne $^ERR-NONE ]
3146 xcall bail read_mline_res
3147 elif [ $len -ne 0 ]
3148 \xcall read_mline_res
3151 define _work {
3152 vput vexpr i + 1 "$2"
3153 if [ $i -lt 111 ]
3154 vput vexpr j % $i 10
3155 if [ $j -ne 0 ]
3156 set j=xcall
3157 else
3158 echon "$i.. "
3159 set j=call
3161 eval \\$j _work $1 $i
3162 return $?
3164 vput vexpr i + $i "$1"
3165 return $i
3167 define _read {
3168 wysh set line; read line;wysh set es=$? en=$^ERRNAME ;\
3169 echo read:$es/$en: $line
3170 if [ "${es}" -ne -1 ]
3171 xcall _read
3173 readctl remove $cwd/.treadctl; echo readctl remove:$?/$^ERRNAME
3175 define t_ocs {
3176 read ver
3177 echo t_ocs
3178 echo "~^header list"; read hl; echo $hl;\
3179 vput vexpr es substr "$hl" 0 1
3180 if [ "$es" != 2 ]
3181 xcall bail "header list"
3182 endif
3184 call _work 1; echo $?
3185 echo "~^header insert cc splicy diet <splice@exam.ple> spliced";\
3186 read es; echo $es; vput vexpr es substr "$es" 0 1
3187 if [ "$es" != 2 ]
3188 xcall bail "be diet"
3189 endif
3190 echo "~^header insert cc <splice2@exam.ple>";\
3191 read es; echo $es; vput vexpr es substr "$es" 0 1
3192 if [ "$es" != 2 ]
3193 xcall bail "be diet2"
3194 endif
3196 call _work 2; echo $?
3197 echo "~^header insert bcc juicy juice <juice@exam.ple> spliced";\
3198 read es; echo $es;vput vexpr es substr "$es" 0 1
3199 if [ "$es" != 2 ]
3200 xcall bail "be juicy"
3201 endif
3202 echo "~^header insert bcc juice2@exam.ple";\
3203 read es; echo $es;vput vexpr es substr "$es" 0 1
3204 if [ "$es" != 2 ]
3205 xcall bail "be juicy2"
3206 endif
3207 echo "~^header insert bcc juice3 <juice3@exam.ple>";\
3208 read es; echo $es;vput vexpr es substr "$es" 0 1
3209 if [ "$es" != 2 ]
3210 xcall bail "be juicy3"
3211 endif
3212 echo "~^header insert bcc juice4@exam.ple";\
3213 read es; echo $es;vput vexpr es substr "$es" 0 1
3214 if [ "$es" != 2 ]
3215 xcall bail "be juicy4"
3216 endif
3218 echo "~^header remove-at bcc 3";\
3219 read es; echo $es;vput vexpr es substr "$es" 0 1
3220 if [ "$es" != 2 ]
3221 xcall bail "remove juicy5"
3222 endif
3223 echo "~^header remove-at bcc 2";\
3224 read es; echo $es;vput vexpr es substr "$es" 0 1
3225 if [ "$es" != 2 ]
3226 xcall bail "remove juicy6"
3227 endif
3228 echo "~^header remove-at bcc 3";\
3229 read es; echo $es;vput vexpr es substr "$es" 0 3
3230 if [ "$es" != 501 ]
3231 xcall bail "failed to remove-at"
3232 endif
3233 # Add duplicates which ought to be removed!
3234 echo "~^header insert bcc juice4@exam.ple";\
3235 read es; echo $es;vput vexpr es substr "$es" 0 1
3236 if [ "$es" != 2 ]
3237 xcall bail "be juicy4-1"
3238 endif
3239 echo "~^header insert bcc juice4@exam.ple";\
3240 read es; echo $es;vput vexpr es substr "$es" 0 1
3241 if [ "$es" != 2 ]
3242 xcall bail "be juicy4-2"
3243 endif
3244 echo "~^header insert bcc juice4@exam.ple";\
3245 read es; echo $es;vput vexpr es substr "$es" 0 1
3246 if [ "$es" != 2 ]
3247 xcall bail "be juicy4-3"
3248 endif
3249 echo "~:set t_ocs"
3252 call _work 3; echo $?
3253 echo "~r - '__EOT'"
3254 vput ! i echo just knock if you can hear me;\
3255 i=0;\
3256 while [ $i -lt 24 ]; do printf "%s " $i; i=`expr $i + 1`; done;\
3257 echo relax
3258 echon shell-cmd says $?/$^ERRNAME: $i
3259 echo "~x will not become interpreted, we are reading until __EOT"
3260 echo "__EOT"
3261 read r_status; echo "~~r status output: $r_status"
3262 echo "~:echo $? $! $^ERRNAME"
3263 read r_status
3264 echo "~~r status from parent: $r_status"
3267 call _work 4; echo $?
3268 vput cwd cwd;echo cwd:$?
3269 readctl create $cwd/.treadctl ;echo readctl:$?/$^ERRNAME;\
3270 call _read
3273 call _work 5; echo $?
3274 echo "~^header show MAILX-Command"; read es;\
3275 call xerr $es "t_header 1000"; call read_mline_res
3276 echo "~^header show MAILX-raw-TO"; read es;\
3277 call xerr $es "t_header 1001"; xcall read_mline_res
3279 echoerr IT IS WRONG IF YOU SEE THIS
3281 define t_oce {
3282 echo on-compose-enter, mailx-command<$mailx-command>
3283 set t_oce autobcc=oce@exam.ple
3284 alternates alter1@exam.ple alter2@exam.ple
3285 alternates
3286 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3287 echo mailx-subject<$mailx-subject>
3288 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3289 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3290 mailx-raw-bcc<$mailx-raw-bcc>
3291 echo mailx-orig-from<$mailx-orig-from> \
3292 mailx-orig-to<$mailx-orig-to> \
3293 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3295 define t_ocl {
3296 echo on-compose-leave, mailx-command<$mailx-command>
3297 set t_ocl autocc=ocl@exam.ple
3298 unalternates *
3299 alternates alter3@exam.ple alter4@exam.ple
3300 alternates
3301 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3302 echo mailx-subject<$mailx-subject>
3303 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3304 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3305 mailx-raw-bcc<$mailx-raw-bcc>
3306 echo mailx-orig-from<$mailx-orig-from> \
3307 mailx-orig-to<$mailx-orig-to> \
3308 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3310 define t_occ {
3311 echo on-compose-cleanup, mailx-command<$mailx-command>
3312 set t_occ autocc=occ@exam.ple
3313 unalternates *
3314 alternates
3315 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3316 echo mailx-subject<$mailx-subject>
3317 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3318 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3319 mailx-raw-bcc<$mailx-raw-bcc>
3320 echo mailx-orig-from<$mailx-orig-from> \
3321 mailx-orig-to<$mailx-orig-to> \
3322 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3324 wysh set on-compose-splice=t_ocs \
3325 on-compose-splice-shell="read ver;printf \"t_ocs-shell\\n\
3326 ~t shell@exam.ple\\n~:set t_ocs_sh\\n\"" \
3327 on-compose-enter=t_oce on-compose-leave=t_ocl \
3328 on-compose-cleanup=t_occ
3329 ' > ./.tnotes 2>&1
3330 ex0_test behave:compose_hooks-3
3331 ${cat} ./.tnotes >> "${MBOX}"
3333 check behave:compose_hooks-3 - "${MBOX}" '679526364 2431'
3335 # Reply, forward, resend, Resend
3337 ${rm} -f "${MBOX}"
3338 printf 'set from=f1@z\nm t1@z\nb1\n!.\nset from=f2@z\nm t2@z\nb2\n!.\n' |
3339 ${MAILX} ${ARGS} -Snomemdebug -Sescape=! \
3340 -Smta=./.tsendmail.sh
3342 printf '
3343 echo start: $? $! $^ERRNAME
3344 File %s
3345 echo File: $? $! $^ERRNAME;echo;echo
3346 reply 1
3347 this is content of reply 1
3349 echo reply 1: $? $! $^ERRNAME;echo;echo
3350 Reply 1 2
3351 this is content of Reply 1 2
3353 echo Reply 1 2: $? $! $^ERRNAME;echo;echo
3354 forward 1 fwdex@am.ple
3355 this is content of forward 1
3357 echo forward 1: $? $! $^ERRNAME;echo;echo
3358 resend 1 2 resendex@am.ple
3359 echo resend 1 2: $? $! $^ERRNAME;echo;echo
3360 Resend 1 2 Resendex@am.ple
3361 echo Resend 1 2: $? $! $^ERRNAME;echo;echo
3362 ' "${MBOX}" |
3363 ${MAILX} ${ARGS} -Snomemdebug -Sescape=! \
3364 -Smta=./.tsendmail.sh \
3366 define bail {
3367 echoerr "Failed: $1. Bailing out"; echo "~x"; xit
3369 define xerr {
3370 vput vexpr es substr "$1" 0 1
3371 if [ "$es" != 2 ]
3372 xcall bail "$2"
3375 define read_mline_res {
3376 read hl; wysh set len=$? es=$! en=$^ERRNAME;\
3377 echo mline_res:$len/$es/$^ERRNAME: $hl
3378 if [ $es -ne $^ERR-NONE ]
3379 xcall bail read_mline_res
3380 elif [ $len -ne 0 ]
3381 \xcall read_mline_res
3384 define work_hl {
3385 echo "~^header show $1"; read es;\
3386 call xerr $es "work_hl $1"; echo $1; call read_mline_res
3387 if [ $# -gt 1 ]
3388 shift
3389 xcall work_hl "$@"
3392 define t_ocs {
3393 read ver
3394 echo t_ocs version $ver
3395 echo "~^header list"; read hl; echo $hl;\
3396 echoerr the header list is $hl;\
3397 call xerr "$hl" "header list"
3398 eval vpospar set $hl
3399 shift
3400 xcall work_hl "$@"
3401 echoerr IT IS WRONG IF YOU SEE THIS
3403 define t_oce {
3404 echo on-XY-enter, mailx-command<$mailx-command>
3405 set t_oce autobcc=oce@exam.ple
3406 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3407 echo mailx-subject<$mailx-subject>
3408 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3409 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3410 mailx-raw-bcc<$mailx-raw-bcc>
3411 echo mailx-orig-from<$mailx-orig-from> \
3412 mailx-orig-to<$mailx-orig-to> \
3413 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3415 define t_ocl {
3416 echo on-XY-leave, mailx-command<$mailx-command>
3417 set t_ocl autocc=ocl@exam.ple
3418 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3419 echo mailx-subject<$mailx-subject>
3420 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3421 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3422 mailx-raw-bcc<$mailx-raw-bcc>
3423 echo mailx-orig-from<$mailx-orig-from> \
3424 mailx-orig-to<$mailx-orig-to> \
3425 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3427 define t_occ {
3428 echo on-XY-cleanup, mailx-command<$mailx-command>
3429 set t_occ autocc=occ@exam.ple
3430 echo mailx-from<$mailx-from> mailx-sender<$mailx-sender>
3431 echo mailx-subject<$mailx-subject>
3432 echo mailx-to<$mailx-to> mailx-cc<$mailx-cc> mailx-bcc<$mailx-bcc>
3433 echo mailx-raw-to<$mailx-raw-to> mailx-raw-cc<$mailx-raw-cc> \
3434 mailx-raw-bcc<$mailx-raw-bcc>
3435 echo mailx-orig-from<$mailx-orig-from> \
3436 mailx-orig-to<$mailx-orig-to> \
3437 mailx-orig-cc<$mailx-orig-cc> mailx-orig-bcc<$mailx-orig-bcc>
3439 wysh set on-compose-splice=t_ocs \
3440 on-compose-enter=t_oce on-compose-leave=t_ocl \
3441 on-compose-cleanup=t_occ \
3442 on-resend-enter=t_oce on-resend-cleanup=t_occ
3443 ' > ./.tnotes 2>&1
3444 ex0_test behave:compose_hooks-4
3445 ${cat} ./.tnotes >> "${MBOX}"
3447 check behave:compose_hooks-4 - "${MBOX}" '3038884027 7516'
3449 t_epilog
3452 t_behave_message_injections() {
3453 t_prolog
3454 TRAP_EXIT_ADDONS="./.t*"
3456 ${cat} <<-_EOT > ./.tsendmail.sh
3457 #!${MYSHELL} -
3458 (echo 'From Echinacea Tue Jun 20 15:54:02 2017' && ${cat} && echo
3459 ) > "${MBOX}"
3460 _EOT
3461 chmod 0755 ./.tsendmail.sh
3463 echo mysig > ./.tmysig
3465 echo some-body | ${MAILX} ${ARGS} -Smta=./.tsendmail.sh \
3466 -Smessage-inject-head=head-inject \
3467 -Smessage-inject-tail=tail-inject \
3468 -Ssignature=./.tmysig \
3469 ex@am.ple > ./.tall 2>&1
3470 check behave:message_injections-1 0 "${MBOX}" '2434746382 134'
3471 check behave:message_injections-2 - .tall '4294967295 0' # empty file
3473 ${cat} <<-_EOT > ./.template
3474 From: me
3475 To: ex1@am.ple
3476 Cc: ex2@am.ple
3477 Subject: This subject is
3479 Body, body, body me.
3480 _EOT
3481 < ./.template ${MAILX} ${ARGS} -t -Smta=./.tsendmail.sh \
3482 -Smessage-inject-head=head-inject \
3483 -Smessage-inject-tail=tail-inject \
3484 -Ssignature=./.tmysig \
3485 > ./.tall 2>&1
3486 check behave:message_injections-3 0 "${MBOX}" '3114203412 198'
3487 check behave:message_injections-4 - .tall '4294967295 0' # empty file
3489 t_epilog
3492 t_behave_mime_types_load_control() {
3493 t_prolog
3494 TRAP_EXIT_ADDONS="./.t*"
3496 ${cat} <<-_EOT > ./.tmts1
3497 @ application/mathml+xml mathml
3498 _EOT
3499 ${cat} <<-_EOT > ./.tmts2
3500 @ x-conference/x-cooltalk ice
3501 @ aga-aga aga
3502 @ application/aga-aga aga
3503 _EOT
3505 ${cat} <<-_EOT > ./.tmts1.mathml
3506 <head>nonsense ML</head>
3507 _EOT
3508 ${cat} <<-_EOT > ./.tmts2.ice
3509 Icy, icy road.
3510 _EOT
3511 printf 'of which the c\x01rack is coming soon' > ./.tmtsx.doom
3512 printf 'of which the c\x01rack is coming soon' > ./.tmtsx.aga
3514 printf '
3515 m %s
3516 Schub-di-du
3517 ~@ ./.tmts1.mathml
3518 ~@ ./.tmts2.ice
3519 ~@ ./.tmtsx.doom
3520 ~@ ./.tmtsx.aga
3522 File %s
3523 from*
3524 type
3526 ' "${MBOX}" "${MBOX}" |
3527 ${MAILX} ${ARGS} \
3528 -Smimetypes-load-control=f=./.tmts1,f=./.tmts2 \
3529 > ./.tout 2>&1
3530 ex0_test behave:mime_types_load_control
3532 ${cat} "${MBOX}" >> ./.tout
3533 check behave:mime_types_load_control-1 - ./.tout '4049496531 2513'
3535 echo type | ${MAILX} ${ARGS} -R \
3536 -Smimetypes-load-control=f=./.tmts1,f=./.tmts3 \
3537 -f "${MBOX}" >> ./.tout 2>&1
3538 check behave:mime_types_load_control-2 0 ./.tout '2418616932 3742'
3540 t_epilog
3543 t_behave_smime() {
3544 have_feat smime || {
3545 echo 'behave:s/mime: unsupported, skipped'
3546 return
3549 t_prolog
3550 TRAP_EXIT_ADDONS="./.t.conf ./.tkey.pem ./.tcert.pem ./.tpair.pem"
3551 TRAP_EXIT_ADDONS="${TRAP_EXIT_ADDONS} ./.VERIFY ./.DECRYPT ./.ENCRYPT"
3552 TRAP_EXIT_ADDONS="${TRAP_EXIT_ADDONS} ./.tsendmail.sh"
3554 printf 'behave:s/mime: .. generating test key and certificate ..\n'
3555 ${cat} <<-_EOT > ./.t.conf
3556 [ req ]
3557 default_bits = 1024
3558 default_keyfile = keyfile.pem
3559 distinguished_name = req_distinguished_name
3560 attributes = req_attributes
3561 prompt = no
3562 output_password =
3564 [ req_distinguished_name ]
3565 C = GB
3566 ST = Over the
3567 L = rainbow
3568 O = S-nail
3569 OU = S-nail.smime
3570 CN = S-nail.test
3571 emailAddress = test@localhost
3573 [ req_attributes ]
3574 challengePassword =
3575 _EOT
3576 openssl req -x509 -nodes -days 3650 -config ./.t.conf \
3577 -newkey rsa:1024 -keyout ./.tkey.pem -out ./.tcert.pem >/dev/null 2>&1
3578 ${cat} ./.tkey.pem ./.tcert.pem > ./.tpair.pem
3580 # Sign/verify
3581 printf 'behave:s/mime:sign/verify: '
3582 echo bla | ${MAILX} ${ARGS} \
3583 -Ssmime-ca-file=./.tcert.pem -Ssmime-sign-cert=./.tpair.pem \
3584 -Ssmime-sign -Sfrom=test@localhost \
3585 -s 'S/MIME test' ./.VERIFY
3586 if [ $? -eq 0 ]; then
3587 printf 'ok\n'
3588 else
3589 printf 'failed\n'
3590 ESTAT=1
3591 t_epilog
3592 return
3595 ${awk} '
3596 BEGIN{ skip=0 }
3597 /^Content-Description: /{ skip = 2; print; next }
3598 /^$/{ if(skip) --skip }
3599 { if(!skip) print }
3601 < ./.VERIFY > "${MBOX}"
3602 check behave:s/mime:sign/verify:checksum - "${MBOX}" '2900817158 648'
3604 printf 'behave:s/mime:sign/verify:verify '
3605 printf 'verify\nx\n' |
3606 ${MAILX} ${ARGS} \
3607 -Ssmime-ca-file=./.tcert.pem -Ssmime-sign-cert=./.tpair.pem \
3608 -Ssmime-sign -Sfrom=test@localhost \
3609 -Serrexit -R \
3610 -f ./.VERIFY >/dev/null 2>&1
3611 if [ $? -eq 0 ]; then
3612 printf 'ok\n'
3613 else
3614 printf 'failed\n'
3615 ESTAT=1
3616 t_epilog
3617 return
3620 printf 'behave:s/mime:sign/verify:disproof-1 '
3621 if openssl smime -verify -CAfile ./.tcert.pem \
3622 -in ./.VERIFY >/dev/null 2>&1; then
3623 printf 'ok\n'
3624 else
3625 printf 'failed\n'
3626 ESTAT=1
3627 t_epilog
3628 return
3631 # (signing +) encryption / decryption
3632 ${cat} <<-_EOT > ./.tsendmail.sh
3633 #!${MYSHELL} -
3634 (echo 'From Euphrasia Thu Apr 27 17:56:23 2017' && ${cat}) > ./.ENCRYPT
3635 _EOT
3636 chmod 0755 ./.tsendmail.sh
3638 printf 'behave:s/mime:encrypt+sign: '
3639 echo bla |
3640 ${MAILX} ${ARGS} \
3641 -Ssmime-force-encryption \
3642 -Ssmime-encrypt-recei@ver.com=./.tpair.pem \
3643 -Smta=./.tsendmail.sh \
3644 -Ssmime-ca-file=./.tcert.pem -Ssmime-sign-cert=./.tpair.pem \
3645 -Ssmime-sign -Sfrom=test@localhost \
3646 -s 'S/MIME test' recei@ver.com
3647 if [ $? -eq 0 ]; then
3648 printf 'ok\n'
3649 else
3650 ESTAT=1
3651 printf 'error: encrypt+sign failed\n'
3654 ${sed} -e '/^$/,$d' < ./.ENCRYPT > "${MBOX}"
3655 check behave:s/mime:encrypt+sign:checksum - "${MBOX}" '1937410597 327'
3657 printf 'behave:s/mime:decrypt+verify: '
3658 printf 'decrypt ./.DECRYPT\nfi ./.DECRYPT\nverify\nx\n' |
3659 ${MAILX} ${ARGS} \
3660 -Ssmime-force-encryption \
3661 -Ssmime-encrypt-recei@ver.com=./.tpair.pem \
3662 -Smta=./.tsendmail.sh \
3663 -Ssmime-ca-file=./.tcert.pem -Ssmime-sign-cert=./.tpair.pem \
3664 -Ssmime-sign -Sfrom=test@localhost \
3665 -Serrexit -R \
3666 -f ./.ENCRYPT >/dev/null 2>&1
3667 if [ $? -eq 0 ]; then
3668 printf 'ok\n'
3669 else
3670 ESTAT=1
3671 printf 'failed\n'
3674 ${awk} '
3675 BEGIN{ skip=0 }
3676 /^Content-Description: /{ skip = 2; print; next }
3677 /^$/{ if(skip) --skip }
3678 { if(!skip) print }
3680 < ./.DECRYPT > "${MBOX}"
3681 check behave:s/mime:decrypt+verify:checksum - "${MBOX}" '1720739247 931'
3683 printf 'behave:s/mime:decrypt+verify:disproof-1: '
3684 if (openssl smime -decrypt -inkey ./.tkey.pem -in ./.ENCRYPT |
3685 openssl smime -verify -CAfile ./.tcert.pem) >/dev/null 2>&1; then
3686 printf 'ok\n'
3687 else
3688 printf 'failed\n'
3689 ESTAT=1
3692 printf "behave:s/mime:encrypt: "
3693 echo bla | ${MAILX} ${ARGS} \
3694 -Ssmime-force-encryption \
3695 -Ssmime-encrypt-recei@ver.com=./.tpair.pem \
3696 -Smta=./.tsendmail.sh \
3697 -Ssmime-ca-file=./.tcert.pem -Ssmime-sign-cert=./.tpair.pem \
3698 -Sfrom=test@localhost \
3699 -s 'S/MIME test' recei@ver.com
3700 if [ $? -eq 0 ]; then
3701 printf 'ok\n'
3702 else
3703 ESTAT=1
3704 printf 'failed\n'
3707 # Same as behave:s/mime:encrypt+sign:checksum above
3708 ${sed} -e '/^$/,$d' < ./.ENCRYPT > "${MBOX}"
3709 check behave:s/mime:encrypt:checksum - "${MBOX}" '1937410597 327'
3711 ${rm} -f ./.DECRYPT
3712 printf 'decrypt ./.DECRYPT\nx\n' | ${MAILX} ${ARGS} \
3713 -Ssmime-force-encryption \
3714 -Ssmime-encrypt-recei@ver.com=./.tpair.pem \
3715 -Smta=./.tsendmail.sh \
3716 -Ssmime-ca-file=./.tcert.pem -Ssmime-sign-cert=./.tpair.pem \
3717 -Sfrom=test@localhost \
3718 -Serrexit -R \
3719 -f ./.ENCRYPT >/dev/null 2>&1
3720 check behave:s/mime:decrypt 0 "./.DECRYPT" '2624716890 422'
3722 printf 'behave:s/mime:decrypt:disproof-1: '
3723 if openssl smime -decrypt -inkey ./.tkey.pem \
3724 -in ./.ENCRYPT >/dev/null 2>&1; then
3725 printf 'ok\n'
3726 else
3727 printf 'failed\n'
3728 ESTAT=1
3731 t_epilog
3734 t_behave_maildir() {
3735 t_prolog
3736 TRAP_EXIT_ADDONS="./.t*"
3740 while [ ${i} -lt 112 ]; do
3741 printf 'm file://%s\n~s Subject %s\nHello %s!\n~.\n' \
3742 "${MBOX}" "${i}" "${i}"
3743 i=`add ${i} 1`
3744 done
3745 ) | ${MAILX} ${ARGS}
3746 check behave:maildir-1 0 "${MBOX}" '1140119864 13780'
3748 printf 'File "%s"
3749 copy * "%s"
3750 File "%s"
3751 from*
3752 ' "${MBOX}" .tmdir1 .tmdir1 |
3753 ${MAILX} ${ARGS} -Snewfolders=maildir > .tlst
3754 check behave:maildir-2 0 .tlst '1797938753 9103'
3756 printf 'File "%s"
3757 copy * "maildir://%s"
3758 File "maildir://%s"
3759 from*
3760 ' "${MBOX}" .tmdir2 .tmdir2 |
3761 ${MAILX} ${ARGS} > .tlst
3762 check behave:maildir-3 0 .tlst '1155631089 9113'
3764 printf 'File "maildir://%s"
3765 copy * "file://%s"
3766 File "file://%s"
3767 from*
3768 ' .tmdir2 .tmbox1 .tmbox1 |
3769 ${MAILX} ${ARGS} > .tlst
3770 check behave:maildir-4 0 .tmbox1 '2646131190 13220'
3771 check behave:maildir-5 - .tlst '3701297796 9110'
3773 # only the odd (even)
3775 printf 'File "maildir://%s"
3776 copy ' .tmdir2
3778 while [ ${i} -lt 112 ]; do
3779 j=`modulo ${i} 2`
3780 [ ${j} -eq 1 ] && printf '%s ' "${i}"
3781 i=`add ${i} 1`
3782 done
3783 printf ' file://%s
3784 File "file://%s"
3785 from*
3786 ' .tmbox2 .tmbox2
3787 ) | ${MAILX} ${ARGS} > .tlst
3788 check behave:maildir-6 0 .tmbox2 '142890131 6610'
3789 check behave:maildir-7 - .tlst '960096773 4573'
3790 # ...
3792 printf 'file "maildir://%s"
3793 move ' .tmdir2
3795 while [ ${i} -lt 112 ]; do
3796 j=`modulo ${i} 2`
3797 [ ${j} -eq 0 ] && [ ${i} -ne 0 ] && printf '%s ' "${i}"
3798 i=`add ${i} 1`
3799 done
3800 printf ' file://%s
3801 File "file://%s"
3802 from*
3803 File "maildir://%s"
3804 from*
3805 ' .tmbox2 .tmbox2 .tmdir2
3806 ) | ${MAILX} ${ARGS} > .tlst
3807 check behave:maildir-8 0 .tmbox2 '3806905791 13100'
3808 ${sed} 2d < .tlst > .tlstx
3809 check behave:maildir-9 - .tlstx '4216815295 13645'
3811 t_epilog
3814 t_behave_mass_recipients() {
3815 t_prolog
3816 TRAP_EXIT_ADDONS="./.t*"
3818 ${cat} <<-_EOT > ./.tsendmail.sh
3819 #!${MYSHELL} -
3820 (echo 'From Eucalyptus Sat Jul 08 21:14:57 2017' && ${cat} && echo
3821 ) >> "${MBOX}"
3822 _EOT
3823 chmod 0755 ./.tsendmail.sh
3825 ${cat} <<'__EOT__' > ./.trc
3826 define bail {
3827 echoerr "Failed: $1. Bailing out"; echo "~x"; xit
3829 define ins_addr {
3830 wysh set nr=$1 hn=$2
3831 echo "~$hn $hn$nr@$hn"; echo '~:echo $?'; read es
3832 if [ "$es" -ne 0 ]
3833 xcall bail "ins_addr $hn 1-$nr"
3835 vput vexpr nr + $nr 1
3836 if [ "$nr" -le "$maximum" ]
3837 xcall ins_addr $nr $hn
3840 define bld_alter {
3841 wysh set nr=$1 hn=$2
3842 alternates $hn$nr@$hn
3843 vput vexpr nr + $nr 2
3844 if [ "$nr" -le "$maximum" ]
3845 xcall bld_alter $nr $hn
3848 define t_ocs {
3849 read ver
3850 call ins_addr 1 t
3851 call ins_addr 1 c
3852 call ins_addr 1 b
3854 define t_ocl {
3855 if [ "$t_remove" != '' ]
3856 call bld_alter 1 t
3857 call bld_alter 2 c
3860 set on-compose-splice=t_ocs on-compose-leave=t_ocl
3861 __EOT__
3863 ${rm} -f "${MBOX}"
3864 printf 'm this-goes@nowhere\nbody\n!.\n' |
3865 ${MAILX} ${ARGS} -Snomemdebug -Sescape=! -Sstealthmua=noagent \
3866 -X'source ./.trc' -Smta=./.tsendmail.sh -Smaximum=2001 \
3867 >./.tall 2>&1
3868 ${cat} ./.tall >> "${MBOX}"
3869 check behave:mass_recipients-1 0 "${MBOX}" '2912243346 51526'
3871 ${rm} -f "${MBOX}"
3872 printf 'm this-goes@nowhere\nbody\n!.\n' |
3873 ${MAILX} ${ARGS} -Snomemdebug -Sescape=! -Sstealthmua=noagent \
3874 -St_remove=1 -X'source ./.trc' -Smta=./.tsendmail.sh -Smaximum=2001 \
3875 >./.tall 2>&1
3876 ${cat} ./.tall >> "${MBOX}"
3877 check behave:mass_recipients-2 0 "${MBOX}" '4097804632 34394'
3879 t_epilog
3882 t_behave_lreply_futh_rth_etc() {
3883 t_prolog
3884 TRAP_EXIT_ADDONS="./.t*"
3886 ${cat} <<-_EOT > ./.tsendmail.sh
3887 #!${MYSHELL} -
3888 (echo 'From HumulusLupulus Thu Jul 27 14:41:20 2017' && ${cat} && echo
3889 ) >> "${MBOX}"
3890 _EOT
3891 chmod 0755 ./.tsendmail.sh
3893 ${cat} <<-_EOT > ./.tmbox
3894 From neverneverland Sun Jul 23 13:46:25 2017
3895 Subject: Bugstop: five miles out 1
3896 Reply-To: mister originator2 <mr2@originator>, bugstop@five.miles.out
3897 From: mister originator <mr@originator>
3898 To: bugstop-commit@five.miles.out, laber@backe.eu
3899 Cc: is@a.list
3900 Mail-Followup-To: bugstop@five.miles.out, laber@backe.eu, is@a.list
3901 In-reply-to: <20170719111113.bkcMz%laber@backe.eu>
3902 Date: Wed, 19 Jul 2017 09:22:57 -0400
3903 Message-Id: <20170719132257.766AF781267@originator>
3904 Status: RO
3906 > |Sorry, I think I misunderstand something. I would think that
3908 That's appalling.
3910 From neverneverland Fri Jul 7 22:39:11 2017
3911 Subject: Bugstop: five miles out 2
3912 Reply-To: mister originator2<mr2@originator>,bugstop@five.miles.out,is@a.list
3913 Content-Transfer-Encoding: 7bit
3914 From: mister originator <mr@originator>
3915 To: bugstop-commit@five.miles.out
3916 Cc: is@a.list
3917 Message-ID: <149945963975.28888.6950788126957753723.reportbug@five.miles.out>
3918 Date: Fri, 07 Jul 2017 16:33:59 -0400
3919 Status: R
3921 capable of changing back.
3923 From neverneverland Fri Jul 7 22:42:00 2017
3924 Subject: Bugstop: five miles out 3
3925 Reply-To: mister originator2 <mr2@originator>, bugstop@five.miles.out
3926 Content-Transfer-Encoding: 7bit
3927 From: mister originator <mr@originator>
3928 To: bugstop-commit@five.miles.out
3929 Cc: is@a.list
3930 Message-ID: <149945963975.28888.6950788126957753746.reportbug@five.miles.out>
3931 Date: Fri, 07 Jul 2017 16:33:59 -0400
3932 List-Post: <mailto:bugstop@five.miles.out>
3933 Status: R
3935 are you ready, boots?
3937 From neverneverland Sat Aug 19 23:15:00 2017
3938 Subject: Bugstop: five miles out 4
3939 Reply-To: mister originator2 <mr2@originator>, bugstop@five.miles.out
3940 Content-Transfer-Encoding: 7bit
3941 From: mister originator <mr@originator>
3942 To: bugstop@five.miles.out
3943 Cc: is@a.list
3944 Message-ID: <149945963975.28888.6950788126qtewrqwer.reportbug@five.miles.out>
3945 Date: Fri, 07 Jul 2017 16:33:59 -0400
3946 List-Post: <mailto:bugstop@five.miles.out>
3947 Status: R
3949 are you ready, boots?
3950 _EOT
3954 printf '
3955 define r {
3956 wysh set m="This is text of \\\"reply ${1}."
3957 reply 1 2 3
3958 !I m
3961 !I m
3964 !I m
3967 echo -----After reply $1.1 - $1.3: $?/$^ERRNAME
3969 define R {
3970 wysh set m="This is text of \\\"Reply ${1}."
3971 eval Reply $2
3972 !I m
3973 !I 2
3976 echo -----After Reply $1.$2: $?/$^ERRNAME
3978 define _Lh {
3979 read protover
3980 echo '"'"'~I m'"'"'
3981 echo '"'"'~I n'"'"'
3982 echo '"'"'".'"'"'
3984 define _Ls {
3985 wysh set m="This is text of \\\"Lreply ${1}." \\
3986 on-compose-splice=_Lh n=$2
3987 eval Lreply $2
3989 define L {
3990 # We need two indirections for this test: one for the case that Lreply
3991 # fails because if missing recipients, we need to read EOF next, thus
3992 # place this in _Ls last, and second for the succeeding cases EOF is
3993 # not what these should read, so go over the backside and splice it in!
3994 call _Ls "$@"
3995 echo -----After Lreply $1.$2: $?/$^ERRNAME
3997 define x {
3998 localopts call-fixate yes
3999 call r $1
4000 call R $1 1; call R $1 2; call R $1 3; call R $1 4
4001 call L $1 1; call L $1 2; call L $1 3
4003 define tweak {
4004 echo;echo '"'"'===== CHANGING === '"'"'"$*"'"'"' ====='"'"';echo
4005 eval "$@"
4008 set from=laber@backe.eu
4009 mlist is@a.list
4010 call x 1
4011 call tweak set reply-to-honour
4012 call x 2
4013 call tweak set followup-to
4014 call x 3
4015 call tweak set followup-to-honour
4016 call x 4
4017 call tweak mlist bugstop@five.miles.out
4018 call x 5
4019 call tweak mlsubscribe bugstop@five.miles.out
4020 call x 6
4021 call tweak set recipients-in-cc
4022 call x 7
4023 ' | ${MAILX} ${ARGS} -Sescape=! -Smta=./.tsendmail.sh \
4024 -Rf ./.tmbox >> "${MBOX}" 2>&1
4026 check behave:lreply_futh_rth_etc 0 "${MBOX}" '1375746559 24495'
4028 t_epilog
4031 t_behave_iconv_mbyte_base64() {
4032 t_prolog
4033 TRAP_EXIT_ADDONS="./.t*"
4035 if [ -n "${UTF8_LOCALE}" ] && have_feat iconv &&
4036 command -v iconv >/dev/null 2>&1 &&
4037 ( iconv -l | ${grep} -i -e iso-2022-jp -e euc-jp) >/dev/null 2>&1; then
4039 else
4040 echo 'behave:iconv_mbyte_base64: unsupported, skipped'
4041 return
4044 ${cat} <<-_EOT > ./.tsendmail.sh
4045 #!${MYSHELL} -
4046 (echo 'From DroseriaRotundifolia Thu Aug 03 17:26:25 2017' && ${cat} &&
4047 echo) >> "${MBOX}"
4048 _EOT
4049 chmod 0755 ./.tsendmail.sh
4051 if ( iconv -l | ${grep} -i iso-2022-jp ) >/dev/null 2>&1; then
4052 printf '
4053 set ttycharset=utf-8 sendcharsets=iso-2022-jp
4054 m t1@exam.ple
4055 !s Japanese from UTF-8 to ISO-2022-JP
4056 シジュウカラ科(シジュウカラか、学名 Paridae)は、鳥類スズメ目の科である。シジュウカラ(四十雀)と総称されるが、狭義にはこの1種をシジュウカラと呼ぶ。
4058 カンムリガラ(学名Parus cristatus)は、スズメ目シジュウカラ科に分類される鳥類の一種。
4061 カンムリガラ(学名Parus cristatus)は、スズメ目シジュウカラ科に分類される鳥類の一種。
4063 シジュウカラ科(シジュウカラか、学名 Paridae)は、鳥類スズメ目の科である。シジュウカラ(四十雀)と総称されるが、狭義にはこの1種をシジュウカラと呼ぶ。
4066 set ttycharset=iso-2022-jp charset-7bit=iso-2022-jp sendcharsets=utf-8
4067 m t2@exam.ple
4068 !s Japanese from ISO-2022-JP to UTF-8, eh, no, also ISO-2022-JP
4069 \e$B%%7%%8%%e%%&%%+%%i2J!J%%7%%8%%e%%&%%+%%i$+!"3XL>\e(B Paridae\e$B!K$O!"D;N`%%9%%:%%aL\\$N2J$G$"$k!#%%7%%8%%e%%&%%+%%i!J;M==?}!K$HAm>N$5$l$k$,!"695A$K$O$3$N\e(B1\e$B<o$r%%7%%8%%e%%&%%+%%i$H8F$V!#\e(B
4071 \e$B%%+%%s%%`%%j%%,%%i!J3XL>\e(BParus cristatus\e$B!K$O!"%%9%%:%%aL\\%%7%%8%%e%%&%%+%%i2J$KJ,N`$5$l$kD;N`$N0l<o!#\e(B
4074 \e$B%%+%%s%%`%%j%%,%%i!J3XL>\e(BParus cristatus\e$B!K$O!"%%9%%:%%aL\\%%7%%8%%e%%&%%+%%i2J$KJ,N`$5$l$kD;N`$N0l<o!#\e(B
4076 \e$B%%7%%8%%e%%&%%+%%i2J!J%%7%%8%%e%%&%%+%%i$+!"3XL>\e(B Paridae\e$B!K$O!"D;N`%%9%%:%%aL\\$N2J$G$"$k!#%%7%%8%%e%%&%%+%%i!J;M==?}!K$HAm>N$5$l$k$,!"695A$K$O$3$N\e(B1\e$B<o$r%%7%%8%%e%%&%%+%%i$H8F$V!#\e(B
4078 ' | LC_ALL=${UTF8_LOCALE} ${MAILX} ${ARGS} -Smta=./.tsendmail.sh \
4079 -Sescape=! -Smime-encoding=base64 2>./.terr
4080 check behave:iconv_mbyte_base64-1 0 "${MBOX}" '3428985079 1976'
4081 check behave:iconv_mbyte_base64-2 - ./.terr '4294967295 0'
4083 printf 'eval f 1; write ./.twrite\n' |
4084 ${MAILX} ${ARGS} ${ADDARG_UNI} -Rf "${MBOX}" >./.tlog 2>&1
4085 check behave:iconv_mbyte_base64-3 0 ./.twrite '1259742080 686'
4086 check behave:iconv_mbyte_base64-4 - ./.tlog '3956097665 119'
4087 else
4088 echo 'behave:iconv_mbyte_base64: ISO-2022-JP unsupported, skipping 1-4'
4091 if ( iconv -l | ${grep} -i euc-jp ) >/dev/null 2>&1; then
4092 rm -f "${MBOX}" ./.twrite
4093 printf '
4094 set ttycharset=utf-8 sendcharsets=euc-jp
4095 m t1@exam.ple
4096 !s Japanese from UTF-8 to EUC-JP
4097 シジュウカラ科(シジュウカラか、学名 Paridae)は、鳥類スズメ目の科である。シジュウカラ(四十雀)と総称されるが、狭義にはこの1種をシジュウカラと呼ぶ。
4099 カンムリガラ(学名Parus cristatus)は、スズメ目シジュウカラ科に分類される鳥類の一種。
4102 カンムリガラ(学名Parus cristatus)は、スズメ目シジュウカラ科に分類される鳥類の一種。
4104 シジュウカラ科(シジュウカラか、学名 Paridae)は、鳥類スズメ目の科である。シジュウカラ(四十雀)と総称されるが、狭義にはこの1種をシジュウカラと呼ぶ。
4107 set ttycharset=EUC-JP sendcharsets=utf-8
4108 m t2@exam.ple
4109 !s Japanese from EUC-JP to UTF-8
4110 ¥·¥¸¥å¥¦¥«¥é²Ê¡Ê¥·¥¸¥å¥¦¥«¥é¤«¡¢³Ø̾ Paridae¡Ë¤Ï¡¢Ä»Îॹ¥º¥áÌܤβʤǤ¢¤ë¡£¥·¥¸¥å¥¦¥«¥é¡Ê»Í½½¿ý¡Ë¤ÈÁí¾Î¤µ¤ì¤ë¤¬¡¢¶¹µÁ¤Ë¤Ï¤³¤Î1¼ï¤ò¥·¥¸¥å¥¦¥«¥é¤È¸Æ¤Ö¡£
4112 ¥«¥ó¥à¥ê¥¬¥é¡Ê³Ø̾Parus cristatus¡Ë¤Ï¡¢¥¹¥º¥áÌÜ¥·¥¸¥å¥¦¥«¥é²Ê¤ËʬÎव¤ì¤ëÄ»Îà¤Î°ì¼ï¡£
4115 ¥«¥ó¥à¥ê¥¬¥é¡Ê³Ø̾Parus cristatus¡Ë¤Ï¡¢¥¹¥º¥áÌÜ¥·¥¸¥å¥¦¥«¥é²Ê¤ËʬÎव¤ì¤ëÄ»Îà¤Î°ì¼ï¡£
4117 ¥·¥¸¥å¥¦¥«¥é²Ê¡Ê¥·¥¸¥å¥¦¥«¥é¤«¡¢³Ø̾ Paridae¡Ë¤Ï¡¢Ä»Îॹ¥º¥áÌܤβʤǤ¢¤ë¡£¥·¥¸¥å¥¦¥«¥é¡Ê»Í½½¿ý¡Ë¤ÈÁí¾Î¤µ¤ì¤ë¤¬¡¢¶¹µÁ¤Ë¤Ï¤³¤Î1¼ï¤ò¥·¥¸¥å¥¦¥«¥é¤È¸Æ¤Ö¡£
4119 ' | LC_ALL=${UTF8_LOCALE} ${MAILX} ${ARGS} -Smta=./.tsendmail.sh \
4120 -Sescape=! -Smime-encoding=base64 2>./.terr
4121 check behave:iconv_mbyte_base64-5 0 "${MBOX}" '1686827547 2051'
4122 check behave:iconv_mbyte_base64-6 - ./.terr '4294967295 0'
4124 printf 'eval f 1; write ./.twrite\n' |
4125 ${MAILX} ${ARGS} ${ADDARG_UNI} -Rf "${MBOX}" >./.tlog 2>&1
4126 check behave:iconv_mbyte_base64-7 0 ./.twrite '1259742080 686'
4127 check behave:iconv_mbyte_base64-8 - ./.tlog '500059195 119'
4128 else
4129 echo 'behave:iconv_mbyte_base64: EUC-JP unsupported, skipping 5-8'
4132 t_epilog
4135 # t_content()
4136 # Some basic tests regarding correct sending of mails, via STDIN / -t / -q,
4137 # including basic MIME Content-Transfer-Encoding correctness (quoted-printable)
4138 # Note we unfortunately need to place some statements without proper
4139 # indentation because of continuation problems
4140 t_content() {
4141 t_prolog
4143 # MIME encoding (QP) stress message body
4144 printf \
4145 'Ich bin eine DÖS-Datäi mit sehr langen Zeilen und auch '\
4146 'sonst bin ich ganz schön am Schleudern, da kannste denke '\
4147 "wasde willst, gelle, gelle, gelle, gelle, gelle.\r\n"\
4148 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst \r\n"\
4149 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1\r\n"\
4150 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12\r\n"\
4151 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123\r\n"\
4152 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234\r\n"\
4153 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345\r\n"\
4154 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456\r\n"\
4155 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 1234567\r\n"\
4156 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 12345678\r\n"\
4157 "Ich bin eine DÖS-Datäi mit langen Zeilen und auch sonst 123456789\r\n"\
4158 "Unn ausserdem habe ich trailing SP/HT/SP/HT whitespace \r\n"\
4159 "Unn ausserdem habe ich trailing HT/SP/HT/SP whitespace \r\n"\
4160 "auf den zeilen vorher.\r\n"\
4161 "From am Zeilenbeginn und From der Mitte gibt es auch.\r\n"\
4162 ".\r\n"\
4163 "Die letzte Zeile war nur ein Punkt.\r\n"\
4164 "..\r\n"\
4165 "Das waren deren zwei.\r\n"\
4166 " \r\n"\
4167 "Die letzte Zeile war ein Leerschritt.\n"\
4168 "=VIER = EQUAL SIGNS=ON A LINE=\r\n"\
4169 "Prösterchen.\r\n"\
4170 ".\n"\
4171 "Die letzte Zeile war nur ein Punkt, mit Unix Zeilenende.\n"\
4172 "..\n"\
4173 "Das waren deren zwei. ditto.\n"\
4174 "Prösterchen.\n"\
4175 "Unn ausseerdem habe ich trailing SP/HT/SP/HT whitespace \n"\
4176 "Unn ausseerdem habe ich trailing HT/SP/HT/SP whitespace \n"\
4177 "auf den zeilen vorher.\n"\
4178 "ditto.\n"\
4179 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.\n"\
4180 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.1"\
4181 "\n"\
4182 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
4183 "\n"\
4184 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
4185 "3\n"\
4186 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
4187 "34\n"\
4188 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
4189 "345\n"\
4190 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende.12"\
4191 "3456\n"\
4192 "QP am Zeilenende über soft-nl hinweg\n"\
4193 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende."\
4194 "ö123\n"\
4195 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende."\
4196 "1ö23\n"\
4197 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende."\
4198 "12ö3\n"\
4199 "Ich bin eine ziemlich lange, steile, scharfe Zeile mit Unix Zeilenende."\
4200 "123ö\n"\
4201 "=VIER = EQUAL SIGNS=ON A LINE=\n"\
4202 " \n"\
4203 "Die letzte Zeile war ein Leerschritt.\n"\
4204 ' '\
4205 > "${BODY}"
4207 # MIME encoding (QP) stress message subject
4208 SUB="Äbrä Kä?dä=brö Fü?di=bus? \
4209 adadaddsssssssddddddddddddddddddddd\
4210 ddddddddddddddddddddddddddddddddddd\
4211 ddddddddddddddddddddddddddddddddddd\
4212 dddddddddddddddddddd Hallelulja? Od\
4213 er?? eeeeeeeeeeeeeeeeeeeeeeeeeeeeee\
4214 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\
4215 eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee f\
4216 fffffffffffffffffffffffffffffffffff\
4217 fffffffffffffffffffff ggggggggggggg\
4218 ggggggggggggggggggggggggggggggggggg\
4219 ggggggggggggggggggggggggggggggggggg\
4220 ggggggggggggggggggggggggggggggggggg\
4221 gggggggggggggggg"
4223 # Three tests for MIME encoding and (a bit) content classification.
4224 # At the same time testing -q FILE, < FILE and -t FILE
4226 ${rm} -f "${MBOX}"
4227 < "${BODY}" ${MAILX} ${ARGS} ${ADDARG_UNI} \
4228 -a "${BODY}" -s "${SUB}" "${MBOX}"
4229 check content:001 0 "${MBOX}" '1145066634 6654'
4231 ${rm} -f "${MBOX}"
4232 < /dev/null ${MAILX} ${ARGS} ${ADDARG_UNI} \
4233 -a "${BODY}" -s "${SUB}" -q "${BODY}" "${MBOX}"
4234 check content:002 0 "${MBOX}" '1145066634 6654'
4236 ${rm} -f "${MBOX}"
4237 ( echo "To: ${MBOX}" && echo "Subject: ${SUB}" && echo &&
4238 ${cat} "${BODY}"
4239 ) | ${MAILX} ${ARGS} ${ADDARG_UNI} -Snodot -a "${BODY}" -t
4240 check content:003 0 "${MBOX}" '1145066634 6654'
4242 # Test for [260e19d] (Juergen Daubert)
4243 ${rm} -f "${MBOX}"
4244 echo body | ${MAILX} ${ARGS} "${MBOX}"
4245 check content:004 0 "${MBOX}" '2917662811 98'
4247 # Sending of multiple mails in a single invocation
4248 ${rm} -f "${MBOX}"
4249 ( printf "m ${MBOX}\n~s subject1\nE-Mail Körper 1\n~.\n" &&
4250 printf "m ${MBOX}\n~s subject2\nEmail body 2\n~.\n" &&
4251 echo x
4252 ) | ${MAILX} ${ARGS} ${ADDARG_UNI}
4253 check content:005 0 "${MBOX}" '2098659767 358'
4255 ## $BODY CHANGED
4257 # "Test for" [d6f316a] (Gavin Troy)
4258 ${rm} -f "${MBOX}"
4259 printf "m ${MBOX}\n~s subject1\nEmail body\n~.\nfi ${MBOX}\np\nx\n" |
4260 ${MAILX} ${ARGS} ${ADDARG_UNI} -Spipe-text/plain="@* ${cat}" > "${BODY}"
4261 check content:006 0 "${MBOX}" '2099098650 122'
4262 check content:006-1 - "${BODY}" '794542938 174'
4264 # "Test for" [c299c45] (Peter Hofmann) TODO shouldn't end up QP-encoded?
4265 ${rm} -f "${MBOX}"
4266 ${awk} 'BEGIN{
4267 for(i = 0; i < 10000; ++i)
4268 printf "\xC3\xBC"
4269 #printf "\xF0\x90\x87\x90"
4270 }' | ${MAILX} ${ARGS} ${ADDARG_UNI} -s TestSubject "${MBOX}"
4271 check content:007 0 "${MBOX}" '534262374 61816'
4273 ## Test some more corner cases for header bodies (as good as we can today) ##
4276 ${rm} -f "${MBOX}"
4277 echo | ${MAILX} ${ARGS} ${ADDARG_UNI} \
4278 -s 'a̲b̲c̲d̲e̲f̲h̲i̲k̲l̲m̲n̲o̲r̲s̲t̲u̲v̲w̲x̲z̲a̲b̲c̲d̲e̲f̲h̲i̲k̲l̲m̲n̲o̲r̲s̲t̲u̲v̲w̲x̲z̲' \
4279 "${MBOX}"
4280 check content:008 0 "${MBOX}" '3370931614 375'
4282 # Single word (overlong line split -- bad standard! Requires injection of
4283 # artificial data!! But can be prevented by using RFC 2047 encoding)
4284 ${rm} -f "${MBOX}"
4285 i=`${awk} 'BEGIN{for(i=0; i<92; ++i) printf "0123456789_"}'`
4286 echo | ${MAILX} ${ARGS} -s "${i}" "${MBOX}"
4287 check content:009 0 "${MBOX}" '489922370 1718'
4289 # Combination of encoded words, space and tabs of varying sort
4290 ${rm} -f "${MBOX}"
4291 echo | ${MAILX} ${ARGS} ${ADDARG_UNI} \
4292 -s "1Abrä Kaspas1 2Abra Katä b_kaspas2 \
4293 3Abrä Kaspas3 4Abrä Kaspas4 5Abrä Kaspas5 \
4294 6Abra Kaspas6 7Abrä Kaspas7 8Abra Kaspas8 \
4295 9Abra Kaspastäb4-3 10Abra Kaspas1 _ 11Abra Katäb1 \
4296 12Abra Kadabrä1 After Tab after Täb this is NUTS" \
4297 "${MBOX}"
4298 check content:010 0 "${MBOX}" '1676887734 591'
4300 # Overlong multibyte sequence that must be forcefully split
4301 # todo This works even before v15.0, but only by accident
4302 ${rm} -f "${MBOX}"
4303 echo | ${MAILX} ${ARGS} ${ADDARG_UNI} \
4304 -s "✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄\
4305 ✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄\
4306 ✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄✄" \
4307 "${MBOX}"
4308 check content:011 0 "${MBOX}" '3029301775 659'
4310 # Trailing WS
4311 ${rm} -f "${MBOX}"
4312 echo | ${MAILX} ${ARGS} \
4313 -s "1-1 B2 B3 B4 B5 B6 B\
4314 1-2 B2 B3 B4 B5 B6 B\
4315 1-3 B2 B3 B4 B5 B6 B\
4316 1-4 B2 B3 B4 B5 B6 B\
4317 1-5 B2 B3 B4 B5 B6 B\
4318 1-6 B2 B3 B4 B5 B6 " \
4319 "${MBOX}"
4320 check content:012 0 "${MBOX}" '4126167195 297'
4322 # Leading and trailing WS
4323 ${rm} -f "${MBOX}"
4324 echo | ${MAILX} ${ARGS} \
4325 -s " 2-1 B2 B3 B4 B5 B6 B\
4326 1-2 B2 B3 B4 B5 B6 B\
4327 1-3 B2 B3 B4 B5 B6 B\
4328 1-4 B2 B3 B4 B5 B6 " \
4329 "${MBOX}"
4330 check content:013 0 "${MBOX}" '3600624479 236'
4332 # Quick'n dirty RFC 2231 test; i had more when implementing it, but until we
4333 # have a (better) test framework materialize a quick shot
4334 ${rm} -f "${MBOX}"
4335 TRAP_EXIT_ADDONS=./.ttt
4337 mkdir ./.ttt || exit 1
4338 cd ./.ttt || exit 2
4339 : > "ma'ger.txt"
4340 : > "mä'ger.txt"
4341 : > 'diet\ is \curd.txt'
4342 : > 'diet "is" curd.txt'
4343 : > höde-tröge.txt
4344 : > höde__tröge__müde__dätte__hätte__vülle__gülle__äse__äße__säuerliche__kräuter__österliche__grüße__mäh.txt
4345 : > höde__tröge__müde__dätte__hätte__vuelle__guelle__aese__aesse__sauerliche__kräuter__österliche__grüße__mäh.txt
4346 : > hööööööööööööööööö_nöööööööööööööööööööööö_düüüüüüüüüüüüüüüüüüü_bäääääääääääääääääääääääh.txt
4347 : > ✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆.txt
4349 echo bla | ${MAILX} ${ARGS} ${ADDARG_UNI} \
4350 -a "./.ttt/ma'ger.txt" -a "./.ttt/mä'ger.txt" \
4351 -a './.ttt/diet\ is \curd.txt' -a './.ttt/diet "is" curd.txt' \
4352 -a ./.ttt/höde-tröge.txt \
4353 -a ./.ttt/höde__tröge__müde__dätte__hätte__vülle__gülle__äse__äße__säuerliche__kräuter__österliche__grüße__mäh.txt \
4354 -a ./.ttt/höde__tröge__müde__dätte__hätte__vuelle__guelle__aese__aesse__sauerliche__kräuter__österliche__grüße__mäh.txt \
4355 -a ./.ttt/hööööööööööööööööö_nöööööööööööööööööööööö_düüüüüüüüüüüüüüüüüüü_bäääääääääääääääääääääääh.txt \
4356 -a ./.ttt/✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆✆.txt \
4357 "${MBOX}"
4358 check content:014-1 0 "${MBOX}" '684985954 3092'
4360 # `resend' test, reusing $MBOX
4361 ${rm} -f "${BODY}"
4362 printf "Resend ${BODY}\nx\n" | ${MAILX} ${ARGS} -Rf "${MBOX}"
4363 check content:014-2 0 "${BODY}" '684985954 3092'
4365 ${rm} -f "${BODY}"
4366 printf "resend ${BODY}\nx\n" | ${MAILX} ${ARGS} -Rf "${MBOX}"
4367 check content:014-3 0 "${BODY}" '3130352658 3148'
4369 t_epilog
4372 t_all() {
4373 # if have_feat devel; then
4374 # ARGS="${ARGS} -Smemdebug"
4375 # export ARGS
4376 # fi
4378 if [ -n "${UTF8_LOCALE}" ]; then
4379 printf 'Using Unicode locale %s\n' "${UTF8_LOCALE}"
4380 else
4381 printf 'No Unicode locale found, disabling Unicode tests\n'
4384 t_behave
4385 t_content
4388 if [ -z "${CHECK_ONLY}" ]; then
4389 cc_all_configs
4390 else
4391 t_all
4394 [ ${ESTAT} -eq 0 ] && echo Ok || echo >&2 'Errors occurred'
4396 exit ${ESTAT}
4397 # s-sh-mode