/* * 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.as.webservices.dmr; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.jboss.as.controller.RunningMode; import org.jboss.as.server.Services; import org.jboss.as.server.moduleservice.ServiceModuleLoader; import org.jboss.as.subsystem.test.AbstractSubsystemBaseTest; import org.jboss.as.subsystem.test.AdditionalInitialization; import org.jboss.as.subsystem.test.KernelServices; import org.jboss.as.subsystem.test.KernelServicesBuilder; import org.jboss.as.webservices.util.WSServices; import org.jboss.msc.service.ServiceContainer; import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.ServiceTarget; import org.jboss.wsf.spi.classloading.ClassLoaderProvider; import org.jboss.wsf.spi.management.ServerConfig; import org.jboss.wsf.spi.metadata.config.ClientConfig; import org.jboss.wsf.spi.metadata.config.EndpointConfig; import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainMetaData; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; /** * A test for checking the services that are created by the subsystem after boot. * * @author <a href="mailto:alessio.soldano@jboss.com>Alessio Soldano</a> */ public class WebservicesSubsystemRuntimeTestCase extends AbstractSubsystemBaseTest { public WebservicesSubsystemRuntimeTestCase() { super(WSExtension.SUBSYSTEM_NAME, new WSExtension()); } @Override protected String getSubsystemXml() throws IOException { return readResource("ws-subsystem20-rt.xml"); } protected AdditionalInitialization createAdditionalInitialization() { return new AdditionalInitialization() { @Override protected RunningMode getRunningMode() { return RunningMode.NORMAL; } @Override protected void addExtraServices(ServiceTarget target) { super.addExtraServices(target); target.addService(Services.JBOSS_SERVICE_MODULE_LOADER, new ServiceModuleLoader(null)).install(); } }; } @AfterClass public static void resetClassLoaderProvider() { //HACK: another hack required because we're not running in a valid modular environment, hence at the of the test //the WS ClassLoaderProvider is still configured to use a ModularClassLoaderProvider backed by the fake //module loader installed by this testcase. As a consequence other tests running after this might fail. //The issue can be prevented in various ways, but given this whole test is a hack as we're not running in a //proper environment, I prefer to do as below for now (after all, this is a testsuite issue only, WFLY-4122) ClassLoaderProvider.setDefaultProvider(new ClassLoaderProvider() { @Override public ClassLoader getWebServiceSubsystemClassLoader() { return Thread.currentThread().getContextClassLoader(); } @Override public ClassLoader getServerJAXRPCIntegrationClassLoader() { return Thread.currentThread().getContextClassLoader(); } @Override public ClassLoader getServerIntegrationClassLoader() { return Thread.currentThread().getContextClassLoader(); } }); } @Test public void testSubsystem() throws Exception { KernelServicesBuilder builder = createKernelServicesBuilder(createAdditionalInitialization()).setSubsystemXml(getSubsystemXml()); KernelServices mainServices = builder.build(); if (!mainServices.isSuccessfulBoot()) { Assert.fail(mainServices.getBootError().toString()); } //WSDL soap:address rewrite engine options test ServerConfig serverConfig = getMSCService(mainServices.getContainer(), WSServices.CONFIG_SERVICE, ServerConfig.class); Assert.assertTrue(serverConfig.isModifySOAPAddress()); Assert.assertEquals("localhost", serverConfig.getWebServiceHost()); Assert.assertEquals(9895, serverConfig.getWebServicePort()); Assert.assertEquals(9944, serverConfig.getWebServiceSecurePort()); Assert.assertEquals("https", serverConfig.getWebServiceUriScheme()); //Client & Endpoint predefined configuration tests //HACK: we need to manually reload the client/endpoint configs as the ServerConfigService is actually not starting in this test; //the reason is that it requires services which are not installed here and even if those were available it would fail to start //because we're not running in a modular environment and hence it won't be able to detect the proper ws stack implementation. //Even if we made the subsystem work with a flat classloader (which would not make sense except for the tests here), we'd have //to deal a hell of ws specific maven dependencies here... so really not worth the effort. serverConfig.reloadClientConfigs(); ClientConfig clCfg = serverConfig.getClientConfig("My-Client-Config"); Assert.assertNotNull(clCfg); Assert.assertEquals(1, clCfg.getProperties().size()); Assert.assertEquals("bar3", clCfg.getProperties().get("foo3")); Assert.assertEquals(2, clCfg.getPreHandlerChains().size()); Map<String, UnifiedHandlerChainMetaData> map = new HashMap<String, UnifiedHandlerChainMetaData>(); for (UnifiedHandlerChainMetaData uhc : clCfg.getPreHandlerChains()) { map.put(uhc.getId(), uhc); } Assert.assertTrue(map.get("my-handlers").getHandlers().isEmpty()); Assert.assertEquals("##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM", map.get("my-handlers").getProtocolBindings()); Assert.assertEquals(1, map.get("my-handlers2").getHandlers().size()); Assert.assertEquals("MyHandler", map.get("my-handlers2").getHandlers().get(0).getHandlerName()); Assert.assertEquals("org.jboss.ws.common.invocation.MyHandler", map.get("my-handlers2").getHandlers().get(0).getHandlerClass()); Assert.assertEquals("##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM", map.get("my-handlers").getProtocolBindings()); Assert.assertEquals(1, clCfg.getPostHandlerChains().size()); Assert.assertEquals("my-handlers2", clCfg.getPostHandlerChains().get(0).getId()); Assert.assertEquals(1, clCfg.getPostHandlerChains().get(0).getHandlers().size()); Assert.assertEquals("MyHandler2", clCfg.getPostHandlerChains().get(0).getHandlers().get(0).getHandlerName()); Assert.assertEquals("org.jboss.ws.common.invocation.MyHandler2", clCfg.getPostHandlerChains().get(0).getHandlers().get(0).getHandlerClass()); Assert.assertEquals("##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM", clCfg.getPostHandlerChains().get(0).getProtocolBindings()); serverConfig.reloadEndpointConfigs(); EndpointConfig epCfg = serverConfig.getEndpointConfig("Standard-Endpoint-Config"); Assert.assertNotNull(epCfg); Assert.assertTrue(epCfg.getProperties().isEmpty()); Assert.assertTrue(epCfg.getPreHandlerChains().isEmpty()); Assert.assertTrue(epCfg.getPostHandlerChains().isEmpty()); epCfg = serverConfig.getEndpointConfig("Recording-Endpoint-Config"); Assert.assertNotNull(epCfg); Assert.assertEquals(2, epCfg.getProperties().size()); Assert.assertEquals("bar", epCfg.getProperties().get("foo")); Assert.assertEquals("bar2", epCfg.getProperties().get("foo2")); Assert.assertEquals(1, epCfg.getPreHandlerChains().size()); Assert.assertEquals("recording-handlers", epCfg.getPreHandlerChains().get(0).getId()); Assert.assertEquals(2, epCfg.getPreHandlerChains().get(0).getHandlers().size()); Assert.assertEquals("RecordingHandler", epCfg.getPreHandlerChains().get(0).getHandlers().get(0).getHandlerName()); Assert.assertEquals("org.jboss.ws.common.invocation.RecordingServerHandler", epCfg.getPreHandlerChains().get(0).getHandlers().get(0).getHandlerClass()); Assert.assertEquals("AnotherRecordingHandler", epCfg.getPreHandlerChains().get(0).getHandlers().get(1).getHandlerName()); Assert.assertEquals("org.jboss.ws.common.invocation.RecordingServerHandler", epCfg.getPreHandlerChains().get(0).getHandlers().get(1).getHandlerClass()); Assert.assertEquals("##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM", epCfg.getPreHandlerChains().get(0).getProtocolBindings()); Assert.assertEquals(1, epCfg.getPostHandlerChains().size()); Assert.assertEquals("recording-handlers2", epCfg.getPostHandlerChains().get(0).getId()); Assert.assertEquals(2, epCfg.getPostHandlerChains().get(0).getHandlers().size()); Assert.assertEquals("RecordingHandler2", epCfg.getPostHandlerChains().get(0).getHandlers().get(0).getHandlerName()); Assert.assertEquals("org.jboss.ws.common.invocation.RecordingServerHandler", epCfg.getPostHandlerChains().get(0).getHandlers().get(0).getHandlerClass()); Assert.assertEquals("AnotherRecordingHandler2", epCfg.getPostHandlerChains().get(0).getHandlers().get(1).getHandlerName()); Assert.assertEquals("org.jboss.ws.common.invocation.RecordingServerHandler", epCfg.getPostHandlerChains().get(0).getHandlers().get(1).getHandlerClass()); Assert.assertEquals("##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM", epCfg.getPostHandlerChains().get(0).getProtocolBindings()); } @SuppressWarnings("unchecked") public static <T> T getMSCService(final ServiceContainer container, final ServiceName serviceName, final Class<T> clazz) { ServiceController<T> service = (ServiceController<T>) container.getService(serviceName); return service != null ? service.getValue() : null; } }