]> diplodocus.org Git - nmh/blobdiff - test/mhfixmsg/test-mhfixmsg
patch: Maildir support for "scan -file"
[nmh] / test / mhfixmsg / test-mhfixmsg
index 167c2379f64f905f9ec6bad5b71b699077b8a3fe..c80cfb8b1a4b9404a9fdf3b79f3fb322fc261894 100755 (executable)
@@ -16,9 +16,10 @@ fi
 
 setup_test
 
 
 setup_test
 
+check_exit '-eq 1' mhfixmsg -
+
 #### Make sure that html-to-text conversion is what we expect.
 #### Make sure that html-to-text conversion is what we expect.
-require_locale en_US.utf-8 en_US.utf8
-LC_ALL=en_US.UTF-8; export LC_ALL
+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"
 
 expected="$MH_TEST_DIR/test-mhfixmsg$$.expected"
 expected_err="$MH_TEST_DIR/test-mhfixmsg$$.expected_err"
@@ -27,8 +28,7 @@ actual_err="$MH_TEST_DIR/test-mhfixmsg$$.actual_err"
 
 mhn_defaults="$MH_INST_DIR${nmhetcdir}/mhn.defaults"
 
 
 mhn_defaults="$MH_INST_DIR${nmhetcdir}/mhn.defaults"
 
-if grep mhfixmsg-format-text/html "${mhn_defaults}" \
-  >/dev/null; then
+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
   can_reformat_texthtml=1
   if grep 'mhfixmsg-format-text/html.*w3m' "${mhn_defaults}" \
     >/dev/null; then
@@ -53,12 +53,15 @@ Usage: mhfixmsg [+folder] [msgs] [switches]
   -decodetext 8bit|7bit|binary
   -nodecodetext
   -decodetypes
   -decodetext 8bit|7bit|binary
   -nodecodetext
   -decodetypes
+  -decodeheaderfieldbodies utf-8
+  -nodecodeheaderfieldbodies
   -[no]crlflinebreaks
   -[no]textcharset
   -[no]reformat
   -[no]replacetextplain
   -[no]fixboundary
   -[no]fixcte
   -[no]crlflinebreaks
   -[no]textcharset
   -[no]reformat
   -[no]replacetextplain
   -[no]fixboundary
   -[no]fixcte
+  -[no]checkbase64
   -fixtype mimetype
   -file file
   -outfile file
   -fixtype mimetype
   -file file
   -outfile file
@@ -71,7 +74,7 @@ Usage: mhfixmsg [+folder] [msgs] [switches]
 EOF
 
 #### Skip nmh intro text.
 EOF
 
 #### Skip nmh intro text.
-run_prog mhfixmsg -help | sed '/^$/,$d' >"$actual" 2>&1
+run_prog mhfixmsg -help 2>&1 | sed '/^$/,$d' >"$actual"
 check "$expected" "$actual"
 
 
 check "$expected" "$actual"
 
 
@@ -86,15 +89,15 @@ esac
 
 # check that non-MIME messages aren't modified
 # check -outfile
 
 # check that non-MIME messages aren't modified
 # check -outfile
-start_test "that non-MIME messages aren't modified, and -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
 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 "that non-MIME messages with no bodies aren't modified, and -outfile"
-cat >`mhpath new` <<EOF
+start_test "non-MIME messages with no bodies aren't modified, and -outfile"
+cat >"`mhpath new`" <<EOF
 From: Test <test@example.com>
 To: Some User <user@example.com>
 Date: Fri, 29 Sep 2006 00:00:00
 From: Test <test@example.com>
 To: Some User <user@example.com>
 Date: Fri, 29 Sep 2006 00:00:00
@@ -108,7 +111,7 @@ check "`mhpath last`" "$actual"
 
 # check -nofixcte
 start_test "-nofixcte"
 
 # check -nofixcte
 start_test "-nofixcte"
-cat >"$MH_TEST_DIR"/Mail/inbox/11 <<EOF
+cat >"`mhpath new`" <<EOF
 From: Anon
 To: Mailinglist
 Subject: =?ISO-8859-15?Q?Re=3A_H=E5lla_linuxsystem_uppdaterade?=
 From: Anon
 To: Mailinglist
 Subject: =?ISO-8859-15?Q?Re=3A_H=E5lla_linuxsystem_uppdaterade?=
@@ -179,6 +182,7 @@ run_test 'mhfixmsg last -outfile '"$actual"' -verbose' \
 QUOTED-PRINTABLE with 8 bit"
 check "$expected" "$actual" 'keep first'
 
 QUOTED-PRINTABLE with 8 bit"
 check "$expected" "$actual" 'keep first'
 
+sbackup="`mhparam sbackup`"
 
 # check with no options:  checks backup
 start_test "with no options:  checks backup"
 
 # check with no options:  checks backup
 start_test "with no options:  checks backup"
@@ -187,7 +191,7 @@ folder last >/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
 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 "$MH_TEST_DIR/Mail/inbox/${sbackup}11" "$MH_TEST_DIR"/Mail/inbox/11.original
 
 
 # check backup with -file
 
 
 # check backup with -file
@@ -196,7 +200,13 @@ 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'
 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 "$MH_TEST_DIR/Mail/inbox/${sbackup}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
 
 
 # check -reformat (enabled by default):  addition of text/plain part
@@ -235,7 +245,7 @@ Content-Transfer-Encoding: 7bit
 ------=_nmh-multipart--
 EOF
 
 ------=_nmh-multipart--
 EOF
 
-cat >"$MH_TEST_DIR"/Mail/inbox/12 <<EOF
+cat >"`mhpath new`" <<EOF
 MIME-Version: 1.0
 From: sender@example.com
 To: bonquiqui@example.com
 MIME-Version: 1.0
 From: sender@example.com
 To: bonquiqui@example.com
@@ -317,7 +327,7 @@ Content-Transfer-Encoding: 7bit
 ------=_nmh-multipart-3--
 EOF
 
 ------=_nmh-multipart-3--
 EOF
 
-cat >"$MH_TEST_DIR"/Mail/inbox/12 <<EOF
+cat >"`mhpath last`" <<EOF
 MIME-Version: 1.0
 From: sender@example.com
 To: bonquiqui@example.com
 MIME-Version: 1.0
 From: sender@example.com
 To: bonquiqui@example.com
@@ -357,8 +367,8 @@ else
 fi
 
 
 fi
 
 
-# check -nodecode
-start_test "-nodecode"
+# check -nodecodetext
+start_test "-nodecodetext"
 prepare_space >"$expected" <<EOF
 MIME-Version: 1.0
 From: sender@example.com
 prepare_space >"$expected" <<EOF
 MIME-Version: 1.0
 From: sender@example.com
@@ -422,7 +432,7 @@ 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.
   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" | \
+  run_prog mhfixmsg last -nodecodetext -outfile - -verbose 2>"$actual.err" | \
     squeeze_lines >"$actual"
   check "$expected" "$actual" 'ignore space'
   check "$expected.err" "$actual.err"
     squeeze_lines >"$actual"
   check "$expected" "$actual" 'ignore space'
   check "$expected.err" "$actual.err"
@@ -450,7 +460,7 @@ This is a text/plain part.
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 1
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 1
@@ -522,7 +532,7 @@ This is the fourth text/plain part.
 This is additional content after the last subpart of the multipart.
 EOF
 
 This is additional content after the last subpart of the multipart.
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 2
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 2
@@ -578,7 +588,7 @@ check "$expected" "$actual"
 #### Generated the encoded text below with:
 ####   $ printf '\275\262=\274\000\n' | base64
 start_test "attempted (default, 8 bit) -decodetext of binary text"
 #### Generated the encoded text below with:
 ####   $ printf '\275\262=\274\000\n' | base64
 start_test "attempted (default, 8 bit) -decodetext of binary text"
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg binary decode test
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg binary decode test
@@ -594,9 +604,9 @@ vbI9vAAK
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cp -p `mhpath last` "$expected"
+cp -p "`mhpath last`" "$expected"
 run_prog mhfixmsg last
 run_prog mhfixmsg last
-check `mhpath last` "$expected" 'keep first'
+check "`mhpath last`" "$expected" 'keep first'
 
 
 # check for successful decode of a different part with attempted -decodetext
 
 
 # check for successful decode of a different part with attempted -decodetext
@@ -643,7 +653,7 @@ ICA8L2JvZHk+PC9odG1sPg==
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg successful decode of text/plain with failed binary decode
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg successful decode of text/plain with failed binary decode
@@ -685,7 +695,7 @@ ICA8L2JvZHk+PC9odG1sPg==
 EOF
 
 run_prog mhfixmsg -noreformat last
 EOF
 
 run_prog mhfixmsg -noreformat last
-check `mhpath last` "$expected" 'keep first'
+check "`mhpath last`" "$expected" 'keep first'
 
 
 # check for successful decode of a different part with -decodetext of binary
 
 
 # check for successful decode of a different part with -decodetext of binary
@@ -716,7 +726,7 @@ Content-Disposition: inline
 EOF
 
 run_prog mhfixmsg -noreformat -decodetext binary last
 EOF
 
 run_prog mhfixmsg -noreformat -decodetext binary last
-check `mhpath last` "$expected"
+check "`mhpath last`" "$expected"
 
 
 # check -decodetext of binary (containing ASCII NUL) text
 
 
 # check -decodetext of binary (containing ASCII NUL) text
@@ -741,7 +751,7 @@ check "$expected" "$actual"
 
 
 # check that -reformat succeeds when decode of binary text fails
 
 
 # check that -reformat succeeds when decode of binary text fails
-start_test "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
 prepare_space >"$expected" <<'EOF'
 MIME-Version: 1.0
 Date: Thu, 11 Apr 2013 02:47:08 -0700
@@ -767,7 +777,7 @@ Content-Transfer-Encoding: quoted-printable
 <body>
 EOF
 
 <body>
 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
 MIME-Version: 1.0
 Content-Type: text/html; charset="ISO-8859-1"
 Content-Transfer-Encoding: quoted-printable
@@ -837,7 +847,7 @@ EOF
 
 #### Generated the encoded text below with:
 ####   $ printf '\275\262=\274\n' | base64
 
 #### Generated the encoded text below with:
 ####   $ printf '\275\262=\274\n' | base64
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg textcharset test
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg textcharset test
@@ -856,19 +866,38 @@ EOF
 
 if test "$ICONV_ENABLED" -eq 1; then
   run_prog mhfixmsg last -textcharset utf-8 -outfile "$actual" 2>&1
 
 if test "$ICONV_ENABLED" -eq 1; then
   run_prog mhfixmsg last -textcharset utf-8 -outfile "$actual" 2>&1
-  check "$expected" "$actual"
+  check "$expected" "$actual" 'keep first'
 else
   echo "$0: skipping -textcharset check because nmh was built without iconv"
   rm -f "$expected"
 fi
 
 
 else
   echo "$0: skipping -textcharset check because nmh was built without iconv"
   rm -f "$expected"
 fi
 
 
+# check -textcharset -verbose
+start_test "-textcharset -verbose"
+cat >"$expected.err" <<EOF
+mhfixmsg: 17 part 1, decode text/plain; charset="iso-8859-1"; name="square.txt"
+mhfixmsg: 17 part 1, convert iso-8859-1 to utf-8
+EOF
+
+if test "$ICONV_ENABLED" -eq 1; then
+  run_prog mhfixmsg last -textcharset utf-8 -outfile "$actual" -verbose \
+           2>"$actual.err"
+  check "$expected" "$actual"
+  check "$expected.err" "$actual.err"
+else
+    echo "$0: skipping -textcharset -verbose check because nmh was built " \
+         "without iconv"
+  rm -f "$expected" "$expected.err"
+fi
+
+
 # check -nofixboundary
 start_test "-nofixboundary"
 cat >"$expected" <<EOF
 EOF
 
 # check -nofixboundary
 start_test "-nofixboundary"
 cat >"$expected" <<EOF
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 Date: Fri, 13 May 2011 08:21:12 -0500
 Content-Type: multipart/alternative;
         boundary="----=_NextPart_000_1781A17_01CC1147.81E9467A"
 Date: Fri, 13 May 2011 08:21:12 -0500
 Content-Type: multipart/alternative;
         boundary="----=_NextPart_000_1781A17_01CC1147.81E9467A"
@@ -888,14 +917,14 @@ The boundaries of this part don't match the header boundary.
 ------=_NextPart_000_1781A1A_01CC1147.81EBA8D4--
 EOF
 
 ------=_NextPart_000_1781A1A_01CC1147.81EBA8D4--
 EOF
 
-cp -p `mhpath last` `mhpath new`
+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'
 
 
 
 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
-start_test "that message is not output when fed through stdin"
+# 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" \
 run_prog mhfixmsg -file - -verbose <`mhpath last` >"$actual" 2>"$actual.err"
 check "$expected" "$actual"
 if grep "mhfixmsg: $MH_TEST_DIR/Mail/.*, fix multipart boundary" \
@@ -937,8 +966,8 @@ check "$expected" "$actual"
 
 
 # check that message is not modified when -fixboundary fails
 
 
 # check that message is not modified when -fixboundary fails
-start_test "that message is not modified when -fixboundary fails"
-cat >`mhpath new` <<EOF
+start_test "message is not modified when -fixboundary fails"
+cat >"`mhpath new`" <<EOF
 Date: Fri, 13 May 2011 08:21:12 -0500
 Content-Type: multipart/alternative;
         boundary="----=_ NextPart_000_1781A17_01CC1147.81E9467A"
 Date: Fri, 13 May 2011 08:21:12 -0500
 Content-Type: multipart/alternative;
         boundary="----=_ NextPart_000_1781A17_01CC1147.81E9467A"
@@ -959,15 +988,15 @@ The boundary below doesn't match the header boundary.
 NextPart_000_1781A1A_01CC1147.81EBA8D4--
 EOF
 
 NextPart_000_1781A1A_01CC1147.81EBA8D4--
 EOF
 
-cp -p `mhpath last` "$expected"
+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
 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 "that text/plain part is not added to text/html in multipart/related when it shouldn't be"
-cat >`mhpath new` <<EOF
+start_test "text/plain part is not added to text/html in multipart/related when it shouldn't be"
+cat >"`mhpath new`" <<EOF
 MIME-Version: 1.0
 Date: Tue, 26 Feb 2013 18:07:20 -0600
 Subject: multipart/related, not /alternative
 MIME-Version: 1.0
 Date: Tue, 26 Feb 2013 18:07:20 -0600
 Subject: multipart/related, not /alternative
@@ -996,7 +1025,7 @@ Your email client does not support HTML messages
 ------=_Part_90310_101292502.1--
 EOF
 
 ------=_Part_90310_101292502.1--
 EOF
 
-cp -p `mhpath last` "$expected"
+cp -p "`mhpath last`" "$expected"
 
 if [ $can_reformat_texthtml -eq 1 ]; then
   #### lynx inserts multiple blank lines, so squeeze them.
 
 if [ $can_reformat_texthtml -eq 1 ]; then
   #### lynx inserts multiple blank lines, so squeeze them.
@@ -1009,7 +1038,7 @@ fi
 
 # check that text/plain part is added to text/html in multipart/related
 # when it should be
 
 # check that text/plain part is added to text/html in multipart/related
 # when it should be
-start_test "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" <<EOF
 MIME-Version: 1.0
 Date: Tue, 26 Feb 2013 18:07:20 -0600
 cat >"$expected" <<EOF
 MIME-Version: 1.0
 Date: Tue, 26 Feb 2013 18:07:20 -0600
@@ -1038,7 +1067,7 @@ Content-Transfer-Encoding: 7bit
 ------=_Part_90310_101292502.1--
 EOF
 
 ------=_Part_90310_101292502.1--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 MIME-Version: 1.0
 Date: Tue, 26 Feb 2013 18:07:20 -0600
 Subject: multipart/related, not /alternative
 MIME-Version: 1.0
 Date: Tue, 26 Feb 2013 18:07:20 -0600
 Subject: multipart/related, not /alternative
@@ -1071,6 +1100,7 @@ fi
 
 
 # check handling of rfc822 message type
 
 
 # check handling of rfc822 message type
+# also, checks -fixboundary
 start_test "handling of rfc822 message type"
 cat >"$expected" <<EOF
 From: Test <test@example.com>
 start_test "handling of rfc822 message type"
 cat >"$expected" <<EOF
 From: Test <test@example.com>
@@ -1101,14 +1131,14 @@ This is an RFC-822 message.
 and some garbage at the end
 EOF
 
 and some garbage at the end
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 From: Test <test@example.com>
 To: Some User <user@example.com>
 Date: Fri, 29 Sep 2006 00:00:00
 Message-Id: @test.nmh
 Subject: message with message/rfc822 attachment
 MIME-Version: 1.0
 From: Test <test@example.com>
 To: Some User <user@example.com>
 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
 
 
 and some garbage before the attachment
 
@@ -1147,7 +1177,7 @@ There are two CR-LF pairs at the end of this sentence.
 \r
 EOF
 
 \r
 EOF
 
-cat >`mhpath new` <<'EOF'
+cat >"`mhpath new`" <<'EOF'
 MIME-Version: 1.0
 From: sender@example.com
 To: recipient@example.com
 MIME-Version: 1.0
 From: sender@example.com
 To: recipient@example.com
@@ -1175,7 +1205,7 @@ There were two CR-LF pairs at the end of this sentence.
 
 EOF
 
 
 EOF
 
-cat >`mhpath new` <<'EOF'
+cat >"`mhpath new`" <<'EOF'
 MIME-Version: 1.0
 From: sender@example.com
 To: recipient@example.com
 MIME-Version: 1.0
 From: sender@example.com
 To: recipient@example.com
@@ -1220,7 +1250,7 @@ Content-Disposition: inline
 ------=_Part_876302--
 EOF
 
 ------=_Part_876302--
 EOF
 
-cat >`mhpath new` <<'EOF'
+cat >"`mhpath new`" <<'EOF'
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg replacement of bad text/plain part test
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg replacement of bad text/plain part test
@@ -1320,7 +1350,7 @@ Content-Disposition: attachment;
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 Subject: test
 From: sender@example.com
 To: recipient@example.com
 Subject: test
 From: sender@example.com
@@ -1347,27 +1377,29 @@ run_test 'mhfixmsg last -outfile '"$actual" ''
 check "$expected" "$actual"
 
 
 check "$expected" "$actual"
 
 
-# check rmmproc
-start_test "rmmproc"
-cat >"$MH_TEST_DIR/Mail/rmmproc" <<'EOF'
+if [ $can_reformat_texthtml -eq 1 ]; then
+  # check rmmproc
+  start_test "rmmproc"
+  cat >"$MH_TEST_DIR/Mail/rmmproc" <<'EOF'
 mv "$1" "$1.backup"
 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"
+  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"
+  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"
+  # 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'
+  run_test 'mhfixmsg 21 -normmproc'
+  check "${MH_TEST_DIR}/Mail/inbox/22" \
+        "${MH_TEST_DIR}/Mail/inbox/${sbackup}21" 'keep first'
+fi
 
 
 # check -rmmproc
 
 
 # check -rmmproc
@@ -1396,7 +1428,7 @@ this is plain text
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg with incorrect Content-Type
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg with incorrect Content-Type
@@ -1412,7 +1444,7 @@ this is plain text
 EOF
 
 mhfixmsg -fixtype application/octet-stream last
 EOF
 
 mhfixmsg -fixtype application/octet-stream last
-check "$expected" `mhpath last`
+check "$expected" "`mhpath last`"
 
 
 # check default -decodetypes
 
 
 # check default -decodetypes
@@ -1447,7 +1479,7 @@ Content-Transfer-Encoding: 7bit
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 3
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 3
@@ -1504,7 +1536,7 @@ CjwvYm9keT4NCjwvaHRtbD4NCg==
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 4
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 4
@@ -1569,7 +1601,7 @@ END:VCALENDAR
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 5
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 5
@@ -1637,7 +1669,7 @@ END:VCALENDAR
 ------- =_aaaaaaaaaa0--
 EOF
 
 ------- =_aaaaaaaaaa0--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 5
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg decode test 5
@@ -1671,14 +1703,14 @@ check "$expected" "$actual"
 
 # check that input is passed through to output when there's a parse error
 # (the charset string is missing its closing quote) with -outfile
 
 # check that input is passed through to output when there's a parse error
 # (the charset string is missing its closing quote) with -outfile
-start_test "that input is passed through to output when there's a parse error"
+start_test "input is passed through to output when there's a parse error"
 cat >"$expected.err" <<EOF
 mhfixmsg: invalid quoted-string in message 31's Content-Type: field
 cat >"$expected.err" <<EOF
 mhfixmsg: invalid quoted-string in message 31's Content-Type: field
-          (parameter charset)
+    (parameter charset)
 mhfixmsg: unable to parse message 31
 EOF
 
 mhfixmsg: unable to parse message 31
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg pass through on parse error
 To: recipient@example.com
 From: sender@example.com
 Subject: mhfixmsg pass through on parse error
@@ -1699,7 +1731,7 @@ set +e
 run_prog mhfixmsg last -outfile "$actual" 2>"$actual.err"
 set -e
 #### Expected output is identical to the input message.
 run_prog mhfixmsg last -outfile "$actual" 2>"$actual.err"
 set -e
 #### Expected output is identical to the input message.
-check `mhpath last` "$actual" 'keep first'
+check "`mhpath last`" "$actual" 'keep first'
 check "$expected.err" "$actual.err"
 
 
 check "$expected.err" "$actual.err"
 
 
@@ -1707,12 +1739,23 @@ check "$expected.err" "$actual.err"
 # (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.
 # (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 "that input is passed through to output when there's a parse error"
+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.
 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"
+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 -P`
+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"
 
 
 start_test "fix RFC 2047 encoded header parameters"
@@ -1742,7 +1785,7 @@ is testø.txt.
 --001a114dd3e8fe9c56053d92f414--
 EOF
 
 --001a114dd3e8fe9c56053d92f414--
 EOF
 
-cat >`mhpath new` <<EOF
+cat >"`mhpath new`" <<EOF
 To: recipient@example.com
 From: sender@example.com
 Date: Wed, 28 Sep 2016 11:24:28 -0400
 To: recipient@example.com
 From: sender@example.com
 Date: Wed, 28 Sep 2016 11:24:28 -0400
@@ -1769,13 +1812,370 @@ run_prog mhfixmsg -file - -outfile - <`mhpath last` >"$actual" 2>/dev/null
 check "$expected" "$actual"
 
 
 check "$expected" "$actual"
 
 
+start_test "-nodecodeheaderfieldbodies"
+cat >"`mhpath new`" <<EOF
+To: recipient@example.com
+From: sender@example.com
+Date: Wed, 28 Sep 2016 11:24:28 -0400
+Subject: =?utf-8?B?dGhpcyBTdWJqZWN0IHdhcyBVVEYtOCBlbmNvZGVk?=
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary=001a114dd3e8fe9c56053d92f414
+Content-Transfer-Encoding: 8bit
+
+--001a114dd3e8fe9c56053d92f414
+Content-Type: text/plain; charset=UTF-8
+
+This is a test.
+
+--001a114dd3e8fe9c56053d92f414
+Content-Type: text/plain; charset=UTF-8; name="test.txt"
+Content-Disposition: attachment; filename="test.txt"
+Content-Transfer-Encoding: 8bit
+
+This is the first text/plain part, in a subpart.  The file name
+is test.txt.
+
+--001a114dd3e8fe9c56053d92f414--
+EOF
+run_prog mhfixmsg -file - -outfile - -decodeheaderfieldbodies utf-8 \
+     -nodecodeheaderfieldbodies <`mhpath last` >"$actual" 2>/dev/null
+check `mhpath last` "$actual" 'keep first'
+
+
+start_test "test decoding of UTF-8 header value"
+cat >"$expected" <<EOF
+To: recipient@example.com
+From: sender@example.com
+Date: Wed, 28 Sep 2016 11:24:28 -0400
+Subject: this Subject was UTF-8 encoded
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary=001a114dd3e8fe9c56053d92f414
+Content-Transfer-Encoding: 8bit
+
+--001a114dd3e8fe9c56053d92f414
+Content-Type: text/plain; charset=UTF-8
+
+This is a test.
+
+--001a114dd3e8fe9c56053d92f414
+Content-Type: text/plain; charset=UTF-8; name="test.txt"
+Content-Disposition: attachment; filename="test.txt"
+Content-Transfer-Encoding: 8bit
+
+This is the first text/plain part, in a subpart.  The file name
+is test.txt.
+
+--001a114dd3e8fe9c56053d92f414--
+EOF
+
+run_prog mhfixmsg -file - -outfile - -decodeheaderfieldbodies utf-8 \
+     <`mhpath last` >"$actual" 2>/dev/null
+check "$expected" "$actual"
+
+
+start_test "-checkbase64 with base64 code that ends with == plus footer"
+cat >"`mhpath new`" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends with ==
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBzb21lIHRleHQuCg==
+
+--
+Wait, this shouldn't be here.
+EOF
+
+cat >"$expected" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends with ==
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart"
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+This is some text.
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+--
+Wait, this shouldn't be here.
+
+------=_nmh-multipart--
+EOF
+run_prog mhfixmsg last -outfile "$actual"
+check "$expected" "$actual"
+
+
+start_test "-checkbase64 with -nodecodetext"
+cat >"`mhpath new`" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends with ==
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBzb21lIHRleHQuCg==
+
+--
+Wait, this shouldn't be here.
+EOF
+
+cat >"$expected" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends with ==
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart"
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBzb21lIHRleHQuCg==
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+--
+Wait, this shouldn't be here.
+
+------=_nmh-multipart--
+EOF
+run_prog mhfixmsg -nodecodetext last -outfile "$actual"
+check "$expected" "$actual"
+
+
+start_test "-checkbase64 with base64 code that ends with = plus footer"
+cat >"`mhpath new`" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends with =
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBwbGFpbiB0ZXh0Lgo=
+
+--
+Wait, this shouldn't be here.
+EOF
+
+cat >"$expected" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends with =
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart"
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+This is plain text.
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+--
+Wait, this shouldn't be here.
+
+------=_nmh-multipart--
+EOF
+run_prog mhfixmsg last -outfile "$actual"
+check "$expected" "$actual"
+
+
+start_test "-checkbase64 with base64 code that ends without = plus footer"
+cat >"`mhpath new`" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends without =
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBzb21lIHRleHQK
+
+--
+Wait, this shouldn't be here.
+EOF
+
+cat >"$expected" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends without =
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart"
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+This is some text
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+--
+Wait, this shouldn't be here.
+
+------=_nmh-multipart--
+EOF
+run_prog mhfixmsg last -outfile "$actual"
+check "$expected" "$actual"
+
+
+start_test "-checkbase64 with base64 code that contains single invalid character"
+cat >"`mhpath new`" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends without =
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBzb21lIHRleHQK
+
+-X-
+Wait, this shouldn't be here.
+EOF
+
+cat >"$expected" <<EOF
+From: Test <test@example.com>
+Subject: base64 code that ends without =
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBzb21lIHRleHQK
+
+-X-
+Wait, this shouldn't be here.
+EOF
+
+cat >"$expected_err" <<EOF
+mhfixmsg: invalid base64 byte 0x2d: -X-
+Wait, this shouldn't be here.
+
+EOF
+
+run_prog mhfixmsg last -outfile "$actual" 2>"$actual_err" || true
+check "$expected" "$actual"
+check "$expected_err" "$actual_err"
+
+
+start_test "-checkbase64 with base64 code in MIME part"
+cat >"`mhpath new`" <<EOF
+From: Test <test@example.com>
+Subject: MIME part with base64 encoded text and unencoded footer
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart"
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+VGhpcyBpcyBzb21lIHRleHQK
+
+--
+Wait, this shouldn't be here.
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+This is a second text/plain part.
+
+------=_nmh-multipart--
+EOF
+
+cat >"$expected" <<EOF
+From: Test <test@example.com>
+Subject: MIME part with base64 encoded text and unencoded footer
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart"
+
+------=_nmh-multipart
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart1"
+
+------=_nmh-multipart1
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+This is some text
+
+------=_nmh-multipart1
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+--
+Wait, this shouldn't be here.
+
+------=_nmh-multipart1--
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+This is a second text/plain part.
+
+------=_nmh-multipart--
+EOF
+run_prog mhfixmsg last -outfile "$actual"
+check "$expected" "$actual"
+
+
+start_test "-checkbase64 with 8-bit encoded base64 code"
+cat >"`mhpath new`" <<EOF
+From: Test <test@example.com>
+Subject: 8-bit encoded base64 code
+MIME-Version: 1.0
+Content-Type: text/plain
+Content-Transfer-Encoding: base64
+
+U2VlIFJGQyAyMDQ1IMKnNi44Lg==
+
+--
+Wait, this shouldn't be here.
+EOF
+cat >"$expected" <<EOF
+From: Test <test@example.com>
+Subject: 8-bit encoded base64 code
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----=_nmh-multipart"
+Content-Transfer-Encoding: 8bit
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 8bit
+
+See RFC 2045 §6.8.
+
+------=_nmh-multipart
+Content-Type: text/plain
+Content-Transfer-Encoding: 7bit
+
+--
+Wait, this shouldn't be here.
+
+------=_nmh-multipart--
+EOF
+
+run_prog mhfixmsg last -outfile "$actual"
+check "$expected" "$actual"
+
+
 # make sure there are no tmp files left over
 # make sure there are no tmp files left over
-find "$MH_TEST_DIR/Mail" \( -name 'mhfix*' -o -name ',mhfix*' \) -print \
+find "$MH_TEST_DIR/Mail" -name '*mhfix*' -print \
   >"$actual"
 cat >"$expected" <<EOF
 EOF
 
 check "$expected" "$actual"
 
   >"$actual"
 cat >"$expected" <<EOF
 EOF
 
 check "$expected" "$actual"
 
+
 finish_test
 exit $failed
 finish_test
 exit $failed