JAMES-2285 Rely on MemoryMailQueue in SMTPServerTest
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ad7e51d9 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ad7e51d9 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ad7e51d9 Branch: refs/heads/master Commit: ad7e51d92cb500e6a27dc73ce842cf61cd513ab9 Parents: 368a5d8 Author: benwa <[email protected]> Authored: Thu Jan 11 14:18:39 2018 +0700 Committer: benwa <[email protected]> Committed: Thu Jan 18 09:48:49 2018 +0700 ---------------------------------------------------------------------- server/protocols/protocols-smtp/pom.xml | 5 + .../apache/james/smtpserver/SMTPServerTest.java | 18 +-- .../james/queue/api/mock/MockMailQueue.java | 150 ------------------- .../queue/api/mock/MockMailQueueFactory.java | 45 ------ .../queue/memory/MemoryMailQueueFactory.java | 13 +- .../james/queue/memory/MemoryMailQueueTest.java | 47 ++++++ 6 files changed, 71 insertions(+), 207 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/ad7e51d9/server/protocols/protocols-smtp/pom.xml ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-smtp/pom.xml b/server/protocols/protocols-smtp/pom.xml index a18c272..13267c2 100644 --- a/server/protocols/protocols-smtp/pom.xml +++ b/server/protocols/protocols-smtp/pom.xml @@ -117,6 +117,11 @@ </dependency> <dependency> <groupId>${project.groupId}</groupId> + <artifactId>james-server-queue-memory</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> <artifactId>james-server-queue-api</artifactId> <type>test-jar</type> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/james-project/blob/ad7e51d9/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java index 3b2d869..3453882 100644 --- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java +++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java @@ -39,7 +39,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.apache.commons.net.ProtocolCommandEvent; @@ -59,8 +58,8 @@ import org.apache.james.protocols.api.utils.ProtocolServerUtils; import org.apache.james.protocols.lib.mock.MockProtocolHandlerLoader; import org.apache.james.protocols.netty.AbstractChannelPipelineFactory; import org.apache.james.queue.api.MailQueueFactory; -import org.apache.james.queue.api.mock.MockMailQueue; -import org.apache.james.queue.api.mock.MockMailQueueFactory; +import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory; +import org.apache.james.queue.memory.MemoryMailQueueFactory; import org.apache.james.rrt.api.RecipientRewriteTable; import org.apache.james.rrt.api.RecipientRewriteTableException; import org.apache.james.rrt.lib.Mappings; @@ -178,8 +177,8 @@ public class SMTPServerTest { protected MockFileSystem fileSystem; protected DNSService dnsService; protected MockProtocolHandlerLoader chain; - protected MockMailQueueFactory queueFactory; - protected MockMailQueue queue; + protected MemoryMailQueueFactory queueFactory; + protected MemoryMailQueueFactory.MemoryMailQueue queue; private SMTPServer smtpServer; @@ -308,8 +307,8 @@ public class SMTPServerTest { } }); - queueFactory = new MockMailQueueFactory(); - queue = (MockMailQueue) queueFactory.getQueue(MockMailQueueFactory.SPOOL); + queueFactory = new MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory()); + queue = (MemoryMailQueueFactory.MemoryMailQueue) queueFactory.getQueue(MailQueueFactory.SPOOL); chain.put("mailqueuefactory", MailQueueFactory.class, queueFactory); chain.put("domainlist", DomainList.class, new SimpleDomainList() { @@ -393,11 +392,10 @@ public class SMTPServerTest { @After public void tearDown() throws Exception { - queue.clear(); smtpServer.destroy(); } - public void verifyLastMail(String sender, String recipient, MimeMessage msg) throws IOException, MessagingException { + public void verifyLastMail(String sender, String recipient, MimeMessage msg) throws Exception { Mail mailData = queue.getLastMail(); assertThat(mailData) .as("mail received by mail server") @@ -818,7 +816,7 @@ public class SMTPServerTest { doTestHeloEhloResolv("helo"); } - private void doTestHeloEhloResolv(String heloCommand) throws IOException { + private void doTestHeloEhloResolv(String heloCommand) throws Exception { SMTPClient smtpProtocol = new SMTPClient(); InetSocketAddress bindedAddress = new ProtocolServerUtils(smtpServer).retrieveBindedAddress(); smtpProtocol.connect(bindedAddress.getAddress().getHostAddress(), bindedAddress.getPort()); http://git-wip-us.apache.org/repos/asf/james-project/blob/ad7e51d9/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueue.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueue.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueue.java deleted file mode 100644 index 3bdbcdc..0000000 --- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueue.java +++ /dev/null @@ -1,150 +0,0 @@ -/**************************************************************** - * 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.queue.api.mock; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Iterator; -import java.util.Random; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import javax.mail.MessagingException; - -import org.apache.commons.io.IOUtils; -import org.apache.james.queue.api.MailQueue; -import org.apache.james.server.core.MailImpl; -import org.apache.mailet.Mail; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MockMailQueue implements MailQueue { - - private static final Logger log = LoggerFactory.getLogger(MockMailQueue.class.getName()); - - private final LinkedBlockingQueue<Mail> queue = new LinkedBlockingQueue<>(); - private boolean throwException; - private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - - /** - * Throw an {@link MailQueueException} on next operation - */ - public void throwExceptionOnNextOperation() { - this.throwException = true; - } - - @Override - public MailQueueItem deQueue() throws MailQueueException { - if (throwException) { - throwException = false; - throw new MailQueueException("Mock"); - } - - try { - final Mail mail = queue.take(); - return new MailQueueItem() { - - @Override - public Mail getMail() { - return mail; - } - - @Override - public void done(boolean success) throws MailQueueException { - // do nothing here - } - }; - - } catch (InterruptedException e) { - log.error("", e); - throw new MailQueueException("Mock", e); - } - } - - private Mail cloneMail(Mail mail) { - ByteArrayOutputStream baos = null; - ByteArrayInputStream bais = null; - try { - baos = new ByteArrayOutputStream(); - ((MailImpl) mail).writeMessageTo(baos); - if (log.isTraceEnabled()) { - log.trace("mimemessage stream: >>>" + new String(baos.toByteArray()) + "<<<"); - } - bais = new ByteArrayInputStream(baos.toByteArray()); - return new MailImpl("MockMailCopy" + new Random().nextLong(), - mail.getSender(), mail.getRecipients(), bais); - } catch (MessagingException | IOException ex) { - log.error("Exception caught", ex); - throw new RuntimeException(ex); - } finally { - IOUtils.closeQuietly(bais); - IOUtils.closeQuietly(baos); - } - } - - @Override - public void enQueue(final Mail mail, long delay, TimeUnit unit) throws MailQueueException { - if (throwException) { - throwException = false; - throw new MailQueueException("Mock"); - } - - scheduler.schedule(() -> { - try { - queue.put(MockMailQueue.this.cloneMail(mail)); - } catch (InterruptedException e) { - log.error("", e); - throw new RuntimeException("Mock", e); - } - }, delay, unit); - } - - @Override - public void enQueue(Mail mail) throws MailQueueException { - if (throwException) { - throwException = false; - throw new MailQueueException("Mock"); - } - - try { - queue.put(cloneMail(mail)); - } catch (InterruptedException e) { - log.error("", e); - throw new MailQueueException("Mock", e); - } - } - - public Mail getLastMail() { - Iterator<Mail> it = queue.iterator(); - - Mail mail = null; - while (it.hasNext()) { - mail = it.next(); - } - - return mail; - } - - public void clear() { - queue.clear(); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/ad7e51d9/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueueFactory.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueueFactory.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueueFactory.java deleted file mode 100644 index 1cf77db..0000000 --- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/mock/MockMailQueueFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/**************************************************************** - * 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.queue.api.mock; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.james.queue.api.MailQueue; -import org.apache.james.queue.api.MailQueueFactory; - -public class MockMailQueueFactory implements MailQueueFactory { - - private final Map<String, MailQueue> queues = new HashMap<>(); - - @Override - public synchronized MailQueue getQueue(String name) { - MailQueue queue = queues.get(name); - if (queue == null) { - queue = new MockMailQueue(); - queues.put(name, queue); - } - - return queue; - } - - public void clear() { - queues.clear(); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/ad7e51d9/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java index 3a81099..5c0a4e1 100644 --- a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java +++ b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java @@ -19,6 +19,7 @@ package org.apache.james.queue.memory; +import java.util.NoSuchElementException; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingDeque; @@ -80,7 +81,7 @@ public class MemoryMailQueueFactory implements MailQueueFactory { @Override public void enQueue(Mail mail) throws MailQueueException { try { - mailItems.addFirst(new MemoryMailQueueItem(cloneMail(mail))); + mailItems.addLast(new MemoryMailQueueItem(cloneMail(mail))); } catch (MessagingException e) { throw new MailQueueException("Error while copying mail " + mail.getName(), e); } @@ -99,11 +100,19 @@ public class MemoryMailQueueFactory implements MailQueueFactory { @Override public MailQueueItem deQueue() throws MailQueueException, InterruptedException { while (true) { - MemoryMailQueueItem item = mailItems.takeLast(); + MemoryMailQueueItem item = mailItems.takeFirst(); return mailQueueItemDecoratorFactory.decorate(item); } } + public Mail getLastMail() throws MailQueueException, InterruptedException { + try { + return mailItems.getLast().getMail(); + } catch (NoSuchElementException e) { + return null; + } + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { http://git-wip-us.apache.org/repos/asf/james-project/blob/ad7e51d9/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueTest.java ---------------------------------------------------------------------- diff --git a/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueTest.java b/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueTest.java index 0c798a3..7f6f0f9 100644 --- a/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueTest.java +++ b/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryMailQueueTest.java @@ -19,10 +19,14 @@ package org.apache.james.queue.memory; +import static org.apache.james.queue.api.Mails.defaultMail; +import static org.assertj.core.api.Assertions.assertThat; + import org.apache.james.queue.api.MailQueue; import org.apache.james.queue.api.MailQueueContract; import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class MemoryMailQueueTest implements MailQueueContract { @@ -37,4 +41,47 @@ public class MemoryMailQueueTest implements MailQueueContract { public MailQueue getMailQueue() { return mailQueue; } + + @Test + public void getLastMailShouldReturnNullWhenNoMail() throws Exception { + assertThat(mailQueue.getLastMail()) + .isNull(); + } + + @Test + public void getLastMailShouldReturnSingleMail() throws Exception { + mailQueue.enQueue(defaultMail() + .name("name") + .build()); + + assertThat(mailQueue.getLastMail().getName()) + .isEqualTo("name"); + } + + @Test + public void getLastMailShouldReturnLastEnqueuedMail() throws Exception { + mailQueue.enQueue(defaultMail() + .name("name1") + .build()); + mailQueue.enQueue(defaultMail() + .name("name2") + .build()); + + assertThat(mailQueue.getLastMail().getName()) + .isEqualTo("name2"); + } + + @Test + public void getLastMailShouldNotAlterMailQueueState() throws Exception { + mailQueue.enQueue(defaultMail() + .name("name1") + .build()); + mailQueue.enQueue(defaultMail() + .name("name2") + .build()); + + mailQueue.getLastMail(); + assertThat(mailQueue.getLastMail().getName()) + .isEqualTo("name2"); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
