This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch CAMEL-13563 in repository https://gitbox.apache.org/repos/asf/camel.git
commit cce51dc871ef05f7ff5ac50666458c2d41a815fa Author: Colm O hEigeartaigh <cohei...@apache.org> AuthorDate: Thu May 23 15:08:41 2019 +0100 Missing file from last commit --- .../WebsocketSSLClientAuthRouteExampleTest.java | 190 +++++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/components/camel-websocket/src/test/java/org/apache/camel/component/websocket/WebsocketSSLClientAuthRouteExampleTest.java b/components/camel-websocket/src/test/java/org/apache/camel/component/websocket/WebsocketSSLClientAuthRouteExampleTest.java new file mode 100644 index 0000000..2853542 --- /dev/null +++ b/components/camel-websocket/src/test/java/org/apache/camel/component/websocket/WebsocketSSLClientAuthRouteExampleTest.java @@ -0,0 +1,190 @@ +/* + * 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.websocket; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.SSLContext; + +import io.netty.handler.ssl.ClientAuth; +import io.netty.handler.ssl.JdkSslContext; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.support.jsse.KeyManagersParameters; +import org.apache.camel.support.jsse.KeyStoreParameters; +import org.apache.camel.support.jsse.SSLContextParameters; +import org.apache.camel.support.jsse.SSLContextServerParameters; +import org.apache.camel.support.jsse.TrustManagersParameters; +import org.apache.camel.test.AvailablePortFinder; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.asynchttpclient.AsyncHttpClient; +import org.asynchttpclient.AsyncHttpClientConfig; +import org.asynchttpclient.DefaultAsyncHttpClient; +import org.asynchttpclient.DefaultAsyncHttpClientConfig; +import org.asynchttpclient.ws.WebSocket; +import org.asynchttpclient.ws.WebSocketTextListener; +import org.asynchttpclient.ws.WebSocketUpgradeHandler; +import org.junit.Before; +import org.junit.Test; + +public class WebsocketSSLClientAuthRouteExampleTest extends CamelTestSupport { + + private static List<String> received = new ArrayList<>(); + private static CountDownLatch latch = new CountDownLatch(10); + protected Properties originalValues = new Properties(); + protected String pwd = "changeit"; + protected int port; + + @Override + @Before + public void setUp() throws Exception { + port = AvailablePortFinder.getNextAvailable(16200); + + super.setUp(); + } + + protected AsyncHttpClient createAsyncHttpSSLClient() throws IOException, GeneralSecurityException { + + AsyncHttpClient c; + AsyncHttpClientConfig config; + + DefaultAsyncHttpClientConfig.Builder builder = + new DefaultAsyncHttpClientConfig.Builder(); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + + KeyStoreParameters truststoreParameters = new KeyStoreParameters(); + truststoreParameters.setResource("jsse/localhost.ks"); + truststoreParameters.setPassword(pwd); + + TrustManagersParameters clientSSLTrustManagers = new TrustManagersParameters(); + clientSSLTrustManagers.setKeyStore(truststoreParameters); + sslContextParameters.setTrustManagers(clientSSLTrustManagers); + + KeyStoreParameters keystoreParameters = new KeyStoreParameters(); + keystoreParameters.setResource("jsse/localhost.ks"); + keystoreParameters.setPassword(pwd); + KeyManagersParameters clientAuthClientSSLKeyManagers = new KeyManagersParameters(); + clientAuthClientSSLKeyManagers.setKeyPassword(pwd); + clientAuthClientSSLKeyManagers.setKeyStore(keystoreParameters); + sslContextParameters.setKeyManagers(clientAuthClientSSLKeyManagers); + + SSLContext sslContext = sslContextParameters.createSSLContext(context()); + JdkSslContext ssl = new JdkSslContext(sslContext, true, ClientAuth.REQUIRE); + builder.setSslContext(ssl); + builder.setAcceptAnyCertificate(true); + config = builder.build(); + c = new DefaultAsyncHttpClient(config); + + return c; + } + + protected SSLContextParameters defineSSLContextParameters() { + + KeyStoreParameters ksp = new KeyStoreParameters(); + ksp.setResource("jsse/localhost.ks"); + ksp.setPassword(pwd); + + KeyManagersParameters kmp = new KeyManagersParameters(); + kmp.setKeyPassword(pwd); + kmp.setKeyStore(ksp); + + TrustManagersParameters tmp = new TrustManagersParameters(); + tmp.setKeyStore(ksp); + + SSLContextServerParameters scsp = new SSLContextServerParameters(); + scsp.setClientAuthentication("REQUIRE"); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + sslContextParameters.setKeyManagers(kmp); + sslContextParameters.setTrustManagers(tmp); + sslContextParameters.setServerParameters(scsp); + + return sslContextParameters; + } + + @Test + public void testWSHttpCall() throws Exception { + + AsyncHttpClient c = createAsyncHttpSSLClient(); + WebSocket websocket = c.prepareGet("wss://127.0.0.1:" + port + "/test").execute( + new WebSocketUpgradeHandler.Builder() + .addWebSocketListener(new WebSocketTextListener() { + @Override + public void onMessage(String message) { + received.add(message); + log.info("received --> " + message); + latch.countDown(); + } + + + @Override + public void onOpen(WebSocket websocket) { + } + + @Override + public void onClose(WebSocket websocket) { + } + + @Override + public void onError(Throwable t) { + t.printStackTrace(); + } + }).build()).get(); + + getMockEndpoint("mock:client").expectedBodiesReceived("Hello from WS client"); + + websocket.sendMessage("Hello from WS client"); + assertTrue(latch.await(10, TimeUnit.SECONDS)); + + assertMockEndpointsSatisfied(); + + assertEquals(10, received.size()); + for (int i = 0; i < 10; i++) { + assertEquals(">> Welcome on board!", received.get(i)); + } + + websocket.close(); + c.close(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() { + + WebsocketComponent websocketComponent = (WebsocketComponent) context.getComponent("websocket"); + websocketComponent.setSslContextParameters(defineSSLContextParameters()); + websocketComponent.setPort(port); + websocketComponent.setMinThreads(1); + websocketComponent.setMaxThreads(25); + + from("websocket://test") + .log(">>> Message received from WebSocket Client : ${body}") + .to("mock:client") + .loop(10) + .setBody().constant(">> Welcome on board!") + .to("websocket://test"); + } + }; + } +}