Skip to content

Commit ecb9ac3

Browse files
committed
Fix flaky TcpNioConnectionTests.testCleanup()
1 parent e3a06e3 commit ecb9ac3

File tree

1 file changed

+20
-30
lines changed

1 file changed

+20
-30
lines changed

spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/connection/TcpNioConnectionTests.java

+20-30
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
2222
import static org.awaitility.Awaitility.with;
2323
import static org.mockito.ArgumentMatchers.any;
2424
import static org.mockito.ArgumentMatchers.contains;
25+
import static org.mockito.BDDMockito.willReturn;
2526
import static org.mockito.Mockito.doAnswer;
2627
import static org.mockito.Mockito.doReturn;
2728
import static org.mockito.Mockito.mock;
@@ -31,7 +32,6 @@
3132
import java.io.ByteArrayOutputStream;
3233
import java.io.IOException;
3334
import java.io.InputStream;
34-
import java.lang.reflect.Field;
3535
import java.lang.reflect.Method;
3636
import java.net.ConnectException;
3737
import java.net.ServerSocket;
@@ -91,7 +91,6 @@
9191
import org.springframework.messaging.MessagingException;
9292
import org.springframework.messaging.support.ErrorMessage;
9393
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
94-
import org.springframework.util.ReflectionUtils;
9594
import org.springframework.util.StopWatch;
9695

9796

@@ -248,10 +247,9 @@ public void testMemoryLeak(TestInfo testInfo) throws Exception {
248247
@Test
249248
@DisabledIfEnvironmentVariable(named = "bamboo_buildKey", matches = ".*?",
250249
disabledReason = "Timing is too short for CI")
251-
public void testCleanup() throws Exception {
250+
public void testCleanup() {
252251
TcpNioClientConnectionFactory factory = new TcpNioClientConnectionFactory("localhost", 0);
253252
factory.setApplicationEventPublisher(nullPublisher);
254-
factory.setNioHarvestInterval(100);
255253
Map<SocketChannel, TcpNioConnection> connections = new HashMap<>();
256254
SocketChannel chan1 = mock(SocketChannel.class);
257255
SocketChannel chan2 = mock(SocketChannel.class);
@@ -262,49 +260,41 @@ public void testCleanup() throws Exception {
262260
connections.put(chan1, conn1);
263261
connections.put(chan2, conn2);
264262
connections.put(chan3, conn3);
265-
boolean java8 = System.getProperty("java.version").startsWith("1.8");
266-
final List<Field> fields = new ArrayList<>();
267-
if (java8) {
268-
ReflectionUtils.doWithFields(SocketChannel.class, field -> {
269-
field.setAccessible(true);
270-
fields.add(field);
271-
}, field -> field.getName().equals("open"));
272-
}
273-
else {
274-
ReflectionUtils.doWithFields(SocketChannel.class, field -> {
275-
field.setAccessible(true);
276-
fields.add(field);
277-
}, field -> field.getName().equals("closed"));
278-
}
279-
Field field = fields.get(0);
280-
// Can't use Mockito because isOpen() is final
281-
ReflectionUtils.setField(field, chan1, java8);
282-
ReflectionUtils.setField(field, chan2, java8);
283-
ReflectionUtils.setField(field, chan3, java8);
263+
willReturn(true).given(chan1).isOpen();
264+
willReturn(true).given(chan2).isOpen();
265+
willReturn(true).given(chan3).isOpen();
284266
Selector selector = mock(Selector.class);
285267
HashSet<SelectionKey> keys = new HashSet<>();
286268
when(selector.selectedKeys()).thenReturn(keys);
287269
factory.processNioSelections(1, selector, null, connections);
288270
assertThat(connections.size()).isEqualTo(3); // all open
289271

290-
ReflectionUtils.setField(field, chan1, !java8);
272+
DirectFieldAccessor factoryFieldAccessor = new DirectFieldAccessor(factory);
273+
274+
willReturn(false).given(chan1).isOpen();
291275
factory.processNioSelections(1, selector, null, connections);
292276
assertThat(connections.size()).isEqualTo(3); // interval didn't pass
293-
Thread.sleep(110);
277+
278+
factoryFieldAccessor.setPropertyValue("nextCheckForClosedNioConnections", System.currentTimeMillis() - 10);
279+
294280
factory.processNioSelections(1, selector, null, connections);
295281
assertThat(connections.size()).isEqualTo(2); // first is closed
296282

297-
ReflectionUtils.setField(field, chan2, !java8);
283+
willReturn(false).given(chan2).isOpen();
298284
factory.processNioSelections(1, selector, null, connections);
299285
assertThat(connections.size()).isEqualTo(2); // interval didn't pass
300-
Thread.sleep(110);
286+
287+
factoryFieldAccessor.setPropertyValue("nextCheckForClosedNioConnections", System.currentTimeMillis() - 10);
288+
301289
factory.processNioSelections(1, selector, null, connections);
302290
assertThat(connections.size()).isEqualTo(1); // second is closed
303291

304-
ReflectionUtils.setField(field, chan3, !java8);
292+
willReturn(false).given(chan3).isOpen();
305293
factory.processNioSelections(1, selector, null, connections);
306294
assertThat(connections.size()).isEqualTo(1); // interval didn't pass
307-
Thread.sleep(110);
295+
296+
factoryFieldAccessor.setPropertyValue("nextCheckForClosedNioConnections", System.currentTimeMillis() - 10);
297+
308298
factory.processNioSelections(1, selector, null, connections);
309299
assertThat(connections.size()).isEqualTo(0); // third is closed
310300

0 commit comments

Comments
 (0)