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

Reply via email to