This is an automated email from the ASF dual-hosted git repository. dsoumis pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 154efad050443018026e6d92bf3c1e726d8860b9 Author: Dimitris Soumis <jimsou...@gmail.com> AuthorDate: Mon Sep 8 17:21:00 2025 +0300 Create a helper in TomcatBaseTest to injects a LifecycleListener to a Context of a Container that sends code ADD_CHILD_EVENT and utilize this helper in TestManagerWebapp. --- .../apache/catalina/manager/TestManagerWebapp.java | 126 ++++++++++----------- .../apache/catalina/startup/TomcatBaseTest.java | 48 ++++++++ 2 files changed, 106 insertions(+), 68 deletions(-) diff --git a/test/org/apache/catalina/manager/TestManagerWebapp.java b/test/org/apache/catalina/manager/TestManagerWebapp.java index 18242d50cd..3b3346d5c7 100644 --- a/test/org/apache/catalina/manager/TestManagerWebapp.java +++ b/test/org/apache/catalina/manager/TestManagerWebapp.java @@ -29,8 +29,6 @@ import org.junit.Assert; import org.junit.Test; import static org.apache.catalina.startup.SimpleHttpClient.CRLF; -import org.apache.catalina.Container; -import org.apache.catalina.ContainerListener; import org.apache.catalina.Context; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleEvent; @@ -532,74 +530,66 @@ public class TestManagerWebapp extends TomcatBaseTest { HostConfig hostConfig = new HostConfig(); ctx.getParent().addLifecycleListener(hostConfig); - ContainerListener containerListener = event -> { - if (Container.ADD_CHILD_EVENT.equals(event.getType())) { - Container child = (Container) event.getData(); - if (child instanceof Context c) { - if ("/examples".equals(c.getPath())) { - c.addLifecycleListener(new FailOnceListener()); - } - } - } - }; - ctx.getParent().addContainerListener(containerListener); - - tomcat.start(); - SimpleHttpClient client = new SimpleHttpClient() { - @Override - public void connect() throws IOException { - connect(30000, 30000); - } - - @Override - public boolean isResponseBodyOK() { - return true; - } - }; - - appDir = new File(webappDir, "examples"); - client.setPort(getPort()); - String basicHeader = (new BasicAuthHeader("Basic", "admin", "sekr3t")).getHeader().toString(); + try (TomcatBaseTest.ContainerInjector ignored = + TomcatBaseTest.ContainerInjector.inject(ctx.getParent(), "/examples", new FailOnceListener())) { - client.setRequest(new String[] { - "GET /manager/text/deploy?war=" + URLEncoder.QUERY.encode(appDir.getAbsolutePath(), StandardCharsets.UTF_8) + " 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()); - - client.setRequest(new String[] { - "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" + CRLF + - "Host: localhost" + CRLF + - "Connection: Close" + CRLF + CRLF - }); - client.connect(); - client.processRequest(true); - Assert.assertEquals(HttpServletResponse.SC_NOT_FOUND, client.getStatusCode()); - - client.setRequest(new String[] { - "GET /manager/text/start?path=/examples 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()); - - client.setRequest(new String[] { - "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" + CRLF + - "Host: localhost" + CRLF + - "Connection: Close" + CRLF + CRLF - }); - client.connect(); - client.processRequest(true); - Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode()); + tomcat.start(); + SimpleHttpClient client = new SimpleHttpClient() { + @Override + public void connect() throws IOException { + connect(30000, 30000); + } - tomcat.stop(); + @Override + public boolean isResponseBodyOK() { + return true; + } + }; + + 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 + + "Host: localhost" + CRLF + + "Authorization: " + basicHeader + CRLF + + "Connection: Close" + CRLF + CRLF + }); + client.connect(); + client.processRequest(true); + Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode()); + + client.setRequest(new String[]{ + "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" + CRLF + + "Host: localhost" + CRLF + + "Connection: Close" + CRLF + CRLF + }); + client.connect(); + client.processRequest(true); + Assert.assertEquals(HttpServletResponse.SC_NOT_FOUND, client.getStatusCode()); + + client.setRequest(new String[]{ + "GET /manager/text/start?path=/examples 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()); + + client.setRequest(new String[]{ + "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" + CRLF + + "Host: localhost" + CRLF + + "Connection: Close" + CRLF + CRLF + }); + client.connect(); + client.processRequest(true); + Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode()); + + tomcat.stop(); + } } private static class FailOnceListener implements LifecycleListener { diff --git a/test/org/apache/catalina/startup/TomcatBaseTest.java b/test/org/apache/catalina/startup/TomcatBaseTest.java index 10ac0da25a..cb6d8c14c5 100644 --- a/test/org/apache/catalina/startup/TomcatBaseTest.java +++ b/test/org/apache/catalina/startup/TomcatBaseTest.java @@ -55,6 +55,8 @@ import org.junit.Assert; import org.junit.Before; import org.apache.catalina.Container; +import org.apache.catalina.ContainerEvent; +import org.apache.catalina.ContainerListener; import org.apache.catalina.Context; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleEvent; @@ -1103,4 +1105,50 @@ public abstract class TomcatBaseTest extends LoggingBaseTest { int insertIndex = formatted.indexOf("XXX"); return (insertIndex == -1) ? formatted : formatted.substring(0, insertIndex); } + + /** + * Injects a {@link LifecycleListener} to a {@link Context} of a {@link Container} that sends {@code ADD_CHILD_EVENT}. + * Useful when deploying with the Manager / HostConfig. + */ + //TODO: make it generic to set other fields in the context as well like Valve, xmlValidation etc + public static class ContainerInjector implements ContainerListener, AutoCloseable { + + private final Container container; + private final String contextPathToTest; + private final LifecycleListener listener; + private volatile boolean installed = false; + + private ContainerInjector(Container container, + String contextPathToTest, + LifecycleListener listener) { + this.container = container; + this.contextPathToTest = contextPathToTest; + this.listener = listener; + container.addContainerListener(this); + } + + public static ContainerInjector inject(Container container, + String contextPathToTest, + LifecycleListener listener) { + return new ContainerInjector(container, contextPathToTest, listener); + } + + @Override + public void containerEvent(ContainerEvent event) { + if (Container.ADD_CHILD_EVENT.equals(event.getType()) && !installed) { + Object data = event.getData(); + if (data instanceof Context ctx) { + if (ctx.getPath().equals(contextPathToTest)) { + ctx.addLifecycleListener(listener); + installed = true; + } + } + } + } + + @Override + public void close() { + container.removeContainerListener(this); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org