From ed874ea84a933e348e4921970bf1f8a5f70d4e46 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Mon, 21 Dec 2015 11:38:55 -0500 Subject: [PATCH] TCP ConnectionFactoryTests Race Condition Wait for events. --- .../tcp/connection/TcpConnectionSupport.java | 3 +++ .../connection/ConnectionFactoryTests.java | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/connection/TcpConnectionSupport.java b/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/connection/TcpConnectionSupport.java index 27616a65c4..9c86f48882 100644 --- a/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/connection/TcpConnectionSupport.java +++ b/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/connection/TcpConnectionSupport.java @@ -376,6 +376,9 @@ public abstract class TcpConnectionSupport implements TcpConnection { } else { this.applicationEventPublisher.publishEvent(event); + if (logger.isTraceEnabled()) { + logger.trace("Published: " + event); + } } } catch (Exception e) { diff --git a/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/connection/ConnectionFactoryTests.java b/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/connection/ConnectionFactoryTests.java index eb60720cb5..ec499b2790 100644 --- a/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/connection/ConnectionFactoryTests.java +++ b/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/connection/ConnectionFactoryTests.java @@ -43,6 +43,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.invocation.InvocationOnMock; @@ -55,6 +56,7 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.integration.ip.event.IpIntegrationEvent; import org.springframework.integration.ip.tcp.TcpReceivingChannelAdapter; +import org.springframework.integration.test.support.LogAdjustingTestSupport; import org.springframework.integration.test.util.TestUtils; import org.springframework.messaging.Message; import org.springframework.scheduling.TaskScheduler; @@ -66,7 +68,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; * @since 3.0 * */ -public class ConnectionFactoryTests { +public class ConnectionFactoryTests extends LogAdjustingTestSupport { @Test public void testObtainConnectionIdsNet() throws Exception { @@ -83,15 +85,21 @@ public class ConnectionFactoryTests { public void testObtainConnectionIds(AbstractServerConnectionFactory serverFactory) throws Exception { final List events = Collections.synchronizedList(new ArrayList()); + int expectedEvents = serverFactory instanceof TcpNetServerConnectionFactory + ? 7 // Listening, + OPEN, CLOSE, EXCEPTION for each side + : 5; // Listening, + OPEN, CLOSE (but we *might* get exceptions, depending on timing). final CountDownLatch serverListeningLatch = new CountDownLatch(1); + final CountDownLatch eventLatch = new CountDownLatch(expectedEvents); ApplicationEventPublisher publisher = new ApplicationEventPublisher() { @Override public void publishEvent(ApplicationEvent event) { + LogFactory.getLog(this.getClass()).trace("Received: " + event); events.add((IpIntegrationEvent) event); if (event instanceof TcpConnectionServerListeningEvent) { serverListeningLatch.countDown(); } + eventLatch.countDown(); } @Override @@ -153,15 +161,14 @@ public class ConnectionFactoryTests { clients = clientFactory.getOpenConnectionIds(); } assertEquals(0, clients.size()); - int expected = serverFactory instanceof TcpNetServerConnectionFactory ? 7// Listening, OPEN, CLOSE, EXCEPTION for each side - : 5; //Listening, OPEN, CLOSE (but we *might* get exceptions, depending on timing). - assertThat("Expected at least " + expected + " events; got: " + events.size() + " : " + events, - events.size(), greaterThanOrEqualTo(expected)); + assertTrue(eventLatch.await(10, TimeUnit.SECONDS)); + assertThat("Expected at least " + expectedEvents + " events; got: " + events.size() + " : " + events, + events.size(), greaterThanOrEqualTo(expectedEvents)); FooEvent event = new FooEvent(client, "foo"); client.publishEvent(event); - assertThat("Expected at least " + expected + " events; got: " + events.size() + " : " + events, - events.size(), greaterThanOrEqualTo(expected + 1)); + assertThat("Expected at least " + expectedEvents + " events; got: " + events.size() + " : " + events, + events.size(), greaterThanOrEqualTo(expectedEvents + 1)); try { event = new FooEvent(mock(TcpConnectionSupport.class), "foo");