JAMES-2139 IT test from mailet
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/895a0042 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/895a0042 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/895a0042 Branch: refs/heads/master Commit: 895a00425f3dc2da42d4ca3def1caa7db8782384 Parents: bdedd0b Author: quynhn <qngu...@linagora.com> Authored: Wed Sep 6 18:00:36 2017 +0700 Committer: Antoine Duprat <adup...@linagora.com> Committed: Wed Sep 13 10:23:33 2017 +0200 ---------------------------------------------------------------------- server/mailet/integration-testing/pom.xml | 10 + .../james/mailets/TemporaryJamesServer.java | 11 +- .../configuration/ProcessorConfiguration.java | 4 + .../transport/mailets/GroupMappingTest.java | 377 +++++++++++++++++++ .../apache/james/utils/IMAPMessageReader.java | 11 + .../apache/james/utils/SMTPMessageSender.java | 10 +- 6 files changed, 416 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/895a0042/server/mailet/integration-testing/pom.xml ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/pom.xml b/server/mailet/integration-testing/pom.xml index 82b5000..a148d31 100644 --- a/server/mailet/integration-testing/pom.xml +++ b/server/mailet/integration-testing/pom.xml @@ -89,6 +89,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>james-server-webadmin-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>test</scope> @@ -103,6 +108,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>com.jayway.restassured</groupId> + <artifactId>rest-assured</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/895a0042/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java index 387e419..55f3f05 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java @@ -36,9 +36,11 @@ import org.apache.james.MemoryJamesServerMain; import org.apache.james.mailets.configuration.MailetContainer; import org.apache.james.modules.TestJMAPServerModule; import org.apache.james.utils.GuiceProbe; +import org.apache.james.webadmin.WebAdminConfiguration; import org.junit.rules.TemporaryFolder; import com.google.common.collect.ImmutableList; +import com.google.inject.AbstractModule; import com.google.inject.Module; public class TemporaryJamesServer { @@ -56,11 +58,10 @@ public class TemporaryJamesServer { jamesServer = new GuiceJamesServer() .combineWith(MemoryJamesServerMain.inMemoryServerModule) .overrideWith((binder) -> binder.bind(PersistenceAdapter.class).to(MemoryPersistenceAdapter.class)) - .overrideWith(ImmutableList.<Module>builder().addAll(Arrays.asList(additionalModules)) - .add(new TestJMAPServerModule(LIMIT_TO_3_MESSAGES)) - .add(new TemporaryFilesystemModule(temporaryFolder)) - .build() - .toArray(new Module[additionalModules.length + 2])); + .overrideWith(additionalModules) + .overrideWith(new TestJMAPServerModule(LIMIT_TO_3_MESSAGES)) + .overrideWith(new TemporaryFilesystemModule(temporaryFolder)) + .overrideWith((binder) -> binder.bind(WebAdminConfiguration.class).toProvider(WebAdminConfiguration::testingConfiguration)); jamesServer.start(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/895a0042/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/ProcessorConfiguration.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/ProcessorConfiguration.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/ProcessorConfiguration.java index 00128f1..cf95d69 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/ProcessorConfiguration.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/ProcessorConfiguration.java @@ -30,6 +30,10 @@ public class ProcessorConfiguration implements SerializableAsXml { return new Builder(); } + public static Builder transport() { + return builder().state("transport"); + } + public static class Builder { private String state; http://git-wip-us.apache.org/repos/asf/james-project/blob/895a0042/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java new file mode 100644 index 0000000..37b16bd --- /dev/null +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java @@ -0,0 +1,377 @@ +/**************************************************************** + * 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 javax.mail.internet.MimeMessage; + +import org.apache.james.core.MailAddress; +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.modules.MailboxProbeImpl; +import org.apache.james.probe.DataProbe; +import org.apache.james.utils.DataProbeImpl; +import org.apache.james.utils.IMAPMessageReader; +import org.apache.james.utils.SMTPMessageSender; +import org.apache.james.utils.WebAdminGuiceProbe; +import org.apache.james.webadmin.routes.GroupsRoutes; +import org.apache.mailet.Mail; +import org.apache.mailet.base.test.FakeMail; +import org.apache.mailet.base.test.MimeMessageBuilder; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import com.jayway.awaitility.Awaitility; +import com.jayway.awaitility.Duration; +import com.jayway.awaitility.core.ConditionFactory; +import com.jayway.restassured.RestAssured; +import com.jayway.restassured.specification.RequestSpecification; + +public class GroupMappingTest { + 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 DOMAIN1 = "domain1.com"; + private static final String DOMAIN2 = "domain2.com"; + + private static final String SENDER = "fromUser@" + DOMAIN1; + private static final String GROUP_ON_DOMAIN1 = "group@" + DOMAIN1; + private static final String GROUP_ON_DOMAIN2 = "group@" + DOMAIN2; + + private static final String USER_DOMAIN1 = "user@" + DOMAIN1; + private static final String USER_DOMAIN2 = "user@" + DOMAIN2; + private static final String MESSAGE_CONTENT = "any text"; + + private TemporaryJamesServer jamesServer; + private ConditionFactory calmlyAwait; + private MimeMessage message; + private DataProbe dataProbe; + private RequestSpecification restApiRequest; + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + @Before + public void setup() throws Exception { + MailetContainer mailetContainer = MailetContainer.builder() + .postmaster("postmaster@" + DOMAIN1) + .threads(5) + .addProcessor(CommonProcessors.root()) + .addProcessor(CommonProcessors.error()) + .addProcessor(ProcessorConfiguration.transport() + .enableJmx(true) + .addMailet(MailetConfiguration.builder() + .match("All") + .clazz("RemoveMimeHeader") + .addProperty("name", "bcc") + .build()) + .addMailet(MailetConfiguration.builder() + .match("All") + .clazz("RecipientRewriteTable") + .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(); + + dataProbe = jamesServer.getProbe(DataProbeImpl.class); + dataProbe.addDomain(DOMAIN1); + dataProbe.addDomain(DOMAIN2); + + dataProbe.addUser(SENDER, PASSWORD); + + dataProbe.addUser(USER_DOMAIN1, PASSWORD); + dataProbe.addUser(USER_DOMAIN2, PASSWORD); + + jamesServer.getProbe(MailboxProbeImpl.class).createMailbox(MailboxConstants.USER_NAMESPACE, USER_DOMAIN1, "INBOX"); + jamesServer.getProbe(MailboxProbeImpl.class).createMailbox(MailboxConstants.USER_NAMESPACE, USER_DOMAIN2, "INBOX"); + + restApiRequest = RestAssured.given() + .port(jamesServer.getProbe(WebAdminGuiceProbe.class).getWebAdminPort()); + + message = MimeMessageBuilder.mimeMessageBuilder() + .setSubject("test") + .setText(MESSAGE_CONTENT) + .build(); + } + + @After + public void tearDown() { + jamesServer.shutdown(); + } + + @Test + public void messageShouldRedirectToUserWhenBelongingToGroup() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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(USER_DOMAIN1, PASSWORD)); + + String processedMessage = imapMessageReader.readFirstMessageInInbox(USER_DOMAIN1, PASSWORD); + + assertThat(processedMessage).contains(MESSAGE_CONTENT); + } + + } + + @Test + public void messageShouldRedirectToUserDoesNotHaveSameDomainWhenBelongingToGroup() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN2); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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(USER_DOMAIN2, PASSWORD)); + + String processedMessage = imapMessageReader.readFirstMessageInInbox(USER_DOMAIN2, PASSWORD); + + assertThat(processedMessage).contains(MESSAGE_CONTENT); + } + } + + @Test + public void messageShouldRedirectToAllUsersBelongingToGroup() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN2); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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.countReceivedMessage(USER_DOMAIN1, PASSWORD, 1)); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.countReceivedMessage(USER_DOMAIN2, PASSWORD, 1)); + } + } + + @Test + public void messageShouldRedirectWhenGroupBelongingToAnotherGroup() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN2 + "/" + USER_DOMAIN2); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + GROUP_ON_DOMAIN2); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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(USER_DOMAIN2, PASSWORD)); + + String processedMessage = imapMessageReader.readFirstMessageInInbox(USER_DOMAIN2, PASSWORD); + + assertThat(processedMessage).contains(MESSAGE_CONTENT); + } + } + + @Test + public void messageShouldNotBeDuplicatedWhenUserBelongingToTwoGroups() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN2 + "/" + USER_DOMAIN1); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + GROUP_ON_DOMAIN2); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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.countReceivedMessage(USER_DOMAIN1, PASSWORD, 1)); + } + } + + @Test + public void messageShouldNotBeDuplicatedWhenRecipientIsAlsoPartOfGroup() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipients(new MailAddress(GROUP_ON_DOMAIN1), new MailAddress(USER_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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.countReceivedMessage(USER_DOMAIN1, PASSWORD, 1)); + } + } + + @Test + public void groupMappingShouldSupportTreeStructure() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN2 + "/" + USER_DOMAIN2); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + GROUP_ON_DOMAIN2); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN2)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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(USER_DOMAIN2, PASSWORD)); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userReceivedMessage(USER_DOMAIN1, PASSWORD)); + } + } + + @Test + public void messageShouldNotBeSentWhenGroupLoopMapping() throws Exception { + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN2 + "/" + USER_DOMAIN2); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + GROUP_ON_DOMAIN2); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN2 + "/" + GROUP_ON_DOMAIN1); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + IMAPMessageReader imapMessageReader = new IMAPMessageReader(LOCALHOST_IP, IMAP_PORT)) { + messageSender.sendMessage(mail); + + calmlyAwait.atMost(Duration.ONE_MINUTE).until(messageSender::messageHaveNotBeenSent); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userDoesNotReceiveMessage(USER_DOMAIN1, PASSWORD)); + calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> imapMessageReader.userDoesNotReceiveMessage(USER_DOMAIN2, PASSWORD)); + } + } + + @Test + public void messageShouldRedirectToUserWhenDomainMapping() throws Exception { + dataProbe.addDomainAliasMapping(DOMAIN1, DOMAIN2); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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(USER_DOMAIN2, PASSWORD)); + } + } + + @Test + public void messageShouldNotSendToUserBelongingToGroupWhenDomainMapping() throws Exception { + dataProbe.addDomainAliasMapping(DOMAIN1, DOMAIN2); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN1 + "/" + USER_DOMAIN1); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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.userDoesNotReceiveMessage(USER_DOMAIN1, PASSWORD)); + } + } + + @Test + public void messageShouldRedirectToGroupWhenDomainMapping() throws Exception { + dataProbe.addDomainAliasMapping(DOMAIN1, DOMAIN2); + + restApiRequest.put(GroupsRoutes.ROOT_PATH + "/" + GROUP_ON_DOMAIN2 + "/" + USER_DOMAIN2); + + Mail mail = FakeMail.builder() + .mimeMessage(message) + .sender(new MailAddress(SENDER)) + .recipient(new MailAddress(GROUP_ON_DOMAIN1)) + .build(); + + try (SMTPMessageSender messageSender = SMTPMessageSender.noAuthentication(LOCALHOST_IP, SMTP_PORT, DOMAIN1); + 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(USER_DOMAIN2, PASSWORD)); + } + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/895a0042/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java ---------------------------------------------------------------------- diff --git a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java index fc05bde..8fb5d68 100644 --- a/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java +++ b/server/testing/src/main/java/org/apache/james/utils/IMAPMessageReader.java @@ -43,6 +43,17 @@ public class IMAPMessageReader implements Closeable { imapClient.select(mailbox); } + public boolean countReceivedMessage(String user, String password, int numberOfMessages) throws IOException { + return countReceivedMessageInMailbox(user, password, INBOX, numberOfMessages); + } + + public boolean countReceivedMessageInMailbox(String user, String password, String mailbox, int numberOfMessages) throws IOException { + connectAndSelect(user, password, mailbox); + + return imapClient.getReplyString() + .contains(numberOfMessages + " EXISTS"); + } + public boolean userReceivedMessage(String user, String password) throws IOException { return userReceivedMessageInMailbox(user, password, INBOX); } http://git-wip-us.apache.org/repos/asf/james-project/blob/895a0042/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java ---------------------------------------------------------------------- diff --git a/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java b/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java index 2a0e5fc..b08c5d2 100644 --- a/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java +++ b/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java @@ -31,10 +31,10 @@ import javax.mail.MessagingException; import org.apache.commons.net.smtp.AuthenticatingSMTPClient; import org.apache.commons.net.smtp.SMTPClient; +import org.apache.james.core.MailAddress; import org.apache.mailet.Mail; import com.google.common.base.Charsets; -import com.google.common.base.Joiner; import com.google.common.base.Throwables; public class SMTPMessageSender implements Closeable { @@ -92,7 +92,9 @@ public class SMTPMessageSender implements Closeable { String from = mail.getSender().asString(); smtpClient.helo(senderDomain); smtpClient.setSender(from); - smtpClient.rcpt("<" + Joiner.on(", ").join(mail.getRecipients()) + ">"); + for (MailAddress mailAddress : mail.getRecipients()) { + smtpClient.addRecipient(mailAddress.asString()); + } smtpClient.sendShortMessageData(asString(mail.getMessage())); } catch (IOException e) { throw Throwables.propagate(e); @@ -110,6 +112,10 @@ public class SMTPMessageSender implements Closeable { .contains("250 2.6.0 Message received"); } + public boolean messageHaveNotBeenSent() throws IOException { + return !messageHasBeenSent(); + } + @Override public void close() throws IOException { smtpClient.disconnect(); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org