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

Reply via email to