From f759f0bacc7d56df770f204819483e08ef56f1fd Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Tue, 12 May 2020 11:30:45 -0400 Subject: [PATCH] Fix SftpStreamingMessageSourceTests for race It turns out there is some race condition between tests against the same source dir. * Add `DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD` to clean up the application context state after each test method --- .../SftpStreamingMessageSourceTests.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java index 157e295751..b1221471dd 100644 --- a/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java +++ b/spring-integration-sftp/src/test/java/org/springframework/integration/sftp/inbound/SftpStreamingMessageSourceTests.java @@ -26,6 +26,8 @@ import static org.junit.Assert.assertThat; import java.io.InputStream; import java.util.Arrays; import java.util.Comparator; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.junit.Test; import org.junit.runner.RunWith; @@ -43,8 +45,10 @@ import org.springframework.integration.endpoint.SourcePollingChannelAdapter; import org.springframework.integration.file.FileHeaders; import org.springframework.integration.file.filters.AcceptAllFileListFilter; import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.metadata.SimpleMetadataStore; import org.springframework.integration.scheduling.PollerMetadata; import org.springframework.integration.sftp.SftpTestSupport; +import org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter; import org.springframework.integration.sftp.session.SftpFileInfo; import org.springframework.integration.sftp.session.SftpRemoteFileTemplate; import org.springframework.integration.transformer.StreamTransformer; @@ -63,7 +67,7 @@ import com.jcraft.jsch.ChannelSftp.LsEntry; * */ @RunWith(SpringRunner.class) -@DirtiesContext +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) public class SftpStreamingMessageSourceTests extends SftpTestSupport { @Autowired @@ -81,6 +85,9 @@ public class SftpStreamingMessageSourceTests extends SftpTestSupport { @Autowired private ApplicationContext context; + @Autowired + private ConcurrentMap metadataMap; + @SuppressWarnings("unchecked") @Test public void testAllContents() { @@ -111,6 +118,7 @@ public class SftpStreamingMessageSourceTests extends SftpTestSupport { this.adapter.stop(); this.source.setFileInfoJson(false); this.data.purge(null); + this.metadataMap.clear(); this.adapter.start(); received = (Message) this.data.receive(10000); assertNotNull(received); @@ -186,12 +194,20 @@ public class SftpStreamingMessageSourceTests extends SftpTestSupport { return pollerMetadata; } + @Bean + public ConcurrentMap metadataMap() { + return new ConcurrentHashMap<>(); + } + + @Bean @InboundChannelAdapter(channel = "stream", autoStartup = "false") public MessageSource sftpMessageSource() { SftpStreamingMessageSource messageSource = new SftpStreamingMessageSource(template(), Comparator.comparing(LsEntry::getFilename)); - messageSource.setFilter(new AcceptAllFileListFilter<>()); + messageSource.setFilter( + new SftpPersistentAcceptOnceFileListFilter( + new SimpleMetadataStore(metadataMap()), "testStreaming")); messageSource.setRemoteDirectory("sftpSource/"); return messageSource; }