blob: d9490c641e796ffd3e546079ae11ebc845e007d0 [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.tuscany.sca.otest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.tuscany.sca.node.Contribution;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
import testClient.TestException_Exception;
import client.RuntimeBridge;
/**
* An implementation of the Runtime Bridge for the Apache Tuscany SCA runtime (version 2.x)
*
*/
public class TuscanyRuntimeBridge implements RuntimeBridge {
static final String CONTRIBUTION_LOCATION_PROPKEY = "OASIS_TESTENV_CONTRIBUTION_LOCATION";
protected NodeFactory launcher;
protected Node node;
protected Properties expectedErrorMessages;
public TuscanyRuntimeBridge() {
// read test error mapping
expectedErrorMessages = new Properties();
try {
InputStream propertiesStream = this.getClass().getResourceAsStream("/tuscany-oasis-sca-tests-errors.properties");
expectedErrorMessages.load(propertiesStream);
} catch (IOException e) {
System.out.println("Unable to read oasis-sca-tests-errors.properties file");
}
}
public boolean startContribution(String compositeName, String contributionLocation, String[] contributionNames) throws Exception {
try {
// Tuscany specific code which starts the contribution(s) holding the test
Properties ps = new Properties();
ps.setProperty("defaultScheme", "vm");
ps.setProperty("org.apache.tuscany.sca.binding.ws.jaxws.ri.JAXWSBindingProviderFactory.defaultPort", "8080");
launcher = NodeFactory.newInstance(ps);
Contribution[] contributions = new Contribution[contributionNames.length];
String[] contributionURIs = getContributionURIs(contributionLocation, contributionNames);
for (int i = 0; i < contributions.length; i++) {
contributions[i] = new Contribution(contributionNames[i], contributionURIs[i]);
} // end for
node = launcher.createNode(compositeName, contributions);
// Start the node
node.start();
// For debugging
// print out the composites that have been read in success cases
// System.out.println(((NodeImpl)node).dumpDomainComposite());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
throw e;
} // end try
return true;
} // end method startContribution
/**
* Gets the location of the Contributions as URIs
* @param contributionLocation - a location pattern URI, which contains one or more "%1"
* substrings, which are substituted with the name of the contribution to get the URI of
* the contribution
* @return the contribution locations as an array of Strings
*/
protected String[] getContributionURIs(String contributionLocation, String[] contributionNames) throws Exception {
String[] locations = new String[contributionNames.length];
if (locations != null && contributionLocation != null) {
for (int i = 0; i < locations.length; i++) {
String aLocation = contributionLocation.replaceAll("%1", contributionNames[i]);
locations[i] = aLocation;
} // end for
} else {
if (locations == null) {
// No contribution specified - throw an Exception
throw new Exception("Unable to start SCA runtime - no contribution supplied - error");
} else {
// No contribution location supplied - throw an Exception
throw new Exception("Unable to start SCA runtime - no contribution location supplied - error");
} // end if
} // end if
return locations;
} // end getContributionURI
public void stopContribution() {
if (node != null) {
node.stop();
} // end if
if (launcher != null) {
launcher.destroy();
} // end if
} // end method stopContribution
public void checkError(String testName, Throwable ex) throws Throwable {
String expectedMessage = expectedErrorMessages.getProperty(testName);
String receivedMessage = getErrorMessage(ex);//ex.getMessage();
if (expectedMessage == null){
writeMissingMessage(testName, ex);
fail("Null expected error message for test " + testName +
"Please add message to oasis-sca-tests-errors.properties");
} // end if
if (receivedMessage == null){
ex.printStackTrace();
fail("Null received error message for test " + testName);
} // end if
if (expectedMessage.startsWith("*")) {
// allow using * to ignore a message comparison
return;
}
// Deal with the case where the message has variable parts within it
// marked with the characters ***. Here we tokenize the expected string
// and make sure all the individual parts are present in the results string
String expectedMessageParts[] = expectedMessage.split("\\*\\*\\*");
if (expectedMessageParts.length > 1){
int foundParts = 0;
for(int i = 0; i < expectedMessageParts.length; i++){
if (receivedMessage.indexOf(expectedMessageParts[i]) > -1 ){
foundParts++;
}
}
if (foundParts == expectedMessageParts.length){
return;
}
}
// Deal with the case where the end of the message is variable (eg contains absolute filenames)
// and where the only relevant part is the start of the message - in this case the expected
// message only contains the stem section which is unchanging...
if( receivedMessage.length() > expectedMessage.length() ) {
// Truncate the received message to the length of the expected message
receivedMessage = receivedMessage.substring(0, expectedMessage.length() );
} // end if
if (!expectedMessage.equals(receivedMessage)) {
writeIncorrectMessage(testName, expectedMessage, receivedMessage);
}
assertEquals( expectedMessage, receivedMessage );
return;
}
protected void writeMissingMessage(String testName, Throwable ex) {
try {
BufferedWriter out = new BufferedWriter(new FileWriter("target/OTestMissingMsgs.txt", true));
out.write(testName + "=*");
out.newLine();
out.close();
} catch (IOException e) {
}
}
protected void writeIncorrectMessage(String testName, String expected, String received) {
try {
BufferedWriter out = new BufferedWriter(new FileWriter("target/OTestIncorrectMsgs.txt", true));
out.write(testName); out.newLine();
out.write(" " + expected); out.newLine();
out.write(" " + received); out.newLine();
out.close();
} catch (IOException e) {
}
}
protected String getErrorMessage(Throwable ex) {
String errorMessage = null;
if (ex instanceof TestException_Exception) {
TestException_Exception te = (TestException_Exception) ex;
errorMessage = te.getFaultInfo().getMessage();
} else {
errorMessage = ex.getMessage();
}
return errorMessage;
}
} // end class TuscanyRuntimeBridge