From 63c5889f7fd573ff42dfe18e66bb458231fc107b Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Fri, 14 Aug 2026 10:02:13 -0500 Subject: [PATCH] Adding method Constraint test to improve test coverage --- .../ee10/servlet/security/ConstraintTest.java | 20 ++++++++++++++++ .../ee11/servlet/security/ConstraintTest.java | 20 ++++++++++++++++ .../jetty/ee9/security/ConstraintTest.java | 24 +++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/security/ConstraintTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/security/ConstraintTest.java index 918ac1a8cfb5..cc11317aee45 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/security/ConstraintTest.java +++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/security/ConstraintTest.java @@ -62,6 +62,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.LoggerFactory; @@ -2580,6 +2581,25 @@ public void testJakartaSpecCombinedConstraintsExamples(String httpMethod, String } } + @ParameterizedTest + @CsvSource(textBlock = """ + PROPPATCH, PATCH + PATCH, PATCHED + """) + public void testSubstringMethod(String methodConstraint, String methodRequest) throws Exception + { + ConstraintMapping forbiddenMapping = new ConstraintMapping(); + forbiddenMapping.setPathSpec("/test/*"); + forbiddenMapping.setMethod(methodConstraint); + forbiddenMapping.setConstraint(Constraint.FORBIDDEN); + _security.setConstraintMappings(List.of(forbiddenMapping)); + _server.start(); + + String requestPath = "/test/foo"; + Constraint constraint = _security.getConstraint(requestPath, methodRequest); + assertThat("%s %s constraint not covered".formatted(methodRequest, requestPath), constraint, nullValue()); + } + public static Stream singleForbiddenMethodOmissionCases() { return Stream.of( diff --git a/jetty-ee11/jetty-ee11-servlet/src/test/java/org/eclipse/jetty/ee11/servlet/security/ConstraintTest.java b/jetty-ee11/jetty-ee11-servlet/src/test/java/org/eclipse/jetty/ee11/servlet/security/ConstraintTest.java index 05310b37bc93..107b6110305a 100644 --- a/jetty-ee11/jetty-ee11-servlet/src/test/java/org/eclipse/jetty/ee11/servlet/security/ConstraintTest.java +++ b/jetty-ee11/jetty-ee11-servlet/src/test/java/org/eclipse/jetty/ee11/servlet/security/ConstraintTest.java @@ -62,6 +62,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.LoggerFactory; @@ -2580,6 +2581,25 @@ public void testJakartaSpecCombinedConstraintsExamples(String httpMethod, String } } + @ParameterizedTest + @CsvSource(textBlock = """ + PROPPATCH, PATCH + PATCH, PATCHED + """) + public void testSubstringMethod(String methodConstraint, String methodRequest) throws Exception + { + ConstraintMapping forbiddenMapping = new ConstraintMapping(); + forbiddenMapping.setPathSpec("/test/*"); + forbiddenMapping.setMethod(methodConstraint); + forbiddenMapping.setConstraint(Constraint.FORBIDDEN); + _security.setConstraintMappings(List.of(forbiddenMapping)); + _server.start(); + + String requestPath = "/test/foo"; + Constraint constraint = _security.getConstraint(requestPath, methodRequest); + assertThat("%s %s constraint not covered".formatted(methodRequest, requestPath), constraint, nullValue()); + } + public static Stream singleForbiddenMethodOmissionCases() { return Stream.of( diff --git a/jetty-ee9/jetty-ee9-security/src/test/java/org/eclipse/jetty/ee9/security/ConstraintTest.java b/jetty-ee9/jetty-ee9-security/src/test/java/org/eclipse/jetty/ee9/security/ConstraintTest.java index a3810bc484e8..5153d2c03dbc 100644 --- a/jetty-ee9/jetty-ee9-security/src/test/java/org/eclipse/jetty/ee9/security/ConstraintTest.java +++ b/jetty-ee9/jetty-ee9-security/src/test/java/org/eclipse/jetty/ee9/security/ConstraintTest.java @@ -66,6 +66,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.LoggerFactory; @@ -2560,6 +2561,29 @@ public void testServletSpecCombinedConstraintsExamples(String httpMethod, String } } + @ParameterizedTest + @CsvSource(textBlock = """ + PROPPATCH, PATCH + PATCH, PATCHED + """) + public void testSubstringMethod(String methodConstraint, String methodRequest) throws Exception + { + ServletConstraint forbidConstraint = new ServletConstraint(); + forbidConstraint.setAuthenticate(true); + forbidConstraint.setName("forbid"); + ConstraintMapping forbiddenMapping = new ConstraintMapping(); + forbiddenMapping.setPathSpec("/test/*"); + forbiddenMapping.setMethod(methodConstraint); + forbiddenMapping.setConstraint(forbidConstraint); + _security.setConstraintMappings(List.of(forbiddenMapping)); + _server.start(); + + String requestPath = "/test/foo"; + RoleInfo roleInfo = _security.prepareConstraintInfo(requestPath, methodRequest); + assertThat("%s %s roleInfo isChecked".formatted(methodRequest, requestPath), roleInfo.isChecked(), is(false)); + assertThat("%s %s roleInfo forbidden".formatted(methodRequest, requestPath), roleInfo.isForbidden(), is(false)); + } + public static Stream singleForbiddenMethodOmissionCases() { return Stream.of(