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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org