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:
Artem Bilan
2018-12-05 19:18:56 -05:00
committed by Gary Russell
parent 29b4a296be
commit 992c0ce6a7
4 changed files with 111 additions and 94 deletions

View File

@@ -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);
}
}
}

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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;
}