| /* |
| * 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(); |
| } |
| } |