From 612ae341ae79f4add050d114ce3ef9c2d379ca6f Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Fri, 18 Oct 2019 09:00:51 -0400 Subject: [PATCH] TCP: Fix race in test - since the deserializer is no longer volatile, we can't change it in the test - move the "old behavior" test for the raw deserializer to a new test --- .../tcp/serializer/DeserializationTests.java | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/serializer/DeserializationTests.java b/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/serializer/DeserializationTests.java index ab9d7b9106..57e46d1793 100644 --- a/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/serializer/DeserializationTests.java +++ b/spring-integration-ip/src/test/java/org/springframework/integration/ip/tcp/serializer/DeserializationTests.java @@ -418,21 +418,59 @@ public class DeserializationTests { assertThat(new String((byte[]) message.getPayload())).isEqualTo("Test"); String shortReply = reply.substring(0, reply.length() - 1); ((MessageChannel) message.getHeaders().getReplyChannel()).send(new GenericMessage(shortReply)); - message = outputChannel.receive(6000); + message = outputChannel.receive(1000); assertThat(message).isNull(); + } + + @Test + public void testTimeoutWithRawDeserializerEofIsTerminator() throws Exception { + ByteArrayRawSerializer serializer = new ByteArrayRawSerializer(); + TcpNioServerConnectionFactory serverNio = new TcpNioServerConnectionFactory(0); + ByteArrayLengthHeaderSerializer lengthHeaderSerializer = new ByteArrayLengthHeaderSerializer(1); + serverNio.setDeserializer(lengthHeaderSerializer); + serverNio.setSerializer(serializer); + serverNio.afterPropertiesSet(); + TcpInboundGateway in = new TcpInboundGateway(); + in.setConnectionFactory(serverNio); + QueueChannel serverSideChannel = new QueueChannel(); + in.setRequestChannel(serverSideChannel); + in.setBeanFactory(mock(BeanFactory.class)); + in.afterPropertiesSet(); + in.start(); + TestingUtilities.waitListening(serverNio, null); + TcpNioClientConnectionFactory clientNio = new TcpNioClientConnectionFactory("localhost", serverNio.getPort()); + clientNio.setSerializer(serializer); + clientNio.setDeserializer(new ByteArrayRawSerializer(true)); + clientNio.setSoTimeout(1000); + clientNio.afterPropertiesSet(); + final TcpOutboundGateway out = new TcpOutboundGateway(); + out.setConnectionFactory(clientNio); + QueueChannel outputChannel = new QueueChannel(); + out.setOutputChannel(outputChannel); + out.setRemoteTimeout(60000); + out.setBeanFactory(mock(BeanFactory.class)); + out.afterPropertiesSet(); + out.start(); + Runnable command = () -> { + try { + out.handleMessage(MessageBuilder.withPayload("\u0004Test").build()); + } + catch (Exception e) { + // eat SocketTimeoutException. Doesn't matter for this test + } + }; + Executor exec = new SimpleAsyncTaskExecutor(); + + Message message; - // good message should be received - if ((deserializer instanceof ByteArrayRawSerializer)) { // restore old behavior - clientNio.setDeserializer(new ByteArrayRawSerializer(true)); - } exec.execute(command); message = serverSideChannel.receive(10000); assertThat(message).isNotNull(); assertThat(new String((byte[]) message.getPayload())).isEqualTo("Test"); - ((MessageChannel) message.getHeaders().getReplyChannel()).send(new GenericMessage(reply)); + ((MessageChannel) message.getHeaders().getReplyChannel()).send(new GenericMessage("reply")); message = outputChannel.receive(10000); assertThat(message).isNotNull(); - assertThat(new String(((byte[]) message.getPayload()))).isEqualTo(reply); + assertThat(new String(((byte[]) message.getPayload()))).isEqualTo("reply"); } private static class CustomDeserializer extends AbstractByteArraySerializer {