/**
* 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.cxf.jms.testsuite.testcases;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.net.URL;
import java.util.Map;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceException;
import org.apache.cxf.BusFactory;
import org.apache.cxf.jms.testsuite.services.TestSuiteServer;
import org.apache.cxf.jms.testsuite.util.JMSTestUtil;
import org.apache.cxf.jms_simple.JMSSimplePortType;
import org.apache.cxf.jms_simple.JMSSimpleService0001;
import org.apache.cxf.jms_simple.JMSSimpleService0003;
import org.apache.cxf.jms_simple.JMSSimpleService0005;
import org.apache.cxf.jms_simple.JMSSimpleService0006;
import org.apache.cxf.jms_simple.JMSSimpleService0008;
import org.apache.cxf.jms_simple.JMSSimpleService0009;
import org.apache.cxf.jms_simple.JMSSimpleService0010;
import org.apache.cxf.jms_simple.JMSSimpleService0011;
import org.apache.cxf.jms_simple.JMSSimpleService0012;
import org.apache.cxf.jms_simple.JMSSimpleService0013;
import org.apache.cxf.jms_simple.JMSSimpleService0014;
import org.apache.cxf.jms_simple.JMSSimpleService0101;
import org.apache.cxf.jms_simple.JMSSimpleService1001;
import org.apache.cxf.jms_simple.JMSSimpleService1009;
import org.apache.cxf.jms_simple.JMSSimpleService1101;
import org.apache.cxf.jms_simple.JMSSimpleService1105;
import org.apache.cxf.jms_simple.JMSSimpleService1109;
import org.apache.cxf.service.model.EndpointInfo;
import org.apache.cxf.testsuite.testcase.MessagePropertiesType;
import org.apache.cxf.testsuite.testcase.TestCaseType;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
import org.apache.cxf.testutil.common.EmbeddedJMSBrokerLauncher;
import org.apache.cxf.transport.jms.JMSConfigFactory;
import org.apache.cxf.transport.jms.JMSConfiguration;
import org.apache.cxf.transport.jms.JMSConstants;
import org.apache.cxf.transport.jms.JMSFactory;
import org.apache.cxf.transport.jms.JMSMessageHeadersType;
import org.apache.cxf.transport.jms.spec.JMSSpecConstants;
import org.apache.cxf.transport.jms.util.JMSSender;
import org.apache.cxf.transport.jms.util.JMSUtil;
import org.apache.cxf.transport.jms.util.ResourceCloser;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Test;
/**
*
*/
public class SOAPJMSTestSuiteTest extends AbstractBusClientServerTestBase {
static EmbeddedJMSBrokerLauncher broker;
java.io.Closeable closeable;
@BeforeClass
public static void startServers() throws Exception {
broker = new EmbeddedJMSBrokerLauncher();
launchServer(broker);
TestSuiteServer.setJndiUrl(broker.getBrokerURL());
assertTrue("server did not launch correctly", launchServer(TestSuiteServer.class, true));
createStaticBus();
}
@After
public void close() throws Exception {
if (closeable != null) {
closeable.close();
closeable = null;
}
}
private void oneWayTest(TestCaseType testcase, JMSSimplePortType port) throws Exception {
closeable = (java.io.Closeable)port;
InvocationHandler handler = Proxy.getInvocationHandler(port);
BindingProvider bp = (BindingProvider)handler;
Map<String, Object> requestContext = bp.getRequestContext();
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
requestContext.put(JMSConstants.JMS_CLIENT_REQUEST_HEADERS, requestHeader);
Exception e = null;
try {
port.ping("test");
} catch (Exception e1) {
e = e1;
}
checkJMSProperties(testcase, requestHeader);
if (e != null) {
throw e;
}
}
private void twoWayTest(TestCaseType testcase, final JMSSimplePortType port)
throws Exception {
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
twoWayTestWithRequestHeader(testcase, port, requestHeader);
}
private void twoWayTestWithRequestHeader(TestCaseType testcase, final JMSSimplePortType port,
JMSMessageHeadersType requestHeader)
throws Exception {
closeable = (java.io.Closeable)port;
InvocationHandler handler = Proxy.getInvocationHandler(port);
BindingProvider bp = (BindingProvider)handler;
Map<String, Object> requestContext = bp.getRequestContext();
if (requestHeader == null) {
requestHeader = new JMSMessageHeadersType();
}
requestContext.put(JMSConstants.JMS_CLIENT_REQUEST_HEADERS, requestHeader);
Exception e = null;
try {
String response = port.echo("test");
assertEquals(response, "test");
} catch (WebServiceException ew) {
throw ew;
} catch (Exception e1) {
e = e1;
}
Map<String, Object> responseContext = bp.getResponseContext();
JMSMessageHeadersType responseHeader = (JMSMessageHeadersType)responseContext
.get(JMSConstants.JMS_CLIENT_RESPONSE_HEADERS);
checkJMSProperties(testcase, requestHeader, responseHeader);
if (e != null) {
throw e;
}
}
@Test
public void test0001() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0001");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0001", "SimplePort",
JMSSimpleService0001.class,
JMSSimplePortType.class);
oneWayTest(testcase, simplePort);
}
@Test
public void test0101() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0101");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0101", "SimplePort",
JMSSimpleService0101.class,
JMSSimplePortType.class);
oneWayTest(testcase, simplePort);
}
@Test
public void test0002() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0002");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0001", "SimplePort",
JMSSimpleService0001.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
requestHeader.setJMSCorrelationID("Correlator0002");
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
}
@Test
public void test0102() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0102");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0101", "SimplePort",
JMSSimpleService0101.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0003() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0003");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0003", "SimplePort",
JMSSimpleService0003.class,
JMSSimplePortType.class);
oneWayTest(testcase, simplePort);
}
@Test
public void test0004() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0004");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0003", "SimplePort",
JMSSimpleService0003.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0005() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0005");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0005", "SimplePort",
JMSSimpleService0005.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0006() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0006");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0006", "SimplePort",
JMSSimpleService0006.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0008() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0008");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0008", "SimplePort",
JMSSimpleService0008.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
requestHeader.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
requestHeader.setTimeToLive(14400000);
requestHeader.setJMSPriority(8);
requestHeader.setJMSReplyTo("dynamicQueues/replyqueue0008");
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
}
@Test
public void test0009() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0009");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0009", "SimplePort",
JMSSimpleService0009.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
requestHeader.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
requestHeader.setTimeToLive(10800000);
requestHeader.setJMSPriority(3);
// FIXME had to change this
requestHeader.setJMSReplyTo("dynamicQueues/replyqueue00091");
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
}
@Test
public void test0010() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0010");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0010", "SimplePort",
JMSSimpleService0010.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0011() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test0011");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0011", "SimplePort",
JMSSimpleService0011.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0012() throws Exception {
// same to test0002
TestCaseType testcase = JMSTestUtil.getTestCase("test0012");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0012", "SimplePort",
JMSSimpleService0012.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0013() throws Exception {
// same to test0002
TestCaseType testcase = JMSTestUtil.getTestCase("test0013");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0013", "SimplePort",
JMSSimpleService0013.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test0014() throws Exception {
// same to test0002
TestCaseType testcase = JMSTestUtil.getTestCase("test0014");
final JMSSimplePortType simplePort = getPort("JMSSimpleService0014", "SimplePort",
JMSSimpleService0014.class,
JMSSimplePortType.class);
twoWayTest(testcase, simplePort);
}
@Test
public void test1001() throws Exception {
// same to test0002
TestCaseType testcase = JMSTestUtil.getTestCase("test1001");
final JMSSimplePortType simplePort = getPort("JMSSimpleService1001", "SimplePort",
JMSSimpleService1001.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
requestHeader.setSOAPJMSBindingVersion("0.3");
try {
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
} catch (Exception e) {
assertTrue(e.getMessage().contains("Unrecognized BindingVersion"));
}
}
@Test
public void test1002() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1002");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1003() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1003");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1004() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1004");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1006() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1006");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1007() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1007");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1008() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1008");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1009() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1009");
final JMSSimplePortType simplePort = getPort("JMSSimpleService1009", "SimplePort",
JMSSimpleService1009.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
try {
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
} catch (Exception e) {
assertTrue(e.getMessage().contains("Unknow JMS Variant"));
}
}
@Test
public void test1101() throws Exception {
// same to test0002
TestCaseType testcase = JMSTestUtil.getTestCase("test1101");
final JMSSimplePortType simplePort = getPort("JMSSimpleService1101", "SimplePort",
JMSSimpleService1101.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
requestHeader.setSOAPJMSBindingVersion("0.3");
try {
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
} catch (Exception e) {
assertTrue(e.getMessage().contains("Unrecognized BindingVersion"));
}
}
@Test
public void test1102() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1102");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1103() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1103");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1104() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1104");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1105() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1105");
final JMSSimplePortType simplePort = getPort("JMSSimpleService1105", "SimplePort",
JMSSimpleService1105.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
requestHeader.setSOAPJMSSOAPAction("mismatch");
try {
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
} catch (Exception e) {
assertTrue(e.getMessage().contains("Mismatched SoapAction"));
}
}
@Test
public void test1106() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1106");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1107() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1107");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1108() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1108");
twoWayTestWithCreateMessage(testcase);
}
@Test
public void test1109() throws Exception {
TestCaseType testcase = JMSTestUtil.getTestCase("test1109");
final JMSSimplePortType simplePort = getPort("JMSSimpleService1109", "SimplePort",
JMSSimpleService1109.class,
JMSSimplePortType.class);
JMSMessageHeadersType requestHeader = new JMSMessageHeadersType();
try {
twoWayTestWithRequestHeader(testcase, simplePort, requestHeader);
} catch (Exception e) {
assertTrue(e.getMessage().contains("Unknow JMS Variant"));
}
}
public <T1, T2> T2 getPort(String serviceName, String portName, Class<T1> serviceClass,
Class<T2> portTypeClass) throws Exception {
String namespace = "http://cxf.apache.org/jms_simple";
QName qServiceName = new QName(namespace, serviceName);
QName qPortName = new QName(namespace, portName);
URL wsdl = getClass().getResource("/wsdl/jms_spec_testsuite.wsdl");
String wsdlString = wsdl.toString();
broker.updateWsdl(getBus(), wsdlString);
BusFactory.setThreadDefaultBus(getBus());
BusFactory.setDefaultBus(getBus());
Class<? extends Service> svcls = serviceClass.asSubclass(Service.class);
Constructor<? extends Service> serviceConstructor = svcls.getConstructor(URL.class,
QName.class);
Service service = serviceConstructor.newInstance(new Object[] {
wsdl, qServiceName
});
broker.updateWsdl(getBus(), wsdlString);
return service.getPort(qPortName, portTypeClass);
}
public void checkJMSProperties(Message message, MessagePropertiesType messageProperties)
throws JMSException {
// todo messagetype
// todo messageid
if (messageProperties.isSetDeliveryMode()) {
assertEquals(message.getJMSDeliveryMode(), messageProperties.getDeliveryMode()
.intValue());
}
if (messageProperties.isSetPriority()) {
assertEquals(message.getJMSPriority(), messageProperties.getPriority().intValue());
}
if (messageProperties.isSetExpiration()) {
assertEquals(message.getJMSExpiration(), messageProperties.getExpiration().intValue());
}
if (messageProperties.isSetReplyTo() && !messageProperties.getReplyTo().trim().equals("")) {
assertEquals(message.getJMSReplyTo().toString(), messageProperties.getReplyTo());
}
if (messageProperties.isSetCorrelationID()
&& !messageProperties.getCorrelationID().trim().equals("")) {
assertEquals(message.getJMSCorrelationID(), messageProperties.getCorrelationID());
}
if (messageProperties.isSetDestination()
&& !messageProperties.getDestination().trim().equals("")) {
assertEquals(message.getJMSDestination().toString(), messageProperties.getDestination());
}
if (messageProperties.isSetRedelivered()) {
assertEquals(message.getJMSRedelivered(), messageProperties.isRedelivered());
}
if (messageProperties.isSetBindingVersion()
&& !messageProperties.getBindingVersion().trim().equals("")) {
assertEquals(message.getStringProperty(JMSSpecConstants.BINDINGVERSION_FIELD),
messageProperties.getBindingVersion());
}
if (messageProperties.isSetTargetService()
&& !messageProperties.getTargetService().trim().equals("")) {
assertEquals(message.getStringProperty(JMSSpecConstants.TARGETSERVICE_FIELD),
messageProperties.getTargetService());
}
if (messageProperties.isSetContentType()
&& !messageProperties.getContentType().trim().equals("")) {
assertEquals(message.getStringProperty(JMSSpecConstants.CONTENTTYPE_FIELD),
messageProperties.getContentType());
}
if (messageProperties.isSetSoapAction()
&& !messageProperties.getSoapAction().trim().equals("")) {
assertEquals(message.getStringProperty(JMSSpecConstants.SOAPACTION_FIELD),
messageProperties.getSoapAction());
}
if (messageProperties.isSetRequestURI()
&& !messageProperties.getRequestURI().trim().equals("")) {
assertEquals(message.getStringProperty(JMSSpecConstants.REQUESTURI_FIELD),
messageProperties.getRequestURI().trim());
}
if (messageProperties.isSetIsFault()) {
assertEquals(message.getBooleanProperty(JMSSpecConstants.ISFAULT_FIELD),
messageProperties.isIsFault());
}
// todo messagebody
}
public void checkJMSProperties(TestCaseType testcase, JMSMessageHeadersType requestHeader)
throws JMSException {
if (testcase.getRequestMessage() != null) {
checkJMSProperties(testcase.getRequestMessage(), requestHeader);
}
}
public void checkJMSProperties(TestCaseType testcase, JMSMessageHeadersType requestHeader,
JMSMessageHeadersType responseHeader) throws JMSException {
if (testcase.getRequestMessage() != null) {
checkJMSProperties(testcase.getRequestMessage(), requestHeader);
}
if (testcase.getResponseMessage() != null) {
checkJMSProperties(testcase.getResponseMessage(), responseHeader);
}
if (requestHeader.getJMSCorrelationID() != null) {
assertEquals(requestHeader.getJMSCorrelationID(), responseHeader.getJMSCorrelationID());
}
// Correlation id should be the message id
/*
else {
assertEquals(requestHeader.getJMSCorrelationID(), responseHeader.getJMSCorrelationID());
}
*/
}
private void checkJMSProperties(MessagePropertiesType messageProperties,
JMSMessageHeadersType header) {
// todo messagetype
// todo messageid
if (messageProperties.isSetDeliveryMode()) {
int dm = 0;
if (header.isSetJMSDeliveryMode()) {
dm = header.getJMSDeliveryMode();
}
assertEquals(dm, messageProperties.getDeliveryMode().intValue());
}
if (messageProperties.isSetPriority()) {
assertEquals(header.getJMSPriority(), messageProperties.getPriority().intValue());
}
if (messageProperties.isSetBindingVersion()
&& !messageProperties.getBindingVersion().trim().equals("")) {
assertEquals(header.getSOAPJMSBindingVersion(), messageProperties.getBindingVersion());
}
if (messageProperties.isSetTargetService()
&& !messageProperties.getTargetService().trim().equals("")) {
assertEquals(header.getSOAPJMSTargetService(), messageProperties.getTargetService());
}
if (messageProperties.isSetContentType()
&& !messageProperties.getContentType().trim().equals("")) {
assertEquals(header.getSOAPJMSContentType(), messageProperties.getContentType());
}
if (messageProperties.isSetSoapAction()
&& !messageProperties.getSoapAction().trim().equals("")) {
assertEquals(header.getSOAPJMSSOAPAction(), messageProperties.getSoapAction());
}
if (messageProperties.isSetRequestURI()
&& !messageProperties.getRequestURI().trim().equals("")) {
assertEquals(header.getSOAPJMSRequestURI(), messageProperties.getRequestURI().trim());
}
if (messageProperties.isSetIsFault()) {
assertEquals(header.isSOAPJMSIsFault(), messageProperties.isIsFault());
}
// todo messagebody
}
public void twoWayTestWithCreateMessage(final TestCaseType testcase) throws Exception {
String address = testcase.getAddress();
EndpointInfo endpointInfo = new EndpointInfo();
endpointInfo.setAddress(JMSTestUtil.getFullAddress(address, broker.getBrokerURL()));
JMSConfiguration jmsConfig = JMSConfigFactory.createFromEndpointInfo(staticBus, endpointInfo , null);
ResourceCloser closer = new ResourceCloser();
try {
Connection connection = closer.register(JMSFactory.createConnection(jmsConfig));
connection.start();
Session session = closer.register(connection.createSession(false, Session.AUTO_ACKNOWLEDGE));
Destination targetDest = jmsConfig.getTargetDestination(session);
Destination replyToDestination = jmsConfig.getReplyToDestination(session, null);
JMSSender sender = JMSFactory.createJmsSender(jmsConfig, null);
Message jmsMessage = JMSTestUtil.buildJMSMessageFromTestCase(testcase, session, replyToDestination);
sender.sendMessage(session, targetDest, jmsMessage);
Message replyMessage = JMSUtil.receive(session, replyToDestination,
jmsMessage.getJMSMessageID(), 10000, true);
checkReplyMessage(replyMessage, testcase);
} catch (JMSException e) {
throw JMSUtil.convertJmsException(e);
} finally {
closer.close();
}
}
private void checkReplyMessage(Message replyMessage, TestCaseType testcase) throws JMSException {
checkJMSProperties(replyMessage, testcase.getResponseMessage());
}
}