Updated tests to use localhost, and added bind retry in MllpServerResource
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/97ca1684 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/97ca1684 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/97ca1684 Branch: refs/heads/master Commit: 97ca16847ecf6bf7f017931dfdaa6c3bd50cd52b Parents: 8f09e4b Author: Quinn Stevenson <qu...@pronoia-solutions.com> Authored: Wed Jan 27 11:19:42 2016 -0700 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Jan 28 09:11:37 2016 +0100 ---------------------------------------------------------------------- .../mllp/MllpProducerConsumerLoopbackTest.java | 7 +-- ...llpTcpClientProducerAcknowledgementTest.java | 11 ++-- .../mllp/MllpTcpClientProducerTest.java | 4 +- .../MllpTcpServerConsumerBlueprintTest.java | 4 ++ .../MllpTcpServerConsumerConnectionTest.java | 11 ++-- .../junit/rule/mllp/MllpServerResource.java | 63 ++++++++++++++++++-- .../blueprint/mllp-tcp-client-producer-test.xml | 3 +- .../blueprint/mllp-tcp-server-consumer-test.xml | 3 +- 8 files changed, 80 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpProducerConsumerLoopbackTest.java ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpProducerConsumerLoopbackTest.java b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpProducerConsumerLoopbackTest.java index 027de7c..8a392b5 100644 --- a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpProducerConsumerLoopbackTest.java +++ b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpProducerConsumerLoopbackTest.java @@ -37,6 +37,7 @@ import static org.apache.camel.test.mllp.Hl7MessageGenerator.generateMessage; public class MllpProducerConsumerLoopbackTest extends CamelTestSupport { int mllpPort = AvailablePortFinder.getNextAvailable(); + String mllpHost = "localhost"; @EndpointInject(uri = "direct://source") ProducerTemplate source; @@ -65,7 +66,7 @@ public class MllpProducerConsumerLoopbackTest extends CamelTestSupport { String routeId = "mllp-receiver"; public void configure() { - fromF("mllp:%d?autoAck=true", mllpPort) + fromF("mllp://%s:%d?autoAck=true", mllpHost, mllpPort) .convertBodyTo(String.class) .to(acknowledged) .process(new PassthroughProcessor("after send to result")) @@ -77,12 +78,10 @@ public class MllpProducerConsumerLoopbackTest extends CamelTestSupport { builders[1] = new RouteBuilder() { String routeId = "mllp-sender"; - String host = "0.0.0.0"; - public void configure() { from(source.getDefaultEndpoint()).routeId(routeId) .log(LoggingLevel.DEBUG, routeId, "Sending: ${body}") - .toF("mllp://%s:%d", host, mllpPort) + .toF("mllp://%s:%d", mllpHost, mllpPort) .setBody(header(MllpConstants.MLLP_ACKNOWLEDGEMENT)) .toF("log://%s?level=INFO&groupInterval=%d&groupActiveOnly=%b", routeId, groupInterval, groupActiveOnly); } http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerAcknowledgementTest.java ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerAcknowledgementTest.java b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerAcknowledgementTest.java index af41550..38838ae 100644 --- a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerAcknowledgementTest.java +++ b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerAcknowledgementTest.java @@ -35,8 +35,10 @@ import static org.apache.camel.test.mllp.Hl7MessageGenerator.generateMessage; public class MllpTcpClientProducerAcknowledgementTest extends CamelTestSupport { + String mllpHost = "localhost"; + @Rule - public MllpServerResource mllpServer = new MllpServerResource(AvailablePortFinder.getNextAvailable()); + public MllpServerResource mllpServer = new MllpServerResource(mllpHost, AvailablePortFinder.getNextAvailable()); @EndpointInject(uri = "direct://source") ProducerTemplate source; @@ -67,14 +69,11 @@ public class MllpTcpClientProducerAcknowledgementTest extends CamelTestSupport { return new RouteBuilder() { String routeId = "mllp-sender"; - String host = "0.0.0.0"; - int port = mllpServer.getListenPort(); - public void configure() { onException(MllpApplicationRejectAcknowledgementException.class) .handled(true) .to(reject) - .log(LoggingLevel.ERROR, routeId, "AR Acknowledgemnet"); + .log(LoggingLevel.ERROR, routeId, "AR Acknowledgement"); onException(MllpApplicationErrorAcknowledgementException.class) .handled(true) @@ -88,7 +87,7 @@ public class MllpTcpClientProducerAcknowledgementTest extends CamelTestSupport { from(source.getDefaultEndpoint()).routeId(routeId) .log(LoggingLevel.INFO, routeId, "Sending Message") - .toF("mllp://%s:%d", host, port) + .toF("mllp://%s:%d", mllpServer.getListenHost(), mllpServer.getListenPort()) .log(LoggingLevel.INFO, routeId, "Received Acknowledgement") .to(accept); } http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerTest.java b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerTest.java index dc8d594..2dcd40b 100644 --- a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerTest.java +++ b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpClientProducerTest.java @@ -36,7 +36,7 @@ import static org.apache.camel.test.mllp.Hl7MessageGenerator.generateMessage; public class MllpTcpClientProducerTest extends CamelTestSupport { @Rule - public MllpServerResource mllpServer = new MllpServerResource(AvailablePortFinder.getNextAvailable()); + public MllpServerResource mllpServer = new MllpServerResource("localhost", AvailablePortFinder.getNextAvailable()); @EndpointInject(uri = "direct://source") ProducerTemplate source; @@ -94,7 +94,7 @@ public class MllpTcpClientProducerTest extends CamelTestSupport { .routeId("mllp-sender-test-route") .log(LoggingLevel.INFO, "Sending Message: $simple{header[CamelHL7MessageControl]}") .toF("mllp://%s:%d?connectTimeout=%d&receiveTimeout=%d", - "0.0.0.0", mllpServer.getListenPort(), connectTimeout, responseTimeout) + mllpServer.getListenHost(), mllpServer.getListenPort(), connectTimeout, responseTimeout) .to(acknowledged); from("direct://handle-timeout") http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerBlueprintTest.java ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerBlueprintTest.java b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerBlueprintTest.java index c7dd2c9..4cc8110 100644 --- a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerBlueprintTest.java +++ b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerBlueprintTest.java @@ -35,6 +35,8 @@ import org.junit.Test; import static org.apache.camel.test.mllp.Hl7MessageGenerator.generateMessage; public class MllpTcpServerConsumerBlueprintTest extends CamelBlueprintTestSupport { + String mllpHost = "localhost"; + @Rule public MllpClientResource mllpClient = new MllpClientResource(); @@ -59,11 +61,13 @@ public class MllpTcpServerConsumerBlueprintTest extends CamelBlueprintTestSuppor @Override protected Properties useOverridePropertiesWithPropertiesComponent() { + mllpClient.setMllpHost(mllpHost); mllpClient.setMllpPort(AvailablePortFinder.getNextAvailable()); Properties props = new Properties(); props.setProperty("receivedUri", receivedUri); + props.setProperty( "mllp.host", mllpClient.getMllpHost()); props.setProperty("mllp.port", Integer.toString(mllpClient.getMllpPort())); return props; http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerConnectionTest.java ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerConnectionTest.java b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerConnectionTest.java index fab33a5..99667b2 100644 --- a/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerConnectionTest.java +++ b/components/camel-mllp/src/test/java/org/apache/camel/component/mllp/MllpTcpServerConsumerConnectionTest.java @@ -30,7 +30,9 @@ import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; public class MllpTcpServerConsumerConnectionTest extends CamelTestSupport { - int mllpPort; + String mllpHost = "localhost"; + int mllpPort = AvailablePortFinder.getNextAvailable(); + @EndpointInject(uri = "mock://result") MockEndpoint result; @@ -41,11 +43,8 @@ public class MllpTcpServerConsumerConnectionTest extends CamelTestSupport { return new RouteBuilder() { String routeId = "mllp-receiver"; - String host = "0.0.0.0"; - int port = mllpPort; - public void configure() { - fromF("mllp:%d?autoAck=false", port) + fromF("mllp://%s:%d?autoAck=false", mllpHost, mllpPort) .log(LoggingLevel.INFO, routeId, "Receiving: ${body}") .to(result); } @@ -74,7 +73,7 @@ public class MllpTcpServerConsumerConnectionTest extends CamelTestSupport { int connectionCount = 10; Socket dummyLoadBalancerSocket = null; - SocketAddress address = new InetSocketAddress("localhost", mllpPort); + SocketAddress address = new InetSocketAddress(mllpHost, mllpPort); int connectTimeout = 5000; try { for (int i = 1; i <= connectionCount; ++i) { http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/java/org/apache/camel/test/junit/rule/mllp/MllpServerResource.java ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/java/org/apache/camel/test/junit/rule/mllp/MllpServerResource.java b/components/camel-mllp/src/test/java/org/apache/camel/test/junit/rule/mllp/MllpServerResource.java index 8215d1b..dc68fbb 100644 --- a/components/camel-mllp/src/test/java/org/apache/camel/test/junit/rule/mllp/MllpServerResource.java +++ b/components/camel-mllp/src/test/java/org/apache/camel/test/junit/rule/mllp/MllpServerResource.java @@ -19,6 +19,7 @@ package org.apache.camel.test.junit.rule.mllp; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.BindException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; @@ -49,6 +50,7 @@ import static org.apache.camel.component.mllp.MllpEndpoint.START_OF_BLOCK; public class MllpServerResource extends ExternalResource { Logger log = LoggerFactory.getLogger(this.getClass()); + String listenHost; int listenPort; int backlog = 5; @@ -87,6 +89,25 @@ public class MllpServerResource extends ExternalResource { this.backlog = backlog; } + public MllpServerResource(String listenHost, int listenPort) { + this.listenHost = listenHost; + this.listenPort = listenPort; + } + + public MllpServerResource(String listenHost, int listenPort, int backlog) { + this.listenHost = listenHost; + this.listenPort = listenPort; + this.backlog = backlog; + } + + public String getListenHost() { + return listenHost; + } + + public void setListenHost(String listenHost) { + this.listenHost = listenHost; + } + public int getListenPort() { return listenPort; } @@ -105,10 +126,18 @@ public class MllpServerResource extends ExternalResource { public void startup() throws IOException { this.active = true; - serverSocketThread = new ServerSocketThread(listenPort, backlog); + + if ( null != listenHost ) { + serverSocketThread = new ServerSocketThread(listenHost, listenPort, backlog); + } else { + serverSocketThread = new ServerSocketThread(listenPort, backlog); + listenHost = serverSocketThread.getListenHost(); + } + if (0 >= listenPort) { listenPort = serverSocketThread.listenPort; } + serverSocketThread.setDaemon(true); serverSocketThread.start(); } @@ -456,10 +485,14 @@ public class MllpServerResource extends ExternalResource { class ServerSocketThread extends Thread { Logger log = LoggerFactory.getLogger(this.getClass()); + final long bindTimeout = 30000; + final long bindRetryDelay = 1000; + + ServerSocket serverSocket; List<ClientSocketThread> clientSocketThreads = new LinkedList<>(); - String listenHost = "0.0.0.0"; + String listenHost; int listenPort; int backlog = 5; @@ -500,12 +533,30 @@ public class MllpServerResource extends ExternalResource { // Set TCP Parameters serverSocket.setSoTimeout(acceptTimeout); - serverSocket.setReuseAddress(false); + serverSocket.setReuseAddress(true); - if (0 >= listenPort) { - serverSocket.bind(null, backlog); + InetSocketAddress listenAddress; + if ( null != this.listenHost ) { + listenAddress = new InetSocketAddress(this.listenHost, this.listenPort); } else { - serverSocket.bind(new InetSocketAddress(this.listenHost, this.listenPort), backlog); + listenAddress = new InetSocketAddress( this.listenPort ); + } + + long startTicks = System.currentTimeMillis(); + while (!serverSocket.isBound()) { + try { + serverSocket.bind(listenAddress, backlog); + } catch ( BindException bindEx ) { + if ( System.currentTimeMillis() < startTicks + bindTimeout) { + log.warn( "Unable to bind to {} - retrying in {} milliseconds", listenAddress.toString(), bindRetryDelay); + try { + Thread.sleep(bindRetryDelay); + } catch (InterruptedException interruptedEx) { + log.error( "Wait for bind retry was interrupted - rethrowing BindException"); + throw bindEx; + } + } + } } if (0 >= this.listenPort) { http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-client-producer-test.xml ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-client-producer-test.xml b/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-client-producer-test.xml index 627ed03..261d62f 100644 --- a/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-client-producer-test.xml +++ b/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-client-producer-test.xml @@ -32,6 +32,7 @@ <property name="frameErrorUri" value="mock://frame-ex" /> <property name="errorAcknowledgementUri" value="mock://ae-ack" /> <property name="rejectAcknowledgementUri" value="mock://ar-ack" /> + <property name="mllp.host" value="localhost" /> <property name="mllp.port" value="7777" /> </default-properties> </property-placeholder> @@ -104,7 +105,7 @@ <route id="direct-to-mllp"> <from uri="{{sourceUri}}" /> <log loggingLevel="DEBUG" message="sending message: $simple{header[CamelMllpMessageControlId]}" /> - <to uri="mllp://{{mllp.port}}"/> + <to uri="mllp://{{mllp.host}}:{{mllp.port}}"/> <to uri="{{acknowledgedUri}}"/> <log loggingLevel="DEBUG" message="message sent: $simple{header[CamelMllpMessageControlId]}" /> <to uri="log:direct-to-mllp?level=INFO&groupSize=50" /> http://git-wip-us.apache.org/repos/asf/camel/blob/97ca1684/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-server-consumer-test.xml ---------------------------------------------------------------------- diff --git a/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-server-consumer-test.xml b/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-server-consumer-test.xml index f90ef63..dda70da 100644 --- a/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-server-consumer-test.xml +++ b/components/camel-mllp/src/test/resources/OSGI-INF/blueprint/mllp-tcp-server-consumer-test.xml @@ -27,6 +27,7 @@ <property-placeholder persistent-id="MllpTcpServerConsumerBlueprintTest" update-strategy="reload" xmlns="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" > <default-properties> <property name="receivedUri" value="mock://received" /> + <property name="mllp.host" value="localhost" /> <property name="mllp.port" value="7777" /> </default-properties> </property-placeholder> @@ -36,7 +37,7 @@ <camelContext id="tcp-server-consumer-context" useMDCLogging="true" xmlns="http://camel.apache.org/schema/blueprint"> <!-- TODO: Add exception handlers --> <route> - <from uri="mllp://{{mllp.port}}" /> + <from uri="mllp://{{mllp.host}}:{{mllp.port}}" /> <to uri="{{receivedUri}}" /> </route> </camelContext>