X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6409ef12b94e7a18b30f327d87891f33e95bb62d..1d5e6d0340ba258b34b85ccdac4c402ccf4fd51e:/test/mhfixmsg/test-mhfixmsg?ds=sidebyside diff --git a/test/mhfixmsg/test-mhfixmsg b/test/mhfixmsg/test-mhfixmsg index db45fc61..3f5e847e 100755 --- a/test/mhfixmsg/test-mhfixmsg +++ b/test/mhfixmsg/test-mhfixmsg @@ -12,52 +12,71 @@ if test -z "${MH_OBJ_DIR}"; then MH_OBJ_DIR=`cd $srcdir && pwd`; export MH_OBJ_DIR fi -. "${srcdir}/test/post/test-post-common.sh" +. "${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" -set +e -if grep mhfixmsg-format-text/html "${MH_TEST_DIR}/Mail/mhn.defaults" \ - >/dev/null; then +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 - mhfixmsg-format-text/html is not available" + echo "$0: skipping -reformat check because no text browser was found" can_reformat_texthtml=0 fi -set -e # check -help -# Verified behavior consistent with compiled sendmail. +start_test "-help" cat >"$expected" <"$actual" 2>&1 +#### Skip nmh intro text. +run_prog mhfixmsg -help | sed '/^$/,$d' >"$actual" 2>&1 check "$expected" "$actual" # check -version -# Verified same behavior as compiled mhfixmsg. +start_test "-version" case `mhfixmsg -version` in mhfixmsg\ --*) ;; *) printf '%s: mhfixmsg -version generated unexpected output\n' "$0" >&2 @@ -67,13 +86,15 @@ 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 -cat >`mhpath new` <"`mhpath new`" < To: Some User Date: Fri, 29 Sep 2006 00:00:00 @@ -86,7 +107,8 @@ check "`mhpath last`" "$actual" # check -nofixcte -cat >"$MH_TEST_DIR"/Mail/inbox/11 <"`mhpath new`" <"$expected" </dev/null run_test 'mhfixmsg' '' @@ -167,6 +191,7 @@ 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 '' @@ -174,10 +199,16 @@ 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 -# -cat >"$expected" <"$expected" < @@ -210,7 +241,7 @@ Content-Transfer-Encoding: 8bit ------=_nmh-multipart-- EOF -cat >"$MH_TEST_DIR"/Mail/inbox/12 <"`mhpath new`" <"$expected.err" - #### lynx inserts multiple blank lines, so use uniq to squeeze them. - mhfixmsg last -outfile - -verbose 2>"$actual.err" | uniq >"$actual" - check "$expected" "$actual" + #### 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 -# -cat >"$expected" <"$expected" < @@ -284,7 +323,7 @@ Content-Transfer-Encoding: 8bit ------=_nmh-multipart-3-- EOF -cat >"$MH_TEST_DIR"/Mail/inbox/12 <"`mhpath last`" <"$expected.err" - #### lynx inserts multiple blank lines, so use uniq to squeeze them. - mhfixmsg last -outfile - -verbose 2>"$actual.err" | uniq >"$actual" - check "$expected" "$actual" + #### 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 -cat >"$expected" <"$expected" <"$expected.err" - #### lynx inserts multiple blank lines, so use uniq to squeeze them. - mhfixmsg last -nodecode -outfile - -verbose 2>"$actual.err" | uniq >"$actual" - check "$expected" "$actual" + #### 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 -decode (enabled by default) +# check -decodetext (enabled by default) +start_test "-decodetext (enabled by default)" cat >"$expected" <`mhpath new` <"`mhpath new`" <$expected <`mhpath new` <"`mhpath new`" <`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 -decode of binary text -printf "%s\x0d\xbd\xb2=\xbc%s" "To: recipient@example.com +# 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=\"iso-8859-1\"; name=\"square.txt\" +Content-Type: text/plain; charset=\"UTF-8\"; name=\"nul+square.txt\" Content-Transfer-Encoding: binary " " ------- =_aaaaaaaaaa0-- " >"$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 +mhfixmsg last -decodetext binary -outfile "$actual" +check "$expected" "$actual" # check that -reformat succeeds when decode of binary text fails -cat >"$expected" <<'EOF' +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: @@ -593,7 +758,7 @@ Content-Type: multipart/alternative; boundary="----=_nmh-multipart" ------=_nmh-multipart Content-Type: text/plain; charset="ISO-8859-1" -Content-Transfer-Encoding: 8bit +Content-Transfer-Encoding: 7bit Mile $0.00 Time $78.71 @@ -608,7 +773,7 @@ Content-Transfer-Encoding: quoted-printable EOF -cat >`mhpath new` <<'EOF' +cat >"`mhpath new`" <<'EOF' MIME-Version: 1.0 Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable @@ -643,10 +808,10 @@ d>"$actual" + 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" @@ -654,15 +819,17 @@ else fi -# check -textcodeset +# check -textcharset # Also checks preservation of attributes after one (charset) that is # modified. +start_test "-textcharset" cat >"$expected" <`mhpath new` <"`mhpath new`" <"$actual.err" -if grep "mhfixmsg: Can't convert .* to .* without iconv" "$actual.err" \ - >/dev/null; then - echo skipping -textcodeset check because nmh was built without iconv - rm -f "$expected" "$actual" "$actual.err" -else +if test "$ICONV_ENABLED" -eq 1; then + run_prog mhfixmsg last -textcharset utf-8 -outfile "$actual" 2>&1 check "$expected" "$actual" - rm "$actual.err" +else + echo "$0: skipping -textcharset check because nmh was built without iconv" + rm -f "$expected" fi -set -e # check -nofixboundary +start_test "-nofixboundary" cat >"$expected" <`mhpath new` <"`mhpath new`" <"$actual" 2>"$actual.err" +# 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 @@ -751,10 +916,11 @@ 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" < @@ -772,28 +938,49 @@ The boundaries of this part don't match the header boundary. EOF run_test 'mhfixmsg last -outfile '"$actual"' -verbose' \ - "mhfixmsg: 17, fix multipart boundary" + "mhfixmsg: 18, fix multipart boundary" check "$expected" "$actual" -# check that text/plain part is added to lone text/html in multipart/related -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 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`" < -------=_nmh-multipart1-- - ------=_Part_90310_101292502.1 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit @@ -817,12 +1002,31 @@ Your email client does not support HTML messages ------=_Part_90310_101292502.1-- EOF -cat >`mhpath new` <"$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" < + +------=_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 use uniq to squeeze them. - mhfixmsg last -outfile - | uniq >"$actual" - check "$expected" "$actual" + #### 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 @@ -883,14 +1108,14 @@ This is an RFC-822 message. and some garbage at the end EOF -cat >`mhpath new` <"`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" +Content-Type: multipart/mixed; boundary="----- =badboundary" and some garbage before the attachment @@ -916,7 +1141,36 @@ 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' +cat >"`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. +There were two CR-LF pairs at the end of this sentence. EOF -mhfixmsg last -outfile "$actual" +run_prog mhfixmsg last -outfile "$actual" -nocrlflinebreaks check "$expected" "$actual" -# check rmmproc -cat >"$MH_TEST_DIR/Mail/rmmproc" <<'EOF' -mv "$1" "$1.backup" +# check -replacetextplain +start_test "-replacetextplain" +prepare_space >"$expected" < +eticket + + + Yes, the text/plain part really was empty. + + + +------=_Part_876302-- 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" +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 -# 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' +------=_Part_876302 +Content-Type: text/html; charset="UTF-8" +Content-Disposition: inline -# 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` + +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 -# make sure there are no tmp files left over -find "$MH_TEST_DIR/Mail" \( -name 'mhfix*' -o -name ',mhfix*' \) -print \ - >"$actual" +# 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" <