| package org.apache.axis2.description; |
| |
| import java.io.InputStream; |
| import java.util.ArrayList; |
| import java.util.Enumeration; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.xml.namespace.QName; |
| |
| import junit.framework.Assert; |
| import junit.framework.Test; |
| import junit.framework.TestSuite; |
| |
| import org.apache.axis2.AbstractTestCase; |
| import org.apache.axis2.wsdl.WSDLConstants; |
| |
| /** |
| * This is a data-driven test class that verifies that |
| * <code>AxisBindingOperation</code>s, <code>AxisOpertion</code>s and |
| * <code>AxisMessage</code>s objects are consistently built when the |
| * <code>WSDLToAxisServiceBuilder.isServerSide</code> attribute is set both to |
| * <code>true</code> and <code>false</code> and the <code>AxisService</code> is |
| * populated. <p/> There are assertions that verify that operations' MEPs, |
| * message labels, message directions AND schema elements tight to the specific |
| * <code>AxisMessage</code>s are correctly populated. |
| */ |
| public class MessageExchangePatternsTest extends AbstractTestCase |
| implements WSDL2Constants { |
| |
| protected static final String WSDL_PATH = "wsdl/meps-wsdl11.wsdl"; |
| |
| // Convenient access to reversed mappings |
| private static final Map REVERSED_MEP; |
| private static final Map REVERSED_DIRECTION; |
| private static final Map REVERSED_MESSAGE_LABEL; |
| private static final Map MESSAGE_LABEL_TO_DIRECTION; |
| |
| static { |
| REVERSED_MEP = new HashMap(); |
| REVERSED_MEP.put(MEP_URI_OUT_IN, MEP_URI_IN_OUT); |
| REVERSED_MEP.put(MEP_URI_OUT_ONLY, MEP_URI_IN_ONLY); |
| REVERSED_MEP.put(MEP_URI_IN_OUT, MEP_URI_OUT_IN); |
| // Axis2 maps the "robust-out-only" operation type as "out-only" |
| REVERSED_MEP.put(MEP_URI_ROBUST_IN_ONLY, MEP_URI_OUT_ONLY); |
| REVERSED_MEP.put(MEP_URI_IN_ONLY, MEP_URI_OUT_ONLY); |
| |
| REVERSED_DIRECTION = new HashMap(); |
| REVERSED_DIRECTION.put(WSDLConstants.WSDL_MESSAGE_DIRECTION_IN, |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT); |
| REVERSED_DIRECTION.put(WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT, |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_IN); |
| |
| REVERSED_MESSAGE_LABEL = new HashMap(); |
| REVERSED_MESSAGE_LABEL.put(MESSAGE_LABEL_IN, MESSAGE_LABEL_OUT); |
| REVERSED_MESSAGE_LABEL.put(MESSAGE_LABEL_OUT, MESSAGE_LABEL_IN); |
| |
| MESSAGE_LABEL_TO_DIRECTION = new HashMap(); |
| MESSAGE_LABEL_TO_DIRECTION.put(MESSAGE_LABEL_IN, |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_IN); |
| MESSAGE_LABEL_TO_DIRECTION.put(MESSAGE_LABEL_OUT, |
| WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT); |
| } |
| |
| protected static String getMEP(String serverSideMEP, boolean isServerSide) { |
| return isServerSide ? serverSideMEP : (String)REVERSED_MEP.get(serverSideMEP); |
| } |
| |
| protected static String getMessageDirection(String serverSideMessageDirection, boolean isServerSide) { |
| return isServerSide ? serverSideMessageDirection : |
| (String)REVERSED_DIRECTION.get(serverSideMessageDirection); |
| } |
| |
| protected static String getMessageLabel(String serverSideMessageLabel, boolean isServerSide) { |
| return isServerSide ? serverSideMessageLabel : |
| (String)REVERSED_MESSAGE_LABEL.get(serverSideMessageLabel); |
| } |
| |
| protected static String getDirectionFromMessageLabel(String serverSideMessageLabel, boolean isServerSide) { |
| String serverSideMessageDirection = (String)MESSAGE_LABEL_TO_DIRECTION.get(serverSideMessageLabel); |
| return getMessageDirection(serverSideMessageDirection, isServerSide); |
| } |
| |
| private AxisBindingOperation bindingOperation; |
| private TestConfig testConfig; |
| |
| public MessageExchangePatternsTest(String testName_) { |
| super(testName_); |
| } |
| |
| public static Test suite() { |
| |
| TestConfig[] testConfigs = buildTestConfigs(WSDL_PATH); |
| |
| String className = MessageExchangePatternsTest.class.getName(); |
| TestSuite suite = new TestSuite(className); |
| for (int i = 0, n = testConfigs.length; i < n; i++) { |
| /* Have JUnit create a TestCase instance for every test method of |
| this class. */ |
| TestSuite testCases = new TestSuite( |
| MessageExchangePatternsTest.class, testConfigs[i].toString()); |
| |
| /* Loop through the TestCase instances and inject them with the test |
| data. */ |
| Enumeration tests = testCases.tests(); |
| while (tests.hasMoreElements()) { |
| MessageExchangePatternsTest test = |
| (MessageExchangePatternsTest)tests.nextElement(); |
| test.setTestConfig(testConfigs[i]); |
| } |
| |
| suite.addTest(testCases); |
| } |
| return suite; |
| } |
| |
| protected static TestConfig[] buildTestConfigs(String wsdlPath) { |
| // Populate WSDL information |
| final String targetNamespace = "http://www.example.org"; |
| final QName serviceName = new QName(targetNamespace, "message-exchange-patterns"); |
| final Map operationNamesToServerSideMEP = new HashMap(); |
| operationNamesToServerSideMEP.put("out-in", MEP_URI_OUT_IN); |
| operationNamesToServerSideMEP.put("out-only", MEP_URI_OUT_ONLY); |
| operationNamesToServerSideMEP.put("in-out", MEP_URI_IN_OUT); |
| operationNamesToServerSideMEP.put("robust-in-only", MEP_URI_ROBUST_IN_ONLY); |
| // Axis2 maps the "robust-out-only" operation type as "out-only" |
| operationNamesToServerSideMEP.put("robust-out-only", MEP_URI_OUT_ONLY); |
| operationNamesToServerSideMEP.put("in-only", MEP_URI_IN_ONLY); |
| final String[] portNames = {"soap11", "soap12"}; |
| final boolean isServerSide[] = {true, false}; |
| final QName inputSchemaElementName = new QName(targetNamespace, "generic-element-in"); |
| final QName outputSchemaElementName = new QName(targetNamespace, "generic-element-out"); |
| |
| /* Create TestConfig objects using combinations between port types (2), |
| operations (5) and the isServerSide flag */ |
| List testConfigs = new ArrayList(); |
| Iterator mepsIt = operationNamesToServerSideMEP.entrySet().iterator(); |
| while (mepsIt.hasNext()) { |
| Map.Entry operationNameToMEP = (Map.Entry)mepsIt.next(); |
| QName operationName = new QName(targetNamespace, (String)operationNameToMEP.getKey()); |
| String serverSideMEP = (String)operationNameToMEP.getValue(); |
| for (int i = 0; i < portNames.length; i++) { |
| OperationReference operationReference = new OperationReference( |
| wsdlPath, serviceName, portNames[i], operationName); |
| for (int j = 0; j < isServerSide.length; j++) { |
| String expectedMEP = getMEP(serverSideMEP, isServerSide[j]); |
| testConfigs.add(new TestConfig( |
| operationReference, isServerSide[j], expectedMEP, |
| inputSchemaElementName, outputSchemaElementName |
| )); |
| } |
| } |
| } |
| return (TestConfig[])testConfigs.toArray(new TestConfig[testConfigs.size()]); |
| } |
| |
| public String getName() { |
| TestConfig testConfig = getTestConfig(); |
| return super.getName() + ". Expected MEP: " + |
| testConfig.getExpectedMep() + " ; isServerSide: " + |
| testConfig.isServerSide(); |
| } |
| |
| public void setUp() throws Exception { |
| TestConfig testConfig = getTestConfig(); |
| OperationReference operationReference = testConfig.getOperationReference(); |
| InputStream contentTypeWsdlIn = getTestResource(operationReference.getWsdlPath()); |
| // Populate AxisService (WSDL port) |
| WSDL11ToAxisServiceBuilder wsdl11Builder = new WSDL11ToAxisServiceBuilder( |
| contentTypeWsdlIn, operationReference.getServiceName(), |
| operationReference.getPortName()); |
| wsdl11Builder.setServerSide(testConfig.isServerSide()); |
| AxisService service = wsdl11Builder.populateService(); |
| |
| // Get Binding Operation |
| AxisEndpoint endpoint = service.getEndpoint(operationReference.getPortName()); |
| AxisBinding binding = endpoint.getBinding(); |
| bindingOperation = (AxisBindingOperation)binding.getChild( |
| operationReference.getOperationName()); |
| } |
| |
| public void testMessageExchangePattern() { |
| TestConfig testConfig = getTestConfig(); |
| AxisOperation axisOperation = bindingOperation.getAxisOperation(); |
| Assert.assertEquals("The Message Exchange Pattern is not the expected", |
| testConfig.getExpectedMep(), axisOperation.getMessageExchangePattern()); |
| } |
| |
| public void testInputMessageDirection() { |
| doTestMessageDirection(MESSAGE_LABEL_IN, |
| getTestConfig().getExpectedInputSchemaElementName()); |
| } |
| |
| public void testOutputMessageDirection() { |
| doTestMessageDirection(MESSAGE_LABEL_OUT, |
| getTestConfig().getExpectedOutputSchemaElementName()); |
| } |
| |
| protected void doTestMessageDirection(String serverSideMessageLabel, |
| QName expectedSchemaElementName) { |
| TestConfig testConfig = getTestConfig(); |
| AxisOperation axisOperation = bindingOperation.getAxisOperation(); |
| |
| String messageLabel = getMessageLabel(serverSideMessageLabel, |
| testConfig.isServerSide()); |
| String expectedDirection = getDirectionFromMessageLabel(serverSideMessageLabel, |
| testConfig.isServerSide()); |
| |
| try { |
| AxisMessage axisMessage = (AxisMessage)axisOperation.getMessage(messageLabel); |
| |
| Assert.assertEquals("The Message Direction is not the expected", |
| expectedDirection, axisMessage.getDirection()); |
| |
| Assert.assertEquals("The Schema Element Name is not the expected", |
| expectedSchemaElementName, |
| axisMessage.getElementQName()); |
| |
| } catch (UnsupportedOperationException e) { |
| // OK, AxisOperation have no message within messageLabel |
| } |
| } |
| |
| protected TestConfig getTestConfig() { |
| return testConfig; |
| } |
| |
| protected void setTestConfig(TestConfig testConfig_) { |
| testConfig = testConfig_; |
| } |
| |
| protected static class TestConfig { |
| |
| private final OperationReference operationReference; |
| private final boolean isServerSide; |
| private final String expectedMep; |
| private final QName expectedInputSchemaElementName; |
| private final QName expectedOutputSchemaElementName; |
| |
| public TestConfig(OperationReference operationReference, |
| boolean isServerSide, |
| String expectedMep, |
| QName expectedInputSchemaElementName, |
| QName expectedOutputSchemaElementName) { |
| this.operationReference = operationReference; |
| this.isServerSide = isServerSide; |
| this.expectedMep = expectedMep; |
| this.expectedInputSchemaElementName = expectedInputSchemaElementName; |
| this.expectedOutputSchemaElementName = expectedOutputSchemaElementName; |
| } |
| |
| public OperationReference getOperationReference() { |
| return operationReference; |
| } |
| |
| public boolean isServerSide() { |
| return isServerSide; |
| } |
| |
| public String getExpectedMep() { |
| return expectedMep; |
| } |
| |
| public QName getExpectedInputSchemaElementName() { |
| return expectedInputSchemaElementName; |
| } |
| |
| public QName getExpectedOutputSchemaElementName() { |
| return expectedOutputSchemaElementName; |
| } |
| |
| public String toString() { |
| OperationReference opRef = getOperationReference(); |
| return "port:" + opRef.getPortName() + "; operation:" + |
| opRef.getOperationName() + "; isServerSide:" + isServerSide() + |
| "; expectedMEP:" + getExpectedMep(); |
| } |
| } |
| |
| } |