#!/bin/sh ###################################################### # # Test mhfixmsg # ###################################################### set -e if test -z "${MH_OBJ_DIR}"; then srcdir=`dirname $0`/../.. MH_OBJ_DIR=`cd $srcdir && pwd`; export MH_OBJ_DIR fi . "${srcdir}/test/post/test-post-common.sh" expected="$MH_TEST_DIR/test-mhfixmsg$$.expected" expected_err="$MH_TEST_DIR/test-mhfixmsg$$.expected_err" actual="$MH_TEST_DIR/test-mhfixmsg$$.actual" actual_err="$MH_TEST_DIR/test-mhfixmsg$$.actual_err" #### Make sure that html-to-text conversion is what we expect. LC_ALL=en_US.UTF-8; export LC_ALL set +e if grep mhfixmsg-format-text/html "${MH_TEST_DIR}/Mail/mhn.defaults" \ >/dev/null; then can_reformat_texthtml=1 if grep 'mhfixmsg-format-text/html.*w3m' "${MH_TEST_DIR}/Mail/mhn.defaults" \ >/dev/null; then #### w3m uses $HOME/.w3m/, and creates it if it doesn't exist. To #### support testing with non-writeable $HOME, and to not leave #### relics from this test if it is writeable but doesn't already #### have a .w3m, and to not depend on whatever is in that if it #### does already exist, overwrite $HOME if using w3m. HOME="$MHTMPDIR" export HOME fi else echo "$0: skipping -reformat check because \ mhfixmsg-format-text/html is not available" can_reformat_texthtml=0 fi set -e # check -help # Verified behavior consistent with compiled sendmail. cat >"$expected" <"$actual" 2>&1 check "$expected" "$actual" # check -version # Verified same behavior as compiled mhfixmsg. case `mhfixmsg -version` in mhfixmsg\ --*) ;; *) printf '%s: mhfixmsg -version generated unexpected output\n' "$0" >&2 failed=`expr ${failed:-0} + 1`;; esac # check that non-MIME messages aren't modified # check -outfile run_test 'mhfixmsg first -outfile '"$actual" '' check "`mhpath first`" "$actual" 'keep first' # check that non-MIME messages with no bodies aren't modified # check -outfile cat >`mhpath new` < To: Some User Date: Fri, 29 Sep 2006 00:00:00 Message-Id: @test.nmh Subject: message with no body EOF run_test 'mhfixmsg last -outfile '"$actual" '' check "`mhpath last`" "$actual" # check -nofixcte cat >"$MH_TEST_DIR"/Mail/inbox/11 <"$expected" </dev/null run_test 'mhfixmsg' '' check "$expected" "$MH_TEST_DIR"/Mail/inbox/11 'keep first' cp "$MH_TEST_DIR"/Mail/inbox/11.original "$MH_TEST_DIR"/Mail/inbox/11 check "$MH_TEST_DIR"/Mail/inbox/,11 "$MH_TEST_DIR"/Mail/inbox/11.original # check backup with -file cp "$MH_TEST_DIR"/Mail/inbox/11 "$MH_TEST_DIR"/Mail/inbox/11.original folder last >/dev/null run_test 'mhfixmsg -file '"$MH_TEST_DIR"/Mail/inbox/11 '' check "$MH_TEST_DIR"/Mail/inbox/11 "$expected" 'keep first' check "$MH_TEST_DIR"/Mail/inbox/,11 "$MH_TEST_DIR"/Mail/inbox/11.original # check -reformat (enabled by default): addition of text/plain part # to solitary text/html part # prepare_space >"$expected" <
Need to go! Need ... to ... go!
------=_nmh-multipart-- EOF cat >"$MH_TEST_DIR"/Mail/inbox/12 <
Need to go! Need ... to ... go!
EOF if [ $can_reformat_texthtml -eq 1 ]; then printf '%s\n' "mhfixmsg: 12, insert text/plain part mhfixmsg: 12 part 1, decode text/html; charset=\"Windows-1252\"" \ >"$expected.err" #### lynx inserts multiple blank lines, so squeeze them. mhfixmsg last -outfile - -verbose 2>"$actual.err" | squeeze_lines >"$actual" check "$expected" "$actual" 'ignore space' check "$expected.err" "$actual.err" else rm -f "$expected" fi # check implicit -file with absolute pathname run_test "mhfixmsg `mhpath last` -outfile /dev/null" '' # check handling of boundary string that appears in message body # prepare_space >"$expected" < ------=_nmh-multipart
------=_nmh-multipart-1
------=_nmh-multipart-2
------=_nmh-multipart-3-- EOF cat >"$MH_TEST_DIR"/Mail/inbox/12 < ------=3D_nmh-multipart
------=3D_nmh-multipart-1
------=3D_nmh-multipart-2
EOF if [ $can_reformat_texthtml -eq 1 ]; then printf '%s\n' "mhfixmsg: 12, insert text/plain part mhfixmsg: 12 part 1, decode text/html; charset=\"Windows-1252\"" \ >"$expected.err" #### lynx inserts multiple blank lines, so squeeze them. mhfixmsg last -outfile - -verbose 2>"$actual.err" | squeeze_lines >"$actual" check "$expected" "$actual" 'ignore space' check "$expected.err" "$actual.err" else rm -f "$expected" fi # check -nodecode prepare_space >"$expected" <
Need to go! Need ... to ... go!
------=_nmh-multipart-- EOF cat >"$MH_TEST_DIR"/Mail/inbox/12 <
Need to go! Need ... to ... go!
EOF if [ $can_reformat_texthtml -eq 1 ]; then printf '%s\n' 'mhfixmsg: 12, insert text/plain part' >"$expected.err" #### lynx inserts multiple blank lines, so squeeze them. mhfixmsg last -nodecode -outfile - -verbose 2>"$actual.err" | \ squeeze_lines >"$actual" check "$expected" "$actual" 'ignore space' check "$expected.err" "$actual.err" else rm -f "$expected" fi # check -decode (enabled by default) cat >"$expected" <`mhpath new` <$expected <`mhpath new` <`mhpath new` <"$expected" ## output_content() in mhoutsbr.c can't handle binary content. ## mhfixmsg last -decodetext binary -outfile "$actual" ## check "$expected" "$actual" rm -f "$expected" rmm last # check that -reformat succeeds when decode of binary text fails prepare_space >"$expected" <<'EOF' MIME-Version: 1.0 Date: Thu, 11 Apr 2013 02:47:08 -0700 To: From: Subject: body requires binary encoding Content-Type: multipart/alternative; boundary="----=_nmh-multipart" ------=_nmh-multipart Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit Mile $0.00 Time $78.71 State Tax $5.90 Vehicle License Fee $1.84 State Txn Tax $6.00 ------=_nmh-multipart Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable EOF cat >`mhpath new` <<'EOF' MIME-Version: 1.0 Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable Date: Thu, 11 Apr 2013 02:47:08 -0700 To: From: Subject: body requires binary encoding   EOF if [ $can_reformat_texthtml -eq 1 ]; then #### lynx inserts multiple blank lines, so squeeze them. #### Truncate to avoid comparing the html portion because it can #### get reformatted. mhfixmsg last -outfile - | squeeze_lines | head -22 >"$actual" check "$expected" "$actual" 'ignore space' else cp -p "$MH_TEST_DIR/Mail/inbox/15" "$MH_TEST_DIR/Mail/inbox/15.backup" rm -f "$expected" fi # check -textcodeset # Also checks preservation of attributes after one (charset) that is # modified. cat >"$expected" <`mhpath new` <"$actual.err" if grep "mhfixmsg: Can't convert .* to .* without iconv" "$actual.err" \ >/dev/null; then echo "$0: skipping -textcodeset check because nmh was built without iconv" rm -f "$expected" "$actual" "$actual.err" else check "$expected" "$actual" rm "$actual.err" fi set -e # check -nofixboundary cat >"$expected" <`mhpath new` < To: Subject: mhfixmsg bad boundary test This is a multi-part message in MIME format. ------=_NextPart_000_1781A1A_01CC1147.81EBA8D4 Content-Type: text/plain The boundaries of this part don't match the header boundary. ------=_NextPart_000_1781A1A_01CC1147.81EBA8D4-- EOF cp -p `mhpath last` `mhpath new` run_test 'mhfixmsg last -nofixboundary' '' check "$MH_TEST_DIR"/Mail/inbox/17 "$MH_TEST_DIR"/Mail/inbox/18 'keep first' # check that message is not output when fed through stdin mhfixmsg -file - -verbose <`mhpath last` >"$actual" 2>"$actual.err" check "$expected" "$actual" if grep "mhfixmsg: $MH_TEST_DIR/Mail/.*, fix multipart boundary" \ "$actual.err" >/dev/null; then rm -f "$actual.err" else echo "$0: test failed, output is in $actual.err." failed=`expr ${failed:-0} + 1` fi # check fixup of erroneous boundary in multipart (-fixboundary, # enabled by default) # check -verbose cat >"$expected" < To: Subject: mhfixmsg bad boundary test This is a multi-part message in MIME format. ------=_NextPart_000_1781A1A_01CC1147.81EBA8D4 Content-Type: text/plain The boundaries of this part don't match the header boundary. ------=_NextPart_000_1781A1A_01CC1147.81EBA8D4-- EOF run_test 'mhfixmsg last -outfile '"$actual"' -verbose' \ "mhfixmsg: 17, fix multipart boundary" check "$expected" "$actual" # check that text/plain part is added to lone text/html in multipart/related prepare_space >"$expected" < HTML Content This is the real content. ------=_nmh-multipart1-- ------=_Part_90310_101292502.1 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Your email client does not support HTML messages ------=_Part_90310_101292502.1-- EOF cat >`mhpath new` < HTML Content This is the real content. ------=_Part_90310_101292502.1 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Your email client does not support HTML messages ------=_Part_90310_101292502.1-- EOF if [ $can_reformat_texthtml -eq 1 ]; then #### lynx inserts multiple blank lines, so squeeze them. mhfixmsg last -outfile - | squeeze_lines >"$actual" check "$expected" "$actual" 'ignore space' else rm -f "$expected" fi # check handling of rfc822 message type cat >"$expected" < To: Some User Date: Fri, 29 Sep 2006 00:00:00 Message-Id: @test.nmh Subject: message with message/rfc822 attachment MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" and some garbage before the attachment ------- =_aaaaaaaaaa0 Content-Type: message/rfc822; name="1552"; charset="us-ascii" Content-Description: 1552 Content-Disposition: attachment; filename="1552" From: Test To: Date: Thu, 28 Sep 2006 00:00:00 Message-Id: @test.nmh Subject: message/rfc822 attachment This is an RFC-822 message. ------- =_aaaaaaaaaa0-- and some garbage at the end EOF cat >`mhpath new` < To: Some User Date: Fri, 29 Sep 2006 00:00:00 Message-Id: @test.nmh Subject: message with message/rfc822 attachment MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaa0" and some garbage before the attachment ------- =_aaaaaaaaaa0 Content-Type: message/rfc822; name="1552"; charset="us-ascii" Content-Description: 1552 Content-Disposition: attachment; filename="1552" From: Test To: Date: Thu, 28 Sep 2006 00:00:00 Message-Id: @test.nmh Subject: message/rfc822 attachment This is an RFC-822 message. ------- =_aaaaaaaaaa0-- and some garbage at the end EOF run_test 'mhfixmsg last -outfile '"$actual" '' check "$expected" "$actual" # check stripping of CRs from ASCII text context cat >"$expected" <`mhpath new` <<'EOF' MIME-Version: 1.0 From: sender@example.com To: recipient@example.com Subject: message with CR's Date: Mon, 29 Apr 2013 11:51:45 -0400 There are two CR-LF pairs at the end of this sentence. EOF mhfixmsg last -outfile "$actual" check "$expected" "$actual" # check -replacetextplain prepare_space >"$expected" < eticket Yes, the text/plain part really was empty. ------=_Part_876302-- EOF cat >`mhpath new` <<'EOF' To: recipient@example.com From: sender@example.com Subject: mhfixmsg replacement of bad text/plain part test MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_876302" ------=_Part_876302 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Content-Disposition: inline ------=_Part_876302 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Content-Disposition: inline eticket Yes, the text/plain part really was empty. ------=_Part_876302-- EOF if [ $can_reformat_texthtml -eq 1 ]; then #### lynx inserts multiple blank lines, so squeeze them. mhfixmsg last -replacetextplain -outfile - | squeeze_lines > "$actual" check "$expected" "$actual" 'ignore space' else rm -f "$expected" fi # check -noreplacetextplain cat >"$expected" < eticket Yes, the text/plain part really was empty. ------=_Part_876302-- EOF mhfixmsg last -replacetextplain -noreplacetextplain -outfile "$actual" check "$expected" "$actual" # check rmmproc cat >"$MH_TEST_DIR/Mail/rmmproc" <<'EOF' mv "$1" "$1.backup" EOF chmod a+x "${MH_TEST_DIR}/Mail/rmmproc" echo "rmmproc: ${MH_TEST_DIR}/Mail/rmmproc" >>"$MH" cp "${MH_TEST_DIR}/Mail/inbox/15" "${MH_TEST_DIR}/Mail/inbox/15.original" run_test 'mhfixmsg 15' '' check "${MH_TEST_DIR}/Mail/inbox/15.backup" \ "${MH_TEST_DIR}/Mail/inbox/15.original" # check -normmproc cp "${MH_TEST_DIR}/Mail/inbox/19" "${MH_TEST_DIR}/Mail/inbox/20" run_test 'mhfixmsg 19 -normmproc' check "${MH_TEST_DIR}/Mail/inbox/20" \ "${MH_TEST_DIR}/Mail/inbox/,19" 'keep first' # check -rmmproc run_test 'mhfixmsg 20 -rmmproc true' if test -f '${MH_TEST_DIR}/Mail/inbox/20.backup'; then echo check of mhfixmsg -rmmproc FAILED, should not have created backup file failed=`expr ${failed:-0} + 1` fi # make sure there are no tmp files left over find "$MH_TEST_DIR/Mail" \( -name 'mhfix*' -o -name ',mhfix*' \) -print \ >"$actual" cat >"$expected" <
Mile $0.00
Time$78.71
<= font face=3D"Arial, Helvetica, sans-serif" color=3D"#333333" size=3D"2">State Tax $5.90
Vehicle License Fee $1.84
State Txn Tax $6.00