MAILET-149 Adding integration tests for Base64 ICS attachments
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f1955243 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f1955243 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f1955243 Branch: refs/heads/master Commit: f19552431b9c751f3c1342f79cefd51d53d4ae6c Parents: 03c8f69 Author: Benoit Tellier <[email protected]> Authored: Fri Jan 20 11:05:15 2017 +0700 Committer: Antoine Duprat <[email protected]> Committed: Mon Jan 23 16:19:24 2017 +0100 ---------------------------------------------------------------------- .../mailet/base/test/MimeMessageBuilder.java | 16 ++-- .../mailets/ICSAttachmentWorkflowTest.java | 89 ++++++++++++++++++++ 2 files changed, 99 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/f1955243/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageBuilder.java ---------------------------------------------------------------------- diff --git a/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageBuilder.java b/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageBuilder.java index 1246bf7..40a7e18 100644 --- a/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageBuilder.java +++ b/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageBuilder.java @@ -21,6 +21,7 @@ package org.apache.mailet.base.test; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import java.util.List; import java.util.Properties; @@ -136,21 +137,20 @@ public class MimeMessageBuilder { } public BodyPart build() throws IOException, MessagingException { - Preconditions.checkState(dataAsString.isPresent() ^ dataAsBytes.isPresent(), "one and only one of data as string or data as bytes should be specified"); + Preconditions.checkState(!(dataAsString.isPresent() && dataAsBytes.isPresent()), "Can not specify data as bytes and data as string at the same time"); MimeBodyPart bodyPart = new MimeBodyPart(); - if (dataAsString.isPresent()) { + if (dataAsBytes.isPresent()) { bodyPart.setDataHandler( new DataHandler( new ByteArrayDataSource( - dataAsString.or(DEFAULT_VALUE), + dataAsBytes.get(), type.or(DEFAULT_TEXT_PLAIN_UTF8_TYPE)) )); - } - if (dataAsBytes.isPresent()) { + } else { bodyPart.setDataHandler( new DataHandler( new ByteArrayDataSource( - dataAsBytes.get(), + dataAsString.or(DEFAULT_VALUE), type.or(DEFAULT_TEXT_PLAIN_UTF8_TYPE)) )); } @@ -198,6 +198,10 @@ public class MimeMessageBuilder { return new BodyPartBuilder(); } + public static BodyPart bodyPartFromBytes(byte[] bytes) throws MessagingException { + return new MimeBodyPart(new ByteArrayInputStream(bytes)); + } + private Optional<String> text = Optional.absent(); private Optional<String> subject = Optional.absent(); private Optional<InternetAddress> sender = Optional.absent(); http://git-wip-us.apache.org/repos/asf/james-project/blob/f1955243/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java index 2a6ffe1..376f5fe 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java @@ -201,6 +201,35 @@ public class ICSAttachmentWorkflowTest { "END:VEVENT\n" + "END:VCALENDAR\n"; + private static final String ICS_BASE64 = "Content-Type: application/ics;\n" + + " name=\"invite.ics\"\n" + + "Content-Transfer-Encoding: base64\n" + + "Content-Disposition: attachment;\n" + + " filename=\"invite.ics\"\n" + + "\n" + + "QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFy\n" + + "IDcwLjkwNTQvL0VODQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6\n" + + "UkVRVUVTVA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMTcwMTIwVDEzMDAwMFoNCkRURU5E\n" + + "OjIwMTcwMTIwVDE0MDAwMFoNCkRUU1RBTVA6MjAxNzAxMTlUMTkxODIzWg0KT1JHQU5JWkVS\n" + + "O0NOPUFudG9pbmUgRHVwcmF0Om1haWx0bzphbnRkdXByYXRAZ21haWwuY29tDQpVSUQ6YWg4\n" + + "Nms1bTM0MmJtY3JiZTlraGtraGxuMDBAZ29vZ2xlLmNvbQ0KQVRURU5ERUU7Q1VUWVBFPUlO\n" + + "RElWSURVQUw7Uk9MRT1SRVEtUEFSVElDSVBBTlQ7UEFSVFNUQVQ9TkVFRFMtQUNUSU9OO1JT\n" + + "VlA9DQogVFJVRTtDTj1hZHVwcmF0QGxpbmFnb3JhLmNvbTtYLU5VTS1HVUVTVFM9MDptYWls\n" + + "dG86YWR1cHJhdEBsaW5hZ29yYS5jb20NCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JP\n" + + "TEU9UkVRLVBBUlRJQ0lQQU5UO1BBUlRTVEFUPUFDQ0VQVEVEO1JTVlA9VFJVRQ0KIDtDTj1B\n" + + "bnRvaW5lIER1cHJhdDtYLU5VTS1HVUVTVFM9MDptYWlsdG86YW50ZHVwcmF0QGdtYWlsLmNv\n" + + "bQ0KQ1JFQVRFRDoyMDE3MDExOVQxOTE4MjNaDQpERVNDUklQVElPTjpBZmZpY2hleiB2b3Ry\n" + + "ZSDDqXbDqW5lbWVudCBzdXIgbGEgcGFnZSBodHRwczovL3d3dy5nb29nbGUuY29tL2NhbA0K\n" + + "IGVuZGFyL2V2ZW50P2FjdGlvbj1WSUVXJmVpZD1ZV2c0Tm1zMWJUTTBNbUp0WTNKaVpUbHJh\n" + + "R3RyYUd4dU1EQWdZV1IxY0hKaGRFQg0KIHNhVzVoWjI5eVlTNWpiMjAmdG9rPU1Ua2pZVzUw\n" + + "WkhWd2NtRjBRR2R0WVdsc0xtTnZiVGcxT1RNNU5XTTRNR1JsWW1FMVlUSTROeg0KIFJqTjJV\n" + + "eU5qVTBNMll5Wm1RNE56UmtOVGhoWVRRJmN0ej1FdXJvcGUvUGFyaXMmaGw9ZnIuDQpMQVNU\n" + + "LU1PRElGSUVEOjIwMTcwMTE5VDE5MTgyM1oNCkxPQ0FUSU9OOg0KU0VRVUVOQ0U6MA0KU1RB\n" + + "VFVTOkNPTkZJUk1FRA0KU1VNTUFSWToNClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVO\n" + + "RDpWQ0FMRU5EQVINCg=="; + public static final String ICS_BASE64_UID = "[email protected]"; + public static final String ICS_BASE64_DTSTAMP = "20170119T191823Z"; + public SwarmGenericContainer rabbitMqContainer = new SwarmGenericContainer("rabbitmq:3") .withAffinityToContainer(); public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -213,6 +242,7 @@ public class ICSAttachmentWorkflowTest { private TemporaryJamesServer jamesServer; private MimeMessage messageWithoutICSAttached; private MimeMessage messageWithICSAttached; + private MimeMessage messageWithICSBase64Attached; @Before public void setup() throws Exception { @@ -310,6 +340,15 @@ public class ICSAttachmentWorkflowTest { .build()) .setSubject("test") .build(); + + messageWithICSBase64Attached = MimeMessageBuilder.mimeMessageBuilder() + .setMultipartWithBodyParts( + MimeMessageBuilder.bodyPartBuilder() + .data("simple text") + .build(), + MimeMessageBuilder.bodyPartFromBytes(ICS_BASE64.getBytes(Charsets.UTF_8))) + .setSubject("test") + .build(); } @After @@ -417,6 +456,56 @@ public class ICSAttachmentWorkflowTest { } @Test + public void headersShouldBeAddedInMailWhenOneBase64ICalAttachment() throws Exception { + Mail mail = FakeMail.builder() + .mimeMessage(messageWithICSBase64Attached) + .sender(new MailAddress(FROM)) + .recipient(new MailAddress(RECIPIENT)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, JAMES_APACHE_ORG); + IMAPMessageReader imapMessageReader = new IMAPMessageReader(LOCALHOST_IP, IMAP_PORT)) { + messageSender.sendMessage(mail); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHasBeenSent); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userReceivedMessage(RECIPIENT, PASSWORD)); + + String receivedHeaders = imapMessageReader.readFirstMessageHeadersInInbox(RECIPIENT, PASSWORD); + + assertThat(receivedHeaders).contains("X-MEETING-UID: " + ICS_BASE64_UID); + assertThat(receivedHeaders).contains("X-MEETING-METHOD: " + ICS_METHOD); + assertThat(receivedHeaders).contains("X-MEETING-SEQUENCE: " + ICS_SEQUENCE); + assertThat(receivedHeaders).contains("X-MEETING-DTSTAMP: " + ICS_BASE64_DTSTAMP); + } + } + + @Test + public void base64CalendarAttachmentShouldBePublishedInMQWhenMatchingWorkflowConfiguration() throws Exception { + Mail mail = FakeMail.builder() + .mimeMessage(messageWithICSBase64Attached) + .sender(new MailAddress(FROM)) + .recipient(new MailAddress(RECIPIENT)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, JAMES_APACHE_ORG); + IMAPMessageReader imapMessageReader = new IMAPMessageReader(LOCALHOST_IP, IMAP_PORT)) { + messageSender.sendMessage(mail); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHasBeenSent); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userReceivedMessage(RECIPIENT, PASSWORD)); + } + + Optional<String> content = amqpRule.readContent(); + assertThat(content).isPresent(); + DocumentContext jsonPath = toJsonPath(content.get()); + assertThat(jsonPath.<String> read("sender")).isEqualTo(FROM); + assertThat(jsonPath.<String> read("recipient")).isEqualTo(RECIPIENT); + assertThat(jsonPath.<String> read("uid")).isEqualTo(ICS_BASE64_UID); + assertThat(jsonPath.<String> read("sequence")).isEqualTo(ICS_SEQUENCE); + assertThat(jsonPath.<String> read("dtstamp")).isEqualTo(ICS_BASE64_DTSTAMP); + assertThat(jsonPath.<String> read("method")).isEqualTo(ICS_METHOD); + assertThat(jsonPath.<String> read("recurrence-id")).isNull(); + } + + @Test public void headersShouldBeFilledOnlyWithOneICalAttachmentWhenMailHasSeveral() throws Exception { MimeMessage messageWithThreeICSAttached = MimeMessageBuilder.mimeMessageBuilder() .setMultipartWithBodyParts( --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
