You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by mo...@apache.org on 2017/11/13 15:48:02 UTC

[12/16] knox git commit: Merge branch 'master' into KNOX-998-Package_Restructuring

http://git-wip-us.apache.org/repos/asf/knox/blob/2c69152f/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
----------------------------------------------------------------------
diff --cc gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
index c9f262b,0000000..8208e4f
mode 100644,000000..100644
--- a/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
+++ b/gateway-test/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryFuncTest.java
@@@ -1,658 -1,0 +1,663 @@@
 +/**
 + * 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.knox.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.knox.gateway.GatewayTestConfig;
 +import org.apache.knox.gateway.config.GatewayConfig;
 +import org.apache.knox.gateway.filter.XForwardedHeaderFilter;
 +import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletFilter;
 +import org.apache.knox.gateway.services.DefaultGatewayServices;
 +import org.apache.knox.gateway.services.ServiceLifecycleException;
 +import org.apache.knox.gateway.topology.Application;
 +import org.apache.knox.gateway.topology.Param;
 +import org.apache.knox.gateway.topology.Provider;
 +import org.apache.knox.gateway.topology.Service;
 +import org.apache.knox.gateway.topology.Topology;
 +import org.apache.knox.gateway.util.XmlUtils;
 +import org.apache.knox.test.TestUtils;
 +import org.apache.knox.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.knox.test.TestUtils.LOG_ENTER;
 +import static org.apache.knox.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" );
 +
 +    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.knox.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.knox.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" ) ) );
++
++    // testing for the adding of missing identity assertion provider - since it isn't explicitly added above
++    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[4]/role", equalTo( "identity-assertion" ) ) );
++    assertThat( gateway, hasXPath( "/gateway/resource[1]/filter[4]/name", equalTo( "Default" ) ) );
++
 +    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();
 +
 +    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();
 +
 +    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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.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.knox.gateway.services.GatewayServicesContextListener")));
 +    assertThat(web, hasXPath("/web-app/listener[3]/listener-class", equalTo("org.apache.knox.gateway.services.GatewayMetricsServletContextListener")));
 +    assertThat(web, hasXPath("/web-app/listener[4]/listener-class", equalTo("org.apache.knox.gateway.ha.provider" +
 +        ".HaServletContextListener")));
 +    assertThat(web, hasXPath("/web-app/listener[5]/listener-class", equalTo("org.apache.knox.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();
 +
 +    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();
 +    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();
 +    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 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(), "    " );
 +    }
 +  }
 +
 +}

http://git-wip-us.apache.org/repos/asf/knox/blob/2c69152f/knox-cli-launcher/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/knox/blob/2c69152f/pom.xml
----------------------------------------------------------------------