MH_OBJ_DIR=`cd $srcdir && pwd`; export MH_OBJ_DIR
fi
-. "${srcdir}/test/post/test-post-common.sh"
+. "${MH_OBJ_DIR}/test/common.sh"
-#### w3m needs $HOME to be writeable.
-if [ -w "$HOME" ]; then
- :
-else
- #### $HOME isn't writeable, so use a directory that should be.
- HOME="$MHTMPDIR"
- export HOME
-fi
+setup_test
+
+#### 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
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" \
+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.
cat >"$expected" <<EOF
Usage: mhfixmsg [+folder] [msgs] [switches]
switches are:
-decodetext 8bit|7bit
-nodecodetext
- -[no]textcodeset
+ -[no]textcharset
-[no]reformat
-[no]replacetextplain
-[no]fixboundary
-[no]fixcte
+ -fixtype mimetype
-file file
-outfile file
-rmmproc program
-normmproc
+ -[no]changecur
-[no]verbose
-version
-help
EOF
-mhfixmsg -help >"$actual" 2>&1
+run_prog mhfixmsg -help >"$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
# check -reformat (enabled by default): addition of text/plain part
# to solitary text/html part
#
-cat >"$expected" <<EOF
+prepare_space >"$expected" <<EOF
MIME-Version: 1.0
From: sender@example.com
To: bonquiqui@example.com
mhfixmsg: 12 part 1, decode text/html; charset=\"Windows-1252\"" \
>"$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"
# check handling of boundary string that appears in message body
#
-cat >"$expected" <<EOF
+prepare_space >"$expected" <<EOF
MIME-Version: 1.0
From: sender@example.com
To: bonquiqui@example.com
mhfixmsg: 12 part 1, decode text/html; charset=\"Windows-1252\"" \
>"$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"
# check -nodecode
-cat >"$expected" <<EOF
+prepare_space >"$expected" <<EOF
MIME-Version: 1.0
From: sender@example.com
To: bonquiqui@example.com
if [ $can_reformat_texthtml -eq 1 ]; then
printf '%s\n' 'mhfixmsg: 12, insert text/plain part' >"$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"
------- =_aaaaaaaaaa0--
EOF
-mhfixmsg last -outfile "$actual"
+run_prog mhfixmsg last -outfile "$actual"
check "$expected" "$actual"
------- =_aaaaaaaaaa0
Content-Type: multipart/related;
- type="multipart/alternative";
- boundary="subpart__1.1"
+ type="text/plain"; boundary="subpart__1.1"
--subpart__1.1
Content-Type: text/plain; charset="iso-8859-1"
------- =_aaaaaaaaaa0
Content-Type: multipart/related;
- type="multipart/alternative";
- boundary="subpart__1.1"
+ type="text/plain"; boundary="subpart__1.1"
--subpart__1.1
Content-Type: text/plain; charset="iso-8859-1"
This is additional content after the last subpart of the multipart.
EOF
-mhfixmsg last -outfile "$actual"
+run_prog mhfixmsg last -outfile "$actual"
check "$expected" "$actual"
# check attempted -decode of binary text
#### Generated the encoded text below with:
-#### $ printf '\x0d\xbd\xb2=\xbc\n' | base64
+#### $ printf '\x0\xbd\xb2=\xbc\n' | base64
cat >`mhpath new` <<EOF
To: recipient@example.com
From: sender@example.com
Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
------- =_aaaaaaaaaa0
-Content-Type: text/plain; charset="iso-8859-1"; name="square.txt"
+Content-Type: text/plain; charset="iso-8859-1"; name="nul+square.txt"
Content-Transfer-Encoding: base64
-Db2yPbwK
+AL2yPbwK
------- =_aaaaaaaaaa0--
EOF
cp -p `mhpath last` "$expected"
-set +e
-mhfixmsg last
-set -e
+run_prog mhfixmsg last
check `mhpath last` "$expected" 'keep first'
Content-Type: multipart/mixed; boundary=\"----- =_aaaaaaaaaa0\"
------- =_aaaaaaaaaa0
-Content-Type: text/plain; charset=\"iso-8859-1\"; name=\"square.txt\"
+Content-Type: text/plain; charset=\"iso-8859-1\"; name=\"nul+square.txt\"
Content-Transfer-Encoding: binary
" "
# check that -reformat succeeds when decode of binary text fails
-cat >"$expected" <<'EOF'
+prepare_space >"$expected" <<'EOF'
MIME-Version: 1.0
Date: Thu, 11 Apr 2013 02:47:08 -0700
To: <me@example.com>
EOF
if [ $can_reformat_texthtml -eq 1 ]; then
- #### lynx inserts multiple blank lines, so use uniq to squeeze them.
+ #### lynx inserts multiple blank lines, so squeeze them.
#### Truncate to avoid comparing the html portion because it can
#### get reformatted.
- mhfixmsg last -outfile - | uniq | head -22 >"$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"
fi
-# check -textcodeset
+# check -textcharset
# Also checks preservation of attributes after one (charset) that is
# modified.
cat >"$expected" <<EOF
To: recipient@example.com
From: sender@example.com
-Subject: mhfixmsg textcodeset test
+Subject: mhfixmsg textcharset test
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
cat >`mhpath new` <<EOF
To: recipient@example.com
From: sender@example.com
-Subject: mhfixmsg textcodeset test
+Subject: mhfixmsg textcharset test
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
------- =_aaaaaaaaaa0--
EOF
-set +e
-mhfixmsg last -textcodeset utf-8 -outfile "$actual" 2>"$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
+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
# check that message is not output when fed through stdin
-mhfixmsg -file - -verbose <`mhpath last` >"$actual" 2>"$actual.err"
+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
cat >"$expected" <<EOF
Date: Fri, 13 May 2011 08:21:12 -0500
Content-Type: multipart/alternative;
- boundary="----=_NextPart_000_1781A1A_01CC1147.81EBA8D4"
+ boundary="----=_NextPart_000_1781A1A_01CC1147.81EBA8D4"
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0
From: <sender@example.com>
check "$expected" "$actual"
-# check that text/plain part is added to lone text/html in multipart/related
-cat >"$expected" <<EOF
+# check that 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
Content-Type: multipart/related;
- boundary="----=_Part_90310_101292502.1"
+ type="text/html"; boundary="----=_Part_90310_101292502.1"
------=_Part_90310_101292502.1
-Content-Type: multipart/alternative; boundary="----=_nmh-multipart1"
-
-------=_nmh-multipart1
-Content-Type: text/plain; charset="us-ascii"
-Content-Transfer-Encoding: 7bit
-
-This is the real content.
-
-------=_nmh-multipart1
Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: 7bit
</body>
</html>
-------=_nmh-multipart1--
-
------=_Part_90310_101292502.1
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
------=_Part_90310_101292502.1--
EOF
-cat >`mhpath new` <<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
+cat >"$expected" <<EOF
MIME-Version: 1.0
Date: Tue, 26 Feb 2013 18:07:20 -0600
Subject: multipart/related, not /alternative
-Content-Type: multipart/related;
- boundary="----=_Part_90310_101292502.1"
+Content-Type: multipart/alternative; boundary="----=_Part_90310_101292502.1"
+
+------=_Part_90310_101292502.1
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7bit
+
+This is the real content.
------=_Part_90310_101292502.1
Content-Type: text/html; charset="us-ascii"
This is the real content.
</body>
</html>
+
+------=_Part_90310_101292502.1--
+EOF
+
+cat >`mhpath new` <<EOF
+MIME-Version: 1.0
+Date: Tue, 26 Feb 2013 18:07:20 -0600
+Subject: multipart/related, not /alternative
+Content-Type: multipart/related;
+ type="text/html"; boundary="----=_Part_90310_101292502.1"
+
------=_Part_90310_101292502.1
-Content-Type: text/plain; charset="us-ascii"
+Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: 7bit
-Your email client does not support HTML messages
+<html><head>
+ <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
+ <title>HTML Content</title>
+ </head>
+ <body>
+ This is the real content.
+ </body>
+</html>
+
------=_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
\r
EOF
-mhfixmsg last -outfile "$actual"
+run_prog mhfixmsg last -outfile "$actual"
check "$expected" "$actual"
# check -replacetextplain
-cat >"$expected" <<EOF
+prepare_space >"$expected" <<EOF
To: recipient@example.com
From: sender@example.com
Subject: mhfixmsg replacement of bad text/plain part test
EOF
if [ $can_reformat_texthtml -eq 1 ]; then
- #### lynx inserts multiple blank lines, so use uniq to squeeze them.
- mhfixmsg last -replacetextplain -outfile - | uniq > "$actual"
- check "$expected" "$actual"
+ #### 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
------=_Part_876302--
EOF
-mhfixmsg last -replacetextplain -noreplacetextplain -outfile "$actual"
+run_prog mhfixmsg last -replacetextplain -noreplacetextplain -outfile "$actual"
+check "$expected" "$actual"
+
+
+# check removal of extraneous trailing semicolon from header parameter list
+cat >"$expected" <<EOF
+To: recipient@example.com
+Subject: test
+From: sender@example.com
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; charset="us-ascii"
+
+test
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; charset="us-ascii";
+ name="DATE"
+Content-Description: check folded headers, with and without trailing semicolon
+Content-Disposition: attachment;
+ filename="DATE"
+
+14 April 2014
+
+------- =_aaaaaaaaaa0--
+EOF
+
+cat >`mhpath new` <<EOF
+To: recipient@example.com
+Subject: test
+From: sender@example.com
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; charset="us-ascii";
+
+test
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; charset="us-ascii";
+ name="DATE"
+Content-Description: check folded headers, with and without trailing semicolon
+Content-Disposition: attachment;
+ filename="DATE";
+
+14 April 2014
+
+------- =_aaaaaaaaaa0--
+EOF
+run_test 'mhfixmsg last -outfile '"$actual" ''
check "$expected" "$actual"
fi
+# check -fixtype
+cat >"$expected" <<EOF
+To: recipient@example.com
+From: sender@example.com
+Subject: mhfixmsg with incorrect Content-Type
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+
+------- =_aaaaaaaaaa0
+Content-Type: text/plain; name="plaintext.txt"
+
+this is plain text
+
+------- =_aaaaaaaaaa0--
+EOF
+
+cat >`mhpath new` <<EOF
+To: recipient@example.com
+From: sender@example.com
+Subject: mhfixmsg with incorrect Content-Type
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
+
+------- =_aaaaaaaaaa0
+Content-Type: application/octet-stream; name="plaintext.txt"
+
+this is plain text
+
+------- =_aaaaaaaaaa0--
+EOF
+
+mhfixmsg -fixtype application/octet-stream last
+check "$expected" `mhpath last`
+
+
# make sure there are no tmp files left over
find "$MH_TEST_DIR/Mail" \( -name 'mhfix*' -o -name ',mhfix*' \) -print \
>"$actual"