Java tutorial
/** * 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.hadoop.gateway.deploy; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.UUID; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.apache.commons.io.FileUtils; import org.apache.hadoop.gateway.GatewayTestConfig; import org.apache.hadoop.gateway.config.GatewayConfig; import org.apache.hadoop.gateway.filter.XForwardedHeaderFilter; import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter; import org.apache.hadoop.gateway.services.DefaultGatewayServices; import org.apache.hadoop.gateway.services.ServiceLifecycleException; import org.apache.hadoop.gateway.topology.Application; import org.apache.hadoop.gateway.topology.Param; import org.apache.hadoop.gateway.topology.Provider; import org.apache.hadoop.gateway.topology.Service; import org.apache.hadoop.gateway.topology.Topology; import org.apache.hadoop.gateway.util.XmlUtils; import org.apache.hadoop.test.TestUtils; import org.apache.hadoop.test.log.NoOpAppender; import org.apache.log4j.Appender; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.SAXException; import static org.apache.hadoop.test.TestUtils.LOG_ENTER; import static org.apache.hadoop.test.TestUtils.LOG_EXIT; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsNot.not; import static org.hamcrest.xml.HasXPath.hasXPath; import static org.junit.Assert.fail; public class DeploymentFactoryFuncTest { private static final long SHORT_TIMEOUT = 1000L; private static final long MEDIUM_TIMEOUT = 5 * SHORT_TIMEOUT; private static final long LONG_TIMEOUT = 10 * MEDIUM_TIMEOUT; @Test(timeout = MEDIUM_TIMEOUT) public void testGenericProviderDeploymentContributor() throws ParserConfigurationException, SAXException, IOException, TransformerException { LOG_ENTER(); GatewayConfig config = new GatewayTestConfig(); File targetDir = new File(System.getProperty("user.dir"), "target"); File gatewayDir = new File(targetDir, "gateway-home-" + UUID.randomUUID()); gatewayDir.mkdirs(); ((GatewayTestConfig) config).setGatewayHomeDir(gatewayDir.getAbsolutePath()); File deployDir = new File(config.getGatewayDeploymentDir()); deployDir.mkdirs(); // ((GatewayTestConfig) config).setDeploymentDir( "clusters" ); addStacksDir(config, targetDir); DefaultGatewayServices srvcs = new DefaultGatewayServices(); Map<String, String> options = new HashMap<>(); options.put("persist-master", "false"); options.put("master", "password"); try { DeploymentFactory.setGatewayServices(srvcs); srvcs.init(config, options); } catch (ServiceLifecycleException e) { e.printStackTrace(); // I18N not required. } Topology topology = new Topology(); topology.setName("test-cluster"); Service service = new Service(); service.setRole("WEBHDFS"); service.addUrl("http://localhost:50070/test-service-url"); topology.addService(service); Provider provider = new Provider(); provider.setRole("federation"); provider.setName("HeaderPreAuth"); provider.setEnabled(true); Param param = new Param(); param.setName("filter"); param.setValue("org.opensource.ExistingFilter"); provider.addParam(param); param = new Param(); param.setName("test-param-name"); param.setValue("test-param-value"); provider.addParam(param); topology.addProvider(provider); EnterpriseArchive war = DeploymentFactory.createDeployment(config, topology); Document gateway = XmlUtils.readXml(war.get("%2F/WEB-INF/gateway.xml").getAsset().openStream()); //dump( gateway ); //by default the first filter will be the X-Forwarded header filter assertThat(gateway, hasXPath("/gateway/resource[1]/filter[1]/role", equalTo("xforwardedheaders"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[1]/name", equalTo("XForwardedHeaderFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[1]/class", equalTo("org.apache.hadoop.gateway.filter.XForwardedHeaderFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/role", equalTo("federation"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/name", equalTo("HeaderPreAuth"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/class", equalTo("org.apache.hadoop.gateway.preauth.filter.HeaderPreAuthFederationFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/param[1]/name", equalTo("filter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/param[1]/value", equalTo("org.opensource.ExistingFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/param[2]/name", equalTo("test-param-name"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/param[2]/value", equalTo("test-param-value"))); LOG_EXIT(); } @Test(timeout = LONG_TIMEOUT) public void testInvalidGenericProviderDeploymentContributor() throws ParserConfigurationException, SAXException, IOException, TransformerException { LOG_ENTER(); GatewayConfig config = new GatewayTestConfig(); File targetDir = new File(System.getProperty("user.dir"), "target"); File gatewayDir = new File(targetDir, "gateway-home-" + UUID.randomUUID()); gatewayDir.mkdirs(); ((GatewayTestConfig) config).setGatewayHomeDir(gatewayDir.getAbsolutePath()); File deployDir = new File(config.getGatewayDeploymentDir()); deployDir.mkdirs(); addStacksDir(config, targetDir); DefaultGatewayServices srvcs = new DefaultGatewayServices(); Map<String, String> options = new HashMap<>(); options.put("persist-master", "false"); options.put("master", "password"); try { DeploymentFactory.setGatewayServices(srvcs); srvcs.init(config, options); } catch (ServiceLifecycleException e) { e.printStackTrace(); // I18N not required. } Topology topology = new Topology(); topology.setName("test-cluster"); Service service = new Service(); service.setRole("WEBHDFS"); service.addUrl("http://localhost:50070/test-service-url"); topology.addService(service); Provider provider = new Provider(); provider.setRole("authentication"); provider.setName("generic"); provider.setEnabled(true); Param param; // = new ProviderParam(); // Missing filter param. //param.setName( "filter" ); //param.setValue( "org.opensource.ExistingFilter" ); //provider.addParam( param ); param = new Param(); param.setName("test-param-name"); param.setValue("test-param-value"); provider.addParam(param); topology.addProvider(provider); Enumeration<Appender> appenders = NoOpAppender.setUp(); try { DeploymentFactory.createDeployment(config, topology); fail("Should have throws IllegalArgumentException"); } catch (DeploymentException e) { // Expected. } finally { NoOpAppender.tearDown(appenders); } LOG_EXIT(); } @Test(timeout = MEDIUM_TIMEOUT) public void testSimpleTopology() throws IOException, SAXException, ParserConfigurationException, URISyntaxException, TransformerException { LOG_ENTER(); GatewayConfig config = new GatewayTestConfig(); //Testing without x-forwarded headers filter ((GatewayTestConfig) config).setXForwardedEnabled(false); File targetDir = new File(System.getProperty("user.dir"), "target"); File gatewayDir = new File(targetDir, "gateway-home-" + UUID.randomUUID()); gatewayDir.mkdirs(); ((GatewayTestConfig) config).setGatewayHomeDir(gatewayDir.getAbsolutePath()); File deployDir = new File(config.getGatewayDeploymentDir()); deployDir.mkdirs(); addStacksDir(config, targetDir); DefaultGatewayServices srvcs = new DefaultGatewayServices(); Map<String, String> options = new HashMap<>(); options.put("persist-master", "false"); options.put("master", "password"); try { DeploymentFactory.setGatewayServices(srvcs); srvcs.init(config, options); } catch (ServiceLifecycleException e) { e.printStackTrace(); // I18N not required. } Topology topology = new Topology(); topology.setName("test-cluster"); Service service = new Service(); service.setRole("WEBHDFS"); service.addUrl("http://localhost:50070/webhdfs"); topology.addService(service); Provider provider = new Provider(); provider.setRole("authentication"); provider.setName("ShiroProvider"); provider.setEnabled(true); Param param = new Param(); param.setName("contextConfigLocation"); param.setValue("classpath:app-context-security.xml"); provider.addParam(param); topology.addProvider(provider); Provider asserter = new Provider(); asserter.setRole("identity-assertion"); asserter.setName("Default"); asserter.setEnabled(true); topology.addProvider(asserter); Provider authorizer = new Provider(); authorizer.setRole("authorization"); authorizer.setName("AclsAuthz"); authorizer.setEnabled(true); topology.addProvider(authorizer); EnterpriseArchive war = DeploymentFactory.createDeployment(config, topology); // File dir = new File( System.getProperty( "user.dir" ) ); // File file = war.as( ExplodedExporter.class ).exportExploded( dir, "test-cluster.war" ); Document web = XmlUtils.readXml(war.get("%2F/WEB-INF/web.xml").getAsset().openStream()); assertThat(web, hasXPath("/web-app")); assertThat(web, hasXPath("/web-app/servlet")); assertThat(web, hasXPath("/web-app/servlet/servlet-name")); assertThat(web, hasXPath("/web-app/servlet/servlet-name", equalTo("test-cluster-knox-gateway-servlet"))); assertThat(web, hasXPath("/web-app/servlet/servlet-class", equalTo("org.apache.hadoop.gateway.GatewayServlet"))); assertThat(web, hasXPath("/web-app/servlet/init-param/param-name", equalTo("gatewayDescriptorLocation"))); assertThat(web, hasXPath("/web-app/servlet/init-param/param-value", equalTo("/WEB-INF/gateway.xml"))); assertThat(web, hasXPath("/web-app/servlet-mapping/servlet-name", equalTo("test-cluster-knox-gateway-servlet"))); assertThat(web, hasXPath("/web-app/servlet-mapping/url-pattern", equalTo("/*"))); Document gateway = XmlUtils.readXml(war.get("%2F/WEB-INF/gateway.xml").getAsset().openStream()); assertThat(gateway, hasXPath("/gateway/resource[1]/pattern", equalTo("/webhdfs/v1/?**"))); //assertThat( gateway, hasXPath( "/gateway/resource[1]/target", equalTo( "http://localhost:50070/webhdfs/v1/?{**}" ) ) ); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[1]/role", equalTo("authentication"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[1]/class", equalTo("org.apache.hadoop.gateway.filter.ResponseCookieFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/role", equalTo("authentication"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[2]/class", equalTo("org.apache.shiro.web.servlet.ShiroFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[3]/role", equalTo("authentication"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[3]/class", equalTo("org.apache.hadoop.gateway.filter.ShiroSubjectIdentityAdapter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[4]/role", equalTo("rewrite"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[4]/class", equalTo("org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[5]/role", equalTo("identity-assertion"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[5]/class", equalTo("org.apache.hadoop.gateway.identityasserter.filter.IdentityAsserterFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[6]/role", equalTo("authorization"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[6]/name", equalTo("AclsAuthz"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[6]/class", equalTo("org.apache.hadoop.gateway.filter.AclsAuthorizationFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[7]/role", equalTo("dispatch"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[7]/name", equalTo("webhdfs"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[7]/class", equalTo("org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter"))); assertThat(gateway, hasXPath("/gateway/resource[2]/pattern", equalTo("/webhdfs/v1/**?**"))); //assertThat( gateway, hasXPath( "/gateway/resource[2]/target", equalTo( "http://localhost:50070/webhdfs/v1/{path=**}?{**}" ) ) ); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[1]/role", equalTo("authentication"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[1]/class", equalTo("org.apache.hadoop.gateway.filter.ResponseCookieFilter"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[2]/role", equalTo("authentication"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[2]/class", equalTo("org.apache.shiro.web.servlet.ShiroFilter"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[3]/role", equalTo("authentication"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[3]/class", equalTo("org.apache.hadoop.gateway.filter.ShiroSubjectIdentityAdapter"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[4]/role", equalTo("rewrite"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[4]/class", equalTo("org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[5]/role", equalTo("identity-assertion"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[5]/class", equalTo("org.apache.hadoop.gateway.identityasserter.filter.IdentityAsserterFilter"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[6]/role", equalTo("authorization"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[6]/name", equalTo("AclsAuthz"))); assertThat(gateway, hasXPath("/gateway/resource[1]/filter[6]/class", equalTo("org.apache.hadoop.gateway.filter.AclsAuthorizationFilter"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[7]/role", equalTo("dispatch"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[7]/name", equalTo("webhdfs"))); assertThat(gateway, hasXPath("/gateway/resource[2]/filter[7]/class", equalTo("org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter"))); LOG_EXIT(); } @Test(timeout = LONG_TIMEOUT) public void testWebXmlGeneration() throws IOException, SAXException, ParserConfigurationException, URISyntaxException { LOG_ENTER(); GatewayConfig config = new GatewayTestConfig(); File targetDir = new File(System.getProperty("user.dir"), "target"); File gatewayDir = new File(targetDir, "gateway-home-" + UUID.randomUUID()); gatewayDir.mkdirs(); ((GatewayTestConfig) config).setGatewayHomeDir(gatewayDir.getAbsolutePath()); File deployDir = new File(config.getGatewayDeploymentDir()); deployDir.mkdirs(); DefaultGatewayServices srvcs = new DefaultGatewayServices(); Map<String, String> options = new HashMap<>(); options.put("persist-master", "false"); options.put("master", "password"); try { DeploymentFactory.setGatewayServices(srvcs); srvcs.init(config, options); } catch (ServiceLifecycleException e) { e.printStackTrace(); // I18N not required. } Topology topology = new Topology(); topology.setName("test-cluster"); Service service = new Service(); service.setRole("WEBHDFS"); service.addUrl("http://localhost:50070/webhdfs"); topology.addService(service); Provider provider = new Provider(); provider.setRole("authentication"); provider.setName("ShiroProvider"); provider.setEnabled(true); Param param = new Param(); param.setName("contextConfigLocation"); param.setValue("classpath:app-context-security.xml"); provider.addParam(param); topology.addProvider(provider); Provider asserter = new Provider(); asserter.setRole("identity-assertion"); asserter.setName("Default"); asserter.setEnabled(true); topology.addProvider(asserter); Provider authorizer = new Provider(); authorizer.setRole("authorization"); authorizer.setName("AclsAuthz"); authorizer.setEnabled(true); topology.addProvider(authorizer); Provider ha = new Provider(); ha.setRole("ha"); ha.setName("HaProvider"); ha.setEnabled(true); topology.addProvider(ha); for (int i = 0; i < 10; i++) { createAndTestDeployment(config, topology); } LOG_EXIT(); } private void createAndTestDeployment(GatewayConfig config, Topology topology) throws IOException, SAXException, ParserConfigurationException { EnterpriseArchive war = DeploymentFactory.createDeployment(config, topology); // File dir = new File( System.getProperty( "user.dir" ) ); // File file = war.as( ExplodedExporter.class ).exportExploded( dir, "test-cluster.war" ); Document web = XmlUtils.readXml(war.get("%2F/WEB-INF/web.xml").getAsset().openStream()); assertThat(web, hasXPath("/web-app/servlet/servlet-class", equalTo("org.apache.hadoop.gateway.GatewayServlet"))); assertThat(web, hasXPath("/web-app/servlet/init-param/param-name", equalTo("gatewayDescriptorLocation"))); assertThat(web, hasXPath("/web-app/servlet/init-param/param-value", equalTo("/WEB-INF/gateway.xml"))); assertThat(web, hasXPath("/web-app/servlet-mapping/servlet-name", equalTo("test-cluster-knox-gateway-servlet"))); assertThat(web, hasXPath("/web-app/servlet-mapping/url-pattern", equalTo("/*"))); //testing the order of listener classes generated assertThat(web, hasXPath("/web-app/listener[2]/listener-class", equalTo("org.apache.hadoop.gateway.services.GatewayServicesContextListener"))); assertThat(web, hasXPath("/web-app/listener[3]/listener-class", equalTo("org.apache.hadoop.gateway.ha.provider.HaServletContextListener"))); assertThat(web, hasXPath("/web-app/listener[4]/listener-class", equalTo("org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletContextListener"))); } @Test(timeout = LONG_TIMEOUT) public void testDeploymentWithServiceParams() throws Exception { LOG_ENTER(); GatewayConfig config = new GatewayTestConfig(); File targetDir = new File(System.getProperty("user.dir"), "target"); File gatewayDir = new File(targetDir, "gateway-home-" + UUID.randomUUID()); gatewayDir.mkdirs(); ((GatewayTestConfig) config).setGatewayHomeDir(gatewayDir.getAbsolutePath()); File deployDir = new File(config.getGatewayDeploymentDir()); deployDir.mkdirs(); addStacksDir(config, targetDir); DefaultGatewayServices srvcs = new DefaultGatewayServices(); Map<String, String> options = new HashMap<>(); options.put("persist-master", "false"); options.put("master", "password"); try { DeploymentFactory.setGatewayServices(srvcs); srvcs.init(config, options); } catch (ServiceLifecycleException e) { e.printStackTrace(); // I18N not required. } Service service; Param param; Topology topology = new Topology(); topology.setName("test-cluster"); service = new Service(); service.setRole("HIVE"); service.setUrls(Arrays.asList(new String[] { "http://hive-host:50001/" })); param = new Param(); param.setName("someparam"); param.setValue("somevalue"); service.addParam(param); topology.addService(service); service = new Service(); service.setRole("WEBHBASE"); service.setUrls(Arrays.asList(new String[] { "http://hbase-host:50002/" })); param = new Param(); param.setName("replayBufferSize"); param.setValue("33"); service.addParam(param); topology.addService(service); service = new Service(); service.setRole("OOZIE"); service.setUrls(Arrays.asList(new String[] { "http://hbase-host:50003/" })); param = new Param(); param.setName("otherparam"); param.setValue("65"); service.addParam(param); topology.addService(service); EnterpriseArchive war = DeploymentFactory.createDeployment(config, topology); Document doc = XmlUtils.readXml(war.get("%2F/WEB-INF/gateway.xml").getAsset().openStream()); // dump( doc ); Node resourceNode, filterNode, paramNode; String value; resourceNode = node(doc, "gateway/resource[role/text()='HIVE']"); assertThat(resourceNode, is(not(nullValue()))); filterNode = node(resourceNode, "filter[role/text()='dispatch']"); assertThat(filterNode, is(not(nullValue()))); paramNode = node(filterNode, "param[name/text()='someparam']"); value = value(paramNode, "value/text()"); assertThat(value, is("somevalue")); resourceNode = node(doc, "gateway/resource[role/text()='WEBHBASE']"); assertThat(resourceNode, is(not(nullValue()))); filterNode = node(resourceNode, "filter[role/text()='dispatch']"); assertThat(filterNode, is(not(nullValue()))); paramNode = node(filterNode, "param[name/text()='replayBufferSize']"); value = value(paramNode, "value/text()"); assertThat(value, is("33")); resourceNode = node(doc, "gateway/resource[role/text()='OOZIE']"); assertThat(resourceNode, is(not(nullValue()))); filterNode = node(resourceNode, "filter[role/text()='dispatch']"); assertThat(filterNode, is(not(nullValue()))); paramNode = node(filterNode, "param[name/text()='otherparam']"); value = value(paramNode, "value/text()"); assertThat(value, is("65")); FileUtils.deleteQuietly(deployDir); LOG_EXIT(); } @Test(timeout = MEDIUM_TIMEOUT) public void testDeploymentWithApplication() throws Exception { LOG_ENTER(); GatewayConfig config = new GatewayTestConfig(); File targetDir = new File(System.getProperty("user.dir"), "target"); File gatewayDir = new File(targetDir, "gateway-home-" + UUID.randomUUID()); gatewayDir.mkdirs(); ((GatewayTestConfig) config).setGatewayHomeDir(gatewayDir.getAbsolutePath()); File deployDir = new File(config.getGatewayDeploymentDir()); deployDir.mkdirs(); addStacksDir(config, targetDir); URL serviceUrl = TestUtils.getResourceUrl(DeploymentFactoryFuncTest.class, "test-apps/minimal-test-app/service.xml"); File serviceFile = new File(serviceUrl.toURI()); File appsDir = serviceFile.getParentFile().getParentFile(); ((GatewayTestConfig) config).setGatewayApplicationsDir(appsDir.getAbsolutePath()); DefaultGatewayServices srvcs = new DefaultGatewayServices(); Map<String, String> options = new HashMap<>(); options.put("persist-master", "false"); options.put("master", "password"); try { DeploymentFactory.setGatewayServices(srvcs); srvcs.init(config, options); } catch (ServiceLifecycleException e) { e.printStackTrace(); // I18N not required. } Topology topology = new Topology(); topology.setName("test-topology"); Application app; app = new Application(); app.setName("minimal-test-app"); app.addUrl("/minimal-test-app-path"); topology.addApplication(app); EnterpriseArchive archive = DeploymentFactory.createDeployment(config, topology); assertThat(archive, notNullValue()); Document doc; doc = XmlUtils.readXml(archive.get("META-INF/topology.xml").getAsset().openStream()); assertThat(doc, notNullValue()); doc = XmlUtils.readXml(archive.get("%2Fminimal-test-app-path/WEB-INF/gateway.xml").getAsset().openStream()); assertThat(doc, notNullValue()); //dump( doc ); assertThat(doc, hasXPath("/gateway/resource/pattern", equalTo("/**?**"))); assertThat(doc, hasXPath("/gateway/resource/filter[1]/role", equalTo("xforwardedheaders"))); assertThat(doc, hasXPath("/gateway/resource/filter[1]/name", equalTo("XForwardedHeaderFilter"))); assertThat(doc, hasXPath("/gateway/resource/filter[1]/class", equalTo(XForwardedHeaderFilter.class.getName()))); assertThat(doc, hasXPath("/gateway/resource/filter[2]/role", equalTo("rewrite"))); assertThat(doc, hasXPath("/gateway/resource/filter[2]/name", equalTo("url-rewrite"))); assertThat(doc, hasXPath("/gateway/resource/filter[2]/class", equalTo(UrlRewriteServletFilter.class.getName()))); LOG_EXIT(); } @Test(timeout = MEDIUM_TIMEOUT) public void testDeploymentWithServicesAndApplications() throws Exception { LOG_ENTER(); GatewayConfig config = new GatewayTestConfig(); File targetDir = new File(System.getProperty("user.dir"), "target"); File gatewayDir = new File(targetDir, "gateway-home-" + UUID.randomUUID()); gatewayDir.mkdirs(); ((GatewayTestConfig) config).setGatewayHomeDir(gatewayDir.getAbsolutePath()); File deployDir = new File(config.getGatewayDeploymentDir()); deployDir.mkdirs(); addStacksDir(config, targetDir); URL serviceUrl = TestUtils.getResourceUrl(DeploymentFactoryFuncTest.class, "test-apps/minimal-test-app/service.xml"); File serviceFile = new File(serviceUrl.toURI()); File appsDir = serviceFile.getParentFile().getParentFile(); ((GatewayTestConfig) config).setGatewayApplicationsDir(appsDir.getAbsolutePath()); DefaultGatewayServices srvcs = new DefaultGatewayServices(); Map<String, String> options = new HashMap<>(); options.put("persist-master", "false"); options.put("master", "password"); try { DeploymentFactory.setGatewayServices(srvcs); srvcs.init(config, options); } catch (ServiceLifecycleException e) { e.printStackTrace(); // I18N not required. } Topology topology = new Topology(); topology.setName("test-topology"); Application app; topology.setName("test-cluster"); Service service = new Service(); service.setRole("WEBHDFS"); service.addUrl("http://localhost:50070/test-service-url"); topology.addService(service); app = new Application(); app.setName("minimal-test-app"); app.addUrl("/minimal-test-app-path-one"); topology.addApplication(app); app.setName("minimal-test-app"); app.addUrl("/minimal-test-app-path-two"); topology.addApplication(app); EnterpriseArchive archive = DeploymentFactory.createDeployment(config, topology); assertThat(archive, notNullValue()); Document doc; org.jboss.shrinkwrap.api.Node node; node = archive.get("META-INF/topology.xml"); assertThat("Find META-INF/topology.xml", node, notNullValue()); doc = XmlUtils.readXml(node.getAsset().openStream()); assertThat("Parse META-INF/topology.xml", doc, notNullValue()); node = archive.get("%2F"); assertThat("Find %2F", node, notNullValue()); node = archive.get("%2F/WEB-INF/gateway.xml"); assertThat("Find %2F/WEB-INF/gateway.xml", node, notNullValue()); doc = XmlUtils.readXml(node.getAsset().openStream()); assertThat("Parse %2F/WEB-INF/gateway.xml", doc, notNullValue()); WebArchive war = archive.getAsType(WebArchive.class, "%2Fminimal-test-app-path-one"); assertThat("Find %2Fminimal-test-app-path-one", war, notNullValue()); node = war.get("/WEB-INF/gateway.xml"); assertThat("Find %2Fminimal-test-app-path-one/WEB-INF/gateway.xml", node, notNullValue()); doc = XmlUtils.readXml(node.getAsset().openStream()); assertThat("Parse %2Fminimal-test-app-path-one/WEB-INF/gateway.xml", doc, notNullValue()); war = archive.getAsType(WebArchive.class, "%2Fminimal-test-app-path-two"); assertThat("Find %2Fminimal-test-app-path-two", war, notNullValue()); node = war.get("/WEB-INF/gateway.xml"); assertThat("Find %2Fminimal-test-app-path-two/WEB-INF/gateway.xml", node, notNullValue()); doc = XmlUtils.readXml(node.getAsset().openStream()); assertThat("Parse %2Fminimal-test-app-path-two/WEB-INF/gateway.xml", doc, notNullValue()); LOG_EXIT(); } private void addStacksDir(GatewayConfig config, File targetDir) { File stacksDir = new File(config.getGatewayServicesDir()); stacksDir.mkdirs(); //TODO: [sumit] This is a hack for now, need to find a better way to locate the source resources for 'stacks' to be tested String pathToStacksSource = "gateway-service-definitions/src/main/resources/services"; File stacksSourceDir = new File(targetDir.getParent(), pathToStacksSource); if (!stacksSourceDir.exists()) { stacksSourceDir = new File(targetDir.getParentFile().getParent(), pathToStacksSource); } if (stacksSourceDir.exists()) { try { FileUtils.copyDirectoryToDirectory(stacksSourceDir, stacksDir); } catch (IOException e) { fail(e.getMessage()); } } } private Node node(Node scope, String expression) throws XPathExpressionException { return (Node) XPathFactory.newInstance().newXPath().compile(expression).evaluate(scope, XPathConstants.NODE); } private String value(Node scope, String expression) throws XPathExpressionException { return XPathFactory.newInstance().newXPath().compile(expression).evaluate(scope); } private static void dump(org.jboss.shrinkwrap.api.Node node, String prefix) { System.out.println(prefix + ": " + node.getPath()); Set<org.jboss.shrinkwrap.api.Node> children = node.getChildren(); if (children != null && !children.isEmpty()) { for (org.jboss.shrinkwrap.api.Node child : children) { dump(child, prefix + " "); } } } private static void dump(Archive archive) { Map<ArchivePath, org.jboss.shrinkwrap.api.Node> content = archive.getContent(); for (Map.Entry<ArchivePath, org.jboss.shrinkwrap.api.Node> entry : content.entrySet()) { dump(entry.getValue(), " "); } } }