Skip to content

Commit 33aaaba

Browse files
committed
Some ImapMailReceiverTests improvements
* Increase reconnectTimeout to avoid race conditions * Do not stub `protected` methods * Rearrange properties settings before spying on object
1 parent e9cee2e commit 33aaaba

File tree

2 files changed

+53
-49
lines changed

2 files changed

+53
-49
lines changed

spring-integration-mail/src/test/java/org/springframework/integration/mail/ImapMailReceiverTests.java

+52-48
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import jakarta.mail.search.AndTerm;
5656
import jakarta.mail.search.FlagTerm;
5757
import jakarta.mail.search.FromTerm;
58+
import jakarta.mail.search.SearchTerm;
5859
import org.junit.jupiter.api.AfterAll;
5960
import org.junit.jupiter.api.AfterEach;
6061
import org.junit.jupiter.api.BeforeAll;
@@ -219,7 +220,7 @@ public void testIdleWithServerGuts(ImapMailReceiver receiver, boolean mapped, bo
219220
QueueChannel channel = new QueueChannel();
220221
adapter.setOutputChannel(channel);
221222
adapter.setTaskScheduler(taskScheduler);
222-
adapter.setReconnectDelay(1);
223+
adapter.setReconnectDelay(10);
223224
adapter.afterPropertiesSet();
224225
adapter.start();
225226
MimeMessage message =
@@ -299,6 +300,7 @@ private AbstractMailReceiver receiveAndMarkAsReadDontDeleteGuts(AbstractMailRece
299300
folderField.setAccessible(true);
300301
Folder folder = mock(Folder.class);
301302
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
303+
given(folder.isOpen()).willReturn(true);
302304
folderField.set(receiver, folder);
303305

304306
final Message[] messages = new Message[] {msg1, msg2};
@@ -313,7 +315,7 @@ private AbstractMailReceiver receiveAndMarkAsReadDontDeleteGuts(AbstractMailRece
313315
return null;
314316
}).given(receiver).openFolder();
315317

316-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
318+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
317319

318320
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
319321
receiver.receive();
@@ -409,6 +411,7 @@ public void receiveMarkAsReadAndDelete() throws Exception {
409411
folderField.setAccessible(true);
410412
Folder folder = mock(Folder.class);
411413
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
414+
given(folder.isOpen()).willReturn(true);
412415
folderField.set(receiver, folder);
413416

414417
Message msg1 = GreenMailUtil.newMimeMessage("test1");
@@ -423,7 +426,7 @@ public void receiveMarkAsReadAndDelete() throws Exception {
423426
return null;
424427
}).given(receiver).openFolder();
425428

426-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
429+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
427430

428431
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
429432
receiver.receive();
@@ -446,6 +449,7 @@ public void receiveAndDontMarkAsRead() throws Exception {
446449
folderField.setAccessible(true);
447450
Folder folder = mock(Folder.class);
448451
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
452+
given(folder.isOpen()).willReturn(true);
449453
folderField.set(receiver, folder);
450454

451455

@@ -454,7 +458,7 @@ public void receiveAndDontMarkAsRead() throws Exception {
454458
final Message[] messages = new Message[] {msg1, msg2};
455459
willAnswer(invocation -> null).given(receiver).openFolder();
456460

457-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
461+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
458462

459463
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
460464
receiver.afterPropertiesSet();
@@ -476,6 +480,7 @@ public void receiveAndDontMarkAsReadButDelete() throws Exception {
476480
folderField.setAccessible(true);
477481
Folder folder = mock(Folder.class);
478482
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
483+
given(folder.isOpen()).willReturn(true);
479484
folderField.set(receiver, folder);
480485

481486
Message msg1 = GreenMailUtil.newMimeMessage("test1");
@@ -490,7 +495,7 @@ public void receiveAndDontMarkAsReadButDelete() throws Exception {
490495
return null;
491496
}).given(receiver).openFolder();
492497

493-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
498+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
494499

495500
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
496501
receiver.afterPropertiesSet();
@@ -513,6 +518,7 @@ public void receiveAndIgnoreMarkAsReadDontDelete() throws Exception {
513518
folderField.setAccessible(true);
514519
Folder folder = mock(Folder.class);
515520
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
521+
given(folder.isOpen()).willReturn(true);
516522
folderField.set(receiver, folder);
517523

518524
Message msg1 = GreenMailUtil.newMimeMessage("test1");
@@ -527,7 +533,7 @@ public void receiveAndIgnoreMarkAsReadDontDelete() throws Exception {
527533
return null;
528534
}).given(receiver).openFolder();
529535

530-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
536+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
531537

532538
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
533539
receiver.receive();
@@ -539,7 +545,7 @@ public void receiveAndIgnoreMarkAsReadDontDelete() throws Exception {
539545
@Test
540546
public void testMessageHistory() throws Exception {
541547
ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
542-
adapter.setReconnectDelay(1);
548+
adapter.setReconnectDelay(10);
543549

544550
AbstractMailReceiver receiver = new ImapMailReceiver();
545551
receiver = spy(receiver);
@@ -552,16 +558,18 @@ public void testMessageHistory() throws Exception {
552558
Message mailMessage = GreenMailUtil.newMimeMessage("test1");
553559
final Message[] messages = new Message[] {mailMessage};
554560

561+
IMAPFolder folder = mock(IMAPFolder.class);
562+
given(folder.isOpen()).willReturn(true);
563+
given(folder.hasNewMessages()).willReturn(true);
564+
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
565+
555566
willAnswer(invocation -> {
556567
DirectFieldAccessor accessor = new DirectFieldAccessor((invocation.getMock()));
557-
IMAPFolder folder = mock(IMAPFolder.class);
558568
accessor.setPropertyValue("folder", folder);
559-
given(folder.isOpen()).willReturn(true);
560-
given(folder.hasNewMessages()).willReturn(true);
561569
return null;
562570
}).given(receiver).openFolder();
563571

564-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
572+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
565573

566574
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
567575

@@ -595,32 +603,33 @@ protected Object handleRequestMessage(org.springframework.messaging.Message<?> r
595603
adapter.setOutputChannel(channel);
596604
QueueChannel errorChannel = new QueueChannel();
597605
adapter.setErrorChannel(errorChannel);
598-
adapter.setReconnectDelay(1);
606+
adapter.setReconnectDelay(10);
599607

600608
AbstractMailReceiver receiver = new ImapMailReceiver();
601-
receiver = spy(receiver);
602609
receiver.setBeanFactory(mock(BeanFactory.class));
603610
receiver.afterPropertiesSet();
604611

605612
Field folderField = AbstractMailReceiver.class.getDeclaredField("folder");
606613
folderField.setAccessible(true);
607614
Folder folder = mock(IMAPFolder.class);
608615
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
616+
given(folder.isOpen()).willReturn(true);
617+
given(folder.exists()).willReturn(true);
609618
folderField.set(receiver, folder);
610619

611-
willAnswer(invocation -> true).given(folder).isOpen();
612-
613-
willAnswer(invocation -> null).given(receiver).openFolder();
620+
Field storeField = AbstractMailReceiver.class.getDeclaredField("store");
621+
storeField.setAccessible(true);
622+
Store store = mock(Store.class);
623+
given(store.isConnected()).willReturn(true);
624+
storeField.set(receiver, store);
614625

615626
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
616627
adapterAccessor.setPropertyValue("mailReceiver", receiver);
617628

618629
Message mailMessage = GreenMailUtil.newMimeMessage("test1");
619630
Message[] messages = new Message[] {mailMessage};
620631

621-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
622-
623-
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
632+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
624633

625634
adapter.start();
626635
org.springframework.messaging.Message<?> replMessage = errorChannel.receive(10000);
@@ -636,29 +645,28 @@ public void testNoInitialIdleDelayWhenRecentNotSupported() throws Exception {
636645

637646
QueueChannel channel = new QueueChannel();
638647
adapter.setOutputChannel(channel);
639-
adapter.setReconnectDelay(1);
648+
adapter.setReconnectDelay(10);
640649

641650
ImapMailReceiver receiver = new ImapMailReceiver("imap:foo");
642-
receiver = spy(receiver);
643-
receiver.setBeanFactory(mock(BeanFactory.class));
644-
receiver.afterPropertiesSet();
651+
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
652+
setUpScheduler(receiver, taskScheduler);
645653

646654
final IMAPFolder folder = mock(IMAPFolder.class);
647655
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
648656
given(folder.isOpen()).willReturn(false).willReturn(true);
649657
given(folder.exists()).willReturn(true);
650658

651-
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
652-
adapterAccessor.setPropertyValue("mailReceiver", receiver);
653-
654659
Field storeField = AbstractMailReceiver.class.getDeclaredField("store");
655660
storeField.setAccessible(true);
656661
Store store = mock(Store.class);
657662
given(store.isConnected()).willReturn(true);
658663
given(store.getFolder(Mockito.any(URLName.class))).willReturn(folder);
659664
storeField.set(receiver, store);
660665

661-
willAnswer(invocation -> folder).given(receiver).getFolder();
666+
receiver.afterPropertiesSet();
667+
668+
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
669+
adapterAccessor.setPropertyValue("mailReceiver", receiver);
662670

663671
Message mailMessage = GreenMailUtil.newMimeMessage("test1");
664672
final Message[] messages = new Message[] {mailMessage};
@@ -677,9 +685,7 @@ public void testNoInitialIdleDelayWhenRecentNotSupported() throws Exception {
677685
else {
678686
return new Message[0];
679687
}
680-
}).given(receiver).searchForNewMessages();
681-
682-
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
688+
}).given(folder).search(any(SearchTerm.class));
683689

684690
willAnswer(invocation -> {
685691
Thread.sleep(300);
@@ -698,6 +704,7 @@ public void testNoInitialIdleDelayWhenRecentNotSupported() throws Exception {
698704
assertThat(channel.receive(100)).isNull();
699705
assertThat(channel.receive(10000)).isNotNull();
700706
adapter.stop();
707+
taskScheduler.shutdown();
701708
}
702709

703710
@Test
@@ -706,40 +713,36 @@ public void testInitialIdleDelayWhenRecentIsSupported() throws Exception {
706713

707714
QueueChannel channel = new QueueChannel();
708715
adapter.setOutputChannel(channel);
709-
adapter.setReconnectDelay(1);
716+
adapter.setReconnectDelay(100);
710717
adapter.afterPropertiesSet();
711718

712719
ImapMailReceiver receiver = new ImapMailReceiver("imap:foo");
713-
receiver.setCancelIdleInterval(1);
714-
receiver = spy(receiver);
715-
receiver.setBeanFactory(mock(BeanFactory.class));
716-
receiver.afterPropertiesSet();
717-
718-
final IMAPFolder folder = mock(IMAPFolder.class);
720+
receiver.setCancelIdleInterval(10);
721+
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
722+
setUpScheduler(receiver, taskScheduler);
723+
IMAPFolder folder = mock(IMAPFolder.class);
719724
given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.RECENT));
720725
given(folder.isOpen()).willReturn(false).willReturn(true);
721726
given(folder.exists()).willReturn(true);
722727

723-
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
724-
adapterAccessor.setPropertyValue("mailReceiver", receiver);
725-
726728
Field storeField = AbstractMailReceiver.class.getDeclaredField("store");
727729
storeField.setAccessible(true);
728730
Store store = mock(Store.class);
729731
given(store.isConnected()).willReturn(true);
730732
given(store.getFolder(Mockito.any(URLName.class))).willReturn(folder);
731733
storeField.set(receiver, store);
732734

733-
willAnswer(invocation -> folder).given(receiver).getFolder();
735+
receiver.afterPropertiesSet();
734736

735-
Message mailMessage = GreenMailUtil.newMimeMessage("test1");
736-
final Message[] messages = new Message[] {mailMessage};
737+
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
738+
adapterAccessor.setPropertyValue("mailReceiver", receiver);
737739

738-
willAnswer(invocation -> messages).given(receiver).searchForNewMessages();
740+
Message mailMessage = GreenMailUtil.newMimeMessage("test1");
741+
Message[] messages = new Message[] {mailMessage};
739742

740-
willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
743+
willAnswer(invocation -> messages).given(folder).search(any(SearchTerm.class));
741744

742-
final CountDownLatch idles = new CountDownLatch(2);
745+
CountDownLatch idles = new CountDownLatch(2);
743746
willAnswer(invocation -> {
744747
idles.countDown();
745748
Thread.sleep(500);
@@ -756,6 +759,7 @@ public void testInitialIdleDelayWhenRecentIsSupported() throws Exception {
756759
assertThat(channel.receive(20000)).isNotNull();
757760
assertThat(idles.await(10, TimeUnit.SECONDS)).isTrue();
758761
adapter.stop();
762+
taskScheduler.shutdown();
759763
}
760764

761765
@Test
@@ -771,7 +775,7 @@ public void testConnectionException() throws Exception {
771775
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
772776
taskScheduler.initialize();
773777
adapter.setTaskScheduler(taskScheduler);
774-
adapter.setReconnectDelay(1);
778+
adapter.setReconnectDelay(10);
775779
adapter.start();
776780
assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue();
777781
assertThat(theEvent.get().toString())
@@ -957,7 +961,7 @@ public void testIdleReconnects() throws Exception {
957961
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
958962
taskScheduler.initialize();
959963
adapter.setTaskScheduler(taskScheduler);
960-
adapter.setReconnectDelay(1);
964+
adapter.setReconnectDelay(10);
961965
adapter.afterPropertiesSet();
962966
final CountDownLatch latch = new CountDownLatch(3);
963967
adapter.setApplicationEventPublisher(e -> latch.countDown());

spring-integration-mail/src/test/resources/log4j2-test.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<Loggers>
99
<Logger name="org.springframework.integration" level="warn"/>
1010
<Logger name="org.springframework.integration.mail" level="warn"/>
11-
<Logger name="com.icegreen.greenmail" level="debug"/>
11+
<Logger name="com.icegreen.greenmail" level="warn"/>
1212
<Logger name="com.sun.mail" level="warn"/>
1313
<Root level="warn">
1414
<AppenderRef ref="STDOUT" />

0 commit comments

Comments
 (0)