This is an automated email from the ASF dual-hosted git repository. rjung pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new fbdd0f20da Extend AccessLogValve unit tests for single pattern identifiers fbdd0f20da is described below commit fbdd0f20da081d7ffafccb23508dcceb3e1d03ac Author: Rainer Jung <rainer.j...@kippdata.de> AuthorDate: Fri Apr 28 00:18:16 2023 +0200 Extend AccessLogValve unit tests for single pattern identifiers --- .../apache/catalina/valves/TestAccessLogValve.java | 128 +++++++++++++++++---- 1 file changed, 108 insertions(+), 20 deletions(-) diff --git a/test/org/apache/catalina/valves/TestAccessLogValve.java b/test/org/apache/catalina/valves/TestAccessLogValve.java index 5dfa4a1dbe..907b8f4b66 100644 --- a/test/org/apache/catalina/valves/TestAccessLogValve.java +++ b/test/org/apache/catalina/valves/TestAccessLogValve.java @@ -18,11 +18,19 @@ package org.apache.catalina.valves; import java.io.CharArrayWriter; import java.io.IOException; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.regex.Pattern; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,6 +38,7 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameter; import org.apache.catalina.LifecycleException; +import org.apache.catalina.core.StandardContext; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.juli.logging.Log; @@ -51,23 +60,85 @@ public class TestAccessLogValve extends TomcatBaseTest { private static final String JSON_TYPE = "json"; private static final String DATE_PATTERN = "\\[\\d\\d/[A-Z][a-z][a-z]/\\d\\d\\d\\d:\\d\\d:\\d\\d:\\d\\d [-+]\\d\\d\\d\\d\\]"; - private static final String IP_PATTERN = "(127\\.0\\.0\\.\\d+|\\[::1\\])"; + private static final String IP_PATTERN = "(127\\.0\\.\\d\\.\\d+|\\[::1\\])"; private static final String UA_PATTERN = "[^\"]+"; @Parameterized.Parameters(name = "{index}: Name[{0}], Type[{1}]") public static Collection<Object[]> parameters() { List<Object[]> parameterSets = new ArrayList<>(); + parameterSets.add(new Object[] {"pct-a", TEXT_TYPE, "/", "%a", IP_PATTERN}); + parameterSets.add(new Object[] {"pct-a", JSON_TYPE, "/", "%a", "\\{\"remoteAddr\":\"" + IP_PATTERN + "\"\\}"}); + parameterSets.add(new Object[] {"pct-A", TEXT_TYPE, "/", "%A", IP_PATTERN}); + parameterSets.add(new Object[] {"pct-A", JSON_TYPE, "/", "%A", "\\{\"localAddr\":\"" + IP_PATTERN + "\"\\}"}); + parameterSets.add(new Object[] {"pct-b", TEXT_TYPE, "/", "%b", "3"}); + parameterSets.add(new Object[] {"pct-b", JSON_TYPE, "/", "%b", "\\{\"size\":\"3\"\\}"}); + parameterSets.add(new Object[] {"pct-B", TEXT_TYPE, "/", "%B", "3"}); + parameterSets.add(new Object[] {"pct-B", JSON_TYPE, "/", "%B", "\\{\"byteSentNC\":\"3\"\\}"}); + parameterSets.add(new Object[] {"pct-D", TEXT_TYPE, "/", "%D", "\\d+"}); + parameterSets.add(new Object[] {"pct-D", JSON_TYPE, "/", "%D", "\\{\"elapsedTime\":\"\\d+\"\\}"}); + parameterSets.add(new Object[] {"pct-F", TEXT_TYPE, "/", "%F", "\\d+"}); + parameterSets.add(new Object[] {"pct-F", JSON_TYPE, "/", "%F", "\\{\"firstByteTime\":\"\\d+\"\\}"}); + parameterSets.add(new Object[] {"pct-h", TEXT_TYPE, "/", "%h", IP_PATTERN}); + parameterSets.add(new Object[] {"pct-h", JSON_TYPE, "/", "%h", "\\{\"host\":\"" + IP_PATTERN + "\"\\}"}); + parameterSets.add(new Object[] {"pct-H", TEXT_TYPE, "/", "%H", "HTTP/1.1"}); + parameterSets.add(new Object[] {"pct-H", JSON_TYPE, "/", "%H", "\\{\"protocol\":\"HTTP/1.1\"\\}"}); + parameterSets.add(new Object[] {"pct-I", TEXT_TYPE, "/", "%I", "http-nio2?-" + IP_PATTERN + "-auto-\\d+-exec-\\d+"}); + parameterSets.add(new Object[] {"pct-I", JSON_TYPE, "/", "%I", "\\{\"threadName\":\"http-nio2?-" + IP_PATTERN + "-auto-\\d+-exec-\\d+\"\\}"}); + parameterSets.add(new Object[] {"pct-l", TEXT_TYPE, "/", "%l", "-"}); + parameterSets.add(new Object[] {"pct-l", JSON_TYPE, "/", "%l", "\\{\"logicalUserName\":\"-\"\\}"}); + parameterSets.add(new Object[] {"pct-m", TEXT_TYPE, "/", "%m", "GET"}); + parameterSets.add(new Object[] {"pct-m", JSON_TYPE, "/", "%m", "\\{\"method\":\"GET\"\\}"}); + parameterSets.add(new Object[] {"pct-p", TEXT_TYPE, "/", "%p", "\\d+"}); + parameterSets.add(new Object[] {"pct-p", JSON_TYPE, "/", "%p", "\\{\"port\":\"\\d+\"\\}"}); + parameterSets.add(new Object[] {"pct-q", TEXT_TYPE, "/", "%q", ""}); + parameterSets.add(new Object[] {"pct-q", JSON_TYPE, "/", "%q", "\\{\"query\":\"\"\\}"}); + parameterSets.add(new Object[] {"pct-r", TEXT_TYPE, "/", "%r", "GET / HTTP/1.1"}); + parameterSets.add(new Object[] {"pct-r", JSON_TYPE, "/", "%r", "\\{\"request\":\"GET / HTTP/1.1\"\\}"}); + parameterSets.add(new Object[] {"pct-s", TEXT_TYPE, "/", "%s", "200"}); + parameterSets.add(new Object[] {"pct-s", JSON_TYPE, "/", "%s", "\\{\"statusCode\":\"200\"\\}"}); + parameterSets.add(new Object[] {"pct-S", TEXT_TYPE, "/", "%S", "[A-F0-9]{32}"}); + parameterSets.add(new Object[] {"pct-S", JSON_TYPE, "/", "%S", "\\{\"sessionId\":\"[A-F0-9]{32}\"\\}"}); + parameterSets.add(new Object[] {"pct-t", TEXT_TYPE, "/", "%t", DATE_PATTERN}); + parameterSets.add(new Object[] {"pct-t", JSON_TYPE, "/", "%t", "\\{\"time\":\"" + DATE_PATTERN + "\"\\}"}); + parameterSets.add(new Object[] {"pct-T", TEXT_TYPE, "/", "%T", "\\d+"}); + parameterSets.add(new Object[] {"pct-T", JSON_TYPE, "/", "%T", "\\{\"elapsedTimeS\":\"\\d+\"\\}"}); + parameterSets.add(new Object[] {"pct-u", TEXT_TYPE, "/", "%u", "-"}); + parameterSets.add(new Object[] {"pct-u", JSON_TYPE, "/", "%u", "\\{\"user\":\"-\"\\}"}); + parameterSets.add(new Object[] {"pct-U", TEXT_TYPE, "/", "%U", "/"}); + parameterSets.add(new Object[] {"pct-U", JSON_TYPE, "/", "%U", "\\{\"path\":\"/\"\\}"}); + parameterSets.add(new Object[] {"pct-v", TEXT_TYPE, "/", "%v", "localhost"}); + parameterSets.add(new Object[] {"pct-v", JSON_TYPE, "/", "%v", "\\{\"localServerName\":\"localhost\"\\}"}); + parameterSets.add(new Object[] {"pct-X", TEXT_TYPE, "/", "%X", "\\+"}); + parameterSets.add(new Object[] {"pct-X", JSON_TYPE, "/", "%X", "\\{\"connectionStatus\":\"\\+\"\\}"}); + parameterSets.add(new Object[] {"pct-a-remote", TEXT_TYPE, "/", "%{remote}a", IP_PATTERN}); + parameterSets.add(new Object[] {"pct-a-remote", JSON_TYPE, "/", "%{remote}a", "\\{\"remoteAddr-remote\":\"" + IP_PATTERN + "\"\\}"}); + parameterSets.add(new Object[] {"pct-a-peer", TEXT_TYPE, "/", "%{peer}a", IP_PATTERN}); + parameterSets.add(new Object[] {"pct-a-peer", JSON_TYPE, "/", "%{peer}a", "\\{\"remoteAddr-peer\":\"" + IP_PATTERN + "\"\\}"}); + parameterSets.add(new Object[] {"pct-p-local", TEXT_TYPE, "/", "%{local}p", "\\d+"}); + parameterSets.add(new Object[] {"pct-p-local", JSON_TYPE, "/", "%{local}p", "\\{\"port-local\":\"\\d+\"\\}"}); + parameterSets.add(new Object[] {"pct-p-remote", TEXT_TYPE, "/", "%{remote}p", "\\d+"}); + parameterSets.add(new Object[] {"pct-p-remote", JSON_TYPE, "/", "%{remote}p", "\\{\"port-remote\":\"\\d+\"\\}"}); + parameterSets.add(new Object[] {"pct-t-sec", TEXT_TYPE, "/", "%{sec}t", "\\d{10}"}); + parameterSets.add(new Object[] {"pct-t-sec", JSON_TYPE, "/", "%{sec}t", "\\{\"time-sec\":\"\\d{10}\"\\}"}); + parameterSets.add(new Object[] {"pct-t-msec", TEXT_TYPE, "/", "%{msec}t", "\\d{13}"}); + parameterSets.add(new Object[] {"pct-t-msec", JSON_TYPE, "/", "%{msec}t", "\\{\"time-msec\":\"\\d{13}\"\\}"}); + parameterSets.add(new Object[] {"pct-t-msec_frac", TEXT_TYPE, "/", "%{msec_frac}t", "\\d{3}"}); + parameterSets.add(new Object[] {"pct-t-msec_frac", JSON_TYPE, "/", "%{msec_frac}t", "\\{\"time-msec_frac\":\"\\d{3}\"\\}"}); + parameterSets.add(new Object[] {"pct-t-begin:sec", TEXT_TYPE, "/", "%{begin:sec}t", "\\d{10}"}); + parameterSets.add(new Object[] {"pct-t-begin:sec", JSON_TYPE, "/", "%{begin:sec}t", "\\{\"time-begin:sec\":\"\\d{10}\"\\}"}); + parameterSets.add(new Object[] {"pct-t-end:sec", TEXT_TYPE, "/", "%{end:sec}t", "\\d{10}"}); + parameterSets.add(new Object[] {"pct-t-end:sec", JSON_TYPE, "/", "%{end:sec}t", "\\{\"time-end:sec\":\"\\d{10}\"\\}"}); parameterSets.add(new Object[] {"common", TEXT_TYPE, "/", "common", - IP_PATTERN + " - - " + DATE_PATTERN + " \"GET / HTTP/1.1\" 404 [67]\\d\\d"}); + IP_PATTERN + " - - " + DATE_PATTERN + " \"GET / HTTP/1.1\" 200 3"}); parameterSets.add(new Object[] {"common", JSON_TYPE, "/", "common", "\\{\"host\":\"" + IP_PATTERN + "\",\"logicalUserName\":\"-\",\"user\":\"-\",\"time\":\"" + DATE_PATTERN + - "\",\"request\":\"GET / HTTP/1.1\",\"statusCode\":\"404\",\"size\":\"[67]\\d\\d\"\\}"}); + "\",\"request\":\"GET / HTTP/1.1\",\"statusCode\":\"200\",\"size\":\"3\"\\}"}); parameterSets.add(new Object[] {"combined", TEXT_TYPE, "/", "combined", - IP_PATTERN + " - - " + DATE_PATTERN + " \"GET / HTTP/1.1\" 404 [67]\\d\\d \"-\" \"" + UA_PATTERN + "\""}); + IP_PATTERN + " - - " + DATE_PATTERN + " \"GET / HTTP/1.1\" 200 3 \"-\" \"" + UA_PATTERN + "\""}); parameterSets.add(new Object[] {"combined", JSON_TYPE, "/", "combined", "\\{\"host\":\"" + IP_PATTERN + "\",\"logicalUserName\":\"-\",\"user\":\"-\",\"time\":\"" + DATE_PATTERN + - "\",\"request\":\"GET / HTTP/1.1\",\"statusCode\":\"404\",\"size\":\"[67]\\d\\d\"" + + "\",\"request\":\"GET / HTTP/1.1\",\"statusCode\":\"200\",\"size\":\"3\"" + ",\"requestHeaders\": \\{\"Referer\":\"-\",\"User-Agent\":\"" + UA_PATTERN + "\"\\}\\}"}); return parameterSets; @@ -142,10 +213,32 @@ public class TestAccessLogValve extends TomcatBaseTest { } } + private static class TesterServlet extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + req.getSession(); + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + PrintWriter pw = resp.getWriter(); + pw.println("OK"); + } + } + @Test - public void Test() { - Tomcat tomcat = null; - tomcat = getTomcatInstance(); + public void Test() throws LifecycleException, IOException { + Tomcat tomcat = getTomcatInstance(); + + // No file system docBase required + StandardContext ctx = (StandardContext) tomcat.addContext("", null); + + // Map the test Servlet + TesterServlet servlet = new TesterServlet(); + Tomcat.addServlet(ctx, "servlet", servlet); + ctx.addServletMappingDecoded("/", "servlet"); CharArrayWriter writer = new CharArrayWriter(); if (TEXT_TYPE.equals(type)) { @@ -161,19 +254,14 @@ public class TestAccessLogValve extends TomcatBaseTest { Assert.fail("Unknown AccessLogValve type " + type); } - try { - tomcat.start(); - } catch (LifecycleException ex) { - log.error("Exception starting tomcat", ex); - } + tomcat.start(); - ByteChunk res = null; - try { - res = getUrl("http://localhost:" + getPort() + path); - } catch (IOException ex) { - log.error("Exception retrieving response", ex); - Assert.fail("Could not retrieve response"); - } + String url = "http://localhost:" + getPort() + path; + ByteChunk out = new ByteChunk(); + Map<String, List<String>> reqHead = new HashMap<>(); + Map<String, List<String>> resHead = new HashMap<>(); + int status = getUrl(url, out, reqHead, resHead); + Assert.assertEquals(HttpServletResponse.SC_OK, status); try { Thread.currentThread().sleep(SLEEP); } catch (InterruptedException ex) { --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org