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

ffang pushed a commit to branch more-rest-test-new
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git

commit 5ae525d086749666bd5701362b938fc130c48c4d
Author: Freeman Fang <freeman.f...@gmail.com>
AuthorDate: Wed Jan 18 15:14:13 2023 -0500

    add CxfRsGlobalSslProducerTest
    
    (cherry picked from commit 43a46af853850b6d32750fb71928073a0c7b8e3e)
---
 .../springboot/CxfRsGlobalSslProducerTest.java     | 257 +++++++++++++++++++++
 1 file changed, 257 insertions(+)

diff --git 
a/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsGlobalSslProducerTest.java
 
b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsGlobalSslProducerTest.java
new file mode 100644
index 00000000000..3a0e4ff6c04
--- /dev/null
+++ 
b/components-starter/camel-cxf-rest-starter/src/test/java/org/apache/camel/component/cxf/rest/springboot/CxfRsGlobalSslProducerTest.java
@@ -0,0 +1,257 @@
+/*
+ * 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.cxf.rest.springboot;
+
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.SSLContextParametersAware;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.component.cxf.common.message.CxfConstants;
+import org.apache.camel.component.cxf.jaxrs.testbean.Customer;
+import 
org.apache.camel.component.cxf.spring.jaxrs.SpringJAXRSClientFactoryBean;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.spring.boot.CamelContextConfiguration;
+import org.apache.camel.support.jsse.KeyStoreParameters;
+import org.apache.camel.support.jsse.SSLContextParameters;
+import org.apache.camel.support.jsse.TrustManagersParameters;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import 
org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
+import org.springframework.boot.web.server.CertificateFileSslStoreProvider;
+import org.springframework.boot.web.server.Ssl;
+import org.springframework.boot.web.server.Ssl.ClientAuth;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.jaxrs.AbstractJAXRSFactoryBean;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration;
+import org.apache.cxf.transport.https.httpclient.DefaultHostnameVerifier;
+
+
+
+@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
+@CamelSpringBootTest
+@SpringBootTest(
+    classes = {
+        CamelAutoConfiguration.class,
+        CxfRsGlobalSslProducerTest.class,
+        CxfRsGlobalSslProducerTest.TestConfiguration.class,
+        CxfAutoConfiguration.class
+    }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+public class CxfRsGlobalSslProducerTest {
+
+    static int port = CXFTestSupport.getSslPort();
+    
+    
+    @Autowired
+    protected ProducerTemplate template;
+    
+    @BeforeEach
+    public void setUp() throws Exception {
+        JAXRSServerFactoryBean sfb = new JAXRSServerFactoryBean();
+        List<Object> serviceBeans = new ArrayList<Object>();
+        serviceBeans.add(new 
org.apache.camel.component.cxf.jaxrs.testbean.CustomerService());
+        sfb.setServiceBeans(serviceBeans);
+        sfb.setAddress("/CxfRsProducerTest/");
+        sfb.setStaticSubresourceResolution(true);
+        Server server = sfb.create();
+        server.start();
+    }
+
+    
+    protected void setupDestinationURL(Message inMessage) {
+        // do nothing here
+    }
+    
+    @Test
+    public void testCorrectTrustStore() {
+        Exchange exchange = template.send("direct://trust", new MyProcessor());
+
+        // get the response message 
+        Customer response = (Customer) exchange.getMessage().getBody();
+
+        assertNotNull(response, "The response should not be null");
+        assertEquals("123", String.valueOf(response.getId()), "Get a wrong 
customer id");
+        assertEquals("John", response.getName(), "Get a wrong customer name");
+        assertEquals(200, 
exchange.getMessage().getHeader(Exchange.HTTP_RESPONSE_CODE), "Get a wrong 
response code");
+        assertEquals("value", exchange.getMessage().getHeader("key"), "Get a 
wrong header value");
+    }
+
+    @Test
+    public void testNoTrustStore() {
+        Exchange exchange = template.send("direct://noTrust", new 
MyProcessor());
+        assertTrue(exchange.isFailed());
+        Exception e = exchange.getException();
+        assertEquals("javax.net.ssl.SSLHandshakeException", 
e.getCause().getClass().getCanonicalName());
+    }
+
+    @Test
+    public void testWrongTrustStore() {
+        Exchange exchange = template.send("direct://wrongTrust", new 
MyProcessor());
+        assertTrue(exchange.isFailed());
+        Exception e = exchange.getException();
+        assertEquals("javax.net.ssl.SSLHandshakeException", 
e.getCause().getClass().getCanonicalName());
+    }
+
+    private class MyProcessor implements Processor {
+
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            exchange.setPattern(ExchangePattern.InOut);
+            Message inMessage = exchange.getIn();
+            setupDestinationURL(inMessage);
+            // using the http central client API
+            inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_USING_HTTP_API, 
Boolean.TRUE);
+            // set the Http method
+            inMessage.setHeader(Exchange.HTTP_METHOD, "GET");
+            // set the relative path
+            inMessage.setHeader(Exchange.HTTP_PATH, 
"/customerservice/customers/123");
+            // Specify the response class , cxfrs will use InputStream as the 
response object type
+            inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, 
Customer.class);
+            // set a customer header
+            inMessage.setHeader("key", "value");
+            // since we use the Get method, so we don't need to set the 
message body
+            inMessage.setBody(null);
+        }
+    }
+    
+    // *************************************
+    // Config
+    // *************************************
+
+    @Configuration
+    public class TestConfiguration {
+
+        
+        
+        /*
+         * This is the way how to configure TLS/SSL with Bean 
+         */
+        @Bean
+        public ServletWebServerFactory servletWebServerFactory() throws 
UnknownHostException {
+            UndertowServletWebServerFactory undertowWebServerFactory 
+                = new UndertowServletWebServerFactory();
+            Ssl ssl = new Ssl();
+            ssl.setClientAuth(ClientAuth.NONE);
+            ssl.setKeyPassword("changeit");
+            ssl.setKeyStoreType("JKS");
+            ssl.setKeyStore("classpath:ssl/keystore-server.jks");
+            ssl.setKeyStorePassword("changeit");
+            SslBuilderCustomizer sslBuilderCustomizer = 
+                new SslBuilderCustomizer(port, 
InetAddress.getByName("localhost"),
+                                         ssl, 
CertificateFileSslStoreProvider.from(ssl));
+            
undertowWebServerFactory.addBuilderCustomizers(sslBuilderCustomizer);
+            return undertowWebServerFactory;
+        }
+        
+        @Bean
+        DefaultHostnameVerifier defaultHostnameVerifier() {
+            return new DefaultHostnameVerifier();
+        }
+        
+        @Bean
+        SSLContextParameters mySslContext() {
+            SSLContextParameters sslContext = new SSLContextParameters();
+            TrustManagersParameters trustManager = new 
TrustManagersParameters();
+            KeyStoreParameters keyStore = new KeyStoreParameters();
+            keyStore.setType("JKS");
+            keyStore.setPassword("changeit");
+            keyStore.setResource("/ssl/truststore-client.jks");
+            trustManager.setKeyStore(keyStore);
+            sslContext.setTrustManagers(trustManager);
+            return sslContext;
+        }
+        
+        @Bean
+        SSLContextParameters wrongSslContext() {
+            SSLContextParameters sslContext = new SSLContextParameters();
+            TrustManagersParameters trustManager = new 
TrustManagersParameters();
+            KeyStoreParameters keyStore = new KeyStoreParameters();
+            keyStore.setType("JKS");
+            keyStore.setPassword("changeit");
+            keyStore.setResource("/ssl/truststore-wrong.jks");
+            trustManager.setKeyStore(keyStore);
+            sslContext.setTrustManagers(trustManager);
+            return sslContext;
+        }
+        
+        
+        @Bean
+        AbstractJAXRSFactoryBean serviceEndpoint(SSLContextParameters 
mySslContext, DefaultHostnameVerifier defaultHostnameVerifier) {
+            AbstractJAXRSFactoryBean afb = new SpringJAXRSClientFactoryBean();
+            afb.setAddress("https://localhost:"; + port 
+                                   + "/services/CxfRsProducerTest/");
+            return afb;
+        }
+        
+        @Bean
+        CamelContextConfiguration contextConfiguration() {
+            return new CamelContextConfiguration() {
+                @Override
+                public void beforeApplicationStart(CamelContext context) {
+                    SSLContextParameters parameters = 
context.getRegistry().lookupByNameAndType("mySslContext", 
SSLContextParameters.class);
+                    ((SSLContextParametersAware) 
context.getComponent("cxfrs")).setUseGlobalSslContextParameters(true);
+                    context.setSSLContextParameters(parameters);
+                }
+
+                @Override
+                public void afterApplicationStart(CamelContext camelContext) {
+                    
+
+                }
+            };
+        }
+        
+        @Bean
+        public RouteBuilder routeBuilder() {
+            return new RouteBuilder() {
+                @Override
+                public void configure() {
+                    
from("direct://trust").to("cxfrs:bean:serviceEndpoint?hostnameVerifier=#defaultHostnameVerifier&synchronous=true");
+                    
from("direct://wrongTrust").to("cxfrs:bean:serviceEndpoint?sslContextParameters=#wrongSslContext&hostnameVerifier=#defaultHostnameVerifier&synchronous=true");
+                    
from("direct://noTrust").to("cxfrs:bean:serviceEndpoint?sslContextParameters=#wrongSslContext&hostnameVerifier=#defaultHostnameVerifier&synchronous=true");
+                }
+            };
+        }
+    }
+    
+}

Reply via email to