You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by al...@apache.org on 2020/08/13 16:14:26 UTC

[camel] branch master updated: CAMEL-14826: Add unit tests to the platform-http component

This is an automated email from the ASF dual-hosted git repository.

aldettinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new c4d9bc3  CAMEL-14826: Add unit tests to the platform-http component
c4d9bc3 is described below

commit c4d9bc34cc2067ec9495e16eae51039d3fb303bc
Author: Zineb Bendhiba <be...@gmail.com>
AuthorDate: Wed Aug 12 18:54:55 2020 +0200

    CAMEL-14826: Add unit tests to the platform-http component
---
 components/camel-platform-http/pom.xml             |  28 +++++
 .../http/JettyCustomPlatformHttpConsumer.java      | 130 +++++++++++++++++++++
 .../http/JettyCustomPlatformHttpEngine.java        |  29 +++++
 .../component/platform/http/JettyServerTest.java   |  53 +++++++++
 .../component/platform/http/PlatformHttpTest.java  |  92 +++++++++++++++
 .../src/test/resources/log4j2.properties           |  28 +++++
 6 files changed, 360 insertions(+)

diff --git a/components/camel-platform-http/pom.xml b/components/camel-platform-http/pom.xml
index d367f57..e849b82 100644
--- a/components/camel-platform-http/pom.xml
+++ b/components/camel-platform-http/pom.xml
@@ -37,6 +37,34 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-support</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${jetty9-version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.eclipse.jetty.orbit</groupId>
+                    <artifactId>javax.servlet</artifactId>
+                </exclusion>
+            </exclusions>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <version>${rest-assured-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyCustomPlatformHttpConsumer.java b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyCustomPlatformHttpConsumer.java
new file mode 100644
index 0000000..b75ef52
--- /dev/null
+++ b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyCustomPlatformHttpConsumer.java
@@ -0,0 +1,130 @@
+/*
+ * 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.platform.http;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.regex.Pattern;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.DefaultMessage;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.server.handler.ContextHandler;
+
+public class JettyCustomPlatformHttpConsumer extends DefaultConsumer {
+    private static final Pattern PATH_PARAMETER_PATTERN = Pattern.compile("\\{([^/}]+)\\}");
+
+    public JettyCustomPlatformHttpConsumer(PlatformHttpEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+        final PlatformHttpEndpoint endpoint = getEndpoint();
+        final String path = configureEndpointPath(endpoint);
+
+        JettyServerTest jettyServerTest = CamelContextHelper.mandatoryLookup(
+                getEndpoint().getCamelContext(),
+                JettyServerTest.JETTY_SERVER_NAME,
+                JettyServerTest.class
+        );
+
+        ContextHandler contextHandler = createHandler(endpoint, path);
+        // add handler after starting server.
+        jettyServerTest.addHandler(contextHandler);
+
+
+    }
+
+    private ContextHandler createHandler(PlatformHttpEndpoint endpoint, String path) {
+        ContextHandler contextHandler = new ContextHandler();
+        contextHandler.setContextPath(path);
+        contextHandler.setResourceBase(".");
+        contextHandler.setClassLoader(Thread.currentThread().getContextClassLoader());
+        contextHandler.setAllowNullPathInfo(true);
+        contextHandler.setHandler(new AbstractHandler() {
+            @Override
+            public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException {
+                Exchange exchg = null;
+                try {
+                    BufferedReader reader = httpServletRequest.getReader();
+                    String bodyRequest = "";
+                    String strCurrentLine = "";
+                    while ((strCurrentLine = reader.readLine()) != null) {
+                        bodyRequest += strCurrentLine;
+                    }
+                    final Exchange exchange = exchg = toExchange(request, bodyRequest);
+                    createUoW(exchange);
+                    getProcessor().process(
+                            exchange);
+                    httpServletResponse.setStatus(HttpServletResponse.SC_OK);
+                    request.setHandled(true);
+                    httpServletResponse.getWriter().println(exchange.getMessage().getBody());
+                } catch (Exception e) {
+                    getExceptionHandler().handleException("Failed handling platform-http endpoint " + endpoint.getPath(), exchg, e);
+                } finally {
+                    if (exchg != null) {
+                        doneUoW(exchg);
+                    }
+                }
+            }
+        });
+        return contextHandler;
+    }
+
+
+    private Exchange toExchange(Request request, String body) {
+        final Exchange exchange = getEndpoint().createExchange();
+        final Message message = new DefaultMessage(exchange);
+
+        final String charset = request.getHeader("charset");
+        if (charset != null) {
+            exchange.setProperty(Exchange.CHARSET_NAME, charset);
+            message.setHeader(Exchange.HTTP_CHARACTER_ENCODING, charset);
+        }
+
+        message.setBody(body.length() != 0 ? body : null);
+        exchange.setMessage(message);
+        return exchange;
+    }
+
+
+    @Override
+    public PlatformHttpEndpoint getEndpoint() {
+        return (PlatformHttpEndpoint) super.getEndpoint();
+    }
+
+    private String configureEndpointPath(PlatformHttpEndpoint endpoint) {
+        String path = endpoint.getPath();
+        if (endpoint.isMatchOnUriPrefix()) {
+            path += "*";
+        }
+        // Transform from the Camel path param syntax /path/{key} to vert.x web's /path/:key
+        return PATH_PARAMETER_PATTERN.matcher(path).replaceAll(":$1");
+    }
+
+}
diff --git a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyCustomPlatformHttpEngine.java b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyCustomPlatformHttpEngine.java
new file mode 100644
index 0000000..02adada
--- /dev/null
+++ b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyCustomPlatformHttpEngine.java
@@ -0,0 +1,29 @@
+/*
+ * 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.platform.http;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.component.platform.http.spi.PlatformHttpEngine;
+
+public class JettyCustomPlatformHttpEngine implements PlatformHttpEngine {
+    @Override
+    public Consumer createConsumer(PlatformHttpEndpoint platformHttpEndpoint, Processor processor) {
+
+        return new JettyCustomPlatformHttpConsumer(platformHttpEndpoint, processor);
+    }
+}
diff --git a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyServerTest.java b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyServerTest.java
new file mode 100644
index 0000000..292c2fd
--- /dev/null
+++ b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/JettyServerTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.platform.http;
+
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+
+public class JettyServerTest {
+    public static final String JETTY_SERVER_NAME = "JettyServerTest";
+
+    private Server server;
+    private HandlerCollection contextHandlerCollection;
+
+    public JettyServerTest(int port) {
+        server = new Server(port);
+        contextHandlerCollection = new HandlerCollection(true);
+        server.setHandler(contextHandlerCollection);
+    }
+
+    public void start() throws Exception {
+        server.start();
+    }
+
+    public void stop() throws Exception {
+        server.stop();
+    }
+
+    /**
+     * adds a context handler and starts it
+     *
+     * @param contextHandler
+     * @throws Exception
+     */
+    public void addHandler(ContextHandler contextHandler) throws Exception {
+        contextHandlerCollection.addHandler(contextHandler);
+        contextHandler.start();
+    }
+}
diff --git a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpTest.java b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpTest.java
new file mode 100644
index 0000000..69b923d
--- /dev/null
+++ b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.platform.http;
+
+import io.restassured.RestAssured;
+import io.restassured.response.Response;
+import io.restassured.specification.RequestSpecification;
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.test.AvailablePortFinder;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+
+public class PlatformHttpTest {
+    private static JettyServerTest server;
+    private static CamelContext ctx;
+    private static int port;
+
+    @BeforeAll
+    public static void init() throws Exception {
+
+        ctx = new DefaultCamelContext();
+        ctx.getRegistry().bind(PlatformHttpConstants.PLATFORM_HTTP_ENGINE_FACTORY, new JettyCustomPlatformHttpEngine());
+
+        port = AvailablePortFinder.getNextAvailable();
+        server = new JettyServerTest(port);
+
+        ctx.getRegistry().bind(JettyServerTest.JETTY_SERVER_NAME, server);
+        server.start();
+
+        ctx.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("platform-http:/get")
+                        .setBody().constant("get");
+                from("platform-http:/post")
+                        .transform().body(String.class, b -> b.toUpperCase());
+            }
+        });
+        ctx.start();
+    }
+
+    @AfterAll
+    public static void tearDown() throws Exception {
+        ctx.stop();
+        server.stop();
+    }
+
+    @Test
+    public void testGet() throws Exception {
+        given()
+                .header("Accept", "application/json")
+                .port(port)
+                .expect()
+                .statusCode(200)
+                .when()
+                .get("/get");
+    }
+
+    @Test
+    public void testPost() {
+        RestAssured.baseURI = "http://localhost:" + port;
+        RequestSpecification request = RestAssured.given();
+        request.body("test");
+        Response response = request.get("/post");
+
+        int statusCode = response.getStatusCode();
+        assertEquals(200, statusCode);
+        assertEquals("TEST", response.body().asString().trim());
+    }
+
+}
diff --git a/components/camel-platform-http/src/test/resources/log4j2.properties b/components/camel-platform-http/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..c2eabf4
--- /dev/null
+++ b/components/camel-platform-http/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-platform-http-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = [%30.30t] %-30.30c{1} %-5p %m%n
+
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
\ No newline at end of file