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]