#!/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 increment_mtime "$MAIL_DIR" 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 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) 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}" 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 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) 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}" 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 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) This is a text attachment. attachment} part{ ID: 6, Content-type: text/plain And this message is signed. -Carl part} part}" 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 part{ ID: 4, Content-type: text/html Non-text part: text/html part} part}" 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 Non-text part: text/html part}" 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) This is a text attachment. attachment}" 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 And this message is signed. -Carl part}" 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 Non-text part: application/pgp-signature part}" 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_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_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" output=$(notmuch show --format=raw 'id:87liy5ap00.fsf@yoom.home.cworth.org') test_expect_equal "$output" "$(cat "${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)" 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 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-----' 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 embedded message, with a single html part.

This is a text attachment. And this message is signed. -Carl' 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 embedded message, with a single html part.

' 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 embedded message, with a single html part.

' 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.' 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. -Carl' 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----- Version: GnuPG v1.4.11 (GNU/Linux) iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE =zkga -----END PGP SIGNATURE-----' 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)" 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" output=$(notmuch reply 'id:87liy5ap00.fsf@yoom.home.cworth.org') test_expect_equal "$output" "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" 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