This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 54797e4d3459c84271ff7130c70218dc48f01066 Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu Jan 18 15:59:43 2024 +0000 Add a server equivalent of the session expiration test --- ...ocketContainerSessionExpiryContainerServer.java | 112 +++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/test/org/apache/tomcat/websocket/TestWsWebSocketContainerSessionExpiryContainerServer.java b/test/org/apache/tomcat/websocket/TestWsWebSocketContainerSessionExpiryContainerServer.java new file mode 100644 index 0000000000..11a1985bb5 --- /dev/null +++ b/test/org/apache/tomcat/websocket/TestWsWebSocketContainerSessionExpiryContainerServer.java @@ -0,0 +1,112 @@ +/* + * 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.tomcat.websocket; + +import java.util.Set; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.websocket.ContainerProvider; +import javax.websocket.Session; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.catalina.Context; +import org.apache.catalina.servlets.DefaultServlet; +import org.apache.catalina.startup.Tomcat; +import org.apache.tomcat.websocket.TestWsWebSocketContainer.EndpointA; +import org.apache.tomcat.websocket.server.Constants; +import org.apache.tomcat.websocket.server.WsServerContainer; + +/* + * Moved to separate test class to improve test concurrency. These tests are + * some of the last tests to start and having them all in a single class + * significantly extends the length of a test run when using multiple test + * threads. + */ +public class TestWsWebSocketContainerSessionExpiryContainerServer extends WsWebSocketContainerBaseTest { + + @Test + public void testSessionExpiryContainer() throws Exception { + + Tomcat tomcat = getTomcatInstance(); + // No file system docBase required + Context ctx = getProgrammaticRootContext(); + ctx.addApplicationListener(TesterEchoServer.Config.class.getName()); + Tomcat.addServlet(ctx, "default", new DefaultServlet()); + ctx.addServletMappingDecoded("/", "default"); + + ctx.addApplicationListener(WebSocketServerTimeoutConfig.class.getName()); + + tomcat.start(); + + // Need access to implementation methods for configuring unit tests + WsWebSocketContainer wsContainer = (WsWebSocketContainer) ContainerProvider.getWebSocketContainer(); + + EndpointA endpointA = new EndpointA(); + connectToEchoServer(wsContainer, endpointA, TesterEchoServer.Config.PATH_BASIC); + connectToEchoServer(wsContainer, endpointA, TesterEchoServer.Config.PATH_BASIC); + Session s3a = connectToEchoServer(wsContainer, endpointA, TesterEchoServer.Config.PATH_BASIC); + + // Check all three sessions are open + Set<Session> setA = s3a.getOpenSessions(); + Assert.assertEquals(3, setA.size()); + + int count = 0; + boolean isOpen = true; + while (isOpen && count < 100) { + count++; + Thread.sleep(100); + isOpen = false; + for (Session session : setA) { + if (session.isOpen()) { + isOpen = true; + break; + } + } + } + + if (isOpen) { + for (Session session : setA) { + if (session.isOpen()) { + System.err.println("Session with ID [" + session.getId() + "] is open"); + } + } + Assert.fail("There were open sessions"); + } + } + + + public static class WebSocketServerTimeoutConfig implements ServletContextListener { + + @Override + public void contextInitialized(ServletContextEvent sce) { + WsServerContainer container = (WsServerContainer) sce.getServletContext().getAttribute( + Constants.SERVER_CONTAINER_SERVLET_CONTEXT_ATTRIBUTE); + // Process timeouts on every run of the background thread + container.setProcessPeriod(0); + // Set session timeout to 5s + container.setDefaultMaxSessionIdleTimeout(5000); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + // NO-OP + } + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org