blob: 97ec81c91da331fb2c0066867e8239e581b020c8 [file] [log] [blame]
/*
* 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.ode.jbi;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.sql.Connection;
import java.sql.Statement;
import java.util.Properties;
import java.util.regex.Pattern;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.InOut;
import javax.sql.DataSource;
import javax.transaction.TransactionManager;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.servicemix.client.DefaultServiceMixClient;
import org.apache.servicemix.jbi.container.ActivationSpec;
import org.apache.servicemix.jbi.container.JBIContainer;
import org.apache.servicemix.jbi.framework.ComponentContextImpl;
import org.apache.servicemix.jbi.framework.ComponentNameSpace;
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.util.FileUtil;
import org.apache.servicemix.tck.SpringTestSupport;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.junit.Ignore;
import org.springframework.context.support.AbstractXmlApplicationContext;
@Ignore
public class JbiTestBase extends SpringTestSupport {
private static Logger log = LoggerFactory.getLogger(JbiTestBase.class);
protected OdeComponent odeComponent;
protected JBIContainer jbiContainer;
protected Properties testProperties;
protected DefaultServiceMixClient smxClient;
@Override
protected AbstractXmlApplicationContext createBeanFactory() {
return new ClassPathXmlApplicationContext(new String[] {
"/smx-base.xml",
"/" + getTestName() + "/smx.xml"
});
}
private void initOdeDb() throws Exception {
TransactionManager tm = (TransactionManager) getBean("transactionManager");
tm.begin();
Connection conn = ((DataSource) getBean("odeDS")).getConnection();
Statement s = conn.createStatement();
s.execute("delete from bpel_process");
s.close();
tm.commit();
}
@Override
protected void setUp() throws Exception {
super.setUp();
initOdeDb();
jbiContainer = ((JBIContainer) getBean("jbi"));
odeComponent = new OdeComponent();
ComponentContextImpl cc = new ComponentContextImpl(jbiContainer, new ComponentNameSpace(jbiContainer.getName(), "ODE"));
ActivationSpec activationSpec = new ActivationSpec();
activationSpec.setComponent(odeComponent);
activationSpec.setComponentName("ODE");
jbiContainer.activateComponent(new File("target/test/smx/ode").getAbsoluteFile(), odeComponent, "", cc, activationSpec, true, false, false, null);
testProperties = new Properties();
testProperties.load(getClass().getResourceAsStream("/" + getTestName() + "/test.properties"));
smxClient = new DefaultServiceMixClient(jbiContainer);
}
protected String getTestName() {
return getClass().getSimpleName();
}
protected void enableProcess(String resource, boolean enable) throws Exception {
resource = "target/test/resources/" + resource;
String process = resource.substring(resource.lastIndexOf('/') + 1);
String dir = new File(resource).getAbsolutePath();
log.debug("enableProcess " + resource + " " + enable + " path: " + dir);
if (enable) {
odeComponent.getServiceUnitManager().deploy(process, dir);
odeComponent.getServiceUnitManager().init(process, dir);
odeComponent.getServiceUnitManager().start(process);
} else {
odeComponent.getServiceUnitManager().stop(process);
odeComponent.getServiceUnitManager().undeploy(process, dir);
}
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
protected void go() throws Exception {
boolean manualDeploy = Boolean.parseBoolean("" + testProperties.getProperty("manualDeploy"));
if (!manualDeploy)
enableProcess(getTestName(), true);
try {
int i = 0;
boolean loop;
do {
String prefix = i == 0 ? "" : "" + i;
loop = i == 0;
{
String deploy = testProperties.getProperty(prefix + "deploy");
if (deploy != null) {
loop = true;
enableProcess(getTestName() + "/" + deploy, true);
}
}
{
String undeploy = testProperties.getProperty(prefix + "undeploy");
if (undeploy != null) {
loop = true;
enableProcess(getTestName() + "/" + undeploy, false);
}
}
String request = testProperties.getProperty(prefix + "request");
if (request != null && request.startsWith("@")) {
request = inputStreamToString(getClass().getResourceAsStream("/" + getTestName() + "/" + request.substring(1)));
}
String expectedResponse = testProperties.getProperty(prefix + "response");
{
String delay = testProperties.getProperty(prefix + "delay");
if (delay != null) {
loop = true;
long d = Long.parseLong(delay);
log.debug("Sleeping " + d + " ms");
Thread.sleep(d);
}
}
{
String httpUrl = testProperties.getProperty(prefix + "http.url");
if (httpUrl != null && request != null) {
loop = true;
log.debug(getTestName() + " sending http request to " + httpUrl + " request: " + request);
URLConnection connection = new URL(httpUrl).openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
//Send request
OutputStream os = connection.getOutputStream();
PrintWriter wt = new PrintWriter(os);
wt.print(request);
wt.flush();
wt.close();
// Read the response.
String result = inputStreamToString(connection.getInputStream());
log.debug(getTestName() + " have result: " + result);
matchResponse(expectedResponse, result, true);
}
}
{
if (testProperties.getProperty(prefix + "nmr.service") != null && request != null) {
loop = true;
InOut io = smxClient.createInOutExchange();
io.setService(QName.valueOf(testProperties.getProperty(prefix + "nmr.service")));
io.setOperation(QName.valueOf(testProperties.getProperty(prefix + "nmr.operation")));
io.getInMessage().setContent(new StreamSource(new ByteArrayInputStream(request.getBytes())));
smxClient.sendSync(io,20000);
if (io.getStatus() == ExchangeStatus.ACTIVE) {
assertNotNull(io.getOutMessage());
String result = new SourceTransformer().contentToString(io.getOutMessage());
matchResponse(expectedResponse, result, true);
smxClient.done(io);
} else {
matchResponse(expectedResponse, "", false);
}
}
}
i++;
} while (loop);
} finally {
if (!manualDeploy)
enableProcess(getTestName(), false);
}
}
protected void matchResponse(String expectedResponse, String result, boolean succeeded) {
if (succeeded) {
assertTrue("Response doesn't match expected regex.\nExpected: " + expectedResponse + "\nReceived: " + result, Pattern.compile(expectedResponse, Pattern.DOTALL).matcher(result).matches());
} else {
assertTrue("Expected success, but got fault", expectedResponse.equals("FAULT"));
}
}
private String inputStreamToString(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileUtil.copyInputStream(is, baos);
return baos.toString();
}
}