This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/11.0.x by this push:
     new 3268e9a363 Refactor to reduce code duplication in tests
3268e9a363 is described below

commit 3268e9a3639269d226363fab04b947d564018162
Author: Mark Thomas <[email protected]>
AuthorDate: Wed Apr 8 18:38:17 2026 +0100

    Refactor to reduce code duplication in tests
---
 .../catalina/filters/TestRateLimitFilter.java      | 64 ++---------------
 .../TestRateLimitFilterWithExactRateLimiter.java   | 82 ++++------------------
 .../catalina/filters/TestRemoteCIDRFilter.java     | 11 +--
 .../filters/TesterRateLimitClientBase.java         | 73 +++++++++++++++++++
 .../tomcat/unittest/TesterResponseWithStatus.java  | 36 ++++++++++
 5 files changed, 131 insertions(+), 135 deletions(-)

diff --git a/test/org/apache/catalina/filters/TestRateLimitFilter.java 
b/test/org/apache/catalina/filters/TestRateLimitFilter.java
index da715c63e0..37fcb17ec8 100644
--- a/test/org/apache/catalina/filters/TestRateLimitFilter.java
+++ b/test/org/apache/catalina/filters/TestRateLimitFilter.java
@@ -14,12 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.catalina.filters;
 
-import java.io.IOException;
-import java.time.Instant;
-
 import jakarta.servlet.FilterChain;
 import jakarta.servlet.FilterConfig;
 import jakarta.servlet.ServletException;
@@ -30,11 +26,9 @@ import org.junit.Test;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.filters.TestRemoteIpFilter.MockFilterChain;
-import org.apache.catalina.filters.TestRemoteIpFilter.MockHttpServletRequest;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.catalina.util.FastRateLimiter;
-import org.apache.tomcat.unittest.TesterResponse;
 import org.apache.tomcat.util.descriptor.web.FilterDef;
 import org.apache.tomcat.util.descriptor.web.FilterMap;
 
@@ -153,68 +147,18 @@ public class TestRateLimitFilter extends TomcatBaseTest {
         return rateLimitFilter;
     }
 
-    static class TestClient extends Thread {
-        RateLimitFilter filter;
-        FilterChain filterChain;
-        String ip;
+    static class TestClient extends TesterRateLimitClientBase {
 
-        int requests;
         int sleep;
 
-        int[] results;
-        volatile String[] rlpHeader;
-        volatile String[] rlHeader;
-
         TestClient(RateLimitFilter filter, FilterChain filterChain, String ip, 
int requests, int rps) {
-            this.filter = filter;
-            this.filterChain = filterChain;
-            this.ip = ip;
-            this.requests = requests;
             this.sleep = 1000 / rps;
-            this.results = new int[requests];
-            this.rlpHeader = new String[requests];
-            this.rlHeader = new String[requests];
-            super.setDaemon(true);
-            super.start();
-        }
-
-        @Override
-        public void run() {
-            try {
-                for (int i = 0; i < requests; i++) {
-                    MockHttpServletRequest request = new 
MockHttpServletRequest();
-                    request.setRemoteAddr(ip);
-                    TesterResponse response = new TesterResponseWithStatus();
-                    response.setRequest(request);
-                    filter.doFilter(request, response, filterChain);
-                    results[i] = response.getStatus();
-                    rlpHeader[i] = 
response.getHeader(RateLimitFilter.HEADER_RATE_LIMIT_POLICY);
-                    rlHeader[i] = 
response.getHeader(RateLimitFilter.HEADER_RATE_LIMIT);
-                    System.out.printf("%s %s: %s %d, Policy:%s, Current:%s\n", 
ip, Instant.now(),
-                            Integer.valueOf(i + 1), 
Integer.valueOf(response.getStatus()), rlpHeader[i], rlHeader[i]);
-                    sleep(sleep);
-                }
-            } catch (Exception ex) {
-                ex.printStackTrace();
-            }
+            super(filter, filterChain, ip, requests);
         }
-    }
-
-    static class TesterResponseWithStatus extends TesterResponse {
-
-        int status = 200;
-        String message = "OK";
 
         @Override
-        public void sendError(int status, String message) throws IOException {
-            this.status = status;
-            this.message = message;
-        }
-
-        @Override
-        public int getStatus() {
-            return status;
+        void waitForNextRequest(long start, int requestIndex) throws Exception 
{
+            sleep(sleep);
         }
     }
-
 }
diff --git 
a/test/org/apache/catalina/filters/TestRateLimitFilterWithExactRateLimiter.java 
b/test/org/apache/catalina/filters/TestRateLimitFilterWithExactRateLimiter.java
index 49da66af8d..068f0194e5 100644
--- 
a/test/org/apache/catalina/filters/TestRateLimitFilterWithExactRateLimiter.java
+++ 
b/test/org/apache/catalina/filters/TestRateLimitFilterWithExactRateLimiter.java
@@ -16,8 +16,6 @@
  */
 package org.apache.catalina.filters;
 
-import java.io.IOException;
-
 import jakarta.servlet.FilterChain;
 import jakarta.servlet.http.HttpServletResponse;
 
@@ -26,11 +24,9 @@ import org.junit.Test;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.filters.TestRemoteIpFilter.MockFilterChain;
-import org.apache.catalina.filters.TestRemoteIpFilter.MockHttpServletRequest;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.catalina.util.ExactRateLimiter;
-import org.apache.tomcat.unittest.TesterResponse;
 import org.apache.tomcat.util.descriptor.web.FilterDef;
 import org.apache.tomcat.util.descriptor.web.FilterMap;
 
@@ -49,10 +45,10 @@ public class TestRateLimitFilterWithExactRateLimiter 
extends TomcatBaseTest {
 
         Tomcat tomcat = getTomcatInstance();
         Context root = tomcat.addContext("", TEMP_DIR);
+        tomcat.start();
 
         MockFilterChain filterChain = new MockFilterChain();
         RateLimitFilter rateLimitFilter = testRateLimitFilter(filterDef, root);
-        tomcat.start();
 
         ExactRateLimiter exactRateLimiter = (ExactRateLimiter) 
rateLimitFilter.rateLimiter;
 
@@ -149,80 +145,26 @@ public class TestRateLimitFilterWithExactRateLimiter 
extends TomcatBaseTest {
         return rateLimitFilter;
     }
 
-    static class TestClient extends Thread {
-        RateLimitFilter filter;
-        FilterChain filterChain;
-        String ip;
+    static class TestClient extends TesterRateLimitClientBase {
 
-        int requests;
         int timePerRequest;
 
-        int[] results;
-        volatile String[] rlpHeader;
-        volatile String[] rlHeader;
-
         TestClient(RateLimitFilter filter, FilterChain filterChain, String ip, 
int requests, int rps) {
-            this.filter = filter;
-            this.filterChain = filterChain;
-            this.ip = ip;
-            this.requests = requests;
             this.timePerRequest = 1000 / rps;
-            this.results = new int[requests];
-            this.rlpHeader = new String[requests];
-            this.rlHeader = new String[requests];
-            super.setDaemon(true);
-            super.start();
+            super(filter, filterChain, ip, requests);
         }
 
         @Override
-        public void run() {
-            long start = System.nanoTime();
-
-            try {
-                for (int i = 0; i < requests; i++) {
-                    MockHttpServletRequest request = new 
MockHttpServletRequest();
-                    request.setRemoteAddr(ip);
-                    TesterResponse response = new TesterResponseWithStatus();
-                    response.setRequest(request);
-                    filter.doFilter(request, response, filterChain);
-                    results[i] = response.getStatus();
-
-                    rlpHeader[i] = 
response.getHeader(RateLimitFilter.HEADER_RATE_LIMIT_POLICY);
-                    rlHeader[i] = 
response.getHeader(RateLimitFilter.HEADER_RATE_LIMIT);
-
-                    if (results[i] != 200) {
-                        break;
-                    }
-                    /*
-                     * Ensure requests are evenly spaced through time 
irrespective of how long each request takes to
-                     * complete. Do comparisons in milliseconds.
-                     */
-                    long expectedDuration = (i + 1) * timePerRequest;
-                    long duration = (System.nanoTime() - start) / 1000000;
-                    if (expectedDuration > duration) {
-                        sleep(expectedDuration - duration);
-                    }
-                }
-            } catch (Exception ex) {
-                ex.printStackTrace();
+        void waitForNextRequest(long start, int requestIndex) throws Exception 
{
+            /*
+             * Ensure requests are evenly spaced through time irrespective of 
how long each request takes to
+             * complete. Do comparisons in milliseconds.
+             */
+            long expectedDuration = (requestIndex + 1) * timePerRequest;
+            long duration = (System.nanoTime() - start) / 1000000;
+            if (expectedDuration > duration) {
+                sleep(expectedDuration - duration);
             }
         }
     }
-
-    static class TesterResponseWithStatus extends TesterResponse {
-
-        int status = 200;
-        String message = "OK";
-
-        @Override
-        public void sendError(int status, String message) throws IOException {
-            this.status = status;
-            this.message = message;
-        }
-
-        @Override
-        public int getStatus() {
-            return status;
-        }
-    }
 }
diff --git a/test/org/apache/catalina/filters/TestRemoteCIDRFilter.java 
b/test/org/apache/catalina/filters/TestRemoteCIDRFilter.java
index 334fb280ab..c89e9f6e7e 100644
--- a/test/org/apache/catalina/filters/TestRemoteCIDRFilter.java
+++ b/test/org/apache/catalina/filters/TestRemoteCIDRFilter.java
@@ -30,6 +30,7 @@ import org.apache.catalina.connector.Request;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.unittest.TesterResponse;
+import org.apache.tomcat.unittest.TesterResponseWithStatus;
 import org.apache.tomcat.util.descriptor.web.FilterDef;
 import org.apache.tomcat.util.descriptor.web.FilterMap;
 
@@ -56,7 +57,7 @@ public class TestRemoteCIDRFilter extends TomcatBaseTest {
             for (int j = 0; j < 256; j += 11) {
                 ipAddr = String.format("192.168.%s.%s", Integer.valueOf(i), 
Integer.valueOf(j));
                 request = new 
TestRemoteIpFilter.MockHttpServletRequest(ipAddr);
-                response = new TestRateLimitFilter.TesterResponseWithStatus();
+                response = new TesterResponseWithStatus();
                 expected = (i == 10 || i == 20) ? HttpServletResponse.SC_OK : 
HttpServletResponse.SC_FORBIDDEN;
                 filter.doFilter(request, response, filterChain);
                 Assert.assertEquals(expected, response.getStatus());
@@ -85,7 +86,7 @@ public class TestRemoteCIDRFilter extends TomcatBaseTest {
             for (int j = 0; j < 256; j += 11) {
                 ipAddr = String.format("192.168.%s.%s", Integer.valueOf(i), 
Integer.valueOf(j));
                 request = new 
TestRemoteIpFilter.MockHttpServletRequest(ipAddr);
-                response = new TestRateLimitFilter.TesterResponseWithStatus();
+                response = new TesterResponseWithStatus();
                 expected = (i != 10 && i != 20) ? HttpServletResponse.SC_OK : 
HttpServletResponse.SC_FORBIDDEN;
                 filter.doFilter(request, response, filterChain);
                 Assert.assertEquals(expected, response.getStatus());
@@ -115,7 +116,7 @@ public class TestRemoteCIDRFilter extends TomcatBaseTest {
             for (int j = 0; j < 256; j += 11) {
                 ipAddr = String.format("10.10.%s.%s", Integer.valueOf(i), 
Integer.valueOf(j));
                 request = new 
TestRemoteIpFilter.MockHttpServletRequest(ipAddr);
-                response = new TestRateLimitFilter.TesterResponseWithStatus();
+                response = new TesterResponseWithStatus();
                 expected = (i != 10 && i != 20) ? HttpServletResponse.SC_OK : 
HttpServletResponse.SC_FORBIDDEN;
                 filter.doFilter(request, response, filterChain);
                 Assert.assertEquals(expected, response.getStatus());
@@ -145,7 +146,7 @@ public class TestRemoteCIDRFilter extends TomcatBaseTest {
             for (int j = 0; j < 256; j += 11) {
                 ipAddr = String.format("192.168.%s.%s", Integer.valueOf(i), 
Integer.valueOf(j));
                 request = new 
TestRemoteIpFilter.MockHttpServletRequest(ipAddr);
-                response = new TestRateLimitFilter.TesterResponseWithStatus();
+                response = new TesterResponseWithStatus();
                 expected = HttpServletResponse.SC_FORBIDDEN;
                 filter.doFilter(request, response, filterChain);
                 Assert.assertEquals(expected, response.getStatus());
@@ -179,7 +180,7 @@ public class TestRemoteCIDRFilter extends TomcatBaseTest {
             for (int j = 0; j < 256; j += 11) {
                 ipAddr = String.format("192.168.%s.%s", Integer.valueOf(i), 
Integer.valueOf(j));
                 request = new 
TestRemoteIpFilter.MockHttpServletRequest(ipAddr);
-                response = new TestRateLimitFilter.TesterResponseWithStatus();
+                response = new TesterResponseWithStatus();
                 expected = HttpServletResponse.SC_FORBIDDEN;
                 filter.doFilter(request, response, filterChain);
                 Assert.assertEquals(expected, response.getStatus());
diff --git a/test/org/apache/catalina/filters/TesterRateLimitClientBase.java 
b/test/org/apache/catalina/filters/TesterRateLimitClientBase.java
new file mode 100644
index 0000000000..4ed73c2fd7
--- /dev/null
+++ b/test/org/apache/catalina/filters/TesterRateLimitClientBase.java
@@ -0,0 +1,73 @@
+/*
+ * 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.catalina.filters;
+
+import jakarta.servlet.FilterChain;
+
+import org.apache.catalina.filters.TestRemoteIpFilter.MockHttpServletRequest;
+import org.apache.tomcat.unittest.TesterResponse;
+import org.apache.tomcat.unittest.TesterResponseWithStatus;
+
+public abstract class TesterRateLimitClientBase extends Thread {
+    RateLimitFilter filter;
+    FilterChain filterChain;
+    String ip;
+
+    int requests;
+
+    int[] results;
+    volatile String[] rlpHeader;
+    volatile String[] rlHeader;
+
+    TesterRateLimitClientBase(RateLimitFilter filter, FilterChain filterChain, 
String ip, int requests) {
+        this.filter = filter;
+        this.filterChain = filterChain;
+        this.ip = ip;
+        this.requests = requests;
+        this.results = new int[requests];
+        this.rlpHeader = new String[requests];
+        this.rlHeader = new String[requests];
+        super.setDaemon(true);
+        super.start();
+    }
+
+    @Override
+    public void run() {
+        long start = System.nanoTime();
+        try {
+            for (int i = 0; i < requests; i++) {
+                MockHttpServletRequest request = new MockHttpServletRequest();
+                request.setRemoteAddr(ip);
+                TesterResponse response = new TesterResponseWithStatus();
+                response.setRequest(request);
+                filter.doFilter(request, response, filterChain);
+                results[i] = response.getStatus();
+                rlpHeader[i] = 
response.getHeader(RateLimitFilter.HEADER_RATE_LIMIT_POLICY);
+                rlHeader[i] = 
response.getHeader(RateLimitFilter.HEADER_RATE_LIMIT);
+                //System.out.printf("%s %s: %s %d, Policy:%s, Current:%s\n", 
ip, Instant.now(),
+                //        Integer.valueOf(i + 1), 
Integer.valueOf(response.getStatus()), rlpHeader[i], rlHeader[i]);
+
+                waitForNextRequest(start, i);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+
+    abstract void waitForNextRequest(long start, int requestIndex) throws 
Exception;
+}
diff --git a/test/org/apache/tomcat/unittest/TesterResponseWithStatus.java 
b/test/org/apache/tomcat/unittest/TesterResponseWithStatus.java
new file mode 100644
index 0000000000..15ec00dfdf
--- /dev/null
+++ b/test/org/apache/tomcat/unittest/TesterResponseWithStatus.java
@@ -0,0 +1,36 @@
+/*
+ *  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.unittest;
+
+import java.io.IOException;
+
+public class TesterResponseWithStatus extends TesterResponse {
+
+    int status = 200;
+    String message = "OK";
+
+    @Override
+    public void sendError(int status, String message) throws IOException {
+        this.status = status;
+        this.message = message;
+    }
+
+    @Override
+    public int getStatus() {
+        return status;
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to