#!/usr/bin/env bash test_description="output of multipart message" . ./test-lib.sh cat < ${MAIL_DIR}/multipart From: Carl Worth To: cworth@cworth.org Subject: Multipart message 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: <87liy5ap00.fsf@yoom.home.cworth.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" --==-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: message/rfc822 Content-Disposition: inline From: Carl Worth To: cworth@cworth.org Subject: html message Date: Tue, 05 Jan 2001 15:42:57 -0000 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu) Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org> MIME-Version: 1.0 Content-Type: text/html

This is an embedded message, with a single html part.

--=-=-= Content-Disposition: attachment; filename=attachment This is a text attachment. --=-=-= And this message is signed. -Carl --=-=-=-- --==-=-= Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE =zkga -----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" 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, Filename: attachment, Content-type: text/plain This is a text attachment. attachment} part{ ID: 6, Content-type: text/plain And this message is signed. -Carl part} part} part{ ID: 7, Content-type: application/pgp-signature Non-text part: application/pgp-signature part} part} body} message} EOF test_expect_equal_file OUTPUT EXPECTED 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, Filename: attachment, Content-type: text/plain This is a text attachment. attachment} part{ ID: 6, Content-type: text/plain And this message is signed. -Carl part} part} part{ ID: 7, Content-type: application/pgp-signature Non-text part: application/pgp-signature part} part} body} message} EOF test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "--format=text --part=2, 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, Filename: attachment, Content-type: text/plain This is a text attachment. attachment} 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=3, rfc822 multipart" 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} EOF test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "--format=text --part=4, html part" 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} EOF test_expect_equal_file OUTPUT EXPECTED 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} EOF test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "--format=text --part=6, plain text part" 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} EOF test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "--format=text --part=7, pgp signature (unverified)" 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} EOF test_expect_equal_file OUTPUT EXPECTED test_expect_success \ "--format=text --part=8, no part, expect error" \ "notmuch show --format=text --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'" 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","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') test_expect_equal "$output" \ '{"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=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') test_expect_equal "$output" \ '{"id": 4, "content-type": "text/html"}' test_begin_subtest "--format=json --part=5, inline attachment" output=$(notmuch show --format=json --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org') test_expect_equal "$output" \ '{"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}' test_begin_subtest "--format=json --part=6, plain text part" output=$(notmuch show --format=json --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org') test_expect_equal "$output" \ '{"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}' test_begin_subtest "--format=json --part=7, pgp signature (unverified)" output=$(notmuch show --format=json --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org') test_expect_equal "$output" \ '{"id": 7, "content-type": "application/pgp-signature"}' test_expect_success \ "--format=json --part=8, no part, expect error" \ "notmuch show --format=json --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'" test_begin_subtest "--format=raw" 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" 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" 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. -Carl -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE =zkga -----END PGP SIGNATURE----- EOF test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "--format=raw --part=2, multipart/mixed" 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 EOF test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "--format=raw --part=3, rfc822 multipart" 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" 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" 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" notmuch show --format=raw --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT cat <EXPECTED And this message is signed. -Carl EOF test_expect_equal_file OUTPUT EXPECTED test_begin_subtest "--format=raw --part=7, pgp signature (unverified)" 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----- 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" 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