Support Java 14 (#3310)
* Support Java 14 * Provide changes to avoid deprecated Java API and have a compatibility back to Java 8 * Change affected test classes to JUnit 5 whenever it is possible * Ignore/Disable some TCP/IP tests which don't pass on Java 14 * Fix (some) TCP tests on JRE 14 * Fix SSL Handshake test - client side handshake is successful with java 14 - change the badClient cert to a badServer cert to force an error on the client side Co-authored-by: artembilan <raven666> Co-authored-by: Gary Russell <grussell@pivotal.io>
This commit is contained in:
@@ -301,6 +301,7 @@ public class TcpNioSSLConnection extends TcpNioConnection {
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
logger.trace("Resuming for close");
|
||||
this.semaphore.release();
|
||||
}
|
||||
|
||||
@@ -364,6 +365,9 @@ public class TcpNioSSLConnection extends TcpNioConnection {
|
||||
TcpNioSSLConnection.this.semaphore.drainPermits();
|
||||
HandshakeStatus status = TcpNioSSLConnection.this.sslEngine.getHandshakeStatus();
|
||||
while (status != HandshakeStatus.FINISHED) {
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("Handshake Status: " + status);
|
||||
}
|
||||
writeEncodedIfAny();
|
||||
status = runTasksIfNeeded(result);
|
||||
if (status == HandshakeStatus.NEED_UNWRAP) {
|
||||
@@ -383,6 +387,9 @@ public class TcpNioSSLConnection extends TcpNioConnection {
|
||||
logger.debug(status);
|
||||
}
|
||||
}
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("Handshake Status: " + status);
|
||||
}
|
||||
}
|
||||
|
||||
private void writeEncodedIfAny() throws IOException {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 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.
|
||||
@@ -20,6 +20,7 @@ import java.io.IOException;
|
||||
import java.net.DatagramSocket;
|
||||
import java.net.InetAddress;
|
||||
import java.net.MulticastSocket;
|
||||
import java.net.NetworkInterface;
|
||||
|
||||
import org.springframework.messaging.MessagingException;
|
||||
|
||||
@@ -29,6 +30,8 @@ import org.springframework.messaging.MessagingException;
|
||||
*
|
||||
* @author Gary Russell
|
||||
* @author Marcin Pilaczynski
|
||||
* @author Artem Bilan
|
||||
*
|
||||
* @since 2.0
|
||||
*/
|
||||
public class MulticastReceivingChannelAdapter extends UnicastReceivingChannelAdapter {
|
||||
@@ -68,8 +71,7 @@ public class MulticastReceivingChannelAdapter extends UnicastReceivingChannelAda
|
||||
MulticastSocket socket = port == 0 ? new MulticastSocket() : new MulticastSocket(port);
|
||||
String localAddress = this.getLocalAddress();
|
||||
if (localAddress != null) {
|
||||
InetAddress whichNic = InetAddress.getByName(localAddress);
|
||||
socket.setInterface(whichNic);
|
||||
socket.setNetworkInterface(NetworkInterface.getByName(localAddress));
|
||||
}
|
||||
setSocketAttributes(socket);
|
||||
socket.joinGroup(InetAddress.getByName(this.group));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2001-2019 the original author or authors.
|
||||
* Copyright 2001-2020 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.
|
||||
@@ -21,6 +21,7 @@ import java.net.DatagramSocket;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.MulticastSocket;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.URISyntaxException;
|
||||
|
||||
import org.springframework.expression.Expression;
|
||||
@@ -35,6 +36,8 @@ import org.springframework.messaging.Message;
|
||||
* acknowledgments are required to determine success.
|
||||
*
|
||||
* @author Gary Russell
|
||||
* @author Artem Bilan
|
||||
*
|
||||
* @since 2.0
|
||||
*/
|
||||
public class MulticastSendingMessageHandler extends UnicastSendingMessageHandler {
|
||||
@@ -79,6 +82,7 @@ public class MulticastSendingMessageHandler extends UnicastSendingMessageHandler
|
||||
*/
|
||||
public MulticastSendingMessageHandler(String address, int port,
|
||||
boolean acknowledge, String ackHost, int ackPort, int ackTimeout) {
|
||||
|
||||
super(address, port, acknowledge, ackHost, ackPort, ackTimeout);
|
||||
}
|
||||
|
||||
@@ -96,6 +100,7 @@ public class MulticastSendingMessageHandler extends UnicastSendingMessageHandler
|
||||
public MulticastSendingMessageHandler(String address, int port,
|
||||
boolean lengthCheck, boolean acknowledge, String ackHost,
|
||||
int ackPort, int ackTimeout) {
|
||||
|
||||
super(address, port, lengthCheck, acknowledge, ackHost, ackPort, ackTimeout);
|
||||
}
|
||||
|
||||
@@ -134,8 +139,8 @@ public class MulticastSendingMessageHandler extends UnicastSendingMessageHandler
|
||||
private void createSocket() throws IOException {
|
||||
if (getTheSocket() == null) {
|
||||
MulticastSocket socket;
|
||||
if (this.isAcknowledge()) {
|
||||
int ackPort = this.getAckPort();
|
||||
if (isAcknowledge()) {
|
||||
int ackPort = getAckPort();
|
||||
if (this.localAddress == null) {
|
||||
socket = ackPort == 0 ? new MulticastSocket() : new MulticastSocket(ackPort);
|
||||
}
|
||||
@@ -143,8 +148,9 @@ public class MulticastSendingMessageHandler extends UnicastSendingMessageHandler
|
||||
InetAddress whichNic = InetAddress.getByName(this.localAddress);
|
||||
socket = new MulticastSocket(new InetSocketAddress(whichNic, ackPort));
|
||||
}
|
||||
if (getSoReceiveBufferSize() > 0) {
|
||||
socket.setReceiveBufferSize(this.getSoReceiveBufferSize());
|
||||
int soReceiveBufferSize = getSoReceiveBufferSize();
|
||||
if (soReceiveBufferSize > 0) {
|
||||
socket.setReceiveBufferSize(soReceiveBufferSize);
|
||||
}
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Listening for acks on port: " + socket.getLocalPort());
|
||||
@@ -161,8 +167,7 @@ public class MulticastSendingMessageHandler extends UnicastSendingMessageHandler
|
||||
}
|
||||
setSocketAttributes(socket);
|
||||
if (this.localAddress != null) {
|
||||
InetAddress whichNic = InetAddress.getByName(this.localAddress);
|
||||
socket.setInterface(whichNic);
|
||||
socket.setNetworkInterface(NetworkInterface.getByName(this.localAddress));
|
||||
}
|
||||
this.multicastSocket = socket;
|
||||
}
|
||||
@@ -194,7 +199,7 @@ public class MulticastSendingMessageHandler extends UnicastSendingMessageHandler
|
||||
protected void convertAndSend(Message<?> message) throws IOException, URISyntaxException {
|
||||
super.convertAndSend(message);
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Sent packet to " + this.multicastSocket.getInterface());
|
||||
logger.debug("Sent packet to " + this.multicastSocket.getNetworkInterface());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,8 +51,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.invocation.InvocationOnMock;
|
||||
@@ -62,7 +61,6 @@ import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.context.ApplicationEvent;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.core.task.SimpleAsyncTaskExecutor;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
@@ -82,8 +80,7 @@ import org.springframework.messaging.SubscribableChannel;
|
||||
import org.springframework.messaging.support.ErrorMessage;
|
||||
import org.springframework.messaging.support.GenericMessage;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
@@ -92,8 +89,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
* @since 2.2
|
||||
*
|
||||
*/
|
||||
@ContextConfiguration
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@SpringJUnitConfig
|
||||
@DirtiesContext
|
||||
public class CachingClientConnectionFactoryTests {
|
||||
|
||||
@@ -183,14 +179,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
when(factory.isRunning()).thenReturn(true);
|
||||
TcpConnectionSupport mockConn1 = makeMockConnection("conn1");
|
||||
TcpConnectionSupport mockConn2 = makeMockConnection("conn2");
|
||||
doAnswer(new Answer<Object>() {
|
||||
|
||||
@Override
|
||||
public Object answer(InvocationOnMock invocation) throws Throwable {
|
||||
return null;
|
||||
}
|
||||
|
||||
}).when(mockConn1).close();
|
||||
doAnswer(invocation -> null).when(mockConn1).close();
|
||||
when(factory.getConnection()).thenReturn(mockConn1)
|
||||
.thenReturn(mockConn2).thenReturn(mockConn1)
|
||||
.thenReturn(mockConn2);
|
||||
@@ -213,7 +202,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
conn2a.close();
|
||||
}
|
||||
|
||||
@Test(expected = PoolItemNotAvailableException.class)
|
||||
@Test
|
||||
public void testLimit() throws Exception {
|
||||
AbstractClientConnectionFactory factory = mock(AbstractClientConnectionFactory.class);
|
||||
when(factory.isRunning()).thenReturn(true);
|
||||
@@ -230,7 +219,8 @@ public class CachingClientConnectionFactoryTests {
|
||||
assertThat(conn1.toString()).isEqualTo("Cached:" + mockConn1.toString());
|
||||
TcpConnection conn2 = cachingFactory.getConnection();
|
||||
assertThat(conn2.toString()).isEqualTo("Cached:" + mockConn2.toString());
|
||||
cachingFactory.getConnection();
|
||||
assertThatExceptionOfType(PoolItemNotAvailableException.class)
|
||||
.isThrownBy(cachingFactory::getConnection);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -253,14 +243,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
TcpConnection conn2 = cachingFactory.getConnection();
|
||||
assertThat(conn2.toString()).isEqualTo("Cached:" + mockConn2.toString());
|
||||
cachingFactory.stop();
|
||||
Answer<Object> answer = new Answer<Object>() {
|
||||
|
||||
@Override
|
||||
public Object answer(InvocationOnMock invocation) throws Throwable {
|
||||
return null;
|
||||
}
|
||||
|
||||
};
|
||||
Answer<Object> answer = invocation -> null;
|
||||
doAnswer(answer).when(mockConn1).close();
|
||||
doAnswer(answer).when(mockConn2).close();
|
||||
when(factory.isRunning()).thenReturn(false);
|
||||
@@ -368,15 +351,16 @@ public class CachingClientConnectionFactoryTests {
|
||||
CachingClientConnectionFactory cccf) throws Exception {
|
||||
TcpConnection cached1 = cccf.getConnection();
|
||||
assertThatExceptionOfType(MessagingException.class)
|
||||
.isThrownBy(() -> cached1.send(new GenericMessage<String>("foo")));
|
||||
.isThrownBy(() -> cached1.send(new GenericMessage<>("foo")));
|
||||
// Before INT-3163 this failed with a timeout - connection not returned to pool after failure on send()
|
||||
TcpConnection cached2 = cccf.getConnection();
|
||||
assertThat(cached1.getConnectionId().contains(conn1.getConnectionId())).isTrue();
|
||||
assertThat(cached2.getConnectionId().contains(conn2.getConnectionId())).isTrue();
|
||||
}
|
||||
|
||||
private CachingClientConnectionFactory createCCCFWith2Connections(TcpConnectionSupport conn1, TcpConnectionSupport conn2)
|
||||
throws Exception {
|
||||
private CachingClientConnectionFactory createCCCFWith2Connections(TcpConnectionSupport conn1,
|
||||
TcpConnectionSupport conn2) throws Exception {
|
||||
|
||||
AbstractClientConnectionFactory factory = mock(AbstractClientConnectionFactory.class);
|
||||
when(factory.isRunning()).thenReturn(true);
|
||||
when(factory.getConnection()).thenReturn(conn1, conn2);
|
||||
@@ -392,17 +376,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
OutputStream stream = mock(OutputStream.class);
|
||||
doThrow(new IOException("Foo")).when(stream).write(any(byte[].class), anyInt(), anyInt());
|
||||
when(socket.getOutputStream()).thenReturn(stream);
|
||||
TcpNetConnection conn = new TcpNetConnection(socket, false, false, new ApplicationEventPublisher() {
|
||||
|
||||
@Override
|
||||
public void publishEvent(ApplicationEvent event) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void publishEvent(Object event) {
|
||||
|
||||
}
|
||||
|
||||
TcpNetConnection conn = new TcpNetConnection(socket, false, false, event -> {
|
||||
}, "foo");
|
||||
conn.setMapper(new TcpMessageMapper());
|
||||
conn.setSerializer(new ByteArrayCrLfSerializer());
|
||||
@@ -411,20 +385,15 @@ public class CachingClientConnectionFactoryTests {
|
||||
|
||||
private TcpConnectionSupport mockedTcpNioConnection() throws Exception {
|
||||
SocketChannel socketChannel = mock(SocketChannel.class);
|
||||
new DirectFieldAccessor(socketChannel).setPropertyValue("open", false);
|
||||
if (System.getProperty("java.version").startsWith("1.8")) {
|
||||
new DirectFieldAccessor(socketChannel).setPropertyValue("open", false);
|
||||
}
|
||||
else {
|
||||
new DirectFieldAccessor(socketChannel).setPropertyValue("closed", true);
|
||||
}
|
||||
doThrow(new IOException("Foo")).when(socketChannel).write(Mockito.any(ByteBuffer.class));
|
||||
when(socketChannel.socket()).thenReturn(mock(Socket.class));
|
||||
TcpNioConnection conn = new TcpNioConnection(socketChannel, false, false, new ApplicationEventPublisher() {
|
||||
|
||||
@Override
|
||||
public void publishEvent(ApplicationEvent event) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void publishEvent(Object event) {
|
||||
|
||||
}
|
||||
|
||||
TcpNioConnection conn = new TcpNioConnection(socketChannel, false, false, event -> {
|
||||
}, "foo");
|
||||
conn.setMapper(new TcpMessageMapper());
|
||||
conn.setSerializer(new ByteArrayCrLfSerializer());
|
||||
@@ -447,7 +416,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void integrationTest() throws Exception {
|
||||
public void integrationTest() {
|
||||
TestingUtilities.waitListening(serverCf, null);
|
||||
new DirectFieldAccessor(this.clientAdapterCf).setPropertyValue("port", this.serverCf.getPort());
|
||||
|
||||
@@ -466,7 +435,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
@Test
|
||||
// @Repeat(1000) // INT-3722
|
||||
public void gatewayIntegrationTest() throws Exception {
|
||||
final List<String> connectionIds = new ArrayList<String>();
|
||||
final List<String> connectionIds = new ArrayList<>();
|
||||
final AtomicBoolean okToRun = new AtomicBoolean(true);
|
||||
ExecutorService exec = Executors.newSingleThreadExecutor();
|
||||
exec.execute(() -> {
|
||||
@@ -494,7 +463,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
await().atMost(Duration.ofSeconds(10)).until(() -> connections.size() > 0);
|
||||
|
||||
// assert we use the same connection from the pool
|
||||
toGateway.send(new GenericMessage<String>("Hello, world2!"));
|
||||
toGateway.send(new GenericMessage<>("Hello, world2!"));
|
||||
m = fromGateway.receive(1000);
|
||||
assertThat(m).isNotNull();
|
||||
assertThat(new String((byte[]) m.getPayload())).isEqualTo("foo:" + "Hello, world2!");
|
||||
@@ -533,7 +502,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
// Failover
|
||||
AbstractClientConnectionFactory factory1 = mock(AbstractClientConnectionFactory.class);
|
||||
AbstractClientConnectionFactory factory2 = mock(AbstractClientConnectionFactory.class);
|
||||
List<AbstractClientConnectionFactory> factories = new ArrayList<AbstractClientConnectionFactory>();
|
||||
List<AbstractClientConnectionFactory> factories = new ArrayList<>();
|
||||
factories.add(factory1);
|
||||
factories.add(factory2);
|
||||
TcpConnectionSupport mockConn1 = makeMockConnection();
|
||||
@@ -551,7 +520,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
CachingClientConnectionFactory cachingFactory = new CachingClientConnectionFactory(failoverFactory, 2);
|
||||
cachingFactory.start();
|
||||
TcpConnection conn1 = cachingFactory.getConnection();
|
||||
GenericMessage<String> message = new GenericMessage<String>("foo");
|
||||
GenericMessage<String> message = new GenericMessage<>("foo");
|
||||
conn1 = cachingFactory.getConnection();
|
||||
conn1.send(message);
|
||||
Mockito.verify(mockConn2).send(message);
|
||||
@@ -586,7 +555,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
AbstractClientConnectionFactory factory2 = new TcpNetClientConnectionFactory("localhost", port2);
|
||||
factory2.setBeanName("client2");
|
||||
factory2.registerListener(message -> false);
|
||||
List<AbstractClientConnectionFactory> factories = new ArrayList<AbstractClientConnectionFactory>();
|
||||
List<AbstractClientConnectionFactory> factories = new ArrayList<>();
|
||||
factories.add(factory1);
|
||||
factories.add(factory2);
|
||||
FailoverClientConnectionFactory failoverFactory = new FailoverClientConnectionFactory(factories);
|
||||
@@ -595,7 +564,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
CachingClientConnectionFactory cachingFactory = new CachingClientConnectionFactory(failoverFactory, 2);
|
||||
cachingFactory.start();
|
||||
TcpConnection conn1 = cachingFactory.getConnection();
|
||||
GenericMessage<String> message = new GenericMessage<String>("foo");
|
||||
GenericMessage<String> message = new GenericMessage<>("foo");
|
||||
conn1.send(message);
|
||||
conn1.close();
|
||||
TcpConnection conn2 = cachingFactory.getConnection();
|
||||
@@ -653,7 +622,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
AbstractClientConnectionFactory factory2 = new TcpNetClientConnectionFactory("localhost", port2);
|
||||
factory2.setBeanName("client2");
|
||||
factory2.registerListener(message -> false);
|
||||
List<AbstractClientConnectionFactory> factories = new ArrayList<AbstractClientConnectionFactory>();
|
||||
List<AbstractClientConnectionFactory> factories = new ArrayList<>();
|
||||
factories.add(factory1);
|
||||
factories.add(factory2);
|
||||
FailoverClientConnectionFactory failoverFactory = new FailoverClientConnectionFactory(factories);
|
||||
@@ -662,7 +631,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
CachingClientConnectionFactory cachingFactory = new CachingClientConnectionFactory(failoverFactory, 2);
|
||||
cachingFactory.start();
|
||||
TcpConnection conn1 = cachingFactory.getConnection();
|
||||
GenericMessage<String> message = new GenericMessage<String>("foo");
|
||||
GenericMessage<String> message = new GenericMessage<>("foo");
|
||||
conn1.send(message);
|
||||
conn1.close();
|
||||
TcpConnection conn2 = cachingFactory.getConnection();
|
||||
@@ -686,7 +655,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
TcpNetServerConnectionFactory in = new TcpNetServerConnectionFactory(0);
|
||||
final CountDownLatch latch1 = new CountDownLatch(2);
|
||||
final CountDownLatch latch2 = new CountDownLatch(102);
|
||||
final List<String> connectionIds = new ArrayList<String>();
|
||||
final List<String> connectionIds = new ArrayList<>();
|
||||
in.registerListener(message -> {
|
||||
connectionIds.add((String) message.getHeaders().get(IpHeaders.CONNECTION_ID));
|
||||
latch1.countDown();
|
||||
@@ -702,16 +671,16 @@ public class CachingClientConnectionFactoryTests {
|
||||
cache.setConnectionWaitTimeout(100);
|
||||
cache.start();
|
||||
TcpConnectionSupport connection1 = cache.getConnection();
|
||||
connection1.send(new GenericMessage<String>("foo"));
|
||||
connection1.send(new GenericMessage<>("foo"));
|
||||
connection1.close();
|
||||
TcpConnectionSupport connection2 = cache.getConnection();
|
||||
connection2.send(new GenericMessage<String>("foo"));
|
||||
connection2.send(new GenericMessage<>("foo"));
|
||||
connection2.close();
|
||||
assertThat(latch1.await(10, TimeUnit.SECONDS)).isTrue();
|
||||
assertThat(connectionIds.get(1)).isSameAs(connectionIds.get(0));
|
||||
for (int i = 0; i < 100; i++) {
|
||||
TcpConnectionSupport connection = cache.getConnection();
|
||||
connection.send(new GenericMessage<String>("foo"));
|
||||
connection.send(new GenericMessage<>("foo"));
|
||||
connection.close();
|
||||
}
|
||||
assertThat(latch2.await(10, TimeUnit.SECONDS)).isTrue();
|
||||
@@ -722,7 +691,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test //INT-3722
|
||||
public void testGatewayRelease() throws Exception {
|
||||
public void testGatewayRelease() {
|
||||
TcpNetServerConnectionFactory in = new TcpNetServerConnectionFactory(0);
|
||||
in.setApplicationEventPublisher(mock(ApplicationEventPublisher.class));
|
||||
final TcpSendingMessageHandler handler = new TcpSendingMessageHandler();
|
||||
@@ -780,7 +749,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
}
|
||||
}).when(logger).debug(anyString());
|
||||
gate.start();
|
||||
gate.handleMessage(new GenericMessage<String>("foo"));
|
||||
gate.handleMessage(new GenericMessage<>("foo"));
|
||||
Message<byte[]> result = (Message<byte[]>) outputChannel.receive(10000);
|
||||
assertThat(result).isNotNull();
|
||||
assertThat(new String(result.getPayload())).isEqualTo("foo");
|
||||
@@ -812,7 +781,7 @@ public class CachingClientConnectionFactoryTests {
|
||||
};
|
||||
factory.setApplicationEventPublisher(mock(ApplicationEventPublisher.class));
|
||||
final CachingClientConnectionFactory cachingFactory = new CachingClientConnectionFactory(factory, 1);
|
||||
final AtomicReference<Message<?>> received = new AtomicReference<Message<?>>();
|
||||
final AtomicReference<Message<?>> received = new AtomicReference<>();
|
||||
cachingFactory.registerListener(message -> {
|
||||
if (!(message instanceof ErrorMessage)) {
|
||||
received.set(message);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 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.
|
||||
@@ -49,7 +49,7 @@ import javax.net.SocketFactory;
|
||||
import javax.net.ssl.SSLEngine;
|
||||
import javax.net.ssl.SSLServerSocket;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import org.springframework.integration.ip.tcp.serializer.ByteArrayCrLfSerializer;
|
||||
@@ -520,14 +520,14 @@ public class SocketSupportTests {
|
||||
testNioClientAndServerSSLDifferentContexts(false);
|
||||
assertThatExceptionOfType(MessagingException.class)
|
||||
.isThrownBy(() -> testNioClientAndServerSSLDifferentContexts(true))
|
||||
.withMessageMatching(".*(Socket closed during SSL Handshake|Broken pipe"
|
||||
+ "|Connection reset by peer|AsynchronousCloseException|ClosedChannelException).*");
|
||||
.withMessageMatching(".*javax.net.ssl.SSLHandshakeException.*");
|
||||
}
|
||||
|
||||
private void testNioClientAndServerSSLDifferentContexts(boolean badClient) throws Exception {
|
||||
private void testNioClientAndServerSSLDifferentContexts(boolean badServer) throws Exception {
|
||||
System.setProperty("javax.net.debug", "all"); // SSL activity in the console
|
||||
TcpNioServerConnectionFactory server = new TcpNioServerConnectionFactory(0);
|
||||
TcpSSLContextSupport serverSslContextSupport = new DefaultTcpSSLContextSupport("server.ks",
|
||||
TcpSSLContextSupport serverSslContextSupport = new DefaultTcpSSLContextSupport(
|
||||
badServer ? "client.ks" : "server.ks",
|
||||
"server.truststore.ks", "secret", "secret");
|
||||
DefaultTcpNioSSLConnectionSupport tcpNioConnectionSupport =
|
||||
new DefaultTcpNioSSLConnectionSupport(serverSslContextSupport, false) {
|
||||
@@ -550,8 +550,7 @@ public class SocketSupportTests {
|
||||
TestingUtilities.waitListening(server, null);
|
||||
|
||||
TcpNioClientConnectionFactory client = new TcpNioClientConnectionFactory("localhost", server.getPort());
|
||||
TcpSSLContextSupport clientSslContextSupport = new DefaultTcpSSLContextSupport(
|
||||
badClient ? "server.ks" : "client.ks",
|
||||
TcpSSLContextSupport clientSslContextSupport = new DefaultTcpSSLContextSupport("client.ks",
|
||||
"client.truststore.ks", "secret", "secret");
|
||||
DefaultTcpNioSSLConnectionSupport clientTcpNioConnectionSupport =
|
||||
new DefaultTcpNioSSLConnectionSupport(clientSslContextSupport, false);
|
||||
|
||||
@@ -63,10 +63,9 @@ import javax.net.SocketFactory;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.TestName;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestInfo;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.invocation.InvocationOnMock;
|
||||
import org.mockito.stubbing.Answer;
|
||||
@@ -84,7 +83,7 @@ import org.springframework.integration.ip.tcp.serializer.MapJsonSerializer;
|
||||
import org.springframework.integration.ip.util.TestingUtilities;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.integration.support.converter.MapMessageConverter;
|
||||
import org.springframework.integration.test.rule.Log4j2LevelAdjuster;
|
||||
import org.springframework.integration.test.condition.LogLevels;
|
||||
import org.springframework.integration.test.util.TestUtils;
|
||||
import org.springframework.integration.util.CompositeExecutor;
|
||||
import org.springframework.messaging.Message;
|
||||
@@ -103,31 +102,25 @@ import org.springframework.util.StopWatch;
|
||||
* @since 2.0
|
||||
*
|
||||
*/
|
||||
@LogLevels(level = "trace", categories = "org.springframework.integration.ip.tcp")
|
||||
public class TcpNioConnectionTests {
|
||||
|
||||
private static final Log logger = LogFactory.getLog(TcpNioConnectionTests.class);
|
||||
|
||||
@Rule
|
||||
public Log4j2LevelAdjuster adjuster =
|
||||
Log4j2LevelAdjuster.trace()
|
||||
.categories("org.springframework.integration.ip.tcp");
|
||||
|
||||
@Rule
|
||||
public TestName testName = new TestName();
|
||||
|
||||
private final ApplicationEventPublisher nullPublisher = mock(ApplicationEventPublisher.class);
|
||||
|
||||
private final AsyncTaskExecutor executor = new SimpleAsyncTaskExecutor();
|
||||
|
||||
@Test
|
||||
public void testWriteTimeout() throws Exception {
|
||||
public void testWriteTimeout(TestInfo testInfo) throws Exception {
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
final CountDownLatch done = new CountDownLatch(1);
|
||||
final AtomicReference<ServerSocket> serverSocket = new AtomicReference<>();
|
||||
this.executor.execute(() -> {
|
||||
try {
|
||||
ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(0);
|
||||
logger.debug(testName.getMethodName() + " starting server for " + server.getLocalPort());
|
||||
logger.debug(testInfo.getTestMethod().get().getName() +
|
||||
" starting server for " + server.getLocalPort());
|
||||
serverSocket.set(server);
|
||||
latch.countDown();
|
||||
Socket s = server.accept();
|
||||
@@ -166,14 +159,15 @@ public class TcpNioConnectionTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReadTimeout() throws Exception {
|
||||
public void testReadTimeout(TestInfo testInfo) throws Exception {
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
final CountDownLatch done = new CountDownLatch(1);
|
||||
final AtomicReference<ServerSocket> serverSocket = new AtomicReference<>();
|
||||
this.executor.execute(() -> {
|
||||
try {
|
||||
ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(0);
|
||||
logger.debug(testName.getMethodName() + " starting server for " + server.getLocalPort());
|
||||
logger.debug(testInfo.getTestMethod().get().getName()
|
||||
+ " starting server for " + server.getLocalPort());
|
||||
serverSocket.set(server);
|
||||
latch.countDown();
|
||||
Socket socket = server.accept();
|
||||
@@ -209,13 +203,14 @@ public class TcpNioConnectionTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMemoryLeak() throws Exception {
|
||||
public void testMemoryLeak(TestInfo testInfo) throws Exception {
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
final AtomicReference<ServerSocket> serverSocket = new AtomicReference<>();
|
||||
this.executor.execute(() -> {
|
||||
try {
|
||||
ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(0);
|
||||
logger.debug(testName.getMethodName() + " starting server for " + server.getLocalPort());
|
||||
logger.debug(testInfo.getTestMethod().get().getName()
|
||||
+ " starting server for " + server.getLocalPort());
|
||||
serverSocket.set(server);
|
||||
latch.countDown();
|
||||
Socket socket = server.accept();
|
||||
@@ -264,37 +259,46 @@ public class TcpNioConnectionTests {
|
||||
connections.put(chan1, conn1);
|
||||
connections.put(chan2, conn2);
|
||||
connections.put(chan3, conn3);
|
||||
boolean java8 = System.getProperty("java.version").startsWith("1.8");
|
||||
final List<Field> fields = new ArrayList<>();
|
||||
ReflectionUtils.doWithFields(SocketChannel.class, field -> {
|
||||
field.setAccessible(true);
|
||||
fields.add(field);
|
||||
}, field -> field.getName().equals("open"));
|
||||
if (java8) {
|
||||
ReflectionUtils.doWithFields(SocketChannel.class, field -> {
|
||||
field.setAccessible(true);
|
||||
fields.add(field);
|
||||
}, field -> field.getName().equals("open"));
|
||||
}
|
||||
else {
|
||||
ReflectionUtils.doWithFields(SocketChannel.class, field -> {
|
||||
field.setAccessible(true);
|
||||
fields.add(field);
|
||||
}, field -> field.getName().equals("closed"));
|
||||
}
|
||||
Field field = fields.get(0);
|
||||
// Can't use Mockito because isOpen() is final
|
||||
ReflectionUtils.setField(field, chan1, true);
|
||||
ReflectionUtils.setField(field, chan2, true);
|
||||
ReflectionUtils.setField(field, chan3, true);
|
||||
ReflectionUtils.setField(field, chan1, java8);
|
||||
ReflectionUtils.setField(field, chan2, java8);
|
||||
ReflectionUtils.setField(field, chan3, java8);
|
||||
Selector selector = mock(Selector.class);
|
||||
HashSet<SelectionKey> keys = new HashSet<>();
|
||||
when(selector.selectedKeys()).thenReturn(keys);
|
||||
factory.processNioSelections(1, selector, null, connections);
|
||||
assertThat(connections.size()).isEqualTo(3); // all open
|
||||
|
||||
ReflectionUtils.setField(field, chan1, false);
|
||||
ReflectionUtils.setField(field, chan1, !java8);
|
||||
factory.processNioSelections(1, selector, null, connections);
|
||||
assertThat(connections.size()).isEqualTo(3); // interval didn't pass
|
||||
Thread.sleep(110);
|
||||
factory.processNioSelections(1, selector, null, connections);
|
||||
assertThat(connections.size()).isEqualTo(2); // first is closed
|
||||
|
||||
ReflectionUtils.setField(field, chan2, false);
|
||||
ReflectionUtils.setField(field, chan2, !java8);
|
||||
factory.processNioSelections(1, selector, null, connections);
|
||||
assertThat(connections.size()).isEqualTo(2); // interval didn't pass
|
||||
Thread.sleep(110);
|
||||
factory.processNioSelections(1, selector, null, connections);
|
||||
assertThat(connections.size()).isEqualTo(1); // second is closed
|
||||
|
||||
ReflectionUtils.setField(field, chan3, false);
|
||||
ReflectionUtils.setField(field, chan3, !java8);
|
||||
factory.processNioSelections(1, selector, null, connections);
|
||||
assertThat(connections.size()).isEqualTo(1); // interval didn't pass
|
||||
Thread.sleep(110);
|
||||
@@ -812,7 +816,7 @@ public class TcpNioConnectionTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore // Timing is too short for CI/Travis
|
||||
@Disabled("Timing is too short for CI/Travis")
|
||||
public void testNoDelayOnClose() throws Exception {
|
||||
TcpNioServerConnectionFactory cf = new TcpNioServerConnectionFactory(0);
|
||||
final CountDownLatch reading = new CountDownLatch(1);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 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.
|
||||
@@ -24,11 +24,13 @@ import java.net.DatagramSocket;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.MulticastSocket;
|
||||
import java.net.NetworkInterface;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -69,7 +71,7 @@ public class DatagramPacketMulticastSendingHandlerTests {
|
||||
byte[] buffer = new byte[8];
|
||||
DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length);
|
||||
MulticastSocket socket1 = new MulticastSocket(testPort);
|
||||
socket1.setInterface(InetAddress.getByName(multicastRule.getNic()));
|
||||
socket1.setNetworkInterface(multicastRule.getNic());
|
||||
InetAddress group = InetAddress.getByName(multicastAddress);
|
||||
socket1.joinGroup(group);
|
||||
listening.countDown();
|
||||
@@ -94,7 +96,10 @@ public class DatagramPacketMulticastSendingHandlerTests {
|
||||
assertThat(listening.await(10000, TimeUnit.MILLISECONDS)).isTrue();
|
||||
MulticastSendingMessageHandler handler = new MulticastSendingMessageHandler(multicastAddress, testPort);
|
||||
handler.setBeanFactory(mock(BeanFactory.class));
|
||||
handler.setLocalAddress(this.multicastRule.getNic());
|
||||
NetworkInterface nic = this.multicastRule.getNic();
|
||||
if (nic != null) {
|
||||
handler.setLocalAddress(nic.getName());
|
||||
}
|
||||
handler.afterPropertiesSet();
|
||||
handler.handleMessage(MessageBuilder.withPayload(payload).build());
|
||||
assertThat(received.await(10000, TimeUnit.MILLISECONDS)).isTrue();
|
||||
@@ -103,6 +108,7 @@ public class DatagramPacketMulticastSendingHandlerTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("Doesn't work on Java 14")
|
||||
public void verifySendMulticastWithAcks() throws Exception {
|
||||
|
||||
MulticastSocket socket;
|
||||
@@ -125,7 +131,7 @@ public class DatagramPacketMulticastSendingHandlerTests {
|
||||
byte[] buffer = new byte[1000];
|
||||
DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length);
|
||||
MulticastSocket socket1 = new MulticastSocket(testPort);
|
||||
socket1.setInterface(InetAddress.getByName(multicastRule.getNic()));
|
||||
socket1.setNetworkInterface(multicastRule.getNic());
|
||||
socket1.setSoTimeout(8000);
|
||||
InetAddress group = InetAddress.getByName(multicastAddress);
|
||||
socket1.joinGroup(group);
|
||||
@@ -146,7 +152,7 @@ public class DatagramPacketMulticastSendingHandlerTests {
|
||||
Object id = message.getHeaders().get(IpHeaders.ACK_ID);
|
||||
byte[] ack = id.toString().getBytes();
|
||||
DatagramPacket ackPack = new DatagramPacket(ack, ack.length,
|
||||
new InetSocketAddress(multicastRule.getNic(), ackPort.get()));
|
||||
new InetSocketAddress(multicastRule.getNic().getInetAddresses().nextElement(), ackPort.get()));
|
||||
DatagramSocket out = new DatagramSocket();
|
||||
out.send(ackPack);
|
||||
out.close();
|
||||
@@ -164,7 +170,7 @@ public class DatagramPacketMulticastSendingHandlerTests {
|
||||
assertThat(listening.await(10000, TimeUnit.MILLISECONDS)).isTrue();
|
||||
MulticastSendingMessageHandler handler =
|
||||
new MulticastSendingMessageHandler(multicastAddress, testPort, true, true, "localhost", 0, 10000);
|
||||
handler.setLocalAddress(this.multicastRule.getNic());
|
||||
handler.setLocalAddress(this.multicastRule.getNic().getName());
|
||||
handler.setMinAcksForSuccess(2);
|
||||
handler.setBeanFactory(mock(BeanFactory.class));
|
||||
handler.afterPropertiesSet();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015-2019 the original author or authors.
|
||||
* Copyright 2015-2020 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,9 @@
|
||||
|
||||
package org.springframework.integration.ip.udp;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.MulticastSocket;
|
||||
import java.net.NetworkInterface;
|
||||
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.Assume;
|
||||
@@ -26,10 +27,12 @@ import org.junit.runner.Description;
|
||||
import org.junit.runners.model.Statement;
|
||||
|
||||
import org.springframework.integration.ip.util.SocketTestUtils;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* @author Artem Bilan
|
||||
*
|
||||
* @since 4.3
|
||||
*/
|
||||
public class MulticastRule extends TestWatcher {
|
||||
@@ -38,7 +41,8 @@ public class MulticastRule extends TestWatcher {
|
||||
|
||||
private final String group;
|
||||
|
||||
private final String nic;
|
||||
@Nullable
|
||||
private final NetworkInterface nic;
|
||||
|
||||
private boolean skip;
|
||||
|
||||
@@ -58,19 +62,20 @@ public class MulticastRule extends TestWatcher {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
if (this.nic != null) {
|
||||
System.setProperty("multicast.local.address", this.nic);
|
||||
System.setProperty("multicast.local.address", this.nic.getName());
|
||||
}
|
||||
}
|
||||
|
||||
private String checkMulticast() throws Exception {
|
||||
String nic = SocketTestUtils.chooseANic(true);
|
||||
if (nic == null) { // no multicast support
|
||||
@Nullable
|
||||
private NetworkInterface checkMulticast() throws Exception {
|
||||
NetworkInterface nic = SocketTestUtils.chooseANic(true);
|
||||
if (nic == null) { // no multicast support
|
||||
this.skip = true;
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
MulticastSocket socket = new MulticastSocket();
|
||||
socket.joinGroup(InetAddress.getByName(this.group));
|
||||
socket.joinGroup(new InetSocketAddress(this.group, 161), nic);
|
||||
socket.close();
|
||||
}
|
||||
catch (Exception e) {
|
||||
@@ -84,25 +89,18 @@ public class MulticastRule extends TestWatcher {
|
||||
return group;
|
||||
}
|
||||
|
||||
public String getNic() {
|
||||
@Nullable
|
||||
public NetworkInterface getNic() {
|
||||
return nic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Statement apply(Statement base, Description description) {
|
||||
if (this.skip) {
|
||||
LogFactory.getLog(this.getClass()).info("No Multicast support; test skipped");
|
||||
return new Statement() {
|
||||
|
||||
@Override
|
||||
public void evaluate() throws Throwable {
|
||||
Assume.assumeTrue(false);
|
||||
}
|
||||
};
|
||||
}
|
||||
else {
|
||||
return super.apply(base, description);
|
||||
LogFactory.getLog(getClass()).info("No Multicast support; test skipped");
|
||||
}
|
||||
Assume.assumeFalse(this.skip);
|
||||
return super.apply(base, description);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2020 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.
|
||||
@@ -23,8 +23,8 @@ import static org.mockito.Mockito.mock;
|
||||
import java.io.IOException;
|
||||
import java.net.DatagramPacket;
|
||||
import java.net.DatagramSocket;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@@ -34,6 +34,8 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.condition.EnabledOnJre;
|
||||
import org.junit.jupiter.api.condition.JRE;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
@@ -244,13 +246,16 @@ public class UdpChannelAdapterTests {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
@EnabledOnJre(JRE.JAVA_8)
|
||||
public void testMulticastReceiver() throws Exception {
|
||||
QueueChannel channel = new QueueChannel(2);
|
||||
MulticastReceivingChannelAdapter adapter =
|
||||
new MulticastReceivingChannelAdapter(this.multicastRule.getGroup(), 0);
|
||||
adapter.setOutputChannel(channel);
|
||||
String nic = this.multicastRule.getNic();
|
||||
adapter.setLocalAddress(nic);
|
||||
NetworkInterface nic = this.multicastRule.getNic();
|
||||
if (nic != null) {
|
||||
adapter.setLocalAddress(nic.getName());
|
||||
}
|
||||
adapter.start();
|
||||
SocketTestUtils.waitListening(adapter);
|
||||
int port = adapter.getPort();
|
||||
@@ -259,7 +264,7 @@ public class UdpChannelAdapterTests {
|
||||
DatagramPacketMessageMapper mapper = new DatagramPacketMessageMapper();
|
||||
DatagramPacket packet = mapper.fromMessage(message);
|
||||
packet.setSocketAddress(new InetSocketAddress(this.multicastRule.getGroup(), port));
|
||||
DatagramSocket datagramSocket = new DatagramSocket(0, Inet4Address.getByName(nic));
|
||||
DatagramSocket datagramSocket = new DatagramSocket(0, nic.getInetAddresses().nextElement());
|
||||
datagramSocket.send(packet);
|
||||
datagramSocket.close();
|
||||
|
||||
@@ -271,19 +276,23 @@ public class UdpChannelAdapterTests {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testMulticastSender() throws Exception {
|
||||
public void testMulticastSender() {
|
||||
QueueChannel channel = new QueueChannel(2);
|
||||
UnicastReceivingChannelAdapter adapter =
|
||||
new MulticastReceivingChannelAdapter(this.multicastRule.getGroup(), 0);
|
||||
adapter.setOutputChannel(channel);
|
||||
String nic = this.multicastRule.getNic();
|
||||
adapter.setLocalAddress(nic);
|
||||
NetworkInterface nic = this.multicastRule.getNic();
|
||||
if (nic != null) {
|
||||
adapter.setLocalAddress(nic.getName());
|
||||
}
|
||||
adapter.start();
|
||||
SocketTestUtils.waitListening(adapter);
|
||||
|
||||
MulticastSendingMessageHandler handler =
|
||||
new MulticastSendingMessageHandler(this.multicastRule.getGroup(), adapter.getPort());
|
||||
handler.setLocalAddress(nic);
|
||||
if (nic != null) {
|
||||
handler.setLocalAddress(nic.getName());
|
||||
}
|
||||
Message<byte[]> message = MessageBuilder.withPayload("ABCD".getBytes()).build();
|
||||
handler.handleMessage(message);
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ import static org.awaitility.Awaitility.await;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.Socket;
|
||||
@@ -36,6 +35,7 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.integration.ip.AbstractInternetProtocolReceivingChannelAdapter;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
/**
|
||||
* TCP/IP Test utilities.
|
||||
@@ -62,9 +62,7 @@ public class SocketTestUtils {
|
||||
public static CountDownLatch testSendLength(final int port, final CountDownLatch latch) {
|
||||
final CountDownLatch testCompleteLatch = new CountDownLatch(1);
|
||||
Thread thread = new Thread(() -> {
|
||||
Socket socket = null;
|
||||
try {
|
||||
socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
for (int i = 0; i < 2; i++) {
|
||||
byte[] len = new byte[4];
|
||||
ByteBuffer.wrap(len).putInt(TEST_STRING.length() * 2);
|
||||
@@ -84,16 +82,6 @@ public class SocketTestUtils {
|
||||
catch (Exception e1) {
|
||||
logger.error(e1);
|
||||
}
|
||||
finally {
|
||||
if (socket != null) {
|
||||
try {
|
||||
socket.close();
|
||||
}
|
||||
catch (IOException e2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
@@ -106,9 +94,7 @@ public class SocketTestUtils {
|
||||
public static CountDownLatch testSendLengthOverflow(final int port) {
|
||||
final CountDownLatch testCompleteLatch = new CountDownLatch(1);
|
||||
Thread thread = new Thread(() -> {
|
||||
Socket socket = null;
|
||||
try {
|
||||
socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
byte[] len = new byte[4];
|
||||
ByteBuffer.wrap(len).putInt(Integer.MAX_VALUE);
|
||||
socket.getOutputStream().write(len);
|
||||
@@ -118,16 +104,6 @@ public class SocketTestUtils {
|
||||
catch (Exception e1) {
|
||||
logger.error(e1);
|
||||
}
|
||||
finally {
|
||||
if (socket != null) {
|
||||
try {
|
||||
socket.close();
|
||||
}
|
||||
catch (IOException e2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
@@ -191,9 +167,7 @@ public class SocketTestUtils {
|
||||
public static CountDownLatch testSendStxEtx(final int port, final CountDownLatch latch) {
|
||||
final CountDownLatch testCompleteLatch = new CountDownLatch(1);
|
||||
Thread thread = new Thread(() -> {
|
||||
Socket socket = null;
|
||||
try {
|
||||
socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
for (int i = 0; i < 2; i++) {
|
||||
writeByte(outputStream, 0x02, true);
|
||||
@@ -213,16 +187,6 @@ public class SocketTestUtils {
|
||||
catch (Exception e1) {
|
||||
logger.error(e1);
|
||||
}
|
||||
finally {
|
||||
if (socket != null) {
|
||||
try {
|
||||
socket.close();
|
||||
}
|
||||
catch (IOException e2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
@@ -235,9 +199,7 @@ public class SocketTestUtils {
|
||||
public static CountDownLatch testSendStxEtxOverflow(final int port) {
|
||||
final CountDownLatch testCompleteLatch = new CountDownLatch(1);
|
||||
Thread thread = new Thread(() -> {
|
||||
Socket socket = null;
|
||||
try {
|
||||
socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
writeByte(outputStream, 0x02, true);
|
||||
for (int i = 0; i < 1500; i++) {
|
||||
@@ -248,16 +210,6 @@ public class SocketTestUtils {
|
||||
catch (Exception e1) {
|
||||
logger.debug("write failed", e1);
|
||||
}
|
||||
finally {
|
||||
if (socket != null) {
|
||||
try {
|
||||
socket.close();
|
||||
}
|
||||
catch (IOException e2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
@@ -271,9 +223,7 @@ public class SocketTestUtils {
|
||||
public static CountDownLatch testSendCrLf(final int port, final CountDownLatch latch) {
|
||||
final CountDownLatch testCompleteLatch = new CountDownLatch(1);
|
||||
Thread thread = new Thread(() -> {
|
||||
Socket socket = null;
|
||||
try {
|
||||
socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
for (int i = 0; i < 2; i++) {
|
||||
outputStream.write(TEST_STRING.getBytes());
|
||||
@@ -293,16 +243,6 @@ public class SocketTestUtils {
|
||||
catch (Exception e1) {
|
||||
logger.error(e1);
|
||||
}
|
||||
finally {
|
||||
if (socket != null) {
|
||||
try {
|
||||
socket.close();
|
||||
}
|
||||
catch (IOException e2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
@@ -315,8 +255,7 @@ public class SocketTestUtils {
|
||||
*/
|
||||
public static void testSendCrLfSingle(final int port, final CountDownLatch latch) {
|
||||
Thread thread = new Thread(() -> {
|
||||
try {
|
||||
Socket socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
outputStream.write(TEST_STRING.getBytes());
|
||||
outputStream.write(TEST_STRING.getBytes());
|
||||
@@ -325,7 +264,6 @@ public class SocketTestUtils {
|
||||
if (latch != null) {
|
||||
latch.await();
|
||||
}
|
||||
socket.close();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
logger.error(ex);
|
||||
@@ -340,12 +278,10 @@ public class SocketTestUtils {
|
||||
*/
|
||||
public static void testSendRaw(final int port) {
|
||||
Thread thread = new Thread(() -> {
|
||||
try {
|
||||
Socket socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
outputStream.write(TEST_STRING.getBytes());
|
||||
outputStream.write(TEST_STRING.getBytes());
|
||||
socket.close();
|
||||
}
|
||||
catch (Exception ex) {
|
||||
logger.error(ex);
|
||||
@@ -354,16 +290,15 @@ public class SocketTestUtils {
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends two serialized objects over the same socket.
|
||||
* @param port
|
||||
* @param port the port for socket
|
||||
*/
|
||||
public static CountDownLatch testSendSerialized(final int port) {
|
||||
final CountDownLatch testCompleteLatch = new CountDownLatch(1);
|
||||
Thread thread = new Thread(() -> {
|
||||
Socket socket = null;
|
||||
try {
|
||||
socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
|
||||
oos.writeObject(TEST_STRING);
|
||||
@@ -376,16 +311,6 @@ public class SocketTestUtils {
|
||||
catch (Exception e1) {
|
||||
logger.error(e1);
|
||||
}
|
||||
finally {
|
||||
if (socket != null) {
|
||||
try {
|
||||
socket.close();
|
||||
}
|
||||
catch (IOException e2) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
@@ -398,14 +323,12 @@ public class SocketTestUtils {
|
||||
public static CountDownLatch testSendCrLfOverflow(final int port) {
|
||||
final CountDownLatch testCompleteLatch = new CountDownLatch(1);
|
||||
Thread thread = new Thread(() -> {
|
||||
try {
|
||||
Socket socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
try (Socket socket = new Socket(InetAddress.getByName("localhost"), port)) {
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
for (int i = 0; i < 1500; i++) {
|
||||
writeByte(outputStream, 'x', true);
|
||||
}
|
||||
testCompleteLatch.await(10, TimeUnit.SECONDS);
|
||||
socket.close();
|
||||
}
|
||||
catch (Exception e) {
|
||||
|
||||
@@ -427,26 +350,23 @@ public class SocketTestUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static String chooseANic(boolean multicast) throws Exception {
|
||||
@Nullable
|
||||
public static NetworkInterface chooseANic(boolean multicast) throws Exception {
|
||||
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
|
||||
while (interfaces.hasMoreElements()) {
|
||||
NetworkInterface intface = interfaces.nextElement();
|
||||
if (intface.isLoopback() || (multicast && !intface.supportsMulticast())
|
||||
|| intface.getName().contains("vboxnet")) {
|
||||
continue;
|
||||
}
|
||||
for (Enumeration<InetAddress> inetAddr = intface.getInetAddresses(); inetAddr.hasMoreElements(); ) {
|
||||
InetAddress nextElement = inetAddr.nextElement();
|
||||
if (nextElement instanceof Inet4Address) {
|
||||
return nextElement.getHostAddress();
|
||||
}
|
||||
NetworkInterface networkInterface = interfaces.nextElement();
|
||||
if (!networkInterface.isLoopback()
|
||||
&& (!multicast || networkInterface.supportsMulticast())
|
||||
&& !networkInterface.getName().contains("vboxnet")
|
||||
&& networkInterface.getInetAddresses().hasMoreElements()) {
|
||||
return networkInterface;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void waitListening(AbstractInternetProtocolReceivingChannelAdapter adapter) throws Exception {
|
||||
await("Adapter not listening").atMost(Duration.ofSeconds(10)).until(() -> adapter.isListening());
|
||||
public static void waitListening(AbstractInternetProtocolReceivingChannelAdapter adapter) {
|
||||
await("Adapter not listening").atMost(Duration.ofSeconds(10)).until(adapter::isListening);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user