http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpClientOptionsTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpClientOptionsTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpClientOptionsTest.java new file mode 100644 index 0000000..387cdeb --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpClientOptionsTest.java @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpEndpoint; +import org.apache.camel.component.http.HttpProducer; +import org.eclipse.jetty.client.HttpClient; +import org.junit.Test; + +/** + * Unit test for http client options. + */ +public class JettyHttpClientOptionsTest extends BaseJettyTest { + + @Test + public void testCustomHttpBinding() throws Exception { + // assert jetty was configured with our timeout + HttpEndpoint jettyEndpoint = context.getEndpoint("http://localhost:{{port}}/myapp/myservice?httpClient.soTimeout=5555", HttpEndpoint.class); + assertNotNull("Jetty endpoint should not be null ", jettyEndpoint); + HttpProducer producer = (HttpProducer)jettyEndpoint.createProducer(); + assertEquals("Get the wrong http client parameter", 5555, producer.getHttpClient().getParams().getSoTimeout()); + + // send and receive + Object out = template.requestBody("http://localhost:{{port}}/myapp/myservice", "Hello World"); + assertEquals("Bye World", context.getTypeConverter().convertTo(String.class, out)); + } + + @Test + public void testProxySettingOfJettyHttpClient() throws Exception { + // setup the Proxy setting through the URI + HttpEndpoint jettyEndpoint = context.getEndpoint("jetty://http://localhost:{{port}}/proxy/setting?proxyHost=192.168.0.1&proxyPort=9090", HttpEndpoint.class); + assertNotNull("Jetty endpoint should not be null ", jettyEndpoint); + JettyHttpProducer producer = (JettyHttpProducer)jettyEndpoint.createProducer(); + assertProxyAddress(producer.getClient(), "192.168.0.1", 9090); + + // setup the context properties + context.getProperties().put("http.proxyHost", "192.168.0.2"); + context.getProperties().put("http.proxyPort", "8080"); + jettyEndpoint = context.getEndpoint("jetty://http://localhost:{{port}}/proxy2/setting", HttpEndpoint.class); + producer = (JettyHttpProducer)jettyEndpoint.createProducer(); + assertProxyAddress(producer.getClient(), "192.168.0.2", 8080); + context.getProperties().clear(); + + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty:http://localhost:{{port}}/myapp/myservice?httpClient.soTimeout=5555").transform().constant("Bye World"); + } + }; + } + + private void assertProxyAddress(HttpClient client, String expectedHost, int expectedPort) { + CamelHttpClient camelHttpClient = (CamelHttpClient)client; + assertEquals("Got the wrong http proxy host parameter", expectedHost, camelHttpClient.getProxyHost()); + assertEquals("Got the wrong http proxy port paramerter", expectedPort, camelHttpClient.getProxyPort()); + } + +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpComponentConfigurationAndDocumentationTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpComponentConfigurationAndDocumentationTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpComponentConfigurationAndDocumentationTest.java new file mode 100644 index 0000000..eae83bf --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpComponentConfigurationAndDocumentationTest.java @@ -0,0 +1,58 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.CamelContext; +import org.apache.camel.ComponentConfiguration; +import org.apache.camel.EndpointConfiguration; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Ignore; +import org.junit.Test; + +public class JettyHttpComponentConfigurationAndDocumentationTest extends CamelTestSupport { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testComponentConfiguration() throws Exception { + JettyHttpComponent comp = context.getComponent("jetty", JettyHttpComponent.class); + EndpointConfiguration conf = comp.createConfiguration("jetty://http://localhost:8080/myapp?" + + "httpClientMinThreads=4&httpClientMaxThreads=8"); + + assertEquals("4", conf.getParameter("httpClientMinThreads")); + assertEquals("8", conf.getParameter("httpClientMaxThreads")); + + ComponentConfiguration compConf = comp.createComponentConfiguration(); + String json = compConf.createParameterJsonSchema(); + assertNotNull(json); + assertTrue(json.contains("\"httpClientMaxThreads\": { \"type\": \"integer\"")); + assertTrue(json.contains("\"sessionSupport\": { \"type\": \"boolean\", \"javaType\": \"boolean\" },")); + } + + @Test + @Ignore // TODO Need to investigate why this fails while html is present + public void testComponentDocumentation() throws Exception { + CamelContext context = new DefaultCamelContext(); + String html = context.getComponentDocumentation("jetty"); + assertNotNull("Should have found some auto-generated HTML", html); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpContentTypeTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpContentTypeTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpContentTypeTest.java new file mode 100644 index 0000000..1edc74b --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpContentTypeTest.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.nio.charset.Charset; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class JettyHttpContentTypeTest extends BaseJettyTest { + + private static final String CHARSET = "ISO-8859-1"; + + @Test + public void testContentType() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.CONTENT_TYPE, + "text/plain; charset=\"" + CHARSET + "\""); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_CHARACTER_ENCODING, CHARSET); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, + "http://0.0.0.0:" + getPort() + "/foo"); + getMockEndpoint("mock:input").expectedPropertyReceived(Exchange.CHARSET_NAME, CHARSET); + + byte[] data = "Hello World".getBytes(Charset.forName(CHARSET)); + String out = template.requestBodyAndHeader("jetty:http://0.0.0.0:{{port}}/foo", data, + "content-type", "text/plain; charset=\"" + CHARSET + "\"", String.class); + assertEquals("Bye World", out); + + Exchange exchange = getMockEndpoint("mock:input").getExchanges().get(0); + Message in = exchange.getIn(); + System.out.println(in.getHeaders()); + assertMockEndpointsSatisfied(); + } + + @Test + public void testContentTypeWithAction() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.CONTENT_TYPE, + "text/plain;charset=\"" + CHARSET + "\";action=\"http://somewhere.com/foo\""); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_CHARACTER_ENCODING, CHARSET); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://0.0.0.0:" + getPort() + "/foo"); + getMockEndpoint("mock:input").expectedPropertyReceived(Exchange.CHARSET_NAME, CHARSET); + + byte[] data = "Hello World".getBytes(Charset.forName(CHARSET)); + String out = template.requestBodyAndHeader("jetty:http://0.0.0.0:{{port}}/foo", data, + "content-type", "text/plain;charset=\"" + CHARSET + "\";action=\"http://somewhere.com/foo\"", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty:http://0.0.0.0:{{port}}/foo") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java new file mode 100644 index 0000000..373681c --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java @@ -0,0 +1,42 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +/** + * Unit test to verify that the Jetty HTTP connector is correctly disconnected on shutdown + */ +public class JettyHttpEndpointDisconnectTest extends BaseJettyTest { + + private String serverUri = "http://localhost:" + getPort() + "/myservice"; + + @Test + public void testContextShutdownRemovesHttpConnector() throws Exception { + context.stop(); + assertEquals("Connector should have been removed", 0, JettyHttpComponent.CONNECTORS.size()); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty:" + serverUri).to("mock:result"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamAsExchangeHeaderTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamAsExchangeHeaderTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamAsExchangeHeaderTest.java new file mode 100644 index 0000000..acca07d --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamAsExchangeHeaderTest.java @@ -0,0 +1,128 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Ignore; +import org.junit.Test; + +/** + * Unit test to verify that we can have URI options for external system (endpoint is lenient) + */ +public class JettyHttpGetWithParamAsExchangeHeaderTest extends BaseJettyTest { + + private String serverUri = "http://localhost:" + getPort() + "/myservice"; + + @Test + public void testHttpGetWithParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("one", "einz"); + mock.expectedHeaderReceived("two", "twei"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBody(serverUri + "?one=einz&two=twei", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithUTF8EncodedParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", "Keine g\u00FCltige GPS-Daten!"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBody(serverUri + "?message=Keine%20g%C3%BCltige%20GPS-Daten!", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + @Ignore + public void testHttpGetWithISO8859EncodedParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", "Keine g\u00C6ltige GPS-Daten!"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBody(serverUri + "?message=Keine+g%C6ltige+GPS-Daten%21", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithSpaceInParams() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", " World"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + // parameter starts with a space using %2B as decimal encoded + template.requestBody(serverUri + "?message=%2BWorld", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithSpaceAsPlusInParams() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", " World"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + // parameter starts with a space using + decoded + template.requestBody(serverUri + "?message=+World", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithParamsViaHeader() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("one", "uno"); + mock.expectedHeaderReceived("two", "dos"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBodyAndHeader(serverUri, null, Exchange.HTTP_QUERY, "one=uno&two=dos"); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpPost() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedBodiesReceived("Hello World"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "POST"); + + template.requestBody(serverUri, "Hello World"); + + assertMockEndpointsSatisfied(); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty:" + serverUri).to("mock:result"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamTest.java new file mode 100644 index 0000000..c2aeecb --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpGetWithParamTest.java @@ -0,0 +1,93 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpMessage; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +/** + * Unit test to verify that we can have URI options for external system (endpoint is lenient) + */ +public class JettyHttpGetWithParamTest extends BaseJettyTest { + + private String serverUri = "http://localhost:" + getPort() + "/myservice"; + private MyParamsProcessor processor = new MyParamsProcessor(); + + @Test + public void testHttpGetWithParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Bye World"); + mock.expectedHeaderReceived("one", "eins"); + mock.expectedHeaderReceived("two", "zwei"); + + template.requestBody(serverUri + "?one=uno&two=dos", "Hello World"); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithParamsViaHeader() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Bye World"); + mock.expectedHeaderReceived("one", "eins"); + mock.expectedHeaderReceived("two", "zwei"); + + template.requestBodyAndHeader(serverUri, "Hello World", Exchange.HTTP_QUERY, "one=uno&two=dos"); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetFromOtherRoute() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Bye World"); + mock.expectedHeaderReceived("one", "eins"); + mock.expectedHeaderReceived("two", "zwei"); + + template.requestBodyAndHeader("direct:start", "Hello World", "parameters", "one=uno&two=dos"); + + assertMockEndpointsSatisfied(); + } + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty:" + serverUri).process(processor).to("mock:result"); + from("direct:start") + .setHeader(Exchange.HTTP_METHOD, constant("GET")) + .setHeader(Exchange.HTTP_URI, simple(serverUri + "?${in.headers.parameters}")) + .to("http://example"); + } + }; + } + + private static class MyParamsProcessor implements Processor { + public void process(Exchange exchange) throws Exception { + HttpMessage message = (HttpMessage)exchange.getIn(); + assertNotNull(message.getRequest()); + assertEquals("uno", message.getRequest().getParameter("one")); + assertEquals("dos", message.getRequest().getParameter("two")); + + exchange.getOut().setBody("Bye World"); + exchange.getOut().setHeader("one", "eins"); + exchange.getOut().setHeader("two", "zwei"); + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpHeadersTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpHeadersTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpHeadersTest.java new file mode 100644 index 0000000..31b6e45 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyHttpHeadersTest.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class JettyHttpHeadersTest extends BaseJettyTest { + + @Test + public void testHttpHeaders() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived("beer", "yes"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://localhost:" + getPort() + "/foo"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URI, "/foo"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_QUERY, "beer=yes"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_PATH, ""); + + String out = template.requestBody("http://localhost:{{port}}/foo?beer=yes", "Hello World", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty:http://0.0.0.0:{{port}}/foo") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyImageFileTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyImageFileTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyImageFileTest.java new file mode 100644 index 0000000..ed61bda --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyImageFileTest.java @@ -0,0 +1,71 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.io.File; + +import org.apache.camel.Endpoint; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.util.MessageHelper; +import org.junit.Test; + +/** + * Unit test for exposing a http server that returns images + */ +public class JettyImageFileTest extends BaseJettyTest { + + private void sendImageContent(boolean usingGZip) throws Exception { + Endpoint endpoint = context.getEndpoint("http://localhost:{{port}}/myapp/myservice"); + Exchange exchange = endpoint.createExchange(); + if (usingGZip) { + exchange.getIn().setHeader(Exchange.CONTENT_ENCODING, "gzip"); + } + template.send(endpoint, exchange); + + assertNotNull(exchange.getOut().getBody()); + assertEquals("Get a wrong content-type ", MessageHelper.getContentType(exchange.getOut()), "image/jpeg"); + } + + @Test + public void testImageContentType() throws Exception { + sendImageContent(false); + } + + @Test + public void testImageContentWithGZip() throws Exception { + sendImageContent(true); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty:http://localhost:{{port}}/myapp/myservice").process(new MyImageService()); + } + }; + } + + public class MyImageService implements Processor { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody(new File("src/test/data/logo.jpeg")); + exchange.getOut().setHeader("Content-Type", "image/jpeg"); + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyOnExceptionHandledTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyOnExceptionHandledTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyOnExceptionHandledTest.java new file mode 100644 index 0000000..e2fb3c7 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyOnExceptionHandledTest.java @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +/** + * @version + */ +public class JettyOnExceptionHandledTest extends BaseJettyTest { + + @Test + public void testJettyOnException() throws Exception { + Exchange reply = template.request("http://localhost:{{port}}/myserver?throwExceptionOnFailure=false", null); + + assertNotNull(reply); + assertEquals("Dude something went wrong", reply.getOut().getBody(String.class)); + assertEquals(500, reply.getOut().getHeader(Exchange.HTTP_RESPONSE_CODE)); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // START SNIPPET: e1 + from("jetty://http://localhost:{{port}}/myserver") + // use onException to catch all exceptions and return a custom reply message + .onException(Exception.class) + .handled(true) + // create a custom failure response + .transform(constant("Dude something went wrong")) + // we must remember to set error code 500 as handled(true) + // otherwise would let Camel thing its a OK response (200) + .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(500)) + .end() + // now just force an exception immediately + .throwException(new IllegalArgumentException("I cannot do this")); + // END SNIPPET: e1 + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBodyWhenErrorTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBodyWhenErrorTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBodyWhenErrorTest.java new file mode 100644 index 0000000..80de7d6 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBodyWhenErrorTest.java @@ -0,0 +1,64 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpOperationFailedException; +import org.junit.Test; + +/** + * Unit test for HttpOperationFailedException should contain response body + */ +public class JettyResponseBodyWhenErrorTest extends BaseJettyTest { + + @Test + public void testResponseBodyWhenError() throws Exception { + try { + template.requestBody("http://localhost:{{port}}/myapp/myservice", "bookid=123"); + fail("Should have thrown an exception"); + } catch (RuntimeCamelException e) { + HttpOperationFailedException cause = assertThrowable(HttpOperationFailedException.class, e.getCause()); + assertEquals(500, cause.getStatusCode()); + String body = context.getTypeConverter().convertTo(String.class, cause.getResponseBody()); + assertTrue(body.indexOf("Damm") > -1); + assertTrue(body.indexOf("IllegalArgumentException") > -1); + assertNotNull(cause.getResponseHeaders()); + String type = cause.getResponseHeaders().get(Exchange.CONTENT_TYPE); + assertTrue(type.startsWith("text/plain")); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + errorHandler(noErrorHandler()); + from("jetty:http://localhost:{{port}}/myapp/myservice").process(new MyBookService()); + } + }; + } + + public class MyBookService implements Processor { + public void process(Exchange exchange) throws Exception { + throw new IllegalArgumentException("Damm"); + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBufferSizeTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBufferSizeTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBufferSizeTest.java new file mode 100644 index 0000000..84baa2c --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyResponseBufferSizeTest.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class JettyResponseBufferSizeTest extends BaseJettyTest { + + @Test + public void testSimple() throws Exception { + String result = template.requestBody("http://localhost:{{port}}/myapp", "Camel", String.class); + assertEquals("Hello Camel", result); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty:http://localhost:{{port}}/myapp?responseBufferSize=65536") + .transform(body().prepend("Hello ")); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteTest.java new file mode 100644 index 0000000..f7c4464 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteTest.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +/** + * Unit test for wiki demonstration. + */ +public class JettyRouteTest extends BaseJettyTest { + + @Test + public void testSendToJetty() throws Exception { + Object response = template.requestBody("http://localhost:{{port}}/myapp/myservice", "bookid=123"); + // convert the response to a String + String body = context.getTypeConverter().convertTo(String.class, response); + assertEquals("<html><body>Book 123 is Camel in Action</body></html>", body); + } + + @Test + public void testHttpProxyHostHeader() throws Exception { + String out = template.requestBody("http://localhost:{{port}}/proxyServer", null, String.class); + assertEquals("Get a wrong host header", "localhost:" + getPort2(), out); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + // START SNIPPET: e1 + from("jetty:http://localhost:{{port}}/myapp/myservice").process(new MyBookService()); + // END SNIPPET: e1 + + from("jetty://http://localhost:{{port}}/proxyServer") + .to("http://localhost:{{port2}}/host?bridgeEndpoint=true"); + + from("jetty://http://localhost:{{port2}}/host").transform(header("host")); + } + }; + } + + // START SNIPPET: e2 + public class MyBookService implements Processor { + public void process(Exchange exchange) throws Exception { + // just get the body as a string + String body = exchange.getIn().getBody(String.class); + + // we have access to the HttpServletRequest here and we can grab it if we need it + HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class); + assertNotNull(req); + + // for unit testing + assertEquals("bookid=123", body); + + // send a html response + exchange.getOut().setBody("<html><body>Book 123 is Camel in Action</body></html>"); + } + } + // END SNIPPET: e2 + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithSocketPropertiesTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithSocketPropertiesTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithSocketPropertiesTest.java new file mode 100644 index 0000000..86ef152 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithSocketPropertiesTest.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +/** + * Unit test for wiki demonstration. + */ +public class JettyRouteWithSocketPropertiesTest extends BaseJettyTest { + + @Test + public void testSendToJetty() throws Exception { + Object response = template.requestBody("http://localhost:{{port}}/myapp/myservice", "bookid=123"); + // convert the response to a String + String body = context.getTypeConverter().convertTo(String.class, response); + assertEquals("<html><body>Book 123 is Camel in Action</body></html>", body); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + // START SNIPPET: e1 + // define socket connector properties + Map<String, Object> properties = new HashMap<String, Object>(); + properties.put("acceptors", 4); + properties.put("statsOn", "false"); + properties.put("soLingerTime", "5000"); + + JettyHttpComponent jetty = getContext().getComponent("jetty", JettyHttpComponent.class); + jetty.setSocketConnectorProperties(properties); + // END SNIPPET: e1 + + from("jetty:http://localhost:{{port}}/myapp/myservice").process(new MyBookService()); + } + }; + } + + public class MyBookService implements Processor { + public void process(Exchange exchange) throws Exception { + // just get the body as a string + String body = exchange.getIn().getBody(String.class); + + // we have access to the HttpServletRequest here and we can grab it if we need it + HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class); + assertNotNull(req); + + // for unit testing + assertEquals("bookid=123", body); + + // send a html response + exchange.getOut().setBody("<html><body>Book 123 is Camel in Action</body></html>"); + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSocketPropertiesTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSocketPropertiesTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSocketPropertiesTest.java new file mode 100644 index 0000000..8b5fedd --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSocketPropertiesTest.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.builder.RouteBuilder; +import org.eclipse.jetty.server.Server; +import org.junit.Test; + +public class JettyRouteWithUnknownSocketPropertiesTest extends BaseJettyTest { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testUnknownProperty() throws Exception { + if (!Server.getVersion().startsWith("8")) { + // SocketConnector props do not work for jetty 9 + return; + } + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + // define socket connector properties + Map<String, Object> properties = new HashMap<String, Object>(); + properties.put("acceptors", 4); + properties.put("statsOn", "false"); + properties.put("soLingerTime", "5000"); + properties.put("doesNotExist", 2000); + + JettyHttpComponent jetty = getContext().getComponent("jetty", JettyHttpComponent.class); + jetty.setSocketConnectorProperties(properties); + + from("jetty:http://localhost:{{port}}/myapp/myservice").to("log:foo"); + } + }); + try { + context.start(); + fail("Should have thrown exception"); + } catch (IllegalArgumentException e) { + assertTrue(e.getMessage().endsWith("Unknown parameters=[{doesNotExist=2000}]")); + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSslSocketPropertiesTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSslSocketPropertiesTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSslSocketPropertiesTest.java new file mode 100644 index 0000000..72d913d --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyRouteWithUnknownSslSocketPropertiesTest.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.builder.RouteBuilder; +import org.eclipse.jetty.server.Server; +import org.junit.Test; + +public class JettyRouteWithUnknownSslSocketPropertiesTest extends BaseJettyTest { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testUnknownProperty() throws Exception { + if (!Server.getVersion().startsWith("8")) { + // SocketConnector props do not work for jetty 9 + return; + } + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + // define socket connector properties + Map<String, Object> properties = new HashMap<String, Object>(); + properties.put("acceptors", 4); + properties.put("statsOn", "false"); + properties.put("soLingerTime", "5000"); + properties.put("doesNotExist", 2000); + + JettyHttpComponent jetty = getContext().getComponent("jetty", JettyHttpComponent.class); + jetty.setSslSocketConnectorProperties(properties); + + from("jetty:https://localhost:{{port}}/myapp/myservice").to("log:foo"); + } + }); + try { + context.start(); + fail("Should have thrown exception"); + } catch (IllegalArgumentException e) { + assertTrue("Actual message: " + e.getMessage(), e.getMessage().endsWith("Unknown parameters=[{doesNotExist=2000}]")); + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySessionSupportTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySessionSupportTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySessionSupportTest.java new file mode 100644 index 0000000..0af49a0 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySessionSupportTest.java @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +/** + * @version + */ +public class JettySessionSupportTest extends BaseJettyTest { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testJettySessionSupportInvalid() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty:http://localhost:{{port}}/hello").to("mock:foo"); + + from("jetty:http://localhost:{{port}}/bye?sessionSupport=true").to("mock:bar"); + } + }); + try { + context.start(); + fail("Should have thrown an exception"); + } catch (IllegalStateException e) { + assertEquals("Server has already been started. Cannot enabled sessionSupport on http:localhost:" + getPort(), e.getMessage()); + } + } + + @Test + public void testJettySessionSupportOk() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty:http://localhost:{{port}}/hello?sessionSupport=true").transform(simple("Bye ${body}")); + } + }); + context.start(); + + try { + String reply = template.requestBody("http://localhost:{{port}}/hello", "World", String.class); + assertEquals("Bye World", reply); + + reply = template.requestBody("http://localhost:{{port}}/hello", "Moon", String.class); + assertEquals("Bye Moon", reply); + } finally { + context.stop(); + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimplifiedHandle404Test.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimplifiedHandle404Test.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimplifiedHandle404Test.java new file mode 100644 index 0000000..8d2eeed --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimplifiedHandle404Test.java @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.processor.aggregate.AggregationStrategy; +import org.junit.Test; + +/** + * Based on end user on forum how to get the 404 error code in his enrich aggregator + * + * @version + */ +public class JettySimplifiedHandle404Test extends BaseJettyTest { + + @Test + public void testSimulate404() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Page not found"); + mock.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 404); + + template.sendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // disable error handling + errorHandler(noErrorHandler()); + + // START SNIPPET: e1 + // We set throwExceptionOnFailure to false to let Camel return any response from the remove HTTP server without thrown + // HttpOperationFailedException in case of failures. + // This allows us to handle all responses in the aggregation strategy where we can check the HTTP response code + // and decide what to do. As this is based on an unit test we assert the code is 404 + from("direct:start").enrich("http://localhost:{{port}}/myserver?throwExceptionOnFailure=false&user=Camel", new AggregationStrategy() { + public Exchange aggregate(Exchange original, Exchange resource) { + // get the response code + Integer code = resource.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class); + assertEquals(404, code.intValue()); + return resource; + } + }).to("mock:result"); + + // this is our jetty server where we simulate the 404 + from("jetty://http://localhost:{{port}}/myserver") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody("Page not found"); + exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 404); + } + }); + // END SNIPPET: e1 + } + }; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimulateInOnlyTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimulateInOnlyTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimulateInOnlyTest.java new file mode 100644 index 0000000..1d5000d --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySimulateInOnlyTest.java @@ -0,0 +1,120 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.Exchange; +import org.apache.camel.ExchangePattern; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +/** + * @version + */ +public class JettySimulateInOnlyTest extends BaseJettyTest { + + private static String route = ""; + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testSimulateInOnlyUsingWireTap() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + // START SNIPPET: e1 + from("jetty://http://localhost:{{port}}/myserver") + // turn the route to in only as we do not want jetty to wait for the response + // we can do this using the wiretap EIP pattern + .wireTap("direct:continue") + // and then construct a canned empty response + .transform(constant("OK")); + + from("direct:continue") + .delay(1500) + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + route += "B"; + } + }). + to("mock:result"); + // END SNIPPET: e1 + } + }); + context.start(); + + route = ""; + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("foo", "bar"); + + String reply = template.requestBody("http://localhost:{{port}}/myserver?foo=bar", null, String.class); + route += "A"; + assertEquals("OK", reply); + + assertMockEndpointsSatisfied(); + + assertEquals("AB", route); + } + + @Test + public void testSimulateInOnly() throws Exception { + context.addRoutes(new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty://http://localhost:{{port}}/myserver") + // turn the route to in only as we do not want jetty to wait for the response + // we can do this by changing the MEP and sending to a seda endpoint to spin off + // a new thread continue doing the routing + .setExchangePattern(ExchangePattern.InOnly) + .to("seda:continue") + // and then construct a canned empty response + .transform(constant("OK")); + + from("seda:continue") + .delay(1000) + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + route += "B"; + } + }). + to("mock:result"); + } + }); + context.start(); + + route = ""; + + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("foo", "bar"); + + String reply = template.requestBody("http://localhost:{{port}}/myserver?foo=bar", null, String.class); + route += "A"; + assertEquals("OK", reply); + + assertMockEndpointsSatisfied(); + + assertEquals("AB", route); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySteveIssueTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySteveIssueTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySteveIssueTest.java new file mode 100644 index 0000000..d66eadb --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySteveIssueTest.java @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +/** + * Unit test based on Steve request for CAMEL-877. + */ +public class JettySteveIssueTest extends BaseJettyTest { + + private String serverUri = "http://localhost:" + getPort() + "/myservice"; + + @Test + public void testSendX() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("<html><body>foo</body></html>"); + mock.expectedHeaderReceived("x", "foo"); + + template.requestBody(serverUri + "?x=foo", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty:" + serverUri) + .setBody().simple("<html><body>${in.header.x}</body></html>") + .to("mock:result"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyStreamCacheIssueTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyStreamCacheIssueTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyStreamCacheIssueTest.java new file mode 100644 index 0000000..719c992 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyStreamCacheIssueTest.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Assert; +import org.junit.Test; + +public class JettyStreamCacheIssueTest extends BaseJettyTest { + + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + // ensure we overflow and spool to disk + context.getStreamCachingStrategy().setSpoolThreshold(5000); + context.setStreamCaching(true); + return context; + } + + @Test + public void testStreamCache() throws Exception { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < 10000; i++) { + sb.append("0123456789"); + } + String input = sb.toString(); + + String out = template.requestBody("direct:input", input, String.class); + assertEquals(input, out); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:input").to("jetty:http://localhost:" + getPort() + "/input"); + + from("jetty:http://localhost:" + getPort() + "/input").process(new Processor() { + @Override + public void process(final Exchange exchange) throws Exception { + Assert.assertFalse(exchange.hasOut()); + } + }); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendResumeTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendResumeTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendResumeTest.java new file mode 100644 index 0000000..31e05cc --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendResumeTest.java @@ -0,0 +1,71 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpConsumer; +import org.apache.camel.component.http.HttpOperationFailedException; +import org.junit.Test; + +/** + * @version + */ +public class JettySuspendResumeTest extends BaseJettyTest { + + private String serverUri = "http://localhost:" + getPort() + "/cool"; + + @Test + public void testJettySuspendResume() throws Exception { + context.getShutdownStrategy().setTimeout(50); + + String reply = template.requestBody(serverUri, "World", String.class); + assertEquals("Bye World", reply); + + // now suspend jetty + HttpConsumer consumer = (HttpConsumer) context.getRoute("route1").getConsumer(); + assertNotNull(consumer); + + // suspend + consumer.suspend(); + + try { + template.requestBody(serverUri, "Moon", String.class); + fail("Should throw exception"); + } catch (Exception e) { + HttpOperationFailedException cause = assertIsInstanceOf(HttpOperationFailedException.class, e.getCause()); + assertEquals(503, cause.getStatusCode()); + } + + // resume + consumer.resume(); + + // and send request which should be processed + reply = template.requestBody(serverUri, "Moon", String.class); + assertEquals("Bye Moon", reply); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty://" + serverUri).id("route1") + .transform(body().prepend("Bye ")); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendTest.java new file mode 100644 index 0000000..3935c71 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendTest.java @@ -0,0 +1,64 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpConsumer; +import org.apache.camel.component.http.HttpOperationFailedException; +import org.junit.Test; + +/** + * @version + */ +public class JettySuspendTest extends BaseJettyTest { + + private String serverUri = "http://localhost:" + getPort() + "/cool"; + + @Test + public void testJettySuspend() throws Exception { + context.getShutdownStrategy().setTimeout(50); + + String reply = template.requestBody(serverUri, "World", String.class); + assertEquals("Bye World", reply); + + // now suspend jetty + HttpConsumer consumer = (HttpConsumer) context.getRoute("route1").getConsumer(); + assertNotNull(consumer); + + // suspend + consumer.suspend(); + + try { + template.requestBody(serverUri, "Moon", String.class); + fail("Should throw exception"); + } catch (Exception e) { + HttpOperationFailedException cause = assertIsInstanceOf(HttpOperationFailedException.class, e.getCause()); + assertEquals(503, cause.getStatusCode()); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty://" + serverUri).id("route1") + .transform(body().prepend("Bye ")); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendWhileInProgressTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendWhileInProgressTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendWhileInProgressTest.java new file mode 100644 index 0000000..cacbe95 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettySuspendWhileInProgressTest.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpOperationFailedException; +import org.junit.Test; + +/** + * @version + */ +public class JettySuspendWhileInProgressTest extends BaseJettyTest { + + private String serverUri = "http://localhost:" + getPort() + "/cool"; + + @Test + public void testJettySuspendWhileInProgress() throws Exception { + context.getShutdownStrategy().setTimeout(50); + + // send a request/reply and have future handle so we can shutdown while in progress + Future<String> reply = template.asyncRequestBodyAndHeader(serverUri, null, "name", "Camel", String.class); + + // shutdown camel while in progress, wait 2 sec so the first req has been received in Camel route + Executors.newSingleThreadExecutor().execute(new Runnable() { + public void run() { + try { + Thread.sleep(2000); + context.stop(); + } catch (Exception e) { + // ignore + } + } + }); + + // wait a bit more before sending next + Thread.sleep(5000); + + // now send a new req/reply + Future<String> reply2 = template.asyncRequestBodyAndHeader(serverUri, null, "name", "Tiger", String.class); + + // the first should wait to have its reply returned + assertEquals("Bye Camel", reply.get(20, TimeUnit.SECONDS)); + + // the 2nd should have a 503 returned as we are shutting down + try { + reply2.get(20, TimeUnit.SECONDS); + fail("Should throw exception"); + } catch (Exception e) { + RuntimeCamelException rce = assertIsInstanceOf(RuntimeCamelException.class, e.getCause()); + HttpOperationFailedException hofe = assertIsInstanceOf(HttpOperationFailedException.class, rce.getCause()); + assertEquals(503, hofe.getStatusCode()); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty://" + serverUri) + .log("Got data will wait 10 sec with reply") + .delay(10000) + .transform(simple("Bye ${header.name}")); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyWithXPathChoiceTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyWithXPathChoiceTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyWithXPathChoiceTest.java new file mode 100644 index 0000000..836533d --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/JettyWithXPathChoiceTest.java @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Before; +import org.junit.Test; + +import static org.apache.camel.component.mock.MockEndpoint.expectsMessageCount; + +public class JettyWithXPathChoiceTest extends BaseJettyTest { + protected MockEndpoint x; + protected MockEndpoint y; + protected MockEndpoint z; + + @Test + public void testSendToFirstWhen() throws Exception { + String body = "<one/>"; + expectsMessageCount(0, y, z); + + sendBody(body); + + assertMockEndpointsSatisfied(); + + x.reset(); + y.reset(); + z.reset(); + + body = "<two/>"; + expectsMessageCount(0, x, z); + + sendBody(body); + + assertMockEndpointsSatisfied(); + } + + private void sendBody(String body) { + template.sendBody("http://localhost:{{port}}/myworld", body); + } + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + + x = getMockEndpoint("mock:x"); + y = getMockEndpoint("mock:y"); + z = getMockEndpoint("mock:z"); + } + + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + public void configure() { + from("jetty:http://localhost:{{port}}/myworld") + // use stream caching + .streamCaching() + .choice() + .when().xpath("/one").to("mock:x") + .when().xpath("/two").to("mock:y") + .otherwise().to("mock:z") + .end(); + + } + }; + } + +}