You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2023/12/06 09:17:29 UTC

(tomcat) branch 9.0.x updated: Split test into three - helps when test machines have many cores

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new 8b734ee182 Split test into three - helps when test machines have many cores
8b734ee182 is described below

commit 8b734ee182d2a8eee66c16594438c326370b322c
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Dec 4 14:14:32 2023 +0000

    Split test into three - helps when test machines have many cores
---
 .../TestHostConfigAutomaticDeploymentA.java        | 482 ++++++++++++
 .../TestHostConfigAutomaticDeploymentB.java        | 687 +++++++++++++++++
 ...ava => TestHostConfigAutomaticDeploymentC.java} | 820 +--------------------
 3 files changed, 1170 insertions(+), 819 deletions(-)

diff --git a/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentA.java b/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentA.java
new file mode 100644
index 0000000000..60f9dd78f5
--- /dev/null
+++ b/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentA.java
@@ -0,0 +1,482 @@
+/*
+ * 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.catalina.startup;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.Host;
+import org.apache.catalina.LifecycleState;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.util.ContextName;
+
+/**
+ * The purpose of this class is to test the automatic deployment features of the
+ * {@link HostConfig} implementation.
+ */
+public class TestHostConfigAutomaticDeploymentA extends TomcatBaseTest {
+
+    private static final ContextName  APP_NAME = new ContextName("myapp", false);
+    private static final File XML_SOURCE =
+            new File("test/deployment/context.xml");
+    private static final File WAR_XML_SOURCE =
+            new File("test/deployment/context.war");
+    private static final File DIR_XML_SOURCE =
+            new File("test/deployment/dirContext");
+    private static final File DIR_SOURCE =
+            new File("test/deployment/dirNoContext");
+
+    private static final int XML = 1;
+    private static final int EXT = 2;
+    private static final int WAR = 3;
+    private static final int DIR = 4;
+
+    private static final String XML_COOKIE_NAME = "XML_CONTEXT";
+    private static final String WAR_COOKIE_NAME = "WAR_CONTEXT";
+    private static final String DIR_COOKIE_NAME = "DIR_CONTEXT";
+    // private static final String DEFAULT_COOKIE_NAME = "JSESSIONID";
+
+    private File external;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        Tomcat tomcat = getTomcatInstance();
+
+        external = new File(getTemporaryDirectory(), "external");
+        if (!external.exists() && !external.mkdir()) {
+            Assert.fail("Unable to create external for test");
+        }
+
+        // Disable background thread
+        tomcat.getEngine().setBackgroundProcessorDelay(-1);
+
+        // Enable deployer
+        tomcat.getHost().addLifecycleListener(new HostConfig());
+
+        // Disable deployment on start up
+        tomcat.getHost().setDeployOnStartup(false);
+
+        // Clean-up after test
+        addDeleteOnTearDown(new File(tomcat.basedir, "/conf"));
+        addDeleteOnTearDown(external);
+    }
+
+
+    /*
+     * Expected behaviour for the deletion of files.
+     *
+     * Artifacts present     Artifact     Artifacts remaining
+     *  XML  WAR  EXT  DIR    Removed     XML  WAR  EXT DIR    Notes
+     *   N    N    N    Y       DIR        -    -    -   N
+     *   N    Y    N    N       WAR        -    N    -   -
+     *   N    Y    N    Y       DIR        -    Y    -   R     1
+     *   N    Y    N    Y       WAR        -    N    -   N
+     *   Y    N    N    N       XML        N    -    -   -
+     *   Y    N    N    Y       DIR        N    -    -   N
+     *   Y    N    N    Y       XML        R    -    -   Y     2
+     *   Y    N    Y    N       EXT        Y    -    N   -
+     *   Y    N    Y    N       XML        N    -    Y   -
+     *   Y    N    Y    Y       DIR        R    -    Y   R     1,2
+     *   Y    N    Y    Y       EXT        Y    -    N   N
+     *   Y    N    Y    Y       XML        N    -    Y   N
+     *   Y    Y    N    N       WAR        N    N    -   -
+     *   Y    Y    N    N       XML        N    N    -   -
+     *   Y    Y    N    Y       DIR        R    Y    -   R     1,2
+     *   Y    Y    N    Y       WAR        N    N    -   -
+     *   Y    Y    N    Y       XML        R    Y    -   Y
+     *
+     * Notes: 1. The DIR will be re-created since unpackWARs is true.
+     *        2. The XML will be extracted from the WAR/DIR if deployXML and
+     *           copyXML are true.
+     */
+    @Test
+    public void testDeleteDirRemoveDir() throws Exception {
+        doTestDelete(false, false, false, false, true, DIR, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteWarRemoveWar() throws Exception {
+        doTestDelete(false, false, false, true, false, WAR, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteWarDirRemoveDir() throws Exception {
+        doTestDelete(false, false, false, true, true, DIR, false, true, true,
+                WAR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteWarDirRemoveWar() throws Exception {
+        doTestDelete(false, false, false, true, true, WAR, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlRemoveXml() throws Exception {
+        doTestDelete(true, false, false, false, false, XML, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlDirRemoveDir() throws Exception {
+        doTestDelete(true, false, false, false, true, DIR, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlDirRemoveXml() throws Exception {
+        doTestDelete(true, false, false, false, true, XML, false, false, true,
+                DIR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlDirRemoveXmlCopyXml() throws Exception {
+        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
+        doTestDelete(true, false, false, false, true, XML, true, false, true,
+                DIR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlExtwarRemoveExt() throws Exception {
+        doTestDelete(true, true, false, false, false, EXT, true, false, false,
+                XML_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlExtdirRemoveExt() throws Exception {
+        doTestDelete(true, false, true, false, false, EXT, true, false, false,
+                XML_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlExtwarRemoveXml() throws Exception {
+        doTestDelete(true, true, false, false, false, XML, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlExtdirRemoveXml() throws Exception {
+        doTestDelete(true, false, true, false, false, XML, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlExtwarDirRemoveDir() throws Exception {
+        doTestDelete(true, true, false, false, true, DIR, true, false, true,
+                XML_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlExtwarDirRemoveExt() throws Exception {
+        doTestDelete(true, true, false, false, true, EXT, true, false, false,
+                XML_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlExtwarDirRemoveXml() throws Exception {
+        doTestDelete(true, true, false, false, true, XML, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlWarRemoveWar() throws Exception {
+        doTestDelete(true, false, false, true, false, WAR, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlWarRemoveXml() throws Exception {
+        doTestDelete(true, false, false, true, false, XML, false, true, false,
+                WAR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlWarRemoveXmlCopyXml() throws Exception {
+        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
+        doTestDelete(true, false, false, true, false, XML, true, true, false,
+                WAR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlWarDirRemoveDir() throws Exception {
+        doTestDelete(true, false, false, true, true, DIR, false, true, true,
+                WAR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlWarDirRemoveDirCopyXml() throws Exception {
+        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
+        doTestDelete(true, false, false, true, true, DIR, true, true, true,
+                WAR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlWarDirRemoveWar() throws Exception {
+        doTestDelete(true, false, false, true, true, WAR, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlWarDirRemoveWarCopyXml() throws Exception {
+        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
+        doTestDelete(true, false, false, true, true, WAR, false, false, false,
+                null);
+    }
+
+    @Test
+    public void testDeleteXmlWarDirRemoveXml() throws Exception {
+        doTestDelete(true, false, false, true, true, XML, false, true, true,
+                DIR_COOKIE_NAME);
+    }
+
+    @Test
+    public void testDeleteXmlWarDirRemoveXmlCopyXml() throws Exception {
+        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
+        doTestDelete(true, false, false, true, true, XML, true, true, true,
+                WAR_COOKIE_NAME);
+    }
+
+    private void doTestDelete(boolean startXml, boolean startExternalWar,
+            boolean startExternalDir, boolean startWar, boolean startDir,
+            int toDelete, boolean resultXml, boolean resultWar,
+            boolean resultDir, String resultCookieName) throws Exception {
+
+        Tomcat tomcat = getTomcatInstance();
+        StandardHost host = (StandardHost) tomcat.getHost();
+
+        // Init
+        File xml = null;
+        File ext = null;
+        File war = null;
+        File dir = null;
+
+        if (startXml && !startExternalWar && !startExternalDir) {
+            xml = createXmlInConfigBaseForAppbase();
+        }
+        if (startExternalWar) {
+            ext = createWar(WAR_XML_SOURCE, false);
+            xml = createXmlInConfigBaseForExternal(ext);
+        }
+        if (startExternalDir) {
+            ext = createDirInExternal(true);
+            xml = createXmlInConfigBaseForExternal(ext);
+        }
+        if (startWar) {
+            war = createWar(WAR_XML_SOURCE, true);
+        }
+        if (startDir) {
+            dir = createDirInAppbase(true);
+        }
+
+        if ((startWar || startExternalWar) && !startDir) {
+            host.setUnpackWARs(false);
+        }
+
+        // Deploy the files we copied
+        tomcat.start();
+        host.backgroundProcess();
+
+        // Remove the specified file
+        switch (toDelete) {
+            case XML:
+                ExpandWar.delete(xml);
+                break;
+            case EXT:
+                ExpandWar.delete(ext);
+                break;
+            case WAR:
+                ExpandWar.delete(war);
+                break;
+            case DIR:
+                ExpandWar.delete(dir);
+                break;
+            default:
+                Assert.fail();
+        }
+
+        // Trigger an auto-deployment cycle
+        host.backgroundProcess();
+
+        Context ctxt = (Context) host.findChild(APP_NAME.getName());
+
+        // Check the results
+        // External WAR and DIR should only be deleted if the test is testing
+        // behaviour when the external resource is deleted
+        if (toDelete == EXT) {
+            if (ext == null) {
+                Assert.fail();
+            } else {
+                Assert.assertFalse(ext.exists());
+            }
+        } else {
+            if (startExternalWar) {
+                if (ext == null) {
+                    Assert.fail();
+                } else {
+                    Assert.assertTrue(ext.isFile());
+                }
+            }
+            if (startExternalDir) {
+                if (ext == null) {
+                    Assert.fail();
+                } else {
+                    Assert.assertTrue(ext.isDirectory());
+                }
+            }
+        }
+
+        if (resultXml) {
+            if (xml == null) {
+                Assert.fail();
+            } else {
+                Assert.assertTrue(xml.isFile());
+            }
+        }
+        if (resultWar) {
+            if (war == null) {
+                Assert.fail();
+            } else {
+                Assert.assertTrue(war.isFile());
+            }
+        }
+        if (resultDir) {
+            if (dir == null) {
+                Assert.fail();
+            } else {
+                Assert.assertTrue(dir.isDirectory());
+            }
+        }
+
+        if (!resultXml && (startExternalWar || startExternalDir)) {
+            Assert.assertNull(ctxt);
+        }
+        if (!resultWar && !resultDir) {
+            if (resultXml) {
+                Assert.assertNotNull(ctxt);
+                Assert.assertEquals(LifecycleState.FAILED, ctxt.getState());
+            } else {
+                Assert.assertNull(ctxt);
+            }
+        }
+
+        if (ctxt != null) {
+            Assert.assertEquals(resultCookieName, ctxt.getSessionCookieName());
+        }
+    }
+
+
+    private File createDirInAppbase(boolean withXml) throws IOException {
+        File dir = new File(getTomcatInstance().getHost().getAppBaseFile(),
+                APP_NAME.getBaseName());
+        if (withXml) {
+            recursiveCopy(DIR_XML_SOURCE.toPath(), dir.toPath());
+        } else {
+            recursiveCopy(DIR_SOURCE.toPath(), dir.toPath());
+        }
+        return dir;
+    }
+
+    private File createDirInExternal(boolean withXml) throws IOException {
+        File ext = new File(external, "external" + ".war");
+        if (withXml) {
+            recursiveCopy(DIR_XML_SOURCE.toPath(), ext.toPath());
+        } else {
+            recursiveCopy(DIR_SOURCE.toPath(), ext.toPath());
+        }
+        return ext;
+    }
+
+    private File createWar(File src, boolean useAppbase) throws IOException {
+        File dest;
+        if (useAppbase) {
+            dest = new File(getTomcatInstance().getHost().getAppBaseFile(),
+                APP_NAME.getBaseName() + ".war");
+        } else {
+            dest = new File(external, "external" + ".war");
+        }
+        Files.copy(src.toPath(), dest.toPath());
+        // Make sure that HostConfig thinks the WAR has been modified.
+        Assert.assertTrue("Failed to set last modified for [" + dest + "]", dest.setLastModified(
+                System.currentTimeMillis() - 2 * HostConfig.FILE_MODIFICATION_RESOLUTION_MS));
+        return dest;
+    }
+
+    private File createXmlInConfigBaseForAppbase() throws IOException {
+        File xml = getXmlInConfigBaseForAppbase();
+        File parent = xml.getParentFile();
+        if (!parent.isDirectory()) {
+            Assert.assertTrue(parent.mkdirs());
+        }
+        Files.copy(XML_SOURCE.toPath(), xml.toPath());
+        // Make sure that HostConfig thinks the xml has been modified.
+        Assert.assertTrue("Failed to set last modified for [" + xml + "]", xml.setLastModified(
+                System.currentTimeMillis() - 2 * HostConfig.FILE_MODIFICATION_RESOLUTION_MS));
+        return xml;
+    }
+
+    private File getXmlInConfigBaseForAppbase() {
+        Host host = getTomcatInstance().getHost();
+        return new File(host.getConfigBaseFile(), APP_NAME + ".xml");
+    }
+
+    private File createXmlInConfigBaseForExternal(File ext) throws IOException {
+        return createXmlInConfigBaseForExternal(ext, false);
+    }
+
+    private File createXmlInConfigBaseForExternal(File ext, boolean antiLocking)
+            throws IOException {
+        File xml = new File(getTomcatInstance().getHost().getConfigBaseFile(),
+                APP_NAME + ".xml");
+        File parent = xml.getParentFile();
+        if (!parent.isDirectory()) {
+            Assert.assertTrue(parent.mkdirs());
+        }
+
+        try (FileOutputStream fos = new FileOutputStream(xml)) {
+            StringBuilder context = new StringBuilder();
+            context.append("<Context sessionCookieName=\"");
+            context.append(XML_COOKIE_NAME);
+            context.append("\" docBase=\"");
+            context.append(ext.getAbsolutePath());
+            if (antiLocking) {
+                context.append("\" antiResourceLocking=\"true");
+            }
+            context.append("\" />");
+            fos.write(context.toString().getBytes(StandardCharsets.ISO_8859_1));
+        }
+        // Make sure that HostConfig thinks the xml has been modified.
+        Assert.assertTrue("Failed to set last modified for [" + xml + "]", xml.setLastModified(
+                System.currentTimeMillis() - 2 * HostConfig.FILE_MODIFICATION_RESOLUTION_MS));
+        return xml;
+    }
+
+    public static class TesterContext extends StandardContext {
+        // No functional change
+    }
+}
diff --git a/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentB.java b/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentB.java
new file mode 100644
index 0000000000..b892b194c5
--- /dev/null
+++ b/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentB.java
@@ -0,0 +1,687 @@
+/*
+ * 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.catalina.startup;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.Host;
+import org.apache.catalina.LifecycleState;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.util.ContextName;
+
+/**
+ * The purpose of this class is to test the automatic deployment features of the
+ * {@link HostConfig} implementation.
+ */
+public class TestHostConfigAutomaticDeploymentB extends TomcatBaseTest {
+
+    private static final ContextName  APP_NAME = new ContextName("myapp", false);
+    private static final File XML_SOURCE =
+            new File("test/deployment/context.xml");
+    private static final File WAR_XML_SOURCE =
+            new File("test/deployment/context.war");
+    private static final File WAR_SOURCE =
+            new File("test/deployment/noContext.war");
+    private static final File DIR_XML_SOURCE =
+            new File("test/deployment/dirContext");
+    private static final File DIR_SOURCE =
+            new File("test/deployment/dirNoContext");
+
+    private static final String XML_COOKIE_NAME = "XML_CONTEXT";
+    private static final String WAR_COOKIE_NAME = "WAR_CONTEXT";
+    private static final String DIR_COOKIE_NAME = "DIR_CONTEXT";
+    // private static final String DEFAULT_COOKIE_NAME = "JSESSIONID";
+
+    private File external;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        Tomcat tomcat = getTomcatInstance();
+
+        external = new File(getTemporaryDirectory(), "external");
+        if (!external.exists() && !external.mkdir()) {
+            Assert.fail("Unable to create external for test");
+        }
+
+        // Disable background thread
+        tomcat.getEngine().setBackgroundProcessorDelay(-1);
+
+        // Enable deployer
+        tomcat.getHost().addLifecycleListener(new HostConfig());
+
+        // Disable deployment on start up
+        tomcat.getHost().setDeployOnStartup(false);
+
+        // Clean-up after test
+        addDeleteOnTearDown(new File(tomcat.basedir, "/conf"));
+        addDeleteOnTearDown(external);
+    }
+
+
+    /*
+     * Expected behaviour for deployment of an XML file.
+     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
+     *    Y/N       Y/N       Y/N           Y    N    N
+     *
+     * Note: Context will fail to start because no valid docBase is present.
+     */
+    @Test
+    public void testDeploymentXmlFFF() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(false, false, false,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlFFT() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(false, false, true,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlFTF() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(false, true, false,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlFTT() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(false, true, true,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlTFF() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(true, false, false,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlTFT() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(true, false, true,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlTTF() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(true, true, false,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlTTT() throws Exception {
+        createXmlInConfigBaseForAppbase();
+        doTestDeployment(true, true, true,
+                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
+    }
+
+
+    /*
+     * Expected behaviour for deployment of an XML file that points to an
+     * external WAR.
+     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
+     *    Y/N       Y/N        Y            Y    N    Y
+     *    Y/N       Y/N        N            Y    N    N
+     *
+     * Notes: No WAR file is present in the appBase because it is an external
+     *        WAR.
+     *        Any context.xml file embedded in the external WAR file is ignored.
+     */
+    @Test
+    public void testDeploymentXmlExternalWarXmlFFF() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(false, false, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalWarXmlFFT() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(false, false, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalWarXmlFTF() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(false, true, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalWarXmlFTT() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(false, true, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalWarXmlTFF() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(true, false, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalWarXmlTFT() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(true, false, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalWarXmlTTF() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(true, true, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalWarXmlTTT() throws Exception {
+        File war = createWar(WAR_XML_SOURCE, false);
+        createXmlInConfigBaseForExternal(war);
+        doTestDeployment(true, true, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
+    }
+
+
+    /*
+     * Expected behaviour for deployment of an XML file that points to an
+     * external DIR.
+     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
+     *    Y/N       Y/N       Y/N           Y    N    N
+     *
+     * Notes: Any context.xml file embedded in the external DIR file is ignored.
+     */
+    @Test
+    public void testDeploymentXmlExternalDirXmlFFF() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(false, false, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalDirXmlFFT() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(false, false, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalDirXmlFTF() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(false, true, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalDirXmlFTT() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(false, true, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalDirXmlTFF() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(true, false, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalDirXmlTFT() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(true, false, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalDirXmlTTF() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(true, true, false,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+    @Test
+    public void testDeploymentXmlExternalDirXmlTTT() throws Exception {
+        File dir = createDirInExternal(true);
+        createXmlInConfigBaseForExternal(dir);
+        doTestDeployment(true, true, true,
+                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
+    }
+
+
+    /*
+     * Expected behaviour for deployment of a WAR with an embedded XML file.
+     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
+     *     N        Y/N        N            N    Y    N
+     *     N        Y/N        Y            N    Y    Y
+     *     Y         N         N            N    Y    N
+     *     Y         N         Y            N    Y    Y
+     *     Y         Y         N            Y    Y    N
+     *     Y         Y         Y            Y    Y    Y
+     */
+    @Test
+    public void testDeploymentWarXmlFFF() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(false, false, false,
+                LifecycleState.FAILED, null, false, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarXmlFFT() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(false, false, true,
+                LifecycleState.FAILED, null, false, true, true);
+    }
+
+    @Test
+    public void testDeploymentWarXmlFTF() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(false, true, false,
+                LifecycleState.FAILED, null, false, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarXmlFTT() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(false, true, true,
+                LifecycleState.FAILED, null, false, true, true);
+    }
+
+    @Test
+    public void testDeploymentWarXmlTFF() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(true, false, false,
+                LifecycleState.STARTED, WAR_COOKIE_NAME, false, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarXmlTFT() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(true, false, true,
+                LifecycleState.STARTED, WAR_COOKIE_NAME, false, true, true);
+    }
+
+    @Test
+    public void testDeploymentWarXmlTTF() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(true, true, false,
+                LifecycleState.STARTED, WAR_COOKIE_NAME, true, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarXmlTTT() throws Exception {
+        createWar(WAR_XML_SOURCE, true);
+        doTestDeployment(true, true, true,
+                LifecycleState.STARTED, WAR_COOKIE_NAME, true, true, true);
+    }
+
+
+    /*
+     * Expected behaviour for deployment of a WAR without an embedded XML file.
+     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
+     *    Y/N       Y/N        N            N    Y    N
+     *    Y/N       Y/N        Y            N    Y    Y
+     */
+    @Test
+    public void testDeploymentWarFFF() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(false, false, false,
+                LifecycleState.STARTED, null, false, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarFFT() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(false, false, true,
+                LifecycleState.STARTED, null, false, true, true);
+    }
+
+    @Test
+    public void testDeploymentWarFTF() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(false, true, false,
+                LifecycleState.STARTED, null, false, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarFTT() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(false, true, true,
+                LifecycleState.STARTED, null, false, true, true);
+    }
+
+    @Test
+    public void testDeploymentWarTFF() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(true, false, false,
+                LifecycleState.STARTED, null, false, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarTFT() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(true, false, true,
+                LifecycleState.STARTED, null, false, true, true);
+    }
+
+    @Test
+    public void testDeploymentWarTTF() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(true, true, false,
+                LifecycleState.STARTED, null, false, true, false);
+    }
+
+    @Test
+    public void testDeploymentWarTTT() throws Exception {
+        createWar(WAR_SOURCE, true);
+        doTestDeployment(true, true, true,
+                LifecycleState.STARTED, null, false, true, true);
+    }
+
+
+    /*
+     * Expected behaviour for deployment of a DIR with an embedded XML file.
+     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
+     *     N        Y/N       Y/N           N    N    Y
+     *     Y         N        Y/N           N    N    Y
+     *     Y         Y        Y/N           Y    N    Y
+     */
+    @Test
+    public void testDeploymentDirXmlFFF() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(false, false, false,
+                LifecycleState.FAILED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirXmlFFT() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(false, false, true,
+                LifecycleState.FAILED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirXmlFTF() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(false, true, false,
+                LifecycleState.FAILED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirXmlFTT() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(false, true, true,
+                LifecycleState.FAILED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirXmlTFF() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(true, false, false,
+                LifecycleState.STARTED, DIR_COOKIE_NAME, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirXmlTFT() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(true, false, true,
+                LifecycleState.STARTED, DIR_COOKIE_NAME, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirXmlTTF() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(true, true, false,
+                LifecycleState.STARTED, DIR_COOKIE_NAME, true, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirXmlTTT() throws Exception {
+        createDirInAppbase(true);
+        doTestDeployment(true, true, true,
+                LifecycleState.STARTED, DIR_COOKIE_NAME, true, false, true);
+    }
+
+
+    /*
+     * Expected behaviour for deployment of a DIR without an embedded XML file.
+     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
+     *    Y/N       Y/N       Y/N           N    N    Y
+     */
+    @Test
+    public void testDeploymentDirFFF() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(false, false, false,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirFFT() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(false, false, true,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirFTF() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(false, true, false,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirFTT() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(false, true, true,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirTFF() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(true, false, false,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirTFT() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(true, false, true,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirTTF() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(true, true, false,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    @Test
+    public void testDeploymentDirTTT() throws Exception {
+        createDirInAppbase(false);
+        doTestDeployment(true, true, true,
+                LifecycleState.STARTED, null, false, false, true);
+    }
+
+    private void doTestDeployment(boolean deployXML, boolean copyXML,
+            boolean unpackWARs, LifecycleState resultState, String cookieName,
+            boolean resultXml, boolean resultWar, boolean resultDir)
+            throws Exception {
+
+        Tomcat tomcat = getTomcatInstance();
+
+        // Start the instance
+        tomcat.start();
+
+        // Set the attributes
+        StandardHost host = (StandardHost) tomcat.getHost();
+        host.setDeployXML(deployXML);
+        host.setCopyXML(copyXML);
+        host.setUnpackWARs(unpackWARs);
+
+        // Trigger automatic deployment
+        host.backgroundProcess();
+
+        // Test the results
+        Context ctxt = (Context) tomcat.getHost().findChild(APP_NAME.getPath());
+        if (resultState == null) {
+            Assert.assertNull(ctxt);
+        } else {
+            Assert.assertNotNull(ctxt);
+            Assert.assertEquals(resultState, ctxt.getState());
+            Assert.assertEquals(cookieName, ctxt.getSessionCookieName());
+        }
+
+        File xml = new File(
+                host.getConfigBaseFile(), APP_NAME.getBaseName() + ".xml");
+        Assert.assertEquals(
+                Boolean.valueOf(resultXml), Boolean.valueOf(xml.isFile()));
+
+        File war = new File(
+                host.getAppBaseFile(), APP_NAME.getBaseName() + ".war");
+        Assert.assertEquals(
+                Boolean.valueOf(resultWar), Boolean.valueOf(war.isFile()));
+
+        File dir = new File(host.getAppBase(), APP_NAME.getBaseName());
+        Assert.assertEquals(
+                Boolean.valueOf(resultDir), Boolean.valueOf(dir.isDirectory()));
+    }
+
+
+    private File createDirInAppbase(boolean withXml) throws IOException {
+        File dir = new File(getTomcatInstance().getHost().getAppBaseFile(),
+                APP_NAME.getBaseName());
+        if (withXml) {
+            recursiveCopy(DIR_XML_SOURCE.toPath(), dir.toPath());
+        } else {
+            recursiveCopy(DIR_SOURCE.toPath(), dir.toPath());
+        }
+        return dir;
+    }
+
+    private File createDirInExternal(boolean withXml) throws IOException {
+        File ext = new File(external, "external" + ".war");
+        if (withXml) {
+            recursiveCopy(DIR_XML_SOURCE.toPath(), ext.toPath());
+        } else {
+            recursiveCopy(DIR_SOURCE.toPath(), ext.toPath());
+        }
+        return ext;
+    }
+
+    private File createWar(File src, boolean useAppbase) throws IOException {
+        File dest;
+        if (useAppbase) {
+            dest = new File(getTomcatInstance().getHost().getAppBaseFile(),
+                APP_NAME.getBaseName() + ".war");
+        } else {
+            dest = new File(external, "external" + ".war");
+        }
+        Files.copy(src.toPath(), dest.toPath());
+        // Make sure that HostConfig thinks the WAR has been modified.
+        Assert.assertTrue("Failed to set last modified for [" + dest + "]", dest.setLastModified(
+                System.currentTimeMillis() - 2 * HostConfig.FILE_MODIFICATION_RESOLUTION_MS));
+        return dest;
+    }
+
+    private File createXmlInConfigBaseForAppbase() throws IOException {
+        File xml = getXmlInConfigBaseForAppbase();
+        File parent = xml.getParentFile();
+        if (!parent.isDirectory()) {
+            Assert.assertTrue(parent.mkdirs());
+        }
+        Files.copy(XML_SOURCE.toPath(), xml.toPath());
+        // Make sure that HostConfig thinks the xml has been modified.
+        Assert.assertTrue("Failed to set last modified for [" + xml + "]", xml.setLastModified(
+                System.currentTimeMillis() - 2 * HostConfig.FILE_MODIFICATION_RESOLUTION_MS));
+        return xml;
+    }
+
+    private File getXmlInConfigBaseForAppbase() {
+        Host host = getTomcatInstance().getHost();
+        return new File(host.getConfigBaseFile(), APP_NAME + ".xml");
+    }
+
+    private File createXmlInConfigBaseForExternal(File ext) throws IOException {
+        return createXmlInConfigBaseForExternal(ext, false);
+    }
+
+    private File createXmlInConfigBaseForExternal(File ext, boolean antiLocking)
+            throws IOException {
+        File xml = new File(getTomcatInstance().getHost().getConfigBaseFile(),
+                APP_NAME + ".xml");
+        File parent = xml.getParentFile();
+        if (!parent.isDirectory()) {
+            Assert.assertTrue(parent.mkdirs());
+        }
+
+        try (FileOutputStream fos = new FileOutputStream(xml)) {
+            StringBuilder context = new StringBuilder();
+            context.append("<Context sessionCookieName=\"");
+            context.append(XML_COOKIE_NAME);
+            context.append("\" docBase=\"");
+            context.append(ext.getAbsolutePath());
+            if (antiLocking) {
+                context.append("\" antiResourceLocking=\"true");
+            }
+            context.append("\" />");
+            fos.write(context.toString().getBytes(StandardCharsets.ISO_8859_1));
+        }
+        // Make sure that HostConfig thinks the xml has been modified.
+        Assert.assertTrue("Failed to set last modified for [" + xml + "]", xml.setLastModified(
+                System.currentTimeMillis() - 2 * HostConfig.FILE_MODIFICATION_RESOLUTION_MS));
+        return xml;
+    }
+
+    public static class TesterContext extends StandardContext {
+        // No functional change
+    }
+}
diff --git a/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java b/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentC.java
similarity index 59%
rename from test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java
rename to test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentC.java
index cfe5c46d84..0b2189f62f 100644
--- a/test/org/apache/catalina/startup/TestHostConfigAutomaticDeployment.java
+++ b/test/org/apache/catalina/startup/TestHostConfigAutomaticDeploymentC.java
@@ -42,7 +42,7 @@ import org.apache.catalina.util.ContextName;
  * The purpose of this class is to test the automatic deployment features of the
  * {@link HostConfig} implementation.
  */
-public class TestHostConfigAutomaticDeployment extends TomcatBaseTest {
+public class TestHostConfigAutomaticDeploymentC extends TomcatBaseTest {
 
     private static final ContextName  APP_NAME = new ContextName("myapp", false);
     private static final File XML_SOURCE =
@@ -111,824 +111,6 @@ public class TestHostConfigAutomaticDeployment extends TomcatBaseTest {
     }
 
 
-    /*
-     * Expected behaviour for deployment of an XML file.
-     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
-     *    Y/N       Y/N       Y/N           Y    N    N
-     *
-     * Note: Context will fail to start because no valid docBase is present.
-     */
-    @Test
-    public void testDeploymentXmlFFF() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(false, false, false,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlFFT() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(false, false, true,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlFTF() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(false, true, false,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlFTT() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(false, true, true,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlTFF() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(true, false, false,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlTFT() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(true, false, true,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlTTF() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(true, true, false,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlTTT() throws Exception {
-        createXmlInConfigBaseForAppbase();
-        doTestDeployment(true, true, true,
-                LifecycleState.FAILED, XML_COOKIE_NAME, true, false, false);
-    }
-
-
-    /*
-     * Expected behaviour for deployment of an XML file that points to an
-     * external WAR.
-     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
-     *    Y/N       Y/N        Y            Y    N    Y
-     *    Y/N       Y/N        N            Y    N    N
-     *
-     * Notes: No WAR file is present in the appBase because it is an external
-     *        WAR.
-     *        Any context.xml file embedded in the external WAR file is ignored.
-     */
-    @Test
-    public void testDeploymentXmlExternalWarXmlFFF() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(false, false, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalWarXmlFFT() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(false, false, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalWarXmlFTF() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(false, true, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalWarXmlFTT() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(false, true, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalWarXmlTFF() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(true, false, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalWarXmlTFT() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(true, false, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalWarXmlTTF() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(true, true, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalWarXmlTTT() throws Exception {
-        File war = createWar(WAR_XML_SOURCE, false);
-        createXmlInConfigBaseForExternal(war);
-        doTestDeployment(true, true, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, true);
-    }
-
-
-    /*
-     * Expected behaviour for deployment of an XML file that points to an
-     * external DIR.
-     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
-     *    Y/N       Y/N       Y/N           Y    N    N
-     *
-     * Notes: Any context.xml file embedded in the external DIR file is ignored.
-     */
-    @Test
-    public void testDeploymentXmlExternalDirXmlFFF() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(false, false, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalDirXmlFFT() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(false, false, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalDirXmlFTF() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(false, true, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalDirXmlFTT() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(false, true, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalDirXmlTFF() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(true, false, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalDirXmlTFT() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(true, false, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalDirXmlTTF() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(true, true, false,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-    @Test
-    public void testDeploymentXmlExternalDirXmlTTT() throws Exception {
-        File dir = createDirInExternal(true);
-        createXmlInConfigBaseForExternal(dir);
-        doTestDeployment(true, true, true,
-                LifecycleState.STARTED, XML_COOKIE_NAME, true, false, false);
-    }
-
-
-    /*
-     * Expected behaviour for deployment of a WAR with an embedded XML file.
-     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
-     *     N        Y/N        N            N    Y    N
-     *     N        Y/N        Y            N    Y    Y
-     *     Y         N         N            N    Y    N
-     *     Y         N         Y            N    Y    Y
-     *     Y         Y         N            Y    Y    N
-     *     Y         Y         Y            Y    Y    Y
-     */
-    @Test
-    public void testDeploymentWarXmlFFF() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(false, false, false,
-                LifecycleState.FAILED, null, false, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarXmlFFT() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(false, false, true,
-                LifecycleState.FAILED, null, false, true, true);
-    }
-
-    @Test
-    public void testDeploymentWarXmlFTF() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(false, true, false,
-                LifecycleState.FAILED, null, false, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarXmlFTT() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(false, true, true,
-                LifecycleState.FAILED, null, false, true, true);
-    }
-
-    @Test
-    public void testDeploymentWarXmlTFF() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(true, false, false,
-                LifecycleState.STARTED, WAR_COOKIE_NAME, false, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarXmlTFT() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(true, false, true,
-                LifecycleState.STARTED, WAR_COOKIE_NAME, false, true, true);
-    }
-
-    @Test
-    public void testDeploymentWarXmlTTF() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(true, true, false,
-                LifecycleState.STARTED, WAR_COOKIE_NAME, true, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarXmlTTT() throws Exception {
-        createWar(WAR_XML_SOURCE, true);
-        doTestDeployment(true, true, true,
-                LifecycleState.STARTED, WAR_COOKIE_NAME, true, true, true);
-    }
-
-
-    /*
-     * Expected behaviour for deployment of a WAR without an embedded XML file.
-     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
-     *    Y/N       Y/N        N            N    Y    N
-     *    Y/N       Y/N        Y            N    Y    Y
-     */
-    @Test
-    public void testDeploymentWarFFF() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(false, false, false,
-                LifecycleState.STARTED, null, false, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarFFT() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(false, false, true,
-                LifecycleState.STARTED, null, false, true, true);
-    }
-
-    @Test
-    public void testDeploymentWarFTF() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(false, true, false,
-                LifecycleState.STARTED, null, false, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarFTT() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(false, true, true,
-                LifecycleState.STARTED, null, false, true, true);
-    }
-
-    @Test
-    public void testDeploymentWarTFF() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(true, false, false,
-                LifecycleState.STARTED, null, false, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarTFT() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(true, false, true,
-                LifecycleState.STARTED, null, false, true, true);
-    }
-
-    @Test
-    public void testDeploymentWarTTF() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(true, true, false,
-                LifecycleState.STARTED, null, false, true, false);
-    }
-
-    @Test
-    public void testDeploymentWarTTT() throws Exception {
-        createWar(WAR_SOURCE, true);
-        doTestDeployment(true, true, true,
-                LifecycleState.STARTED, null, false, true, true);
-    }
-
-
-    /*
-     * Expected behaviour for deployment of a DIR with an embedded XML file.
-     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
-     *     N        Y/N       Y/N           N    N    Y
-     *     Y         N        Y/N           N    N    Y
-     *     Y         Y        Y/N           Y    N    Y
-     */
-    @Test
-    public void testDeploymentDirXmlFFF() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(false, false, false,
-                LifecycleState.FAILED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirXmlFFT() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(false, false, true,
-                LifecycleState.FAILED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirXmlFTF() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(false, true, false,
-                LifecycleState.FAILED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirXmlFTT() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(false, true, true,
-                LifecycleState.FAILED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirXmlTFF() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(true, false, false,
-                LifecycleState.STARTED, DIR_COOKIE_NAME, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirXmlTFT() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(true, false, true,
-                LifecycleState.STARTED, DIR_COOKIE_NAME, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirXmlTTF() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(true, true, false,
-                LifecycleState.STARTED, DIR_COOKIE_NAME, true, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirXmlTTT() throws Exception {
-        createDirInAppbase(true);
-        doTestDeployment(true, true, true,
-                LifecycleState.STARTED, DIR_COOKIE_NAME, true, false, true);
-    }
-
-
-    /*
-     * Expected behaviour for deployment of a DIR without an embedded XML file.
-     * deployXML  copyXML  unpackWARs      XML  WAR  DIR
-     *    Y/N       Y/N       Y/N           N    N    Y
-     */
-    @Test
-    public void testDeploymentDirFFF() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(false, false, false,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirFFT() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(false, false, true,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirFTF() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(false, true, false,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirFTT() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(false, true, true,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirTFF() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(true, false, false,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirTFT() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(true, false, true,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirTTF() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(true, true, false,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    @Test
-    public void testDeploymentDirTTT() throws Exception {
-        createDirInAppbase(false);
-        doTestDeployment(true, true, true,
-                LifecycleState.STARTED, null, false, false, true);
-    }
-
-    private void doTestDeployment(boolean deployXML, boolean copyXML,
-            boolean unpackWARs, LifecycleState resultState, String cookieName,
-            boolean resultXml, boolean resultWar, boolean resultDir)
-            throws Exception {
-
-        Tomcat tomcat = getTomcatInstance();
-
-        // Start the instance
-        tomcat.start();
-
-        // Set the attributes
-        StandardHost host = (StandardHost) tomcat.getHost();
-        host.setDeployXML(deployXML);
-        host.setCopyXML(copyXML);
-        host.setUnpackWARs(unpackWARs);
-
-        // Trigger automatic deployment
-        host.backgroundProcess();
-
-        // Test the results
-        Context ctxt = (Context) tomcat.getHost().findChild(APP_NAME.getPath());
-        if (resultState == null) {
-            Assert.assertNull(ctxt);
-        } else {
-            Assert.assertNotNull(ctxt);
-            Assert.assertEquals(resultState, ctxt.getState());
-            Assert.assertEquals(cookieName, ctxt.getSessionCookieName());
-        }
-
-        File xml = new File(
-                host.getConfigBaseFile(), APP_NAME.getBaseName() + ".xml");
-        Assert.assertEquals(
-                Boolean.valueOf(resultXml), Boolean.valueOf(xml.isFile()));
-
-        File war = new File(
-                host.getAppBaseFile(), APP_NAME.getBaseName() + ".war");
-        Assert.assertEquals(
-                Boolean.valueOf(resultWar), Boolean.valueOf(war.isFile()));
-
-        File dir = new File(host.getAppBase(), APP_NAME.getBaseName());
-        Assert.assertEquals(
-                Boolean.valueOf(resultDir), Boolean.valueOf(dir.isDirectory()));
-    }
-
-
-    /*
-     * Expected behaviour for the deletion of files.
-     *
-     * Artifacts present     Artifact     Artifacts remaining
-     *  XML  WAR  EXT  DIR    Removed     XML  WAR  EXT DIR    Notes
-     *   N    N    N    Y       DIR        -    -    -   N
-     *   N    Y    N    N       WAR        -    N    -   -
-     *   N    Y    N    Y       DIR        -    Y    -   R     1
-     *   N    Y    N    Y       WAR        -    N    -   N
-     *   Y    N    N    N       XML        N    -    -   -
-     *   Y    N    N    Y       DIR        N    -    -   N
-     *   Y    N    N    Y       XML        R    -    -   Y     2
-     *   Y    N    Y    N       EXT        Y    -    N   -
-     *   Y    N    Y    N       XML        N    -    Y   -
-     *   Y    N    Y    Y       DIR        R    -    Y   R     1,2
-     *   Y    N    Y    Y       EXT        Y    -    N   N
-     *   Y    N    Y    Y       XML        N    -    Y   N
-     *   Y    Y    N    N       WAR        N    N    -   -
-     *   Y    Y    N    N       XML        N    N    -   -
-     *   Y    Y    N    Y       DIR        R    Y    -   R     1,2
-     *   Y    Y    N    Y       WAR        N    N    -   -
-     *   Y    Y    N    Y       XML        R    Y    -   Y
-     *
-     * Notes: 1. The DIR will be re-created since unpackWARs is true.
-     *        2. The XML will be extracted from the WAR/DIR if deployXML and
-     *           copyXML are true.
-     */
-    @Test
-    public void testDeleteDirRemoveDir() throws Exception {
-        doTestDelete(false, false, false, false, true, DIR, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteWarRemoveWar() throws Exception {
-        doTestDelete(false, false, false, true, false, WAR, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteWarDirRemoveDir() throws Exception {
-        doTestDelete(false, false, false, true, true, DIR, false, true, true,
-                WAR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteWarDirRemoveWar() throws Exception {
-        doTestDelete(false, false, false, true, true, WAR, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlRemoveXml() throws Exception {
-        doTestDelete(true, false, false, false, false, XML, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlDirRemoveDir() throws Exception {
-        doTestDelete(true, false, false, false, true, DIR, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlDirRemoveXml() throws Exception {
-        doTestDelete(true, false, false, false, true, XML, false, false, true,
-                DIR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlDirRemoveXmlCopyXml() throws Exception {
-        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
-        doTestDelete(true, false, false, false, true, XML, true, false, true,
-                DIR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlExtwarRemoveExt() throws Exception {
-        doTestDelete(true, true, false, false, false, EXT, true, false, false,
-                XML_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlExtdirRemoveExt() throws Exception {
-        doTestDelete(true, false, true, false, false, EXT, true, false, false,
-                XML_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlExtwarRemoveXml() throws Exception {
-        doTestDelete(true, true, false, false, false, XML, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlExtdirRemoveXml() throws Exception {
-        doTestDelete(true, false, true, false, false, XML, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlExtwarDirRemoveDir() throws Exception {
-        doTestDelete(true, true, false, false, true, DIR, true, false, true,
-                XML_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlExtwarDirRemoveExt() throws Exception {
-        doTestDelete(true, true, false, false, true, EXT, true, false, false,
-                XML_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlExtwarDirRemoveXml() throws Exception {
-        doTestDelete(true, true, false, false, true, XML, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlWarRemoveWar() throws Exception {
-        doTestDelete(true, false, false, true, false, WAR, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlWarRemoveXml() throws Exception {
-        doTestDelete(true, false, false, true, false, XML, false, true, false,
-                WAR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlWarRemoveXmlCopyXml() throws Exception {
-        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
-        doTestDelete(true, false, false, true, false, XML, true, true, false,
-                WAR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlWarDirRemoveDir() throws Exception {
-        doTestDelete(true, false, false, true, true, DIR, false, true, true,
-                WAR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlWarDirRemoveDirCopyXml() throws Exception {
-        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
-        doTestDelete(true, false, false, true, true, DIR, true, true, true,
-                WAR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlWarDirRemoveWar() throws Exception {
-        doTestDelete(true, false, false, true, true, WAR, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlWarDirRemoveWarCopyXml() throws Exception {
-        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
-        doTestDelete(true, false, false, true, true, WAR, false, false, false,
-                null);
-    }
-
-    @Test
-    public void testDeleteXmlWarDirRemoveXml() throws Exception {
-        doTestDelete(true, false, false, true, true, XML, false, true, true,
-                DIR_COOKIE_NAME);
-    }
-
-    @Test
-    public void testDeleteXmlWarDirRemoveXmlCopyXml() throws Exception {
-        ((StandardHost) getTomcatInstance().getHost()).setCopyXML(true);
-        doTestDelete(true, false, false, true, true, XML, true, true, true,
-                WAR_COOKIE_NAME);
-    }
-
-    private void doTestDelete(boolean startXml, boolean startExternalWar,
-            boolean startExternalDir, boolean startWar, boolean startDir,
-            int toDelete, boolean resultXml, boolean resultWar,
-            boolean resultDir, String resultCookieName) throws Exception {
-
-        Tomcat tomcat = getTomcatInstance();
-        StandardHost host = (StandardHost) tomcat.getHost();
-
-        // Init
-        File xml = null;
-        File ext = null;
-        File war = null;
-        File dir = null;
-
-        if (startXml && !startExternalWar && !startExternalDir) {
-            xml = createXmlInConfigBaseForAppbase();
-        }
-        if (startExternalWar) {
-            ext = createWar(WAR_XML_SOURCE, false);
-            xml = createXmlInConfigBaseForExternal(ext);
-        }
-        if (startExternalDir) {
-            ext = createDirInExternal(true);
-            xml = createXmlInConfigBaseForExternal(ext);
-        }
-        if (startWar) {
-            war = createWar(WAR_XML_SOURCE, true);
-        }
-        if (startDir) {
-            dir = createDirInAppbase(true);
-        }
-
-        if ((startWar || startExternalWar) && !startDir) {
-            host.setUnpackWARs(false);
-        }
-
-        // Deploy the files we copied
-        tomcat.start();
-        host.backgroundProcess();
-
-        // Remove the specified file
-        switch (toDelete) {
-            case XML:
-                ExpandWar.delete(xml);
-                break;
-            case EXT:
-                ExpandWar.delete(ext);
-                break;
-            case WAR:
-                ExpandWar.delete(war);
-                break;
-            case DIR:
-                ExpandWar.delete(dir);
-                break;
-            default:
-                Assert.fail();
-        }
-
-        // Trigger an auto-deployment cycle
-        host.backgroundProcess();
-
-        Context ctxt = (Context) host.findChild(APP_NAME.getName());
-
-        // Check the results
-        // External WAR and DIR should only be deleted if the test is testing
-        // behaviour when the external resource is deleted
-        if (toDelete == EXT) {
-            if (ext == null) {
-                Assert.fail();
-            } else {
-                Assert.assertFalse(ext.exists());
-            }
-        } else {
-            if (startExternalWar) {
-                if (ext == null) {
-                    Assert.fail();
-                } else {
-                    Assert.assertTrue(ext.isFile());
-                }
-            }
-            if (startExternalDir) {
-                if (ext == null) {
-                    Assert.fail();
-                } else {
-                    Assert.assertTrue(ext.isDirectory());
-                }
-            }
-        }
-
-        if (resultXml) {
-            if (xml == null) {
-                Assert.fail();
-            } else {
-                Assert.assertTrue(xml.isFile());
-            }
-        }
-        if (resultWar) {
-            if (war == null) {
-                Assert.fail();
-            } else {
-                Assert.assertTrue(war.isFile());
-            }
-        }
-        if (resultDir) {
-            if (dir == null) {
-                Assert.fail();
-            } else {
-                Assert.assertTrue(dir.isDirectory());
-            }
-        }
-
-        if (!resultXml && (startExternalWar || startExternalDir)) {
-            Assert.assertNull(ctxt);
-        }
-        if (!resultWar && !resultDir) {
-            if (resultXml) {
-                Assert.assertNotNull(ctxt);
-                Assert.assertEquals(LifecycleState.FAILED, ctxt.getState());
-            } else {
-                Assert.assertNull(ctxt);
-            }
-        }
-
-        if (ctxt != null) {
-            Assert.assertEquals(resultCookieName, ctxt.getSessionCookieName());
-        }
-    }
-
-
     /*
      * Expected behaviour for modification of files.
      *


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org