X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=test%2Fmultipart;h=22c42c6aefc73b8bcda59831bbf2f0f8c615367f;hb=8e2a14bbbb5c423614a2f5992d756674ece5bedb;hp=42cbb7658f2afa66510d6ae873e9edb4f8895a79;hpb=916c2aa6247c6ef3d2a9c9c784cf4d3a5de263d0;p=notmuch
diff --git a/test/multipart b/test/multipart
index 42cbb765..22c42c6a 100755
--- a/test/multipart
+++ b/test/multipart
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
test_description="output of multipart message"
. ./test-lib.sh
@@ -29,7 +29,7 @@ Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
MIME-Version: 1.0
Content-Type: text/html
-
This is an imbeded message, with a single html part.
+This is an embedded message, with a single html part.
--=-=-=
Content-Disposition: attachment; filename=attachment
@@ -56,14 +56,46 @@ W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
-----END PGP SIGNATURE-----
--==-=-=--
EOF
+
+cat < ${MAIL_DIR}/base64-part-with-crlf
+From: Carl Worth
+To: cworth@cworth.org
+Subject: Test message with a BASE64 encoded binary containing CRLF pair
+Date: Tue, 05 Jan 2001 15:43:57 -0000
+User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
+Message-ID:
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="==-=-=";
+
+--==-=-=
+
+The attached BASE64-encoded part expands to a binary containing a CRLF
+pair (that is one bye of 0x0D followed by one byte of 0x0A). This is
+designed to ensure that notmuch is not corrupting the output of this
+part by converting the CRLF pair to an LF only (as would be appropriate
+for display of a text part on a Linux system, for example).
+
+The part should be a 3-byte file with the following sequence of 3
+hexadecimal bytes:
+
+ EF 0D 0A
+
+--==-=-=
+Content-Type: application/octet-stream
+Content-Disposition: attachment; filename=crlf.bin
+Content-Transfer-Encoding: base64
+
+7w0K
+--==-=-=--
+EOF
notmuch new > /dev/null
test_begin_subtest "--format=text --part=0, full message"
-output=$(notmuch show --format=text --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"message{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 filename:${MAIL_DIR}/multipart
+notmuch show --format=text --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+message{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 filename:${MAIL_DIR}/multipart
header{
-Carl Worth (2001-01-05) (attachment inbox unread)
+Carl Worth (2001-01-05) (attachment inbox signed unread)
Subject: Multipart message
From: Carl Worth
To: cworth@cworth.org
@@ -77,8 +109,7 @@ Date: Tue, 05 Jan 2001 15:43:57 -0000
Non-text part: text/html
part}
part}
-attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
attachment}
part{ ID: 6, Content-type: text/plain
@@ -92,20 +123,30 @@ Non-text part: application/pgp-signature
part}
part}
body}
-message}"
+message}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
-test_begin_subtest "--format=text --part=1, message body"
-output=$(notmuch show --format=text --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"part{ ID: 1, Content-type: multipart/signed
+test_begin_subtest "--format=text --part=0, full message"
+notmuch show --format=text --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+message{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 filename:${MAIL_DIR}/multipart
+header{
+Carl Worth (2001-01-05) (attachment inbox signed unread)
+Subject: Multipart message
+From: Carl Worth
+To: cworth@cworth.org
+Date: Tue, 05 Jan 2001 15:43:57 -0000
+header}
+body{
+part{ ID: 1, Content-type: multipart/signed
part{ ID: 2, Content-type: multipart/mixed
part{ ID: 3, Content-type: message/rfc822
part{ ID: 4, Content-type: text/html
Non-text part: text/html
part}
part}
-attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
attachment}
part{ ID: 6, Content-type: text/plain
@@ -117,19 +158,22 @@ And this message is signed.
part{ ID: 7, Content-type: application/pgp-signature
Non-text part: application/pgp-signature
part}
-part}"
+part}
+body}
+message}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=text --part=2, multipart/mixed"
-output=$(notmuch show --format=text --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"part{ ID: 2, Content-type: multipart/mixed
+notmuch show --format=text --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+part{ ID: 2, Content-type: multipart/mixed
part{ ID: 3, Content-type: message/rfc822
part{ ID: 4, Content-type: text/html
Non-text part: text/html
part}
part}
-attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
attachment}
part{ ID: 6, Content-type: text/plain
@@ -137,47 +181,58 @@ And this message is signed.
-Carl
part}
-part}"
+part}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=text --part=3, rfc822 multipart"
-output=$(notmuch show --format=text --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"part{ ID: 3, Content-type: message/rfc822
+notmuch show --format=text --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+part{ ID: 3, Content-type: message/rfc822
part{ ID: 4, Content-type: text/html
Non-text part: text/html
part}
-part}"
+part}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=text --part=4, html part"
-output=$(notmuch show --format=text --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"part{ ID: 4, Content-type: text/html
+notmuch show --format=text --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+part{ ID: 4, Content-type: text/html
Non-text part: text/html
-part}"
+part}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
-test_begin_subtest "--format=text --part=5, inline attachement"
-output=$(notmuch show --format=text --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"attachment{ ID: 5, Content-type: text/plain
-Attachment: attachment (text/plain)
+test_begin_subtest "--format=text --part=5, inline attachment"
+notmuch show --format=text --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+attachment{ ID: 5, Filename: attachment, Content-type: text/plain
This is a text attachment.
-attachment}"
+attachment}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=text --part=6, plain text part"
-output=$(notmuch show --format=text --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"part{ ID: 6, Content-type: text/plain
+notmuch show --format=text --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+part{ ID: 6, Content-type: text/plain
And this message is signed.
-Carl
-part}"
+part}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=text --part=7, pgp signature (unverified)"
-output=$(notmuch show --format=text --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-"part{ ID: 7, Content-type: application/pgp-signature
+notmuch show --format=text --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+part{ ID: 7, Content-type: application/pgp-signature
Non-text part: application/pgp-signature
-part}"
+part}
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_expect_success \
"--format=text --part=8, no part, expect error" \
@@ -186,7 +241,7 @@ test_expect_success \
test_begin_subtest "--format=json --part=0, full message"
output=$(notmuch show --format=json --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org')
test_expect_equal "$output" \
-'{"id": "87liy5ap00.fsf@yoom.home.cworth.org", "match": true, "filename": "'"${MAIL_DIR}/multipart"'", "timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["attachment","inbox","unread"], "headers": {"Subject": "Multipart message", "From": "Carl Worth ", "To": "cworth@cworth.org", "Cc": "", "Bcc": "", "Date": "Tue, 05 Jan 2001 15:43:57 -0000"}, "body": [{"id": 1, "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, {"id": 7, "content-type": "application/pgp-signature"}]}]}'
+'{"id": "87liy5ap00.fsf@yoom.home.cworth.org", "match": true, "filename": "'"${MAIL_DIR}/multipart"'", "timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["attachment","inbox","signed","unread"], "headers": {"Subject": "Multipart message", "From": "Carl Worth ", "To": "cworth@cworth.org", "Cc": "", "Bcc": "", "Date": "Tue, 05 Jan 2001 15:43:57 -0000"}, "body": [{"id": 1, "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, {"id": 7, "content-type": "application/pgp-signature"}]}]}'
test_begin_subtest "--format=json --part=1, message body"
output=$(notmuch show --format=json --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org')
@@ -197,11 +252,13 @@ test_begin_subtest "--format=json --part=2, multipart/mixed"
output=$(notmuch show --format=json --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org')
test_expect_equal "$output" \
'{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}'
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=json --part=3, rfc822 multipart"
output=$(notmuch show --format=json --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org')
test_expect_equal "$output" \
'{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}'
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=json --part=4, html part"
output=$(notmuch show --format=json --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org')
@@ -228,17 +285,19 @@ test_expect_success \
"notmuch show --format=json --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
test_begin_subtest "--format=raw"
-output=$(notmuch show --format=raw 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" "$(cat "${MAIL_DIR}"/multipart)"
+notmuch show --format=raw 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
test_begin_subtest "--format=raw --part=0, full message"
-output=$(notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" "$(cat "${MAIL_DIR}"/multipart)"
+notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
test_begin_subtest "--format=raw --part=1, message body"
-output=$(notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-'This is an imbeded message, with a single html part.
+notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+# output should *not* include newline
+echo >>OUTPUT
+cat <EXPECTED
+This is an embedded message, with a single html part.
This is a text attachment.
And this message is signed.
@@ -249,60 +308,107 @@ Version: GnuPG v1.4.11 (GNU/Linux)
iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
=zkga
------END PGP SIGNATURE-----'
+-----END PGP SIGNATURE-----
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=raw --part=2, multipart/mixed"
-output=$(notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-'This is an imbeded message, with a single html part.
+notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+This is an embedded message, with a single html part.
This is a text attachment.
And this message is signed.
--Carl'
+-Carl
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=raw --part=3, rfc822 multipart"
-output=$(notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-'This is an imbeded message, with a single html part.
'
+notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+This is an embedded message, with a single html part.
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=raw --part=4, html part"
-output=$(notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-'This is an imbeded message, with a single html part.
'
+notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+This is an embedded message, with a single html part.
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=raw --part=5, inline attachment"
-output=$(notmuch show --format=raw --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-'This is a text attachment.'
+notmuch show --format=raw --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+This is a text attachment.
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=raw --part=6, plain text part"
-output=$(notmuch show --format=raw --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-'And this message is signed.
+notmuch show --format=raw --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+And this message is signed.
--Carl'
+-Carl
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_begin_subtest "--format=raw --part=7, pgp signature (unverified)"
-output=$(notmuch show --format=raw --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" \
-'-----BEGIN PGP SIGNATURE-----
+notmuch show --format=raw --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+# output should *not* include newline
+echo >>OUTPUT
+cat <EXPECTED
+-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
=zkga
------END PGP SIGNATURE-----'
+-----END PGP SIGNATURE-----
+EOF
+test_expect_equal_file OUTPUT EXPECTED
test_expect_success \
"--format=raw --part=8, no part, expect error" \
"notmuch show --format=raw --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
test_begin_subtest "--format=mbox"
-output=$(notmuch show --format=mbox 'id:87liy5ap00.fsf@yoom.home.cworth.org')
-test_expect_equal "$output" "$(printf "From cworth@cworth.org Fri Jan 5 15:43:57 2001\n"; cat "${MAIL_DIR}"/multipart)"
+notmuch show --format=mbox 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+printf "From cworth@cworth.org Fri Jan 5 15:43:57 2001\n" >EXPECTED
+cat "${MAIL_DIR}"/multipart >>EXPECTED
+# mbox output is expected to include a blank line
+echo >>EXPECTED
+test_expect_equal_file OUTPUT EXPECTED
test_expect_success \
"--format=mbox --part=1, incompatible, expect error" \
"! notmuch show --format=mbox --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
+test_begin_subtest "'notmuch reply' to a multipart message"
+notmuch reply 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
+cat <EXPECTED
+From: Notmuch Test Suite
+Subject: Re: Multipart message
+To: Carl Worth , cworth@cworth.org
+In-Reply-To: <87liy5ap00.fsf@yoom.home.cworth.org>
+References: <87liy5ap00.fsf@yoom.home.cworth.org>
+
+On Tue, 05 Jan 2001 15:43:57 -0000, Carl Worth wrote:
+Non-text part: multipart/signed
+Non-text part: multipart/mixed
+Non-text part: message/rfc822
+Non-text part: text/html
+> This is a text attachment.
+> And this message is signed.
+>
+> -Carl
+Non-text part: application/pgp-signature
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+test_begin_subtest "'notmuch show --part' does not corrupt a part with CRLF pair"
+notmuch show --format=raw --part=3 id:base64-part-with-crlf > crlf.out
+echo -n -e "\xEF\x0D\x0A" > crlf.expected
+test_expect_equal_file crlf.out crlf.expected
+
test_done