#!/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 . "${MH_OBJ_DIR}/test/common.sh" setup_test check_exit '-eq 1' mhfixmsg - #### Make sure that html-to-text conversion is what we expect. require_locale en_US.UTF-8 en_US.UTF8 en_US.utf-8 en_US.utf8 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" mhn_defaults="$MH_INST_DIR${nmhetcdir}/mhn.defaults" if grep mhfixmsg-format-text/html "${mhn_defaults}" >/dev/null; then can_reformat_texthtml=1 if grep 'mhfixmsg-format-text/html.*w3m' "${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 no text browser was found" can_reformat_texthtml=0 fi # check -help start_test "-help" cat >"$expected" <"$actual" 2>&1 check "$expected" "$actual" # check -version start_test "-version" 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 start_test "non-MIME messages aren't modified, and -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 start_test "non-MIME messages with no bodies aren't modified, and -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 start_test "-nofixcte" cat >"`mhpath new`" <"$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 start_test "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 -file with directory start_test "-file with directory" run_test 'mhfixmsg -file /tmp' 'mhfixmsg: /tmp is a directory mhfixmsg: unable to parse message from file /tmp' # check -reformat (enabled by default): addition of text/plain part # to solitary text/html part start_test "-reformat (enabled by default): addition of text/plain part" prepare_space >"$expected" <
Need to go! Need ... to ... go!
------=_nmh-multipart-- EOF cat >"`mhpath new`" <
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. run_prog 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 start_test "implicit -file with absolute pathname" run_test "mhfixmsg `mhpath last` -outfile /dev/null" '' # check handling of boundary string that appears in message body start_test "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 >"`mhpath last`" < ------=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. run_prog 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 start_test "-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. run_prog 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 -decodetext (enabled by default) start_test "-decodetext (enabled by default)" cat >"$expected" <"`mhpath new`" <$expected <"`mhpath new`" <"`mhpath new`" <998 characters) text start_test "for successful decode of a different part with attempted -decodetext" cat >$expected <"`mhpath new`" <998 characters) text start_test "for successful decode of a different part with -decodetext of binary" cat >$expected <long lineThis line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. This line is greater than 998 characters in length, so this part should not be decoded. ------- =_aaaaaaaaaa0-- EOF run_prog mhfixmsg -noreformat -decodetext binary last check "`mhpath last`" "$expected" # check -decodetext of binary (containing ASCII NUL) text start_test "-decodetext of binary (containing ASCII NUL) text" printf "%s\275\262=\274\000%s" "To: recipient@example.com From: sender@example.com Subject: mhfixmsg binary decode test MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=\"----- =_aaaaaaaaaa0\" Content-Transfer-Encoding: binary ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset=\"UTF-8\"; name=\"nul+square.txt\" Content-Transfer-Encoding: binary " " ------- =_aaaaaaaaaa0-- " >"$expected" mhfixmsg last -decodetext binary -outfile "$actual" check "$expected" "$actual" # check that -reformat succeeds when decode of binary text fails start_test "-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: 7bit 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. run_prog 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 -textcharset # Also checks preservation of attributes after one (charset) that is # modified. start_test "-textcharset" cat >"$expected" <"`mhpath new`" <&1 check "$expected" "$actual" else echo "$0: skipping -textcharset check because nmh was built without iconv" rm -f "$expected" fi # check -nofixboundary start_test "-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/18 "$MH_TEST_DIR"/Mail/inbox/19 'keep first' # check that message is not output when fed through stdin (without -outfile) start_test "message is not output when fed through stdin" run_prog 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 start_test "fixup of erroneous boundary in multipart (-fixboundary, enabled by default)" 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: 18, fix multipart boundary" check "$expected" "$actual" # check that message is not modified when -fixboundary fails start_test "message is not modified when -fixboundary fails" cat >"`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 boundary below doesn't match the header boundary. ------=_ NextPart_000_1781A1A_01CC1147.81EBA8D4-- EOF cp -p "`mhpath last`" "$expected" run_test "mhfixmsg last -outfile $actual" '' check "$expected" "$actual" # check that text/plain part is not added to text/html in multipart/related # when it shouldn't be start_test "text/plain part is not added to text/html in multipart/related when it shouldn't be" 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 cp -p "`mhpath last`" "$expected" if [ $can_reformat_texthtml -eq 1 ]; then #### lynx inserts multiple blank lines, so squeeze them. run_prog mhfixmsg last -outfile - | squeeze_lines >"$actual" check "$expected" "$actual" 'ignore space' else rm -f "$expected" fi # check that text/plain part is added to text/html in multipart/related # when it should be start_test "text/plain part is added to text/html in multipart/related when it should be" cat >"$expected" < HTML Content This is the real content. ------=_Part_90310_101292502.1-- EOF cat >"`mhpath new`" < HTML Content This is the real content. ------=_Part_90310_101292502.1-- EOF if [ $can_reformat_texthtml -eq 1 ]; then #### lynx inserts multiple blank lines, so squeeze them. run_prog mhfixmsg last -outfile - | squeeze_lines >"$actual" check "$expected" "$actual" 'ignore space' else rm -f "$expected" fi # check handling of rfc822 message type # also, checks -fixboundary start_test "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="----- =badboundary" 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 not stripping of CRs from ASCII text context (default) start_test "not stripping of CRs from ASCII text context (default)" 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 run_prog mhfixmsg last -outfile "$actual" check "$expected" "$actual" # check stripping of CRs from ASCII text context start_test "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 were two CR-LF pairs at the end of this sentence. EOF run_prog mhfixmsg last -outfile "$actual" -nocrlflinebreaks check "$expected" "$actual" # check -replacetextplain start_test "-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-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. run_prog mhfixmsg last -replacetextplain -outfile - | \ squeeze_lines > "$actual" check "$expected" "$actual" 'ignore space' else rm -f "$expected" fi # check -noreplacetextplain start_test "-noreplacetextplain" cat >"$expected" < eticket Yes, the text/plain part really was empty. ------=_Part_876302-- EOF run_prog mhfixmsg last -replacetextplain -noreplacetextplain -outfile "$actual" check "$expected" "$actual" # check removal of extraneous trailing semicolon from header parameter list start_test "removal of extraneous trailing semicolon from header parameter list" cat >"$expected" <"`mhpath new`" <"$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/16" "${MH_TEST_DIR}/Mail/inbox/16.original" run_test 'mhfixmsg 16' '' check "${MH_TEST_DIR}/Mail/inbox/16.backup" \ "${MH_TEST_DIR}/Mail/inbox/16.original" # check -normmproc start_test "-normmproc" cp "${MH_TEST_DIR}/Mail/inbox/21" "${MH_TEST_DIR}/Mail/inbox/22" run_test 'mhfixmsg 21 -normmproc' check "${MH_TEST_DIR}/Mail/inbox/22" \ "${MH_TEST_DIR}/Mail/inbox/,21" 'keep first' fi # check -rmmproc start_test "-rmmproc" run_test 'mhfixmsg 21 -rmmproc true' if test -f '${MH_TEST_DIR}/Mail/inbox/22.backup'; then echo check of mhfixmsg -rmmproc FAILED, should not have created backup file failed=`expr ${failed:-0} + 1` fi # check -fixtype start_test "-fixtype" cat >"$expected" <"`mhpath new`" <$expected < This was the text/html part. ------- =_aaaaaaaaaa0-- EOF cat >"`mhpath new`" <$expected <"`mhpath new`" <$expected <"`mhpath new`" <$expected <"`mhpath new`" <"$expected.err" <"`mhpath new`" <"$actual.err" set -e #### Expected output is identical to the input message. check "`mhpath last`" "$actual" 'keep first' check "$expected.err" "$actual.err" # check that input is passed through to output when there's a parse error # (the charset string is missing its closing quote) with -outfile, and # input from stdin. Don't check err output, because it contains the name # of a tmp file. It's similar to that of the previous check. start_test "input is passed through to output when there's a parse error" set +e run_prog mhfixmsg -file - -outfile - <`mhpath last` >"$actual" 2>/dev/null set -e #### Expected output is identical to the input message. check "`mhpath last`" "$actual" 'keep first' start_test "pass through message with relative folder path with parse error" #### Factor out leading portion of current folder path and make it relative. pwd=`pwd` set +e run_prog mhfixmsg +./`mhpath | sed "s%^$pwd/%%"` last -out - >"$actual" 2>/dev/null set -e folder -f +inbox >/dev/null #### Expected output is identical to the input message. check "`mhpath last`" "$actual" start_test "fix RFC 2047 encoded header parameters" #### Also, add C-T-E:8bit to the message headers. cat >"$expected" <"`mhpath new`" <"$actual" 2>/dev/null check "$expected" "$actual" # 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