/**
* 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.stomp;
import javax.net.ssl.SSLContext;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.SslContext;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.test.AvailablePortFinder;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.camel.util.jsse.KeyManagersParameters;
import org.apache.camel.util.jsse.KeyStoreParameters;
import org.apache.camel.util.jsse.SSLContextParameters;
import org.apache.camel.util.jsse.TrustManagersParameters;
import org.fusesource.stomp.client.Stomp;
public abstract class StompBaseTest extends CamelTestSupport {
protected BrokerService brokerService;
protected int numberOfMessages = 100;
protected int port;
private boolean canTest;
private SSLContextParameters serverSslContextParameters;
private SSLContext serverSslContext;
private SSLContextParameters clientSslContextParameters;
private SSLContext clientSslContext;
protected int getPort() {
return port;
}
/**
* Whether we can test on this box, as not all boxes can be used for reliable CI testing.
*/
protected boolean canTest() {
return canTest;
}
protected boolean isUseSsl() {
return false;
}
@Override
public boolean isUseRouteBuilder() {
return false;
}
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry = super.createRegistry();
if (isUseSsl()) {
registry.bind("sslContextParameters", getClientSSLContextParameters());
}
return registry;
}
@Override
public void setUp() throws Exception {
port = AvailablePortFinder.getNextAvailable(61613);
try {
brokerService = new BrokerService();
brokerService.setPersistent(false);
brokerService.setAdvisorySupport(false);
if (isUseSsl()) {
SslContext sslContext = new SslContext();
sslContext.setSSLContext(getServerSSLContext());
brokerService.setSslContext(sslContext);
brokerService.addConnector("stomp+ssl://localhost:" + getPort() + "?trace=true");
} else {
brokerService.addConnector("stomp://localhost:" + getPort() + "?trace=true");
}
brokerService.start();
brokerService.waitUntilStarted();
super.setUp();
canTest = true;
} catch (Exception e) {
System.err.println("Cannot test due " + e.getMessage() + " more details in the log");
log.warn("Cannot test due " + e.getMessage(), e);
canTest = false;
}
}
@Override
public void tearDown() throws Exception {
super.tearDown();
if (brokerService != null) {
brokerService.stop();
brokerService.waitUntilStopped();
}
}
protected Stomp createStompClient() throws Exception {
Stomp stomp;
if (isUseSsl()) {
stomp = new Stomp("ssl://localhost:" + getPort());
stomp.setSslContext(getClientSSLContext());
} else {
stomp = new Stomp("tcp://localhost:" + getPort());
}
return stomp;
}
protected SSLContextParameters getServerSSLContextParameters() {
if (serverSslContextParameters == null) {
serverSslContextParameters = getSSLContextParameters("jsse/server.keystore", "password");
}
return serverSslContextParameters;
}
protected SSLContext getServerSSLContext() throws Exception {
if (serverSslContext == null) {
serverSslContext = getServerSSLContextParameters().createSSLContext(context);
}
return serverSslContext;
}
protected SSLContextParameters getClientSSLContextParameters() {
if (clientSslContextParameters == null) {
clientSslContextParameters = getSSLContextParameters("jsse/client.keystore", "password");
}
return clientSslContextParameters;
}
protected SSLContext getClientSSLContext() throws Exception {
if (clientSslContext == null) {
clientSslContext = getClientSSLContextParameters().createSSLContext(context);
}
return clientSslContext;
}
private SSLContextParameters getSSLContextParameters(String path, String password) {
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource(path);
ksp.setPassword(password);
KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyPassword(password);
kmp.setKeyStore(ksp);
TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(ksp);
SSLContextParameters sslContextParameters = new SSLContextParameters();
sslContextParameters.setKeyManagers(kmp);
sslContextParameters.setTrustManagers(tmp);
return sslContextParameters;
}
}