INT-4150: Make ImapMailReceiverTests much faster
JIRA: https://jira.spring.io/browse/INT-4150 * Fix internal `taskScheduler` for destroy in the `ImapMailReceiver` * Some code style polishing in the `ImapIdleChannelAdapter`
This commit is contained in:
committed by
Gary Russell
parent
29b4a296be
commit
992c0ce6a7
@@ -256,9 +256,12 @@ public class ImapIdleChannelAdapter extends MessageProducerSupport implements Be
|
||||
}
|
||||
}
|
||||
catch (Exception e) { //run again after a delay
|
||||
logger.warn("Failed to execute IDLE task. Will attempt to resubmit in " + ImapIdleChannelAdapter.this.reconnectDelay + " milliseconds.", e);
|
||||
if (logger.isWarnEnabled()) {
|
||||
logger.warn("Failed to execute IDLE task. Will attempt to resubmit in "
|
||||
+ ImapIdleChannelAdapter.this.reconnectDelay + " milliseconds.", e);
|
||||
}
|
||||
ImapIdleChannelAdapter.this.receivingTaskTrigger.delayNextExecution();
|
||||
ImapIdleChannelAdapter.this.publishException(e);
|
||||
publishException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -312,6 +315,7 @@ public class ImapIdleChannelAdapter extends MessageProducerSupport implements Be
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ExceptionAwarePeriodicTrigger implements Trigger {
|
||||
@@ -334,18 +338,20 @@ public class ImapIdleChannelAdapter extends MessageProducerSupport implements Be
|
||||
}
|
||||
}
|
||||
|
||||
public void delayNextExecution() {
|
||||
void delayNextExecution() {
|
||||
this.delayNextExecution = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class ImapIdleExceptionEvent extends MailIntegrationEvent {
|
||||
|
||||
private static final long serialVersionUID = -5875388810251967741L;
|
||||
|
||||
public ImapIdleExceptionEvent(Exception e) {
|
||||
ImapIdleExceptionEvent(Exception e) {
|
||||
super(ImapIdleChannelAdapter.this, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,9 +16,9 @@
|
||||
|
||||
package org.springframework.integration.mail;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
|
||||
@@ -63,13 +63,15 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
|
||||
private final IdleCanceler idleCanceler = new IdleCanceler();
|
||||
|
||||
private volatile boolean shouldMarkMessagesAsRead = true;
|
||||
private boolean shouldMarkMessagesAsRead = true;
|
||||
|
||||
private volatile SearchTermStrategy searchTermStrategy = new DefaultSearchTermStrategy();
|
||||
private SearchTermStrategy searchTermStrategy = new DefaultSearchTermStrategy();
|
||||
|
||||
private volatile long cancelIdleInterval = DEFAULT_CANCEL_IDLE_INTERVAL;
|
||||
private long cancelIdleInterval = DEFAULT_CANCEL_IDLE_INTERVAL;
|
||||
|
||||
private volatile TaskScheduler scheduler;
|
||||
private TaskScheduler scheduler;
|
||||
|
||||
private boolean isInternalScheduler;
|
||||
|
||||
private volatile ScheduledFuture<?> pingTask;
|
||||
|
||||
@@ -92,7 +94,6 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
|
||||
/**
|
||||
* Check if messages should be marked as read.
|
||||
*
|
||||
* @return true if messages should be marked as read.
|
||||
*/
|
||||
public Boolean isShouldMarkMessagesAsRead() {
|
||||
@@ -102,7 +103,6 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
/**
|
||||
* Provides a way to set custom {@link SearchTermStrategy} to compile a {@link SearchTerm}
|
||||
* to be applied when retrieving mail
|
||||
*
|
||||
* @param searchTermStrategy The search term strategy implementation.
|
||||
*/
|
||||
public void setSearchTermStrategy(SearchTermStrategy searchTermStrategy) {
|
||||
@@ -112,7 +112,6 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
|
||||
/**
|
||||
* Specify if messages should be marked as read.
|
||||
*
|
||||
* @param shouldMarkMessagesAsRead true if messages should be marked as read.
|
||||
*/
|
||||
public void setShouldMarkMessagesAsRead(Boolean shouldMarkMessagesAsRead) {
|
||||
@@ -138,6 +137,7 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
|
||||
scheduler.initialize();
|
||||
this.scheduler = scheduler;
|
||||
this.isInternalScheduler = true;
|
||||
}
|
||||
Properties javaMailProperties = getJavaMailProperties();
|
||||
for (String name : new String[]{"imap", "imaps"}) {
|
||||
@@ -148,10 +148,17 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() throws Exception {
|
||||
super.destroy();
|
||||
if (this.isInternalScheduler) {
|
||||
((ThreadPoolTaskScheduler) this.scheduler).shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is unique to the IMAP receiver and only works if IMAP IDLE
|
||||
* is supported (see RFC 2177 for more detail).
|
||||
*
|
||||
* @throws MessagingException Any MessagingException.
|
||||
*/
|
||||
public void waitForNewMessages() throws MessagingException {
|
||||
@@ -189,7 +196,6 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
* {@link javax.mail.Flags.Flag#ANSWERED ANSWERED}, and not
|
||||
* {@link javax.mail.Flags.Flag#DELETED DELETED}. The search term is used
|
||||
* to {@link Folder#search(SearchTerm) search} for new messages.
|
||||
*
|
||||
* @return the new messages
|
||||
* @throws MessagingException in case of JavaMail errors
|
||||
*/
|
||||
@@ -204,7 +210,6 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
throw new MessagingException("Folder is closed");
|
||||
}
|
||||
|
||||
// INT-3859
|
||||
private Message[] nullSafeMessages(Message[] messageArray) {
|
||||
boolean hasNulls = false;
|
||||
for (Message message : messageArray) {
|
||||
@@ -217,13 +222,9 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
return messageArray;
|
||||
}
|
||||
else {
|
||||
List<Message> messages = new ArrayList<Message>();
|
||||
for (Message message : messageArray) {
|
||||
if (message != null) {
|
||||
messages.add(message);
|
||||
}
|
||||
}
|
||||
return messages.toArray(new Message[messages.size()]);
|
||||
return Arrays.stream(messageArray)
|
||||
.filter(Objects::nonNull)
|
||||
.toArray(Message[]::new);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,6 +277,7 @@ public class ImapMailReceiver extends AbstractMailReceiver {
|
||||
messages[0].getFolder().isOpen();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class DefaultSearchTermStrategy implements SearchTermStrategy {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2017 the original author or authors.
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,8 +16,11 @@
|
||||
|
||||
package org.springframework.integration.mail;
|
||||
|
||||
import static org.hamcrest.Matchers.emptyArray;
|
||||
import static org.hamcrest.Matchers.endsWith;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.instanceOf;
|
||||
import static org.hamcrest.Matchers.not;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
@@ -69,12 +72,13 @@ import org.junit.BeforeClass;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
@@ -83,7 +87,6 @@ import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
|
||||
import org.springframework.integration.history.MessageHistory;
|
||||
import org.springframework.integration.mail.ImapIdleChannelAdapter.ImapIdleExceptionEvent;
|
||||
import org.springframework.integration.mail.config.ImapIdleChannelAdapterParserTests;
|
||||
import org.springframework.integration.mail.support.DefaultMailHeaderMapper;
|
||||
import org.springframework.integration.test.mail.TestMailServer;
|
||||
import org.springframework.integration.test.mail.TestMailServer.ImapServer;
|
||||
@@ -93,6 +96,9 @@ import org.springframework.messaging.MessageHeaders;
|
||||
import org.springframework.messaging.PollableChannel;
|
||||
import org.springframework.scheduling.TaskScheduler;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
import com.sun.mail.imap.IMAPFolder;
|
||||
|
||||
@@ -101,6 +107,10 @@ import com.sun.mail.imap.IMAPFolder;
|
||||
* @author Gary Russell
|
||||
* @author Artem Bilan
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@ContextConfiguration(
|
||||
"classpath:org/springframework/integration/mail/config/ImapIdleChannelAdapterParserTests-context.xml")
|
||||
@DirtiesContext
|
||||
public class ImapMailReceiverTests {
|
||||
|
||||
@Rule
|
||||
@@ -111,6 +121,9 @@ public class ImapMailReceiverTests {
|
||||
private final static ImapServer imapIdleServer = TestMailServer.imap(0);
|
||||
|
||||
|
||||
@Autowired
|
||||
private ApplicationContext context;
|
||||
|
||||
@BeforeClass
|
||||
public static void setup() throws InterruptedException {
|
||||
int n = 0;
|
||||
@@ -127,8 +140,8 @@ public class ImapMailReceiverTests {
|
||||
|
||||
@Test
|
||||
public void testIdleWithServerCustomSearch() throws Exception {
|
||||
ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort()
|
||||
+ "/INBOX");
|
||||
ImapMailReceiver receiver =
|
||||
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
|
||||
receiver.setSearchTermStrategy((supportedFlags, folder) -> {
|
||||
try {
|
||||
FromTerm fromTerm = new FromTerm(new InternetAddress("bar@baz"));
|
||||
@@ -143,24 +156,24 @@ public class ImapMailReceiverTests {
|
||||
|
||||
@Test
|
||||
public void testIdleWithServerDefaultSearch() throws Exception {
|
||||
ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort()
|
||||
+ "/INBOX");
|
||||
ImapMailReceiver receiver =
|
||||
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
|
||||
testIdleWithServerGuts(receiver, false);
|
||||
assertTrue(imapIdleServer.assertReceived("searchWithUserFlag"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIdleWithMessageMapping() throws Exception {
|
||||
ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort()
|
||||
+ "/INBOX");
|
||||
ImapMailReceiver receiver =
|
||||
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
|
||||
receiver.setHeaderMapper(new DefaultMailHeaderMapper());
|
||||
testIdleWithServerGuts(receiver, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIdleWithServerDefaultSearchSimple() throws Exception {
|
||||
ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort()
|
||||
+ "/INBOX");
|
||||
ImapMailReceiver receiver =
|
||||
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
|
||||
receiver.setSimpleContent(true);
|
||||
testIdleWithServerGuts(receiver, false, true);
|
||||
assertTrue(imapIdleServer.assertReceived("searchWithUserFlag"));
|
||||
@@ -168,8 +181,8 @@ public class ImapMailReceiverTests {
|
||||
|
||||
@Test
|
||||
public void testIdleWithMessageMappingSimple() throws Exception {
|
||||
ImapMailReceiver receiver = new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort()
|
||||
+ "/INBOX");
|
||||
ImapMailReceiver receiver =
|
||||
new ImapMailReceiver("imap://user:pw@localhost:" + imapIdleServer.getPort() + "/INBOX");
|
||||
receiver.setSimpleContent(true);
|
||||
receiver.setHeaderMapper(new DefaultMailHeaderMapper());
|
||||
testIdleWithServerGuts(receiver, true, true);
|
||||
@@ -188,7 +201,7 @@ public class ImapMailReceiverTests {
|
||||
receiver.setMaxFetchSize(1);
|
||||
receiver.setShouldDeleteMessages(false);
|
||||
receiver.setShouldMarkMessagesAsRead(true);
|
||||
receiver.setCancelIdleInterval(8);
|
||||
receiver.setCancelIdleInterval(1);
|
||||
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
|
||||
setUpScheduler(receiver, taskScheduler);
|
||||
receiver.setUserFlag("testSIUserFlag");
|
||||
@@ -199,6 +212,7 @@ public class ImapMailReceiverTests {
|
||||
QueueChannel channel = new QueueChannel();
|
||||
adapter.setOutputChannel(channel);
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.setReconnectDelay(1);
|
||||
adapter.start();
|
||||
if (!mapped) {
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -224,7 +238,9 @@ public class ImapMailReceiverTests {
|
||||
assertThat(headers.get(MailHeaders.CONTENT_TYPE), equalTo("TEXT/PLAIN; charset=ISO-8859-1"));
|
||||
assertThat(headers.get(MessageHeaders.CONTENT_TYPE), equalTo("TEXT/PLAIN; charset=ISO-8859-1"));
|
||||
assertThat(headers.get(MailHeaders.FROM), equalTo("Bar <bar@baz>"));
|
||||
assertThat((headers.get(MailHeaders.TO, String[].class))[0], equalTo("Foo <foo@bar>"));
|
||||
String[] toHeader = headers.get(MailHeaders.TO, String[].class);
|
||||
assertThat(toHeader, not(emptyArray()));
|
||||
assertThat(toHeader[0], equalTo("Foo <foo@bar>"));
|
||||
assertThat(Arrays.toString(headers.get(MailHeaders.CC, String[].class)), equalTo("[a@b, c@d]"));
|
||||
assertThat(Arrays.toString(headers.get(MailHeaders.BCC, String[].class)), equalTo("[e@f, g@h]"));
|
||||
assertThat(headers.get(MailHeaders.SUBJECT), equalTo("Test Email"));
|
||||
@@ -236,7 +252,7 @@ public class ImapMailReceiverTests {
|
||||
}
|
||||
}
|
||||
assertNotNull(channel.receive(10000)); // new message after idle
|
||||
assertNull(channel.receive(10000)); // no new message after second and third idle
|
||||
assertNull(channel.receive(100)); // no new message after second and third idle
|
||||
verify(logger).debug("Canceling IDLE");
|
||||
taskScheduler.shutdown();
|
||||
assertTrue(imapIdleServer.assertReceived("storeUserFlag"));
|
||||
@@ -250,7 +266,7 @@ public class ImapMailReceiverTests {
|
||||
receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2);
|
||||
verify(msg1, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(msg2, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any());
|
||||
verify(receiver, times(0)).deleteMessages(Mockito.any());
|
||||
}
|
||||
|
||||
private AbstractMailReceiver receiveAndMarkAsReadDontDeleteGuts(AbstractMailReceiver receiver, Message msg1,
|
||||
@@ -269,7 +285,7 @@ public class ImapMailReceiverTests {
|
||||
|
||||
willAnswer(invocation -> {
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
|
||||
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
|
||||
int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode");
|
||||
if (folderOpenMode != Folder.READ_WRITE) {
|
||||
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
|
||||
}
|
||||
@@ -294,7 +310,7 @@ public class ImapMailReceiverTests {
|
||||
receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2);
|
||||
verify(msg1, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(msg2, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any());
|
||||
verify(receiver, times(0)).deleteMessages(Mockito.any());
|
||||
}
|
||||
|
||||
@Test // INT-2991 filtered messages were marked SEEN
|
||||
@@ -309,7 +325,7 @@ public class ImapMailReceiverTests {
|
||||
receiver = receiveAndMarkAsReadDontDeleteGuts(receiver, msg1, msg2);
|
||||
verify(msg1, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(msg2, never()).setFlag(Flag.SEEN, true);
|
||||
verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any());
|
||||
verify(receiver, times(0)).deleteMessages(Mockito.any());
|
||||
}
|
||||
|
||||
|
||||
@@ -333,7 +349,7 @@ public class ImapMailReceiverTests {
|
||||
final Message[] messages = new Message[] { msg1, msg2 };
|
||||
willAnswer(invocation -> {
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
|
||||
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
|
||||
int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode");
|
||||
if (folderOpenMode != Folder.READ_WRITE) {
|
||||
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
|
||||
}
|
||||
@@ -346,7 +362,7 @@ public class ImapMailReceiverTests {
|
||||
receiver.receive();
|
||||
verify(msg1, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(msg2, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(receiver, times(1)).deleteMessages((Message[]) Mockito.any());
|
||||
verify(receiver, times(1)).deleteMessages(Mockito.any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -398,7 +414,7 @@ public class ImapMailReceiverTests {
|
||||
final Message[] messages = new Message[] { msg1, msg2 };
|
||||
willAnswer(invocation -> {
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
|
||||
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
|
||||
int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode");
|
||||
if (folderOpenMode != Folder.READ_WRITE) {
|
||||
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
|
||||
}
|
||||
@@ -434,7 +450,7 @@ public class ImapMailReceiverTests {
|
||||
final Message[] messages = new Message[] { msg1, msg2 };
|
||||
willAnswer(invocation -> {
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(invocation.getMock());
|
||||
int folderOpenMode = (Integer) accessor.getPropertyValue("folderOpenMode");
|
||||
int folderOpenMode = (int) accessor.getPropertyValue("folderOpenMode");
|
||||
if (folderOpenMode != Folder.READ_WRITE) {
|
||||
throw new IllegalArgumentException("Folder had to be open in READ_WRITE mode");
|
||||
}
|
||||
@@ -447,15 +463,13 @@ public class ImapMailReceiverTests {
|
||||
receiver.receive();
|
||||
verify(msg1, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(msg2, times(1)).setFlag(Flag.SEEN, true);
|
||||
verify(receiver, times(0)).deleteMessages((Message[]) Mockito.any());
|
||||
verify(receiver, times(0)).deleteMessages(Mockito.any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void testMessageHistory() throws Exception {
|
||||
ConfigurableApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class);
|
||||
ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
|
||||
AbstractMailReceiver receiver = new ImapMailReceiver();
|
||||
receiver = spy(receiver);
|
||||
@@ -482,7 +496,7 @@ public class ImapMailReceiverTests {
|
||||
|
||||
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
|
||||
|
||||
PollableChannel channel = context.getBean("channel", PollableChannel.class);
|
||||
PollableChannel channel = this.context.getBean("channel", PollableChannel.class);
|
||||
|
||||
adapter.start();
|
||||
org.springframework.messaging.Message<?> replMessage = channel.receive(10000);
|
||||
@@ -492,14 +506,11 @@ public class ImapMailReceiverTests {
|
||||
assertNotNull(componentHistoryRecord);
|
||||
assertEquals("mail:imap-idle-channel-adapter", componentHistoryRecord.get("type"));
|
||||
adapter.stop();
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIdleChannelAdapterException() throws Exception {
|
||||
ConfigurableApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class);
|
||||
ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
|
||||
//ImapMailReceiver receiver = (ImapMailReceiver) TestUtils.getPropertyValue(adapter, "mailReceiver");
|
||||
|
||||
@@ -548,15 +559,12 @@ public class ImapMailReceiverTests {
|
||||
assertNotNull(replMessage);
|
||||
assertEquals("Failed", ((Exception) replMessage.getPayload()).getCause().getMessage());
|
||||
adapter.stop();
|
||||
context.close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("resource")
|
||||
@Test
|
||||
public void testNoInitialIdleDelayWhenRecentNotSupported() throws Exception {
|
||||
ConfigurableApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class);
|
||||
ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
|
||||
QueueChannel channel = new QueueChannel();
|
||||
adapter.setOutputChannel(channel);
|
||||
@@ -607,7 +615,7 @@ public class ImapMailReceiverTests {
|
||||
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
|
||||
|
||||
willAnswer(invocation -> {
|
||||
Thread.sleep(5000);
|
||||
Thread.sleep(300);
|
||||
shouldFindMessagesCounter.set(1);
|
||||
return null;
|
||||
}).given(folder).idle();
|
||||
@@ -620,23 +628,21 @@ public class ImapMailReceiverTests {
|
||||
*/
|
||||
assertNotNull(channel.receive(3000));
|
||||
// We should not receive any more until the next idle elapses
|
||||
assertNull(channel.receive(3000));
|
||||
assertNull(channel.receive(100));
|
||||
assertNotNull(channel.receive(6000));
|
||||
adapter.stop();
|
||||
context.close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("resource")
|
||||
@Test
|
||||
public void testInitialIdleDelayWhenRecentIsSupported() throws Exception {
|
||||
ConfigurableApplicationContext context =
|
||||
new ClassPathXmlApplicationContext("ImapIdleChannelAdapterParserTests-context.xml", ImapIdleChannelAdapterParserTests.class);
|
||||
ImapIdleChannelAdapter adapter = context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
|
||||
|
||||
QueueChannel channel = new QueueChannel();
|
||||
adapter.setOutputChannel(channel);
|
||||
adapter.setReconnectDelay(1);
|
||||
|
||||
ImapMailReceiver receiver = new ImapMailReceiver("imap:foo");
|
||||
receiver.setCancelIdleInterval(1);
|
||||
receiver = spy(receiver);
|
||||
receiver.setBeanFactory(mock(BeanFactory.class));
|
||||
receiver.afterPropertiesSet();
|
||||
@@ -670,7 +676,7 @@ public class ImapMailReceiverTests {
|
||||
final CountDownLatch idles = new CountDownLatch(2);
|
||||
willAnswer(invocation -> {
|
||||
idles.countDown();
|
||||
Thread.sleep(5000);
|
||||
Thread.sleep(1000);
|
||||
return null;
|
||||
}).given(folder).idle();
|
||||
|
||||
@@ -680,18 +686,17 @@ public class ImapMailReceiverTests {
|
||||
* Idle takes 5 seconds; since this server supports RECENT, we should
|
||||
* not receive any early messages.
|
||||
*/
|
||||
assertNull(channel.receive(3000));
|
||||
assertNull(channel.receive(100));
|
||||
assertNotNull(channel.receive(5000));
|
||||
assertTrue(idles.await(5, TimeUnit.SECONDS));
|
||||
adapter.stop();
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConnectionException() throws Exception {
|
||||
ImapMailReceiver mailReceiver = new ImapMailReceiver("imap:foo");
|
||||
ImapIdleChannelAdapter adapter = new ImapIdleChannelAdapter(mailReceiver);
|
||||
final AtomicReference<ImapIdleExceptionEvent> theEvent = new AtomicReference<ImapIdleExceptionEvent>();
|
||||
final AtomicReference<ImapIdleExceptionEvent> theEvent = new AtomicReference<>();
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
adapter.setApplicationEventPublisher(event -> {
|
||||
assertNull("only one event expected", theEvent.get());
|
||||
@@ -703,7 +708,8 @@ public class ImapMailReceiverTests {
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.start();
|
||||
assertTrue(latch.await(10, TimeUnit.SECONDS));
|
||||
assertTrue(theEvent.get().toString().endsWith("cause=java.lang.IllegalStateException: Failure in 'idle' task. Will resubmit.]"));
|
||||
assertThat(theEvent.get().toString(),
|
||||
endsWith("cause=java.lang.IllegalStateException: Failure in 'idle' task. Will resubmit.]"));
|
||||
}
|
||||
|
||||
@Test // see INT-1801
|
||||
@@ -715,7 +721,7 @@ public class ImapMailReceiverTests {
|
||||
Folder folder = mock(Folder.class);
|
||||
given(folder.exists()).willReturn(true);
|
||||
given(folder.isOpen()).willReturn(true);
|
||||
given(folder.search((SearchTerm) Mockito.any())).willReturn(new Message[] { });
|
||||
given(folder.search(Mockito.any())).willReturn(new Message[] { });
|
||||
given(store.getFolder(Mockito.any(URLName.class))).willReturn(folder);
|
||||
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
|
||||
|
||||
@@ -823,6 +829,8 @@ public class ImapMailReceiverTests {
|
||||
exec = TestUtils.getPropertyValue(adapter, "sendingTaskExecutor", ExecutorService.class);
|
||||
adapter.stop();
|
||||
assertTrue(exec.isShutdown());
|
||||
|
||||
taskScheduler.shutdown();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -836,7 +844,7 @@ public class ImapMailReceiverTests {
|
||||
|
||||
private boolean firstDone;
|
||||
|
||||
TestReceiver() {
|
||||
private TestReceiver() {
|
||||
setSearchTermStrategy(searchTermStrategy);
|
||||
}
|
||||
|
||||
@@ -848,7 +856,7 @@ public class ImapMailReceiverTests {
|
||||
given(folder.getMessages())
|
||||
.willReturn(!this.firstDone ? messages1 : messages2);
|
||||
}
|
||||
catch (MessagingException e) {
|
||||
catch (MessagingException ignored) {
|
||||
}
|
||||
return folder;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2014-2017 the original author or authors.
|
||||
* Copyright 2014-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -41,6 +41,7 @@ import org.springframework.util.Base64Utils;
|
||||
* the pertinent data so it can be verified by a test case.
|
||||
*
|
||||
* @author Gary Russell
|
||||
* @author Artem Bilan
|
||||
*
|
||||
* @since 5.0
|
||||
*
|
||||
@@ -76,7 +77,7 @@ public class TestMailServer {
|
||||
|
||||
public static class SmtpServer extends MailServer {
|
||||
|
||||
public SmtpServer(int port) throws IOException {
|
||||
SmtpServer(int port) throws IOException {
|
||||
super(port);
|
||||
}
|
||||
|
||||
@@ -85,9 +86,9 @@ public class TestMailServer {
|
||||
return new SmtpHandler(socket);
|
||||
}
|
||||
|
||||
public class SmtpHandler extends MailHandler {
|
||||
class SmtpHandler extends MailHandler {
|
||||
|
||||
public SmtpHandler(Socket socket) {
|
||||
SmtpHandler(Socket socket) {
|
||||
super(socket);
|
||||
}
|
||||
|
||||
@@ -154,7 +155,7 @@ public class TestMailServer {
|
||||
|
||||
public static class Pop3Server extends MailServer {
|
||||
|
||||
public Pop3Server(int port) throws IOException {
|
||||
Pop3Server(int port) throws IOException {
|
||||
super(port);
|
||||
}
|
||||
|
||||
@@ -163,9 +164,9 @@ public class TestMailServer {
|
||||
return new Pop3Handler(socket);
|
||||
}
|
||||
|
||||
public class Pop3Handler extends MailHandler {
|
||||
class Pop3Handler extends MailHandler {
|
||||
|
||||
public Pop3Handler(Socket socket) {
|
||||
Pop3Handler(Socket socket) {
|
||||
super(socket);
|
||||
}
|
||||
|
||||
@@ -218,7 +219,7 @@ public class TestMailServer {
|
||||
|
||||
private boolean idled;
|
||||
|
||||
public ImapServer(int port) throws IOException {
|
||||
ImapServer(int port) throws IOException {
|
||||
super(port);
|
||||
}
|
||||
|
||||
@@ -234,9 +235,9 @@ public class TestMailServer {
|
||||
return new ImapHandler(socket);
|
||||
}
|
||||
|
||||
public class ImapHandler extends MailHandler {
|
||||
class ImapHandler extends MailHandler {
|
||||
|
||||
public ImapHandler(Socket socket) {
|
||||
ImapHandler(Socket socket) {
|
||||
super(socket);
|
||||
}
|
||||
|
||||
@@ -347,7 +348,7 @@ public class TestMailServer {
|
||||
idleTag = tag;
|
||||
if (!idled) {
|
||||
try {
|
||||
Thread.sleep(3000);
|
||||
Thread.sleep(1000);
|
||||
write("* 2 EXISTS");
|
||||
seen = false;
|
||||
}
|
||||
@@ -371,7 +372,7 @@ public class TestMailServer {
|
||||
}
|
||||
}
|
||||
|
||||
public void searchReply(String tag) throws IOException {
|
||||
void searchReply(String tag) throws IOException {
|
||||
if (seen) {
|
||||
write("* SEARCH");
|
||||
}
|
||||
@@ -391,13 +392,13 @@ public class TestMailServer {
|
||||
|
||||
private final ExecutorService exec = Executors.newCachedThreadPool();
|
||||
|
||||
protected final Set<String> assertions = new HashSet<String>();
|
||||
protected final Set<String> assertions = new HashSet<>();
|
||||
|
||||
protected final List<String> messages = new ArrayList<String>();
|
||||
protected final List<String> messages = new ArrayList<>();
|
||||
|
||||
private volatile boolean listening;
|
||||
|
||||
public MailServer(int port) throws IOException {
|
||||
MailServer(int port) throws IOException {
|
||||
this.socket = ServerSocketFactory.getDefault().createServerSocket(port);
|
||||
this.listening = true;
|
||||
exec.execute(this);
|
||||
@@ -464,11 +465,11 @@ public class TestMailServer {
|
||||
|
||||
private BufferedWriter writer;
|
||||
|
||||
protected StringBuilder sb = new StringBuilder();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
protected BufferedReader reader;
|
||||
|
||||
public MailHandler(Socket socket) {
|
||||
MailHandler(Socket socket) {
|
||||
this.socket = socket;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user