This is an automated email from the ASF dual-hosted git repository. dsoumis pushed a commit to branch 11.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 412406e629dc576412e8686dd5f21c291ae4667e Author: Dimitris Soumis <jimsou...@gmail.com> AuthorDate: Tue Sep 9 14:58:44 2025 +0300 Replace deployment of /examples with a new custom webapp to avoid Windows locks. ContainerInjector enhancements. --- .../apache/catalina/manager/TestManagerWebapp.java | 53 +++++++++++++++++++--- .../apache/catalina/startup/TomcatBaseTest.java | 13 ++++-- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/test/org/apache/catalina/manager/TestManagerWebapp.java b/test/org/apache/catalina/manager/TestManagerWebapp.java index 540125e3e2..a91239278b 100644 --- a/test/org/apache/catalina/manager/TestManagerWebapp.java +++ b/test/org/apache/catalina/manager/TestManagerWebapp.java @@ -530,9 +530,40 @@ public class TestManagerWebapp extends TomcatBaseTest { HostConfig hostConfig = new HostConfig(); ctx.getParent().addLifecycleListener(hostConfig); + File appRoot = new File(webappDir, "bug57700"); + File webInf = new File(appRoot, "WEB-INF"); + Assert.assertTrue(webInf.mkdirs() && webInf.isDirectory()); + try (PrintWriter out = new PrintWriter(new File(appRoot, "index.html"), StandardCharsets.UTF_8)) { + out.println("ok"); + } + try (PrintWriter out = new PrintWriter(new File(webInf, "web.xml"), StandardCharsets.UTF_8)) { + out.println(""" + <?xml version="1.0" encoding="UTF-8"?> + <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee + https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" + version="6.0"> + <servlet> + <servlet-name>default</servlet-name> + <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> + <init-param> + <param-name>listings</param-name> + <param-value>false</param-value> + </init-param> + </servlet> + <servlet-mapping> + <servlet-name>default</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping> + </web-app> + """); + } + addDeleteOnTearDown(appRoot); + try (TomcatBaseTest.ContainerInjector ignored = TomcatBaseTest.ContainerInjector.inject(ctx.getParent(), - c -> c.getPath().equals("/examples"), + c -> c.getPath().equals("/bug57700"), c -> c.addLifecycleListener(new FailOnceListener()))) { tomcat.start(); @@ -548,12 +579,11 @@ public class TestManagerWebapp extends TomcatBaseTest { } }; - appDir = new File(webappDir, "examples"); client.setPort(getPort()); String basicHeader = (new BasicAuthHeader("Basic", "admin", "sekr3t")).getHeader().toString(); client.setRequest(new String[]{ - "GET /manager/text/deploy?war=" + URLEncoder.QUERY.encode(appDir.getAbsolutePath(), StandardCharsets.UTF_8) + " HTTP/1.1" + CRLF + + "GET /manager/text/deploy?war=" + URLEncoder.QUERY.encode(appRoot.getAbsolutePath(), StandardCharsets.UTF_8) + " HTTP/1.1" + CRLF + "Host: localhost" + CRLF + "Authorization: " + basicHeader + CRLF + "Connection: Close" + CRLF + CRLF @@ -563,7 +593,7 @@ public class TestManagerWebapp extends TomcatBaseTest { Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode()); client.setRequest(new String[]{ - "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" + CRLF + + "GET /bug57700/index.html HTTP/1.1" + CRLF + "Host: localhost" + CRLF + "Connection: Close" + CRLF + CRLF }); @@ -572,7 +602,7 @@ public class TestManagerWebapp extends TomcatBaseTest { Assert.assertEquals(HttpServletResponse.SC_NOT_FOUND, client.getStatusCode()); client.setRequest(new String[]{ - "GET /manager/text/start?path=/examples HTTP/1.1" + CRLF + + "GET /manager/text/start?path=/bug57700 HTTP/1.1" + CRLF + "Host: localhost" + CRLF + "Authorization: " + basicHeader + CRLF + "Connection: Close" + CRLF + CRLF @@ -582,7 +612,7 @@ public class TestManagerWebapp extends TomcatBaseTest { Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode()); client.setRequest(new String[]{ - "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" + CRLF + + "GET /bug57700/index.html HTTP/1.1" + CRLF + "Host: localhost" + CRLF + "Connection: Close" + CRLF + CRLF }); @@ -590,6 +620,17 @@ public class TestManagerWebapp extends TomcatBaseTest { client.processRequest(true); Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode()); + client.setRequest(new String[] { + "GET /manager/text/undeploy?path=/bug57700 HTTP/1.1" + CRLF + + "Host: localhost" + CRLF + + "Authorization: " + basicHeader + CRLF + + "Connection: Close" + CRLF + + CRLF + }); + client.connect(); + client.processRequest(true); + Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode()); + tomcat.stop(); } } diff --git a/test/org/apache/catalina/startup/TomcatBaseTest.java b/test/org/apache/catalina/startup/TomcatBaseTest.java index 9d67187626..5183e129a8 100644 --- a/test/org/apache/catalina/startup/TomcatBaseTest.java +++ b/test/org/apache/catalina/startup/TomcatBaseTest.java @@ -1116,21 +1116,28 @@ public abstract class TomcatBaseTest extends LoggingBaseTest { private final Predicate<Context> filter; private final Consumer<Context> action; private volatile boolean installed = false; + private String containerEvent = Container.ADD_CHILD_EVENT; - private ContainerInjector(Container container, Predicate<Context> filter, Consumer<Context> action) { + private ContainerInjector(Container container, Predicate<Context> filter, Consumer<Context> action, String containerEvent) { this.container = container; this.filter = filter; this.action = action; + if (containerEvent != null) { + this.containerEvent = containerEvent; + } container.addContainerListener(this); } public static ContainerInjector inject(Container container, Predicate<Context> filter, Consumer<Context> action) { - return new ContainerInjector(container, filter, action); + return new ContainerInjector(container, filter, action, null); + } + public static ContainerInjector inject(Container container, Predicate<Context> filter, Consumer<Context> action, String containerEvent) { + return new ContainerInjector(container, filter, action, containerEvent); } @Override public void containerEvent(ContainerEvent event) { - if (Container.ADD_CHILD_EVENT.equals(event.getType()) && !installed) { + if (this.containerEvent.equals(event.getType()) && !installed) { Object data = event.getData(); if (data instanceof Context ctx) { if (filter != null && filter.test(ctx)) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org