/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.ws.jaxws.cxf.jms; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.transport.jms.JMSConduit; import org.apache.cxf.transport.jms.JMSConfiguration; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.container.test.api.TargetsContainer; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.jboss.ws.common.DOMUtils; import org.jboss.ws.common.IOUtils; import org.jboss.wsf.test.JBossWSTest; import org.jboss.wsf.test.JBossWSTestHelper; import org.junit.Test; import org.junit.runner.RunWith; import javax.jms.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.io.File; import java.net.URL; import java.util.Properties; /** * Test case for deploying an archive with a JMS (SOAP-over-JMS 1.0) endpoint only * * @author alessio.soldano@jboss.com * @since 10-Jun-2011 */ @RunWith(Arquillian.class) public class JMSEndpointOnlyDeploymentTestCase extends JBossWSTest { private static final String JMS_SERVER = "jms"; private static volatile boolean waitForResponse; private static boolean useHornetQ() { return JBossWSTestHelper.isTargetWildFly9(); } @Deployment(name="jaxws-cxf-jms-only-deployment-test-servlet", order=1, testable = false) @TargetsContainer(JMS_SERVER) public static WebArchive createWarDeployment() { WebArchive archive = ShrinkWrap.create(WebArchive.class, "jaxws-cxf-jms-only-deployment-test-servlet.war"); archive .setManifest(new StringAsset("Manifest-Version: 1.0\n" + "Dependencies: org.jboss.ws.cxf.jbossws-cxf-client services," + (useHornetQ() ? "org.hornetq\n" : "org.apache.activemq.artemis"))) .addAsManifestResource(new File(JBossWSTestHelper.getTestResourcesDir() + "/jaxws/cxf/jms/META-INF/permissions.xml"), "permissions.xml") .addAsWebInfResource(new File(JBossWSTestHelper.getTestResourcesDir() + "/jaxws/cxf/jms/META-INF/wsdl/HelloWorldService.wsdl"), "classes/META-INF/wsdl/HelloWorldService.wsdl") .addClass(org.jboss.test.ws.jaxws.cxf.jms.DeploymentTestServlet.class) .addClass(org.jboss.test.ws.jaxws.cxf.jms.HelloWorld.class); return archive; } @Deployment(name="jaxws-cxf-jms-only-deployment", order=2, testable = false) @TargetsContainer(JMS_SERVER) public static JavaArchive createJarDeployment() { JavaArchive archive = ShrinkWrap.create(JavaArchive.class,"jaxws-cxf-jms-only-deployment.jar"); archive .setManifest(new StringAsset("Manifest-Version: 1.0\n" + "Dependencies: " + (useHornetQ() ? "org.hornetq\n" : "org.apache.activemq.artemis"))) .addClass(org.jboss.test.ws.jaxws.cxf.jms.HelloWorld.class) .addClass(org.jboss.test.ws.jaxws.cxf.jms.HelloWorldImpl.class) .addAsManifestResource(new File(JBossWSTestHelper.getTestResourcesDir() + "/jaxws/cxf/jms/META-INF/wsdl/HelloWorldService.wsdl"), "wsdl/HelloWorldService.wsdl"); return archive; } @Test @RunAsClient public void testJMSEndpointServerSide() throws Exception { URL url = new URL("http://" + getServerHost() + ":" + getServerPort(CXF_TESTS_GROUP_QUALIFIER, JMS_SERVER) + "/jaxws-cxf-jms-only-deployment-test-servlet"); assertEquals("true", IOUtils.readAndCloseStream(url.openStream())); } @Test @RunAsClient public void testJMSEndpointClientSide() throws Exception { URL wsdlUrl = getResourceURL("jaxws/cxf/jms/META-INF/wsdl/HelloWorldService.wsdl"); QName serviceName = new QName("http://org.jboss.ws/jaxws/cxf/jms", "HelloWorldService"); Service service = Service.create(wsdlUrl, serviceName); HelloWorld proxy = (HelloWorld) service.getPort(new QName("http://org.jboss.ws/jaxws/cxf/jms", "HelloWorldImplPort"), HelloWorld.class); setupProxy(proxy); try { assertEquals("Hi", proxy.echo("Hi")); } catch (Exception e) { rethrowAndHandleAuthWarning(e); } } @Test @RunAsClient public void testMessagingClient() throws Exception { String reqMessage = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" + " <soap:Body>" + " <ns2:echo xmlns:ns2=\"http://org.jboss.ws/jaxws/cxf/jms\">" + " <arg0>Hi</arg0>" + " </ns2:echo>" + " </soap:Body>" + "</soap:Envelope>"; String resMessage = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" + " <soap:Body>" + " <ns2:echoResponse xmlns:ns2=\"http://org.jboss.ws/jaxws/cxf/jms\">" + " <return>Hi</return>" + " </ns2:echoResponse>" + " </soap:Body>" + "</soap:Envelope>"; Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, getInitialContextFactory()); env.put(Context.PROVIDER_URL, getRemotingProtocol() + "://" + getServerHost() + ":" + getServerPort(CXF_TESTS_GROUP_QUALIFIER, JMS_SERVER)); env.put(Context.SECURITY_PRINCIPAL, JBossWSTestHelper.getTestUsername()); env.put(Context.SECURITY_CREDENTIALS, JBossWSTestHelper.getTestPassword()); InitialContext context = null; try { context = new InitialContext(env); } catch (Exception e) { rethrowAndHandleAuthWarning(e); } QueueConnectionFactory connectionFactory = (QueueConnectionFactory)context.lookup("jms/RemoteConnectionFactory"); Queue reqQueue = (Queue)context.lookup("jms/queue/test"); Queue resQueue = (Queue)context.lookup("jms/queue/test"); QueueConnection con = connectionFactory.createQueueConnection(JBossWSTestHelper.getTestUsername(), JBossWSTestHelper.getTestPassword()); QueueSession session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); QueueReceiver receiver = session.createReceiver(resQueue); ResponseListener responseListener = new ResponseListener(); receiver.setMessageListener(responseListener); con.start(); TextMessage message = session.createTextMessage(reqMessage); message.setJMSReplyTo(resQueue); message.setStringProperty("SOAPJMS_contentType", "text/xml"); message.setStringProperty("SOAPJMS_requestURI", "jms:queue:testQueue"); waitForResponse = true; QueueSender sender = session.createSender(reqQueue); sender.send(message); sender.close(); int timeout = 30000; while (waitForResponse && timeout > 0) { Thread.sleep(100); timeout -= 100; } assertNotNull("Expected response message", responseListener.resMessage); assertEquals(DOMUtils.parse(resMessage), DOMUtils.parse(responseListener.resMessage)); sender.close(); receiver.close(); con.stop(); session.close(); con.close(); } public static class ResponseListener implements MessageListener { public String resMessage; public void onMessage(Message msg) { TextMessage textMessage = (TextMessage)msg; try { resMessage = textMessage.getText(); waitForResponse = false; } catch (Throwable t) { t.printStackTrace(); } } } private void setupProxy(HelloWorld proxy) { JMSConduit conduit = (JMSConduit)ClientProxy.getClient(proxy).getConduit(); JMSConfiguration config = conduit.getJmsConfig(); config.setUserName(JBossWSTestHelper.getTestUsername()); config.setPassword(JBossWSTestHelper.getTestPassword()); Properties props = conduit.getJmsConfig().getJndiEnvironment(); props.put(Context.SECURITY_PRINCIPAL, JBossWSTestHelper.getTestUsername()); props.put(Context.SECURITY_CREDENTIALS, JBossWSTestHelper.getTestPassword()); } private static void rethrowAndHandleAuthWarning(Exception e) throws Exception { System.out.println("This test requires a testQueue JMS queue and a user with 'guest' role to be available on the application server; " + "queue are easily added using jboss-cli.sh/bat, while users are added using add-user.sh/bat. When running test please specify user " + "and password using -Dtest.username=\"foo\" -Dtest.password=\"bar\"."); throw e; } }