You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/01/24 01:26:19 UTC
[05/10] james-project git commit: MAILET-149 Introduce ICS mailets
workflow tests
MAILET-149 Introduce ICS mailets workflow tests
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/28eedd5d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/28eedd5d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/28eedd5d
Branch: refs/heads/master
Commit: 28eedd5d7f48f5b2b9c721349c7f8e90e42c5c9e
Parents: 4a59c1b
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Jan 17 10:14:50 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Mon Jan 23 16:19:24 2017 +0100
----------------------------------------------------------------------
server/mailet/integration-testing/pom.xml | 10 +
.../james/mailets/utils/IMAPMessageReader.java | 10 +-
.../mailets/ICSAttachmentWorkflowTest.java | 550 +++++++++++++++++++
3 files changed, 569 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/28eedd5d/server/mailet/integration-testing/pom.xml
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/pom.xml b/server/mailet/integration-testing/pom.xml
index 7395aa7..31eb20c 100644
--- a/server/mailet/integration-testing/pom.xml
+++ b/server/mailet/integration-testing/pom.xml
@@ -161,6 +161,11 @@
</dependency>
<dependency>
<groupId>org.apache.james</groupId>
+ <artifactId>apache-mailet-icalendar</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.james</groupId>
<artifactId>james-server-data-memory</artifactId>
</dependency>
<dependency>
@@ -194,6 +199,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>com.jayway.jsonpath</groupId>
+ <artifactId>json-path</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<scope>test</scope>
http://git-wip-us.apache.org/repos/asf/james-project/blob/28eedd5d/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
index 17c7afd..931df1a 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/utils/IMAPMessageReader.java
@@ -54,9 +54,17 @@ public class IMAPMessageReader implements Closeable {
}
public String readFirstMessageInInbox(String user, String password) throws IOException {
+ return readFirstMessageInInbox(user, password, "(BODY[])");
+ }
+
+ public String readFirstMessageHeadersInInbox(String user, String password) throws IOException {
+ return readFirstMessageInInbox(user, password, "(RFC822.HEADER)");
+ }
+
+ private String readFirstMessageInInbox(String user, String password, String parameters) throws IOException {
imapClient.login(user, password);
imapClient.select("INBOX");
- imapClient.fetch("1:1", "(BODY[])");
+ imapClient.fetch("1:1", parameters);
return imapClient.getReplyString();
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/28eedd5d/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
new file mode 100644
index 0000000..51a23e2
--- /dev/null
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
@@ -0,0 +1,550 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.transport.mailets;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.InetAddress;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailets.TemporaryJamesServer;
+import org.apache.james.mailets.configuration.CommonProcessors;
+import org.apache.james.mailets.configuration.MailetConfiguration;
+import org.apache.james.mailets.configuration.MailetContainer;
+import org.apache.james.mailets.configuration.ProcessorConfiguration;
+import org.apache.james.mailets.utils.IMAPMessageReader;
+import org.apache.james.mailets.utils.SMTPMessageSender;
+import org.apache.james.util.streams.SwarmGenericContainer;
+import org.apache.mailet.Mail;
+import org.apache.mailet.MailAddress;
+import org.apache.mailet.base.test.FakeMail;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+import com.google.common.base.Charsets;
+import com.google.common.net.InetAddresses;
+import com.google.common.primitives.Bytes;
+import com.jayway.awaitility.Awaitility;
+import com.jayway.awaitility.Duration;
+import com.jayway.awaitility.core.ConditionFactory;
+import com.jayway.jsonpath.Configuration;
+import com.jayway.jsonpath.DocumentContext;
+import com.jayway.jsonpath.JsonPath;
+import com.jayway.jsonpath.Option;
+import com.rabbitmq.client.BuiltinExchangeType;
+import com.rabbitmq.client.Channel;
+import com.rabbitmq.client.Connection;
+import com.rabbitmq.client.ConnectionFactory;
+import com.rabbitmq.client.GetResponse;
+
+public class ICSAttachmentWorkflowTest {
+
+ private static final String LOCALHOST_IP = "127.0.0.1";
+ private static final int IMAP_PORT = 1143;
+ private static final int SMTP_PORT = 1025;
+ private static final String PASSWORD = "secret";
+
+ private static final String JAMES_APACHE_ORG = "james.org";
+
+ private static final String FROM = "fromUser@" + JAMES_APACHE_ORG;
+ private static final String RECIPIENT = "touser@" + JAMES_APACHE_ORG;
+
+ private static final String MAIL_ATTRIBUTE = "my.attribute";
+ private static final String EXCHANGE_NAME = "myExchange";
+ private static final String ROUTING_KEY = "myRoutingKey";
+
+ private static final String ICS_UID = "f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047feb2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bc";
+ private static final String ICS_DTSTAMP = "20170106T115036Z";
+ private static final String ICS_SEQUENCE = "0";
+ private static final String ICS_METHOD = "REQUEST";
+ private static final String ICS_1 = "BEGIN:VCALENDAR\r\n" +
+ "PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR\r\n" +
+ "CALSCALE:GREGORIAN\r\n" +
+ "X-OBM-TIME:1483703436\r\n" +
+ "VERSION:2.0\r\n" +
+ "METHOD:" + ICS_METHOD + "\r\n" +
+ "BEGIN:VEVENT\r\n" +
+ "CREATED:20170106T115035Z\r\n" +
+ "LAST-MODIFIED:20170106T115036Z\r\n" +
+ "DTSTAMP:" + ICS_DTSTAMP + "\r\n" +
+ "DTSTART:20170111T090000Z\r\n" +
+ "DURATION:PT1H30M\r\n" +
+ "TRANSP:OPAQUE\r\n" +
+ "SEQUENCE:" + ICS_SEQUENCE + "\r\n" +
+ "SUMMARY:Sprint planning #23\r\n" +
+ "DESCRIPTION:\r\n" +
+ "CLASS:PUBLIC\r\n" +
+ "PRIORITY:5\r\n" +
+ "ORGANIZER;X-OBM-ID=128;CN=Raphael OUAZANA:MAILTO:ouazana@linagora.com\r\n" +
+ "X-OBM-DOMAIN:linagora.com\r\n" +
+ "X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922\r\n" +
+ "LOCATION:Hangout\r\n" +
+ "CATEGORIES:\r\n" +
+ "X-OBM-COLOR:\r\n" +
+ "UID:" + ICS_UID + "\r\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Matthieu EXT_BAECHLER;PARTSTAT=NEEDS-ACTION;X-OBM-ID=302:MAILTO:baechler@linagora.com\r\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Laura ROYET;PARTSTAT=NEEDS-ACTION;X-OBM-ID=723:MAILTO:royet@linagora.com\r\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Raphael OUAZANA;PARTSTAT=ACCEPTED;X-OBM-ID=128:MAILTO:ouazana@linagora.com\r\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Luc DUZAN;PARTSTAT=NEEDS-ACTION;X-OBM-ID=715:MAILTO:duzan@linagora.com\r\n" +
+ "ATTENDEE;CUTYPE=RESOURCE;CN=Salle de reunion Lyon;PARTSTAT=ACCEPTED;X-OBM-ID=66:MAILTO:noreply@linagora.com\r\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Antoine DUPRAT;PARTSTAT=NEEDS-ACTION;X-OBM-ID=453:MAILTO:duprat@linagora.com\r\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Benoit TELLIER;PARTSTAT=NEEDS-ACTION;X-OBM-ID=623:MAILTO:tellier@linagora.com\r\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Quynh Quynh N NGUYEN;PARTSTAT=NEEDS-ACTION;X-OBM-ID=769:MAILTO:nguyen@linagora.com\r\n" +
+ "END:VEVENT\r\n" +
+ "END:VCALENDAR\r\n";
+
+ private static final String ICS_2 = "BEGIN:VCALENDAR\n" +
+ "PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR\n" +
+ "CALSCALE:GREGORIAN\n" +
+ "X-OBM-TIME:1483703436\n" +
+ "VERSION:2.0\n" +
+ "METHOD:REQUEST\n" +
+ "BEGIN:VEVENT\n" +
+ "CREATED:20170106T115035Z\n" +
+ "LAST-MODIFIED:20170106T115036Z\n" +
+ "DTSTAMP:20170106T115037Z\n" +
+ "DTSTART:20170111T090000Z\n" +
+ "DURATION:PT1H30M\n" +
+ "TRANSP:OPAQUE\n" +
+ "SEQUENCE:1\n" +
+ "SUMMARY:Sprint planning #23\n" +
+ "DESCRIPTION:\n" +
+ "CLASS:PUBLIC\n" +
+ "PRIORITY:5\n" +
+ "ORGANIZER;X-OBM-ID=128;CN=Raphael OUAZANA:MAILTO:ouazana@linagora.com\n" +
+ "X-OBM-DOMAIN:linagora.com\n" +
+ "X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922\n" +
+ "LOCATION:Hangout\n" +
+ "CATEGORIES:\n" +
+ "X-OBM-COLOR:\n" +
+ "UID:f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047fe\n" +
+ " b2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962bd\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Matthieu EXT_BAECHLER;PARTSTAT=NEE\n" +
+ " DS-ACTION;X-OBM-ID=302:MAILTO:baechler@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Laura ROYET;PARTSTAT=NEEDS-ACTION;\n" +
+ " X-OBM-ID=723:MAILTO:royet@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Raphael OUAZANA;PARTSTAT=ACCEPTED;\n" +
+ " X-OBM-ID=128:MAILTO:ouazana@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Luc DUZAN;PARTSTAT=NEEDS-ACTION;X-\n" +
+ " OBM-ID=715:MAILTO:duzan@linagora.com\n" +
+ "ATTENDEE;CUTYPE=RESOURCE;CN=Salle de reunion Lyon;PARTSTAT=ACCEPTED;X-OBM-\n" +
+ " ID=66:MAILTO:noreply@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Antoine DUPRAT;PARTSTAT=NEEDS-ACTI\n" +
+ " ON;X-OBM-ID=453:MAILTO:duprat@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Beno�t TELLIER;PARTSTAT=NEEDS-ACTI\n" +
+ " ON;X-OBM-ID=623:MAILTO:tellier@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Quynh Quynh N NGUYEN;PARTSTAT=NEED\n" +
+ " S-ACTION;X-OBM-ID=769:MAILTO:nguyen@linagora.com\n" +
+ "END:VEVENT\n" +
+ "END:VCALENDAR\n";
+
+ private static final String ICS_3 = "BEGIN:VCALENDAR\n" +
+ "PRODID:-//Aliasource Groupe LINAGORA//OBM Calendar 3.2.1-rc2//FR\n" +
+ "CALSCALE:GREGORIAN\n" +
+ "X-OBM-TIME:1483703436\n" +
+ "VERSION:2.0\n" +
+ "METHOD:REQUEST\n" +
+ "BEGIN:VEVENT\n" +
+ "CREATED:20170106T115035Z\n" +
+ "LAST-MODIFIED:20170106T115036Z\n" +
+ "DTSTAMP:20170106T115038Z\n" +
+ "DTSTART:20170111T090000Z\n" +
+ "DURATION:PT1H30M\n" +
+ "TRANSP:OPAQUE\n" +
+ "SEQUENCE:2\n" +
+ "SUMMARY:Sprint planning #23\n" +
+ "DESCRIPTION:\n" +
+ "CLASS:PUBLIC\n" +
+ "PRIORITY:5\n" +
+ "ORGANIZER;X-OBM-ID=128;CN=Raphael OUAZANA:MAILTO:ouazana@linagora.com\n" +
+ "X-OBM-DOMAIN:linagora.com\n" +
+ "X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922\n" +
+ "LOCATION:Hangout\n" +
+ "CATEGORIES:\n" +
+ "X-OBM-COLOR:\n" +
+ "UID:f1514f44bf39311568d640727cff54e819573448d09d2e5677987ff29caa01a9e047fe\n" +
+ " b2aab16e43439a608f28671ab7c10e754ce92be513f8e04ae9ff15e65a9819cf285a6962be\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Matthieu EXT_BAECHLER;PARTSTAT=NEE\n" +
+ " DS-ACTION;X-OBM-ID=302:MAILTO:baechler@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Laura ROYET;PARTSTAT=NEEDS-ACTION;\n" +
+ " X-OBM-ID=723:MAILTO:royet@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Raphael OUAZANA;PARTSTAT=ACCEPTED;\n" +
+ " X-OBM-ID=128:MAILTO:ouazana@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Luc DUZAN;PARTSTAT=NEEDS-ACTION;X-\n" +
+ " OBM-ID=715:MAILTO:duzan@linagora.com\n" +
+ "ATTENDEE;CUTYPE=RESOURCE;CN=Salle de reunion Lyon;PARTSTAT=ACCEPTED;X-OBM-\n" +
+ " ID=66:MAILTO:noreply@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Antoine DUPRAT;PARTSTAT=NEEDS-ACTI\n" +
+ " ON;X-OBM-ID=453:MAILTO:duprat@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Beno�t TELLIER;PARTSTAT=NEEDS-ACTI\n" +
+ " ON;X-OBM-ID=623:MAILTO:tellier@linagora.com\n" +
+ "ATTENDEE;CUTYPE=INDIVIDUAL;RSVP=TRUE;CN=Quynh Quynh N NGUYEN;PARTSTAT=NEED\n" +
+ " S-ACTION;X-OBM-ID=769:MAILTO:nguyen@linagora.com\n" +
+ "END:VEVENT\n" +
+ "END:VCALENDAR\n";
+
+ public SwarmGenericContainer rabbitMqContainer = new SwarmGenericContainer("rabbitmq:3")
+ .withAffinityToContainer();
+
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ @Rule
+ public final RuleChain chain = RuleChain.outerRule(temporaryFolder).around(rabbitMqContainer);
+
+ private TemporaryJamesServer jamesServer;
+ private ConditionFactory calmlyAwait;
+ private Channel channel;
+ private String queueName;
+ private Connection connection;
+
+ @Before
+ public void setup() throws Exception {
+ @SuppressWarnings("deprecation")
+ InetAddress containerIp = InetAddresses.forString(rabbitMqContainer.getContainerInfo().getNetworkSettings().getIpAddress());
+ String amqpUri = "amqp://" + containerIp.getHostAddress();
+
+ MailetContainer mailetContainer = MailetContainer.builder()
+ .postmaster("postmaster@" + JAMES_APACHE_ORG)
+ .threads(5)
+ .addProcessor(CommonProcessors.root())
+ .addProcessor(CommonProcessors.error())
+ .addProcessor(ProcessorConfiguration.builder()
+ .state("transport")
+ .enableJmx(true)
+ .addMailet(MailetConfiguration.builder()
+ .match("All")
+ .clazz("RemoveMimeHeader")
+ .addProperty("name", "bcc")
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("All")
+ .clazz("StripAttachment")
+ .addProperty("attribute", MAIL_ATTRIBUTE)
+ .addProperty("pattern", ".*")
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("All")
+ .clazz("MimeDecodingMailet")
+ .addProperty("attribute", MAIL_ATTRIBUTE)
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("All")
+ .clazz("ICalendarParser")
+ .addProperty("sourceAttribute", MAIL_ATTRIBUTE)
+ .addProperty("destinationAttribute", MAIL_ATTRIBUTE)
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("All")
+ .clazz("ICALToHeader")
+ .addProperty("attribute", MAIL_ATTRIBUTE)
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("All")
+ .clazz("ICALToJsonAttribute")
+ .addProperty("source", MAIL_ATTRIBUTE)
+ .addProperty("destination", MAIL_ATTRIBUTE)
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("All")
+ .clazz("AmqpForwardAttribute")
+ .addProperty("uri", amqpUri)
+ .addProperty("exchange", EXCHANGE_NAME)
+ .addProperty("attribute", MAIL_ATTRIBUTE)
+ .addProperty("routing_key", ROUTING_KEY)
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("RecipientIsLocal")
+ .clazz("org.apache.james.jmap.mailet.VacationMailet")
+ .build())
+ .addMailet(MailetConfiguration.builder()
+ .match("RecipientIsLocal")
+ .clazz("LocalDelivery")
+ .build())
+ .build())
+ .build();
+
+ jamesServer = new TemporaryJamesServer(temporaryFolder, mailetContainer);
+ Duration slowPacedPollInterval = Duration.FIVE_HUNDRED_MILLISECONDS;
+ calmlyAwait = Awaitility.with().pollInterval(slowPacedPollInterval).and().with().pollDelay(slowPacedPollInterval).await();
+
+ jamesServer.getServerProbe().addDomain(JAMES_APACHE_ORG);
+ jamesServer.getServerProbe().addUser(FROM, PASSWORD);
+ jamesServer.getServerProbe().addUser(RECIPIENT, PASSWORD);
+ jamesServer.getServerProbe().createMailbox(MailboxConstants.USER_NAMESPACE, RECIPIENT, "INBOX");
+
+ ConnectionFactory factory = new ConnectionFactory();
+ factory.setUri(amqpUri);
+ waitingForRabbitToBeReady(factory);
+ connection = factory.newConnection();
+ channel = connection.createChannel();
+ channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
+ queueName = channel.queueDeclare().getQueue();
+ channel.queueBind(queueName, EXCHANGE_NAME, ROUTING_KEY);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ channel.close();
+ connection.close();
+ jamesServer.shutdown();
+ }
+
+ @Test
+ public void calendarAttachmentShouldNotBePublishedInMQWhenNoICalAttachment() throws Exception {
+ MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
+
+ MimeMultipart multiPart = new MimeMultipart();
+ MimeBodyPart part = new MimeBodyPart();
+ part.setText("simple text");
+ multiPart.addBodyPart(part);
+ multiPart.addBodyPart(createAttachmentBodyPart("My attachment".getBytes(Charsets.UTF_8), "test.txt"));
+
+ message.setSubject("test");
+ message.setContent(multiPart);
+ message.saveChanges();
+
+ Mail mail = FakeMail.builder()
+ .mimeMessage(message)
+ .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));
+ }
+
+ boolean autoAck = true;
+ GetResponse basicGet = channel.basicGet(queueName, autoAck);
+ assertThat(basicGet).isNull();
+ }
+
+ @Test
+ public void calendarAttachmentShouldBePublishedInMQWhenMatchingWorkflowConfiguration() throws Exception {
+ MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
+
+ MimeMultipart multiPart = new MimeMultipart();
+ MimeBodyPart part = new MimeBodyPart();
+ part.setText("simple text");
+ multiPart.addBodyPart(part);
+ multiPart.addBodyPart(createAttachmentBodyPart(ICS_1.getBytes(Charsets.UTF_8), "meeting.ics"));
+
+ message.setSubject("test");
+ message.setContent(multiPart);
+ message.saveChanges();
+
+ Mail mail = FakeMail.builder()
+ .mimeMessage(message)
+ .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));
+ }
+
+ boolean autoAck = true;
+ GetResponse basicGet = channel.basicGet(queueName, autoAck);
+
+ DocumentContext jsonPath = toJsonPath(basicGet);
+ assertThat(jsonPath.<String> read("ical")).isEqualTo(ICS_1);
+ assertThat(jsonPath.<String> read("sender")).isEqualTo(FROM);
+ assertThat(jsonPath.<String> read("recipient")).isEqualTo(RECIPIENT);
+ assertThat(jsonPath.<String> read("uid")).isEqualTo(ICS_UID);
+ assertThat(jsonPath.<String> read("sequence")).isEqualTo(ICS_SEQUENCE);
+ assertThat(jsonPath.<String> read("dtstamp")).isEqualTo(ICS_DTSTAMP);
+ assertThat(jsonPath.<String> read("method")).isEqualTo(ICS_METHOD);
+ assertThat(jsonPath.<String> read("recurrence-id")).isNull();
+ }
+
+ private DocumentContext toJsonPath(GetResponse basicGet) {
+ return JsonPath.using(Configuration.defaultConfiguration()
+ .addOptions(Option.SUPPRESS_EXCEPTIONS))
+ .parse(new String(basicGet.getBody(), Charsets.UTF_8));
+ }
+
+ @Test
+ public void headersShouldNotBeAddedInMailWhenNoICalAttachment() throws Exception {
+ MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
+
+ MimeMultipart multiPart = new MimeMultipart();
+ MimeBodyPart part = new MimeBodyPart();
+ part.setText("simple text");
+ multiPart.addBodyPart(part);
+ multiPart.addBodyPart(createAttachmentBodyPart("My attachment".getBytes(Charsets.UTF_8), "test.txt"));
+
+ message.setSubject("test");
+ message.setContent(multiPart);
+ message.saveChanges();
+
+ Mail mail = FakeMail.builder()
+ .mimeMessage(message)
+ .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).doesNotContain("X-MEETING-UID");
+ assertThat(receivedHeaders).doesNotContain("X-MEETING-METHOD");
+ assertThat(receivedHeaders).doesNotContain("X-MEETING-RECURRENCE-ID");
+ assertThat(receivedHeaders).doesNotContain("X-MEETING-SEQUENCE");
+ assertThat(receivedHeaders).doesNotContain("X-MEETING-DTSTAMP");
+ }
+ }
+
+ @Test
+ public void headersShouldBeAddedInMailWhenOneICalAttachment() throws Exception {
+ MimeMessage message = new MimeMessage(Session
+ .getDefaultInstance(new Properties()));
+
+ MimeMultipart multiPart = new MimeMultipart();
+ MimeBodyPart part = new MimeBodyPart();
+ part.setText("simple text");
+ multiPart.addBodyPart(part);
+ multiPart.addBodyPart(createAttachmentBodyPart(ICS_1.getBytes(Charsets.UTF_8), "test.txt"));
+
+ message.setSubject("test");
+ message.setContent(multiPart);
+ message.saveChanges();
+
+ Mail mail = FakeMail.builder()
+ .mimeMessage(message)
+ .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_UID);
+ assertThat(receivedHeaders).contains("X-MEETING-METHOD: " + ICS_METHOD);
+ assertThat(receivedHeaders).contains("X-MEETING-SEQUENCE: " + ICS_SEQUENCE);
+ assertThat(receivedHeaders).contains("X-MEETING-DTSTAMP: " + ICS_DTSTAMP);
+ }
+ }
+
+ @Ignore("See JIRA issue MAILET-151")
+ @Test
+ public void headersShouldBeFilledOnlyWithOneICalAttachmentWhenMailHasSeveral() throws Exception {
+ MimeMessage message = new MimeMessage(Session
+ .getDefaultInstance(new Properties()));
+
+ MimeMultipart multiPart = new MimeMultipart();
+ MimeBodyPart part = new MimeBodyPart();
+ part.setText("simple text");
+ multiPart.addBodyPart(part);
+ multiPart.addBodyPart(createAttachmentBodyPart(ICS_1.getBytes(Charsets.UTF_8), "test.txt"));
+ multiPart.addBodyPart(createAttachmentBodyPart(ICS_2.getBytes(Charsets.UTF_8), "test.txt"));
+ multiPart.addBodyPart(createAttachmentBodyPart(ICS_3.getBytes(Charsets.UTF_8), "test.txt"));
+
+ message.setSubject("test");
+ message.setContent(multiPart);
+ message.saveChanges();
+
+ Mail mail = FakeMail.builder()
+ .mimeMessage(message)
+ .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);
+
+ //Here only the third ICal attachment is used to fill headers
+ assertThat(receivedHeaders).contains("X-MEETING-UID: " + ICS_UID);
+ assertThat(receivedHeaders).contains("X-MEETING-METHOD: " + ICS_METHOD);
+ assertThat(receivedHeaders).contains("X-MEETING-SEQUENCE: " + ICS_SEQUENCE);
+ assertThat(receivedHeaders).contains("X-MEETING-DTSTAMP: " + ICS_DTSTAMP);
+ }
+ }
+
+
+ private MimeBodyPart createAttachmentBodyPart(byte[] body, String fileName) throws MessagingException, UnsupportedEncodingException {
+ MimeBodyPart part = createBodyPart(body);
+ part.setDisposition("attachment");
+ part.setFileName(fileName);
+ return part;
+ }
+
+ private MimeBodyPart createBodyPart(byte[] body) throws MessagingException, UnsupportedEncodingException {
+ return new MimeBodyPart(new ByteArrayInputStream(
+ Bytes.concat("Content-Transfer-Encoding: 8bit\r\nContent-Type: application/octet-stream; charset=utf-8\r\n\r\n".getBytes(Charsets.UTF_8),
+ body)));
+ }
+
+ private void waitingForRabbitToBeReady(ConnectionFactory factory) {
+ Awaitility
+ .await()
+ .atMost(30, TimeUnit.SECONDS)
+ .with()
+ .pollInterval(10, TimeUnit.MILLISECONDS)
+ .until(() -> isReady(factory));
+ }
+
+ private boolean isReady(ConnectionFactory factory) {
+ try (Connection connection = factory.newConnection()) {
+ return true;
+ } catch (IOException e) {
+ return false;
+ } catch (TimeoutException e) {
+ return false;
+ }
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org