org.apache.hadoop.gateway.deploy.DeploymentFactoryFuncTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.hadoop.gateway.deploy.DeploymentFactoryFuncTest.java

Source

/**
 * 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(), "    ");
        }
    }

}