From f05ed3d0ce36ada538ff94de23b54c3f542e83de Mon Sep 17 00:00:00 2001 From: asya-vorobeva Date: Mon, 22 Jun 2026 12:18:06 +0200 Subject: [PATCH] S5786: raise one issue per class with a quick fix to remove all redundant visibility modifiers at once Instead of reporting a separate issue on each noncompliant modifier, the rule now reports a single issue on the class name listing all offending modifiers as secondaries. The quick fix removes all of them in one click. Co-Authored-By: Claude Sonnet 4.6 --- .claude/commands/quickfix-tests.md | 141 + .../resources/autoscan/diffs/diff_S2699.json | 2 +- .../resources/autoscan/diffs/diff_S5786.json | 2 +- .../java-S5786.json | 1114 +------ .../resources/eclipse-jetty/java-S5786.json | 2552 ++--------------- .../src/test/resources/mall/java-S5786.json | 15 +- its/vibebot/pom.xml | 1 + ...faultPackageClassAndMethodCheckSample.java | 73 +- .../checks/helpers/ClassPatternsUtils.java | 16 + .../java/checks/helpers/UnitTestUtils.java | 40 + ...ractJUnit5NotCompliantModifierChecker.java | 147 - ...nit5DefaultPackageClassAndMethodCheck.java | 103 +- ...nit5SilentlyIgnoreClassAndMethodCheck.java | 86 +- 13 files changed, 722 insertions(+), 3570 deletions(-) create mode 100644 .claude/commands/quickfix-tests.md delete mode 100644 java-checks/src/main/java/org/sonar/java/checks/tests/AbstractJUnit5NotCompliantModifierChecker.java diff --git a/.claude/commands/quickfix-tests.md b/.claude/commands/quickfix-tests.md new file mode 100644 index 00000000000..ab97158d346 --- /dev/null +++ b/.claude/commands/quickfix-tests.md @@ -0,0 +1,141 @@ +# Quick Fix Test Annotation Pattern + +## Overview + +Quick fix annotations go in the sample file alongside `// Noncompliant` comments. + +--- + +## Annotation Format + +### 1. Declare an expected quick fix on the Noncompliant line + +```java +someCode(); // Noncompliant {{message}} [[quickfixes=qf1]] +``` + +`[[quickfixes=qfN]]` must come **after** `{{message}}`. + +If the issue has a precise underline annotation on the next line, the `[[quickfixes=qfN]]` +attribute goes on the `// Noncompliant` line (not on the `//^^^^` line). + +### 2. Declare fix description + +```java +// fix@qf1 {{Description shown in IDE}} +``` + +### 3. Declare each text edit + +```java +// edit@qf1 [[sl=+2;sc=3;el=+2;ec=9]] {{replacement}} +// edit@qf1 [[sl=+5;sc=3;el=+5;ec=13]] {{}} // empty = delete +``` + +**Attributes:** +- `sl` / `el` — start/end line, relative (`+N`/`-N`) to the Noncompliant line, or absolute +- `sc` / `ec` — start/end column (1-indexed, end is exclusive — i.e. points to the first character NOT removed) +- `{{replacement}}` — replacement text; `{{}}` means delete + +--- + +## Column Indexing + +Columns are **1-indexed** and the end column is **exclusive** (points past the last removed character). + +For a modifier like `public` at the start of ` public static void foo()`: +- `public` occupies columns 3–8 (1-indexed, inclusive) +- To remove `public ` (including trailing space, up to `static`): `sc=3;ec=10` + - `sc=3` = column of `p` + - `ec=10` = column of `s` in `static` (the first character NOT removed) + +For `protected` followed by a space and `static` (13 chars total indented by 2): +- `protected` at columns 3–11; `static` at column 13 +- To remove `protected `: `sc=3;ec=13` + +General rule using `AnalyzerMessage.textSpanBetween(modifier, true, nextToken, false)`: +- `sc` = column of modifier's first character (1-indexed) +- `ec` = column of next token's first character (1-indexed) + +--- + +## Edit Order + +Edits must be listed **in the same order** they appear in the `JavaQuickFix`. +The verifier uses `List.equals()` — order matters. + +**Do NOT call `.reverseSortEdits()` on `JavaQuickFix.Builder`** unless you also list +the annotations in the resulting (reversed) order. The natural collection order (ascending +by source position) is the standard — matches how annotations appear in the sample file. + +--- + +## Example: Single modifier (one edit) + +```java +protected static class Foo { // Noncompliant {{Remove this 'protected' modifier.}} [[quickfixes=qf1]] +//^^^^^^^^^ +// fix@qf1 {{Remove "protected" modifier}} +// edit@qf1 [[sc=3;ec=13]] {{}} +``` + +No `sl`/`el` needed when the edit is on the **same line** as the issue. + +## Example: Multiple modifiers across methods (multiple edits) + +```java +class MyTest { // Noncompliant {{Remove the visibility modifiers from this test class and its methods.}} [[quickfixes=qf1]] +// ^^^^^^ + // fix@qf1 {{Remove all visibility modifiers}} + // edit@qf1 [[sl=+5;sc=3;el=+5;ec=10]] {{}} // public on line+5 + // edit@qf1 [[sl=+9;sc=3;el=+9;ec=13]] {{}} // protected on line+9 +``` + +--- + +## Check implementation + +```java +private static JavaQuickFix buildQuickFix(List modifiers) { + List edits = modifiers.stream() + .map(m -> JavaTextEdit.removeTextSpan( + AnalyzerMessage.textSpanBetween(m, true, QuickFixHelper.nextToken(m), false))) + .toList(); + String description = modifiers.size() == 1 + ? String.format("Remove \"%s\" modifier", modifiers.get(0).keyword().text()) + : "Remove all visibility modifiers"; + return JavaQuickFix.newQuickFix(description) + .addTextEdits(edits) + .build(); // do NOT call reverseSortEdits() unless annotations also reversed +} +``` + +Report the issue with `withQuickFixes` (plural), not `withQuickFix`: + +```java +QuickFixHelper.newIssue(context) + .forRule(this) + .onTree(someTree) + .withMessage("...") + .withQuickFixes(() -> List.of(buildQuickFix(modifiers))) + .report(); +``` + +--- + +## Debugging + +If the test fails with: +``` +Expected quickfix qfN at line X was not matched by any provided quickfixes +``` + +Check these in order: +1. **Order of edits** — are the `edit@` annotations in the same order as the `JavaQuickFix` text edits? +2. **Column values** — verify `sc`/`ec` using the column formula above +3. **Description** — must match the `fix@` annotation exactly +4. **`withQuickFixes` vs `withQuickFix`** — use the plural form +5. **`reverseSortEdits()`** — remove it unless annotations are also in reversed order + +The verifier prints only the EXPECTED side on failure; it does not print the actual. +To see the actual, temporarily add a print in `buildQuickFix` or check column math manually. diff --git a/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json b/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json index bd4c927ed7c..dcc3e18b861 100644 --- a/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json +++ b/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json @@ -1,6 +1,6 @@ { "ruleKey": "S2699", "hasTruePositives": true, - "falseNegatives": 159, + "falseNegatives": 161, "falsePositives": 1 } diff --git a/its/autoscan/src/test/resources/autoscan/diffs/diff_S5786.json b/its/autoscan/src/test/resources/autoscan/diffs/diff_S5786.json index 5c94a63ea49..18041cd99a8 100644 --- a/its/autoscan/src/test/resources/autoscan/diffs/diff_S5786.json +++ b/its/autoscan/src/test/resources/autoscan/diffs/diff_S5786.json @@ -1,6 +1,6 @@ { "ruleKey": "S5786", "hasTruePositives": true, - "falseNegatives": 72, + "falseNegatives": 35, "falsePositives": 0 } diff --git a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S5786.json b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S5786.json index da003abc8d1..6dda18ffab3 100644 --- a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S5786.json +++ b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S5786.json @@ -1,1198 +1,248 @@ { "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/CookieCutterLenientTest.java": [ -166 +37 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/CookieCutterTest.java": [ -30, -58, -72, -89, -108, -125, -142, -163, -177, -192, -206, -216, -230 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/DateParserTest.java": [ -30, -34, -40 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/GZIPContentDecoderTest.java": [ -44, -50, -73, -79, -89, -102, -126, -139, -156, -181, -209, -235, -270, -296, -324, -369 +44 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpCookieTest.java": [ -46, -72, -78, -114, -158, -195, -220, -242, -254, -269, -279, -291, -303, -324, -350, -364 +43 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldTest.java": [ -34, -37, -53, -62, -71, -94, -144, -170, -176, -189 +34 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java": [ -53, -56, -86, -106, -130, -151, -164, -188, -206, -225, -245, -285, -331, -373, -391, -402, -413, -453, -493, -541, -563, -585, -627, -645, -674, -712, -724, -735, -746, -764, -773, -802, -813, -887, -899, -927, -957, -995, -1025 +53 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java": [ -55, -93, -135, -171, -209, -253, -325 +32 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerHTTPTest.java": [ -45 +38 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java": [ -35, -38, -75, -115, -148, -181, -222, -271, -297, -331, -366, -400, -465, -535, -624, -694, -743, -793, -857 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java": [ -82, -100, -114, -128, -145, -157, -174, -187, -201, -215, -229, -243, -254, -267, -292, -319, -338, -355, -372, -425, -453, -472, -488, -539, -585, -631, -656, -686, -708, -720, -732, -746, -780, -802, -818, -834, -857, -881, -934, -964, -988, -1023, -1061, -1093, -1124, -1136, -1157, -1183, -1248, -1314, -1335, -1353, -1389, -1410, -1431, -1454, -1473, -1492, -1508, -1540, -1562, -1584, -1606, -1628, -1650, -1690, -1728, -1750, -1772, -1794, -1818, -1842, -1871, -1900, -1916, -1932, -1947, -1961, -1977, -1994, -2012, -2028, -2043, -2059, -2076, -2093, -2112, -2141, -2163, -2196, -2227, -2260, -2289, -2320, -2355, -2391, -2423, -2464, -2509, -2554, -2630, -2703, -2758, -2819 +52 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpSchemeTest.java": [ -34, -38, -48, -56, -64 +34 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpStatusCodeTest.java": [ -26, -29, -36 +26 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpURIParseTest.java": [ -163, -200, -228 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java": [ -30, -33, -78, -95, -116, -143, -165, -172, -201, -247, -267, -276 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/MimeTypesTest.java": [ -29, -32, -38, -46, -52, -58, -65, -88, -111 +29 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/QuotedCSVTest.java": [ -32, -35, -46, -57, -68, -77, -88, -97, -108, -146, -158 +32 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/QuotedQualityCSVTest.java": [ -30, -34, -42, -51, -61, -70, -85, -106, -116, -127, -136, -145, -155, -165, -231, -239, -247, -255, -263, -271, -279, -287, -295, -303, -311 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/SyntaxTest.java": [ -28, -31, -53, -84, -105 +28 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/PathMappingsTest.java": [ -35, -64, -94, -117, -151, -171, -254, -273, -301, -310, -325, -339, -356, -375, -404, -430 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/RegexPathSpecTest.java": [ -44, -59, -80, -101, -119, -139 +29 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/ServletPathSpecMatchListTest.java": [ -74 +36 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/ServletPathSpecOrderTest.java": [ -93 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/ServletPathSpecTest.java": [ -30, -59, -65, -71, -77, -83, -89, -97, -113, -128, -136, -144, -158, -177, -194 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpecBadSpecsTest.java": [ -59 +32 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpecTest.java": [ -35, -61, -74, -92, -108, -127, -151, -172, -196, -219, -243, -266, -288 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/WebSocketUriMappingTest.java": [ -31, -45, -54, -65, -77, -86, -97, -106, -115, -124, -134, -143, -152, -162, -172 +31 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/ArrayByteBufferPoolTest.java": [ -39, -42, -70, -99, -128, -155, -166, -195 +39 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/ByteArrayEndPointTest.java": [ -45, -50, -57, -63, -110, -133, -152, -215, -264 +45 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/CyclicTimeoutTest.java": [ -34, -41, -59, -66, -77, -89, -102, -115, -128, -144 +34 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java": [ -58, -61, -73, -151, -210, -278, -352, -391, -419, -452 +58 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/IdleTimeoutTest.java": [ -32, -41, -65, -72, -84, -96, -109, -122, -144, -157 +32 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/MappedByteBufferPoolTest.java": [ -39, -42, -61, -81, -98, -109, -121, -144 +39 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/NIOTest.java": [ -37, -40 +37 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SelectorManagerTest.java": [ -43, -49, -56, -64 +43 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SocketChannelEndPointInterestsTest.java": [ -48, -110, -123 +48 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SocketChannelEndPointOpenCloseTest.java": [ -34, -45, -52, -68, -142 +34 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SocketChannelEndPointTest.java": [ -126, -136, -190, -239, -284, -387, -452 +76 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java": [ -62, -145, -173, -278, -307, -335, -365, -409, -436, -478, -522 +62 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SslEngineBehaviorTest.java": [ -39, -44, -54, -61 +39 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/WriteFlusherTest.java": [ -50, -53, -59, -92, -125, -165, -202, -242, -283, -331, -371, -411, -445 +50 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java": [ -55, -61, -68, -78, -93, -111, -126, -146, -161, -173, -194, -211, -232 +55 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/MBeanContainerLifeCycleTest.java": [ -34, -40, -50, -56, -73, -101 +34 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/MBeanContainerTest.java": [ -37, -46, -53, -63, -85, -91, -97, -107, -117, -136, -153, -171, -183, -194, -209, -215 +37 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ObjectMBeanTest.java": [ -41, -46, -52, -59, -66, -77, -88, -99, -109, -135, -181 +41 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ObjectMBeanUtilTest.java": [ -42, -53, -62, -73, -84, -92, -103, -113, -123, -135, -146, -178, -197, -205, -213, -221, -234 +42 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/PojoTest.java": [ -34, -37 +34 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/AsyncCompletionTest.java": [ -118, -204, -486, -647 +71 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/AsyncRequestReadTest.java": [ -49, -56, -66, -73, -120, -219, -269, -305 +49 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java": [ -54, -76, -90, -97 +54 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/CheckReverseProxyHeadersTest.java": [ -36, -39 +36 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ClassLoaderDumpTest.java": [ -32, -35, -56, -78, -108, -157 +32 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ConnectionOpenCloseTest.java": [ -51, -56, -107, -170 +51 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/CookiesTest.java": [ -29, -32, -41, -64, -87, -109, -133, -158 +29 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/CustomResourcesMonitorTest.java": [ -45, -54, -76, -82 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/DetectorConnectionTest.java": [ -51, -122, -129, -149, -169, -189, -222, -250, -274, -300, -324, -354, -389, -415, -442, -465, -500, -567, -613, -628, -634 +51 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ErrorHandlerTest.java": [ -54, -61, -133, -140, -157, -172, -187, -204, -222, -240, -259, -278, -297, -314, -333, -352, -371, -389, -412, -441, -526, -548 +54 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ExtendedServerTest.java": [ -48, -51, -115 +48 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ForwardedRequestCustomizerTest.java": [ -69, -127, -589, -605, -624 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/GracefulStopTest.java": [ -55, -113, -285, -300, -320, -338, -361 +55 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HalfCloseTest.java": [ -38, -41, -66, -105 +38 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HostHeaderCustomizerTest.java": [ -37, -40 +37 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpChannelEventTest.java": [ -44, -59, -66, -109, -143, -172, -208, -244 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java": [ -79, -100, -107, -156, -175, -189, -206, -235, -304, -370, -423, -444, -457, -471, -485, -494, -502, -510, -518, -526, -534, -542, -550, -564, -577, -599, -622, -639, -659, -680, -700, -751, -800, -813, -823, -834, -844, -863, -884, -910, -974, -1011, -1035, -1069, -1103, -1135, -1167, -1199, -1219, -1269, -1311, -1365 +72 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpInputAsyncStateTest.java": [ -49, -95, -269, -275, -291, -308, -326, -344, -363, -379, -396, -414, -432, -451, -467, -484, -502, -520, -539, -559, -580, -602, -624, -647, -672, -707 +49 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpInputTest.java": [ -41, -178, -192, -198, -210, -254, -282, -311, -337, -362, -379, -429, -450, -497, -528, -538, -548, -564, -574, -595 +41 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToAsyncCommitTest.java": [ -77, -91, -149, -165, -224, -239, -305, -321, -388, -404, -469, -487, -555, -572, -641, -657, -723, -740, -806, -821, -884, -900 +51 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToCommitTest.java": [ -57, -69, -96, -110, -137, -151, -180, -195, -228, -242, -272, -287, -320, -335, -350, -365, -438, -453, -468, -480, -492, -506, -572, -586, -618, -632, -663, -677 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpOutputTest.java": [ -69, -103, -110, -117, -124, -148, -158, -169, -200, -210, -221, -232, -243, -296, -310, -324, -338, -352, -366, -380, -394, -408, -425, -439, -453, -467, -482, -497, -512, -527, -545, -560, -575, -590, -606, -624, -640, -658, -695, -734, -818, -868, -921, -976 +59 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpWriterTest.java": [ -36, -43, -69, -77, -85, -93, -108, -137, -145, -168, -206 +36 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/InclusiveByteRangeTest.java": [ -35, -89, -96, -109, -127, -142, -157, -171, -185, -199, -212, -226, -240, -255, -261, -284, -290, -296, -303, -309, -316, -322, -328, -334, -340, -346, -352 +35 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/InsufficientThreadsDetectionTest.java": [ -28, -34, -40, -60, -77 +28 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LargeHeaderTest.java": [ -48, -53, -93, -99 +48 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LocalAsyncContextTest.java": [ -53, -79, -86, -98, -110, -122, -134, -146, -158, -170, -209 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LocalConnectorTest.java": [ -38, -44, -55, -63, -93, -101, -109, -120, -131, -142, -154, -166, -178, -204, -237, -263, -281, -300, -315, -336, -356, -396 +38 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LowResourcesMonitorTest.java": [ -44, -52, -79, -85, -120, -170, -192 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/MultiPartCaptureTest.java": [ -158 +59 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/MultiPartFormInputStreamTest.java": [ -60, -75, -100, -123, -142, -202, -212, -228, -268, -283, -298, -341, -374, -387, -401, -420, -435, -457, -480, -504, -528, -551, -570, -580, -635, -652, -686, -712, -739, -761, -782, -804, -826, -847, -853, -951, -985, -1035, -1073 +60 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/MultiPartParserTest.java": [ -38, -42, -54, -67, -101, -114, -151, -164, -192, -210, -227, -247, -278, -296, -319, -343, -376, -403, -442, -475, -518, -650 +38 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/NotAcceptingTest.java": [ -57, -79, -86, -153, -215, -301, -365 +47 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/OptionalSslConnectionTest.java": [ -43, -72, -89, -137, -158, -180, -208 +43 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java": [ -45, -51, -74, -81, -107, -132, -149, -195, -243, -275, -289, -328, -355, -388, -412, -424, -442, -465, -492, -507, -525, -547, -563, -582, -605, -628 +45 ] } diff --git a/its/ruling/src/test/resources/eclipse-jetty/java-S5786.json b/its/ruling/src/test/resources/eclipse-jetty/java-S5786.json index 4620626c690..45760c1bf98 100644 --- a/its/ruling/src/test/resources/eclipse-jetty/java-S5786.json +++ b/its/ruling/src/test/resources/eclipse-jetty/java-S5786.json @@ -1,2772 +1,656 @@ { "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/CookieCutterLenientTest.java": [ -166 +37 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/CookieCutterTest.java": [ -30, -58, -72, -89, -108, -125, -142, -163, -177, -192, -206, -216, -230 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/DateParserTest.java": [ -30, -34, -40 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/GZIPContentDecoderTest.java": [ -44, -50, -73, -79, -89, -102, -126, -139, -156, -181, -209, -235, -270, -296, -324, -369 +44 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpCookieTest.java": [ -46, -72, -78, -114, -158, -195, -220, -242, -254, -269, -279, -291, -303, -324, -350, -364 +43 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldTest.java": [ -34, -37, -53, -62, -71, -94, -144, -170, -176, -189 +34 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpFieldsTest.java": [ -53, -56, -86, -106, -130, -151, -164, -188, -206, -225, -245, -285, -331, -373, -391, -402, -413, -453, -493, -541, -563, -585, -627, -645, -674, -712, -724, -735, -746, -764, -773, -802, -813, -887, -899, -927, -957, -995, -1025 +53 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorClientTest.java": [ -55, -93, -135, -171, -209, -253, -325 +32 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerHTTPTest.java": [ -45 +38 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpGeneratorServerTest.java": [ -35, -38, -75, -115, -148, -181, -222, -271, -297, -331, -366, -400, -465, -535, -624, -694, -743, -793, -857 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java": [ -82, -100, -114, -128, -145, -157, -174, -187, -201, -215, -229, -243, -254, -267, -292, -319, -338, -355, -372, -425, -453, -472, -488, -539, -585, -631, -656, -686, -708, -720, -732, -746, -780, -802, -818, -834, -857, -881, -934, -964, -988, -1023, -1061, -1093, -1124, -1136, -1157, -1183, -1248, -1314, -1335, -1353, -1389, -1410, -1431, -1454, -1473, -1492, -1508, -1540, -1562, -1584, -1606, -1628, -1650, -1690, -1728, -1750, -1772, -1794, -1818, -1842, -1871, -1900, -1916, -1932, -1947, -1961, -1977, -1994, -2012, -2028, -2043, -2059, -2076, -2093, -2112, -2141, -2163, -2196, -2227, -2260, -2289, -2320, -2355, -2391, -2423, -2464, -2509, -2554, -2630, -2703, -2758, -2819 +52 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpSchemeTest.java": [ -34, -38, -48, -56, -64 +34 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpStatusCodeTest.java": [ -26, -29, -36 +26 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpURIParseTest.java": [ -163, -200, -228 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java": [ -30, -33, -78, -95, -116, -143, -165, -172, -201, -247, -267, -276 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/MimeTypesTest.java": [ -29, -32, -38, -46, -52, -58, -65, -88, -111 +29 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/QuotedCSVTest.java": [ -32, -35, -46, -57, -68, -77, -88, -97, -108, -146, -158 +32 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/QuotedQualityCSVTest.java": [ -30, -34, -42, -51, -61, -70, -85, -106, -116, -127, -136, -145, -155, -165, -231, -239, -247, -255, -263, -271, -279, -287, -295, -303, -311 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/SyntaxTest.java": [ -28, -31, -53, -84, -105 +28 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/PathMappingsTest.java": [ -35, -64, -94, -117, -151, -171, -254, -273, -301, -310, -325, -339, -356, -375, -404, -430 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/RegexPathSpecTest.java": [ -44, -59, -80, -101, -119, -139 +29 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/ServletPathSpecMatchListTest.java": [ -74 +36 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/ServletPathSpecOrderTest.java": [ -93 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/ServletPathSpecTest.java": [ -30, -59, -65, -71, -77, -83, -89, -97, -113, -128, -136, -144, -158, -177, -194 +30 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpecBadSpecsTest.java": [ -59 +32 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpecTest.java": [ -35, -61, -74, -92, -108, -127, -151, -172, -196, -219, -243, -266, -288 +35 ], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/pathmap/WebSocketUriMappingTest.java": [ -31, -45, -54, -65, -77, -86, -97, -106, -115, -124, -134, -143, -152, -162, -172 +31 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/ArrayByteBufferPoolTest.java": [ -39, -42, -70, -99, -128, -155, -166, -195 +39 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/ByteArrayEndPointTest.java": [ -45, -50, -57, -63, -110, -133, -152, -215, -264 +45 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/CyclicTimeoutTest.java": [ -34, -41, -59, -66, -77, -89, -102, -115, -128, -144 +34 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/IOTest.java": [ -58, -61, -73, -151, -210, -278, -352, -391, -419, -452 +58 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/IdleTimeoutTest.java": [ -32, -41, -65, -72, -84, -96, -109, -122, -144, -157 +32 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/MappedByteBufferPoolTest.java": [ -39, -42, -61, -81, -98, -109, -121, -144 +39 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/NIOTest.java": [ -37, -40 +37 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SelectorManagerTest.java": [ -43, -49, -56, -64 +43 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SocketChannelEndPointInterestsTest.java": [ -48, -110, -123 +48 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SocketChannelEndPointOpenCloseTest.java": [ -34, -45, -52, -68, -142 +34 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SocketChannelEndPointTest.java": [ -126, -136, -190, -239, -284, -387, -452 +76 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java": [ -62, -145, -173, -278, -307, -335, -365, -409, -436, -478, -522 +62 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/SslEngineBehaviorTest.java": [ -39, -44, -54, -61 +39 ], "org.eclipse.jetty:jetty-project:jetty-io/src/test/java/org/eclipse/jetty/io/WriteFlusherTest.java": [ -50, -53, -59, -92, -125, -165, -202, -242, -283, -331, -371, -411, -445 +50 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ConnectorServerTest.java": [ -55, -61, -68, -78, -93, -111, -126, -146, -161, -173, -194, -211, -232 +55 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/MBeanContainerLifeCycleTest.java": [ -34, -40, -50, -56, -73, -101 +34 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/MBeanContainerTest.java": [ -37, -46, -53, -63, -85, -91, -97, -107, -117, -136, -153, -171, -183, -194, -209, -215 +37 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ObjectMBeanTest.java": [ -41, -46, -52, -59, -66, -77, -88, -99, -109, -135, -181 +41 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/ObjectMBeanUtilTest.java": [ -42, -53, -62, -73, -84, -92, -103, -113, -123, -135, -146, -178, -197, -205, -213, -221, -234 +42 ], "org.eclipse.jetty:jetty-project:jetty-jmx/src/test/java/org/eclipse/jetty/jmx/PojoTest.java": [ -34, -37 +34 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/AsyncCompletionTest.java": [ -118, -204, -486, -647 +71 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/AsyncRequestReadTest.java": [ -49, -56, -66, -73, -120, -219, -269, -305 +49 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/AsyncStressTest.java": [ -54, -76, -90, -97 +54 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/CheckReverseProxyHeadersTest.java": [ -36, -39 +36 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ClassLoaderDumpTest.java": [ -32, -35, -56, -78, -108, -157 +32 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ConnectionOpenCloseTest.java": [ -51, -56, -107, -170 +51 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/CookiesTest.java": [ -29, -32, -41, -64, -87, -109, -133, -158 +29 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/CustomResourcesMonitorTest.java": [ -45, -54, -76, -82 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/DelayedServerTest.java": [ -33, -36 +33 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/DetectorConnectionTest.java": [ -51, -122, -129, -149, -169, -189, -222, -250, -274, -300, -324, -354, -389, -415, -442, -465, -500, -567, -613, -628, -634 +51 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ErrorHandlerTest.java": [ -54, -61, -133, -140, -157, -172, -187, -204, -222, -240, -259, -278, -297, -314, -333, -352, -371, -389, -412, -441, -526, -548 +54 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ExtendedServerTest.java": [ -48, -51, -115 +48 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ForwardedRequestCustomizerTest.java": [ -69, -127, -589, -605, -624 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/GracefulStopTest.java": [ -55, -113, -285, -300, -320, -338, -361 +55 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HalfCloseTest.java": [ -38, -41, -66, -105 +38 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HostHeaderCustomizerTest.java": [ -37, -40 +37 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpChannelEventTest.java": [ -44, -59, -66, -109, -143, -172, -208, -244 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java": [ -79, -100, -107, -156, -175, -189, -206, -235, -304, -370, -423, -444, -457, -471, -485, -494, -502, -510, -518, -526, -534, -542, -550, -564, -577, -599, -622, -639, -659, -680, -700, -751, -800, -813, -823, -834, -844, -863, -884, -910, -974, -1011, -1035, -1069, -1103, -1135, -1167, -1199, -1219, -1269, -1311, -1365 +72 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpInputAsyncStateTest.java": [ -49, -95, -269, -275, -291, -308, -326, -344, -363, -379, -396, -414, -432, -451, -467, -484, -502, -520, -539, -559, -580, -602, -624, -647, -672, -707 +49 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpInputTest.java": [ -41, -178, -192, -198, -210, -254, -282, -311, -337, -362, -379, -429, -450, -497, -528, -538, -548, -564, -574, -595 +41 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToAsyncCommitTest.java": [ -77, -91, -149, -165, -224, -239, -305, -321, -388, -404, -469, -487, -555, -572, -641, -657, -723, -740, -806, -821, -884, -900 +51 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpManyWaysToCommitTest.java": [ -57, -69, -96, -110, -137, -151, -180, -195, -228, -242, -272, -287, -320, -335, -350, -365, -438, -453, -468, -480, -492, -506, -572, -586, -618, -632, -663, -677 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpOutputTest.java": [ -69, -103, -110, -117, -124, -148, -158, -169, -200, -210, -221, -232, -243, -296, -310, -324, -338, -352, -366, -380, -394, -408, -425, -439, -453, -467, -482, -497, -512, -527, -545, -560, -575, -590, -606, -624, -640, -658, -695, -734, -818, -868, -921, -976 +59 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java": [ -43, -67, -90 +43 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/HttpWriterTest.java": [ -36, -43, -69, -77, -85, -93, -108, -137, -145, -168, -206 +36 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/InclusiveByteRangeTest.java": [ -35, -89, -96, -109, -127, -142, -157, -171, -185, -199, -212, -226, -240, -255, -261, -284, -290, -296, -303, -309, -316, -322, -328, -334, -340, -346, -352 +35 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/InsufficientThreadsDetectionTest.java": [ -28, -34, -40, -60, -77 +28 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LargeHeaderTest.java": [ -48, -53, -93, -99 +48 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LocalAsyncContextTest.java": [ -53, -79, -86, -98, -110, -122, -134, -146, -158, -170, -209 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LocalConnectorTest.java": [ -38, -44, -55, -63, -93, -101, -109, -120, -131, -142, -154, -166, -178, -204, -237, -263, -281, -300, -315, -336, -356, -396 +38 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/LowResourcesMonitorTest.java": [ -44, -52, -79, -85, -120, -170, -192 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/MultiPartCaptureTest.java": [ -158 +59 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/MultiPartFormInputStreamTest.java": [ -60, -75, -100, -123, -142, -202, -212, -228, -268, -283, -298, -341, -374, -387, -401, -420, -435, -457, -480, -504, -528, -551, -570, -580, -635, -652, -686, -712, -739, -761, -782, -804, -826, -847, -853, -951, -985, -1035, -1073 +60 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/MultiPartParserTest.java": [ -38, -42, -54, -67, -101, -114, -151, -164, -192, -210, -227, -247, -278, -296, -319, -343, -376, -403, -442, -475, -518, -650 +38 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/NotAcceptingTest.java": [ -57, -79, -86, -153, -215, -301, -365 +47 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/OptionalSslConnectionTest.java": [ -43, -72, -89, -137, -158, -180, -208 +43 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/PartialRFC2616Test.java": [ -45, -51, -74, -81, -107, -132, -149, -195, -243, -275, -289, -328, -355, -388, -412, -424, -442, -465, -492, -507, -525, -547, -563, -582, -605, -628 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ProxyConnectionTest.java": [ -40, -44, -57, -70, -86, -99, -118, -156, -189, -202, -210, -225, -243, -279 +40 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ProxyCustomizerTest.java": [ -43, -131, -162 +43 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ProxyProtocolTest.java": [ -42, -57, -64, -120, -221 +42 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java": [ -103, -111, -134, -141, -201, -236, -262, -293, -329, -378, -415, -469, -524, -560, -595, -622, -645, -664, -683, -704, -761, -912, -958, -983, -1007, -1033, -1061, -1090, -1159, -1204, -1242, -1279, -1324, -1432, -1560, -1596, -1667, -1731, -1777, -1784, -1816, -1877 +103 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ResourceCacheTest.java": [ -53, -113, -143, -181, -350 +53 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java": [ -122, -182, -190, -295, -310, -334, -348, -371, -416, -478, -539, -567, -578, -605, -644, -679, -693, -707, -725, -748, -771, -809, -833, -840, -859, -928, -1007, -1084, -1092, -1102, -1115, -1175, -1193, -1210, -1236, -1259, -1278, -1287, -1341, -1375, -1392, -1417, -1431 +96 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorCloseTest.java": [ -24, -27, -33 +24 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorHttpServerTest.java": [ -26, -29 +26 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTest.java": [ -62, -122, -153, -185, -217, -236, -264, -292 +62 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ServerConnectorTimeoutTest.java": [ -49, -52, -60, -70, -89, -107, -155 +49 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ServletRequestWrapperTest.java": [ -36, -43, -55 +36 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ServletWriterTest.java": [ -45, -63, -69 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ShutdownMonitorTest.java": [ -38, -41, -47, -78, -85, -124, -155, -187 +38 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/SlowClientWithPipelinedRequestTest.java": [ -44, -77, -87 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/StopTest.java": [ -64, -74, -251, -263, -275, -281, -371, -457 +64 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/StressTest.java": [ -55, -95, -114, -121, -131, -137, -147, -153 +55 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ThreadStarvationTest.java": [ -155, -162, -190, -280 +62 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/AllowSymLinkAliasCheckerTest.java": [ -79, -86, -195 +52 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/BufferedResponseHandlerTest.java": [ -44, -54, -79, -85, -99, -112, -122, -135, -149, -160, -171, -182, -194, -206, -221 +44 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerCollectionTest.java": [ -45, -48, -165, -246, -283, -343 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerGetResourceTest.java": [ -49, -60, -132, -138, -146, -159, -172, -185, -199, -213, -226, -239, -249, -262, -276, -290, -304, -323, -336, -360, -385, -406 +49 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ContextHandlerTest.java": [ -53, -56, -62, -68, -125, -367, -399, -464, -480, -524, -577, -607, -640, -667, -674, -691, -708, -725, -741, -758 +53 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/DebugHandlerTest.java": [ -69, -134, -140, -154 +56 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/DefaultHandlerTest.java": [ -39, -46, -66, -72, -98, -124 +39 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/HandlerTest.java": [ -37, -40, -55, -70, -79, -91, -105, -119, -145, -171, -180, -200, -220, -231, -245, -262 +37 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/InetAccessHandlerTest.java": [ -55, -80, -87 +47 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/NcsaRequestLogTest.java": [ -107, -113, -127, -139, -163, -179, -195, -211, -224, -237, -250, -263, -276, -289, -302, -315, -331, -347, -360, -373, -408, -420, -434, -448, -469, -504, -533, -563 +61 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ResourceHandlerRangeTest.java": [ -42, -48, -87, -93 +42 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ResourceHandlerTest.java": [ -67, -78, -143, -149, -155, -164, -178, -191, -209, -221, -233, -245, -259, -268, -286, -330, -343 +67 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ScopedHandlerTest.java": [ -34, -39, -45, -57, -72, -90, -114 +34 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/SecuredRedirectHandlerTest.java": [ -57, -66, -150, -160, -172, -185, -197, -209 +57 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ShutdownHandlerTest.java": [ -45, -68, -90, -102 +45 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/StatisticsHandlerTest.java": [ -53, -62, -79, -86, -179, -240, -370, -429, -485, -537, -652, -772 +53 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/handler/ThreadLimitHandlerTest.java": [ -46, -53, -63, -70, -108, -141, -174 +46 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/resource/RangeWriterTest.java": [ -56, -119, -130, -145, -164, -183 +50 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/session/HouseKeeperTest.java": [ -39, -79 +39 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionCookieTest.java": [ -36, -122 +36 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/session/SessionHandlerTest.java": [ -35, -38, -47 +35 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLCloseTest.java": [ -42, -45 +42 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLEngineTest.java": [ -68, -111, -130, -137, -166, -194, -270 +68 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLReadEOFAfterResponseTest.java": [ -50, -53 +50 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SSLSelectChannelConnectorLoadTest.java": [ -55, -62, -89, -96, -105, -158 +55 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SelectChannelServerSslTest.java": [ -72, -83, -188, -248 +72 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SlowClientsTest.java": [ -55, -60 +55 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SniSslConnectionFactoryTest.java": [ -76, -84, -158, -165, -173, -187, -208, -223, -233, -250, -275, -304, -327, -388, -448 +76 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslConnectionFactoryTest.java": [ -63, -70, -114, -121, -128, -135, -150, -192 +63 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslContextFactoryReloadTest.java": [ -90, -97, -155 +60 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslSelectChannelTimeoutTest.java": [ -33, -44 +33 ], "org.eclipse.jetty:jetty-project:jetty-server/src/test/java/org/eclipse/jetty/server/ssl/SslUploadTest.java": [ -54, -61, -79, -87 +54 ], "org.eclipse.jetty:jetty-project:jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/JMXTest.java": [ -36, -39 +36 ], "org.eclipse.jetty:jetty-project:jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/JettyLoggerConfigurationTest.java": [ -29, -32, -56, -66, -77, -88, -98, -109, -119, -130, -141, -151, -162, -174, -188, -203, -220, -240 +29 ], "org.eclipse.jetty:jetty-project:jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/JettyLoggerTest.java": [ -38, -41, -48, -83, -108, -130, -166, -221, -271, -317, -368, -400, -435, -485, -519, -553, -584, -620 +38 ], "org.eclipse.jetty:jetty-project:jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/StdErrAppenderTest.java": [ -26, -29 +26 ], "org.eclipse.jetty:jetty-project:jetty-util-ajax/src/test/java/org/eclipse/jetty/util/ajax/AsyncJSONTest.java": [ -51, -73, -113, -136, -189, -216, -272, -299, -343, -369, -439, -485, -507 +40 ], "org.eclipse.jetty:jetty-project:jetty-util-ajax/src/test/java/org/eclipse/jetty/util/ajax/JSONCollectionConvertorTest.java": [ -39, -42, -50, -58, -87, -95 +39 ], "org.eclipse.jetty:jetty-project:jetty-util-ajax/src/test/java/org/eclipse/jetty/util/ajax/JSONPojoConvertorFactoryTest.java": [ -34, -37, -80 +34 ], "org.eclipse.jetty:jetty-project:jetty-util-ajax/src/test/java/org/eclipse/jetty/util/ajax/JSONPojoConvertorTest.java": [ -33, -36, -76 +33 ], "org.eclipse.jetty:jetty-project:jetty-util-ajax/src/test/java/org/eclipse/jetty/util/ajax/JSONTest.java": [ -44, -67, -73, -129, -147, -156, -165, -174, -183, -201, -210, -219, -228, -241, -264, -272, -283, -347, -411 +44 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/ArrayUtilTest.java": [ -34, -38, -54, -67, -82, -88 +34 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/AtomicBiIntegerTest.java": [ -28, -32, -74, -90 +28 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/BlockingArrayQueueTest.java": [ -41, -44, -84, -106, -119, -170, -214, -340, -347, -369, -403, -416, -438, -472, -512 +41 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/BufferUtilTest.java": [ -43, -46, -71, -95, -119, -143, -162, -179, -198, -216, -241, -270, -277, -284, -294, -325, -337, -348 +43 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/DateCacheTest.java": [ -36, -41, -74 +36 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/FutureCallbackTest.java": [ -36, -39, -47, -57, -70, -100, -116, -148, -162 +36 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/HostPortTest.java": [ -92, -114 +32 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/IncludeExcludeSetTest.java": [ -28, -31 +28 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/IncludeExcludeTest.java": [ -27, -30, -39, -53, -69, -87, -96, -113, -131 +27 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/InetAddressSetTest.java": [ -64, -72, -118, -135, -202, -212, -253, -262, -293, -302 +41 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/IntrospectionUtilTest.java": [ -34, -38, -44, -50, -57, -64, -71 +34 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/IteratingCallbackTest.java": [ -34, -39, -46, -52, -77, -104, -141, -169, -195, -256, -262 +34 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/JavaVersionTest.java": [ -29, -32, -43, -54, -65, -76, -87, -98, -109, -120, -131, -142, -153 +29 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/LazyListTest.java": [ -51, -63, -79, -98, -112, -131, -151, -175, -187, -203, -219, -237, -252, -267, -283, -301, -317, -335, -358, -382, -401, -422, -433, -448, -465, -481, -499, -517, -533, -551, -571, -591, -612, -635, -656, -677, -699, -723, -735, -750, -768, -787, -810, -836, -867, -881, -914, -945, -985, -1021, -1034, -1058, -1091, -1130, -1144, -1158, -1177, -1197, -1217, -1228, -1252, -1265, -1279, -1297, -1319, -1343, -1366, -1375, -1385, -1401, -1421, -1434, -1447, -1460, -1474, -1484, -1494, -1516, -1525, -1536, -1551, -1567, -1579, -1592, -1612, -1635, -1645, -1655, -1671, -1688, -1699, -1714, -1733, -1753, -1765, -1782, -1807, -1833, -1847, -1861, -1876, -1893, -1911, -1932, -1957, -1977, -1998, -2012, -2035, -2050, -2062, -2074, -2087, -2100, -2119 +43 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/LeakDetectorTest.java": [ -29, -53, -78 +29 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/LoaderTest.java": [ -34, -38, -44, -50 +34 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/MultiExceptionTest.java": [ -32, -35, -49, -142, -207 +32 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/MultiMapTest.java": [ -36, -42, -57, -73, -89, -113, -133, -149, -164, -187, -213, -236, -259, -282, -303, -324, -354, -375, -398, -421, -444, -465, -484, -502, -517, -532, -551 +36 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/MultiReleaseJarFileTest.java": [ -37, -42, -51, -75, -103, -126 +37 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/PathWatcherTest.java": [ -306, -432, -495, -555, -606, -670, -733, -793, -865, -925 +57 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/PoolTest.java": [ -54, -98, -111, -125, -137, -200, -214, -224, -240, -253, -268, -282, -296, -312, -335, -359, -384, -402, -415, -440, -453, -464, -485, -510, -527, -536 +41 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/ProcessorUtilsTest.java": [ -26, -29, -44 +26 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/QueueBenchmarkTest.java": [ -42, -53, -71 +42 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/QuotedStringTokenizerTest.java": [ -28, -34, -45, -57, -73, -95, -116, -151, -161, -174, -190 +28 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/RegexSetTest.java": [ -25, -29, -39, -52, -65 +25 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/RolloverFileOutputStreamTest.java": [ -47, -89, -110, -130, -150, -170, -190, -293, -333 +47 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/ScannerTest.java": [ -48, -56, -107, -126, -201, -277, -383 +48 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/SearchPatternTest.java": [ -29, -33, -66, -79, -98, -114, -123, -139, -174, -180, -224 +29 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/SharedBlockingCallbackTest.java": [ -40, -56, -70, -105, -128, -173, -214, -225 +40 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/StringUtilTest.java": [ -43, -51, -69, -86, -96, -132, -139, -150, -157, -170, -191, -207, -223, -239, -249 +39 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/TestIntrospectionUtil.java": [ -108, -130, -146, -159, -172, -185, -200, -213, -226 +33 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/TopologicalSortTest.java": [ -28, -32, -42, -57, -73, -89, -109, -138, -155, -169 +28 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/TrieTest.java": [ -65, -84, -106, -133, -158, -183, -201, -222, -243 +37 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/TypeUtilTest.java": [ -38, -41, -59, -85, -107, -136, -165, -177, -185, -194, -203, -212 +38 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/URIUtilCanonicalPathTest.java": [ -136 +31 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/URIUtilTest.java": [ -82, -92, -128, -183, -189, -289, -368, -390, -410, -440, -465, -486, -502, -518, -541, -578, -615, -645, -709, -731 +63 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/URLEncodedTest.java": [ -52, -169, -223, -236, -251, -281, -291, -302 +49 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/UptimeTest.java": [ -23, -26 +23 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java": [ -33, -38, -49, -60, -72 +33 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/Utf8AppendableTest.java": [ -61, -76, -93, -112, -128, -149, -161, -181, -201, -220, -239, -258 +43 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/Utf8LineParserTest.java": [ -31, -55, -71, -87, -138 +31 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/component/ContainerLifeCycleTest.java": [ -40, -43, -76, -126, -137, -207, -351, -521, -621, -648, -671, -708 +40 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/component/DumpableTest.java": [ -29, -32, -40 +29 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/component/LifeCycleListenerNestedTest.java": [ -37, -179, -214, -250 +37 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/component/LifeCycleListenerTest.java": [ -30, -35, -71, -114 +30 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/ClassPathResourceTest.java": [ -30, -36, -54, -73, -100 +30 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java": [ -216, -224, -233, -243, -252, -278, -297, -326, -386, -402, -424, -441, -454, -473, -487, -508, -527, -542, -566, -596, -615, -647, -689, -730, -770, -810, -856, -904, -943, -970, -998, -1026, -1054, -1082, -1110, -1142, -1159, -1221, -1248, -1275, -1316, -1357, -1386, -1417, -1450, -1470, -1506 +78 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/JarResourceTest.java": [ -51, -56, -94, -106, -124, -141, -183, -194, -222, -246 +51 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/JrtResourceTest.java": [ -36, -41, -58, -75, -91, -103 +36 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/PathResourceTest.java": [ -41, -44, -68, -92, -113 +41 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceAliasTest.java": [ -43, -50, -87 +43 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceCollectionTest.java": [ -42, -47, -55, -63, -71, -79, -86, -96, -106, -116, -130, -144, -179, -201, -218 +42 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java": [ -253, -260, -267, -279, -291 +47 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/security/CredentialTest.java": [ -31, -35, -54, -66, -75, -84, -93, -101 +31 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/security/PasswordTest.java": [ -25, -28, -37, -45 +25 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/ssl/SslContextFactoryTest.java": [ -69, -74, -88, -108, -139, -149, -164, -171, -178, -193, -209, -227, -241, -255, -270, -279, -319, -337, -346, -355 +69 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/ssl/X509Test.java": [ -32, -35, -52, -69, -86, -102, -117, -132, -142, -152, -162 +32 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/statistic/CounterStatisticTest.java": [ -31, -35, -79 +31 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/statistic/RateStatisticTest.java": [ -29, -32 +29 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/statistic/SampleStatisticTest.java": [ -27, -50 +27 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/AutoLockTest.java": [ -29, -32, -50, -73 +29 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/EatWhatYouKillTest.java": [ -34, -55, -62 +34 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/QueuedThreadPoolTest.java": [ -44, -182, -282, -369, -412, -465, -513, -567, -624, -707, -740, -754, -760, -778 +44 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/ReservedThreadExecutorTest.java": [ -40, -61, -70, -76, -83, -117, -165, -189, -271 +40 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/SchedulerTest.java": [ -63, -80, -102, -140, -161, -182 +40 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/SerializedExecutorTest.java": [ -33, -36 +33 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/SweeperTest.java": [ -32, -37, -44, -50, -56, -95 +32 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/ThreadClassLoaderScopeTest.java": [ -30, -49, -60 +30 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/ThreadFactoryTest.java": [ -31, -34 +31 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/strategy/ExecuteProduceConsumeTest.java": [ -36, -48, -79, -87, -94, -105, -124, -156, -188, -265 +36 ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/thread/strategy/ExecutionStrategyTest.java": [ -68, -75, -92, -112, -150 +45 ], "org.eclipse.jetty:jetty-project:jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlAppendableTest.java": [ -28, -31 +28 ], "org.eclipse.jetty:jetty-project:jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlConfigurationTest.java": [ -87, -102, -179, -290, -305, -315, -327, -339, -351, -363, -374, -387, -402, -412, -425, -434, -445, -456, -466, -477, -488, -499, -523, -540, -557, -574, -591, -608, -635, -689, -705, -728, -755, -782, -801, -820, -839, -858, -877, -895, -933, -947, -974, -1001, -1065, -1077, -1090, -1102, -1113, -1124, -1138, -1152, -1166, -1180, -1191, -1204, -1218, -1232, -1246, -1267, -1288, -1304, -1333, -1390, -1420, -1450, -1464, -1479, -1541, -1561 +79 ], "org.eclipse.jetty:jetty-project:jetty-xml/src/test/java/org/eclipse/jetty/xml/XmlParserTest.java": [ -27, -30 +27 ], "org.eclipse.jetty:jetty-project:tests/jetty-http-tools/src/test/java/org/eclipse/jetty/http/tools/HttpTesterTest.java": [ -39, -67, -86, -104, -126, -151, -169, -189, -214, -253 +39 ], "org.eclipse.jetty:jetty-project:tests/jetty-http-tools/src/test/java/org/eclipse/jetty/http/tools/matchers/HttpFieldsMatchersTest.java": [ -28, -31, -43, -59, -75, -91, -107 +28 ] } diff --git a/its/ruling/src/test/resources/mall/java-S5786.json b/its/ruling/src/test/resources/mall/java-S5786.json index a4443f3e43b..fb9b99c3414 100644 --- a/its/ruling/src/test/resources/mall/java-S5786.json +++ b/its/ruling/src/test/resources/mall/java-S5786.json @@ -1,21 +1,14 @@ { "com.macro.mall:mall:mall-demo/src/test/java/com/macro/mall/demo/MallDemoApplicationTests.java": [ -11, -14, -18 +11 ], "com.macro.mall:mall:mall-portal/src/test/java/com/macro/mall/portal/MallPortalApplicationTests.java": [ -7, -10 +7 ], "com.macro.mall:mall:mall-portal/src/test/java/com/macro/mall/portal/PortalProductDaoTests.java": [ -19, -23 +19 ], "com.macro.mall:mall:mall-search/src/test/java/com/macro/mall/search/MallSearchApplicationTests.java": [ -16, -22, -25, -30 +16 ] } diff --git a/its/vibebot/pom.xml b/its/vibebot/pom.xml index 40e7b8f8604..db6c149bffc 100644 --- a/its/vibebot/pom.xml +++ b/its/vibebot/pom.xml @@ -11,6 +11,7 @@ UTF-8 21 + 1.7.30 diff --git a/java-checks-test-sources/default/src/test/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheckSample.java b/java-checks-test-sources/default/src/test/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheckSample.java index 301775fe00b..936bbb8a3ee 100644 --- a/java-checks-test-sources/default/src/test/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheckSample.java +++ b/java-checks-test-sources/default/src/test/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheckSample.java @@ -10,49 +10,44 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -class JUnit5DefaultPackageClassAndMethodCheckSample { +class JUnit5DefaultPackageClassAndMethodCheckSample { // Noncompliant {{Remove redundant visibility modifiers from this test class and its methods.}} [[quickfixes=qf1]] +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // fix@qf1 {{Remove all redundant visibility modifiers}} + // edit@qf1 [[sl=+12;sc=3;el=+12;ec=10]] {{}} + // edit@qf1 [[sl=+16;sc=3;el=+16;ec=13]] {{}} + // edit@qf1 [[sl=+20;sc=3;el=+20;ec=10]] {{}} + // edit@qf1 [[sl=+24;sc=3;el=+24;ec=10]] {{}} + // edit@qf1 [[sl=+28;sc=3;el=+28;ec=10]] {{}} + // edit@qf1 [[sl=+32;sc=3;el=+32;ec=10]] {{}} + // edit@qf1 [[sl=+36;sc=3;el=+36;ec=13]] {{}} @BeforeAll - public static void beforeAll() {} // Noncompliant {{Remove this 'public' modifier.}} [[quickfixes=qf5]] -//^^^^^^ - // fix@qf5 {{Remove "public" modifier}} - // edit@qf5 [[sc=3;ec=10]] {{}} + public static void beforeAll() {} +//^^^^^^< @AfterAll - protected static void afterAll() {} // Noncompliant {{Remove this 'protected' modifier.}} [[quickfixes=qf6]] -//^^^^^^^^^ - // fix@qf6 {{Remove "protected" modifier}} - // edit@qf6 [[sc=3;ec=13]] {{}} + protected static void afterAll() {} +//^^^^^^^^^< @BeforeEach - public void beforeEach() {} // Noncompliant {{Remove this 'public' modifier.}} [[quickfixes=qf7]] -//^^^^^^ - // fix@qf7 {{Remove "public" modifier}} - // edit@qf7 [[sc=3;ec=10]] {{}} + public void beforeEach() {} +//^^^^^^< @AfterEach - public void afterEach() {} // Noncompliant {{Remove this 'public' modifier.}} [[quickfixes=qf8]] -//^^^^^^ - // fix@qf8 {{Remove "public" modifier}} - // edit@qf8 [[sc=3;ec=10]] {{}} + public void afterEach() {} +//^^^^^^< @Test - public void testPublic() {} // Noncompliant {{Remove this 'public' modifier.}} [[quickfixes=qf1]] -//^^^^^^ - // fix@qf1 {{Remove "public" modifier}} - // edit@qf1 [[sc=3;ec=10]] {{}} + public void testPublic() {} +//^^^^^^< @Test - public static void testPublicStatic() {} // Noncompliant {{Remove this 'public' modifier.}} [[quickfixes=qf2]] -//^^^^^^ - // fix@qf2 {{Remove "public" modifier}} - // edit@qf2 [[sc=3;ec=10]] {{}} + public static void testPublicStatic() {} +//^^^^^^< @Test - protected void testProtected() {} // Noncompliant [[quickfixes=qf3]] -//^^^^^^^^^ - // fix@qf3 {{Remove "protected" modifier}} - // edit@qf3 [[sc=3;ec=13]] {{}} + protected void testProtected() {} +//^^^^^^^^^< @Test private void testPrivate() {} // Compliant, bug raises by S5810 @@ -80,14 +75,23 @@ public static class WithoutTest { // Compliant } - protected static class PublicWithOneTest { // Noncompliant {{Remove this 'protected' modifier.}} [[quickfixes=qf4]] + protected static class PublicWithOneTest { // Noncompliant {{Remove this 'protected' modifier.}} [[quickfixes=qf2]] //^^^^^^^^^ - // fix@qf4 {{Remove "protected" modifier}} - // edit@qf4 [[sc=3;ec=13]] {{}} + // fix@qf2 {{Remove this 'protected' modifier.}} + // edit@qf2 [[sc=3;ec=13]] {{}} @Test void test() {} } + public static class WithClassAndMethodModifiers { // Noncompliant {{Remove redundant visibility modifiers from this test class and its methods.}} [[quickfixes=qf3]] + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // fix@qf3 {{Remove all redundant visibility modifiers}} + // edit@qf3 [[sl=+6;sc=5;el=+6;ec=12]] {{}} + // edit@qf3 [[sc=3;ec=10]] {{}} + @Test + public void test() {} + } + private static class PrivateWithOneTest { // Compliant, bug handled by S5810 @Test void test() {} @@ -175,4 +179,9 @@ public void test_to_override() { assertEquals(23, 12 + 11); } } + + Object anonymousClassWithTest = new Object() { + @Test + public void test() {} // Compliant, anonymous classes are ignored + }; } diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/ClassPatternsUtils.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/ClassPatternsUtils.java index 84da2b0e0f7..dc85c801744 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/helpers/ClassPatternsUtils.java +++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/ClassPatternsUtils.java @@ -31,6 +31,22 @@ public class ClassPatternsUtils { private ClassPatternsUtils() { } + /** + * Returns true if the class has any public static method or public static field that requires + * the class itself to be public (e.g. constants or factory methods used from outside). + */ + public static boolean shouldBePublicClass(ClassTree classTree, List methods) { + boolean hasPublicStaticMethods = methods.stream() + .map(MethodTree::modifiers) + .anyMatch(mods -> ModifiersUtils.hasAll(mods, Modifier.PUBLIC, Modifier.STATIC)); + boolean hasPublicStaticFields = classTree.members().stream() + .filter(member -> member.is(Tree.Kind.VARIABLE)) + .map(VariableTree.class::cast) + .map(VariableTree::modifiers) + .anyMatch(mods -> ModifiersUtils.hasAll(mods, Modifier.PUBLIC, Modifier.STATIC)); + return hasPublicStaticMethods || hasPublicStaticFields; + } + public static boolean isPrivateInnerClass(ClassTree classTree) { return !classTree.symbol().owner().isPackageSymbol() && ModifiersUtils.hasModifier(classTree.modifiers(), Modifier.PRIVATE); diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java index c6402f358e2..1516dd283f7 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java +++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java @@ -16,6 +16,7 @@ */ package org.sonar.java.checks.helpers; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -164,9 +165,48 @@ public final class UnitTestUtils { private static final Pattern UNIT_TEST_NAME_RELATED_TO_OBJECT_METHODS_REGEX = Pattern.compile("equal|hash_?code|object_?method|to_?string", Pattern.CASE_INSENSITIVE); + public record JUnit5MethodGroups( + List classMethods, + List instanceMethods, + List otherMethods + ) {} + private UnitTestUtils() { } + /** + * Categorizes the methods of a JUnit 5 test class into three groups: + * class lifecycle methods (@BeforeAll/@AfterAll), instance methods (@Test/@BeforeEach/etc.), + * and other (non-JUnit 5) methods. Overriding methods are excluded from the JUnit 5 groups. + */ + public static JUnit5MethodGroups groupJUnit5Methods(ClassTree classTree) { + List classMethods = new ArrayList<>(); + List instanceMethods = new ArrayList<>(); + List otherMethods = new ArrayList<>(); + classTree.members().stream() + .filter(member -> member.is(Tree.Kind.METHOD)) + .map(MethodTree.class::cast) + .forEach(method -> { + if (hasJUnitJupiterAnnotation(method) || hasJUnit5InstanceLifecycleAnnotation(method)) { + if (isNotOverriding(method)) { + instanceMethods.add(method); + } + } else if (hasJUnit5ClassLifecycleAnnotation(method)) { + if (isNotOverriding(method)) { + classMethods.add(method); + } + } else { + otherMethods.add(method); + } + }); + return new JUnit5MethodGroups(classMethods, instanceMethods, otherMethods); + } + + private static boolean isNotOverriding(MethodTree tree) { + // When it cannot be decided, isOverriding will return null, we consider it as an override to avoid FP. + return Boolean.FALSE.equals(tree.isOverriding()); + } + public static boolean hasNestedAnnotation(ClassTree tree) { SymbolMetadata metadata = tree.symbol().metadata(); return metadata.isAnnotatedWith(NESTED_ANNOTATION); diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/AbstractJUnit5NotCompliantModifierChecker.java b/java-checks/src/main/java/org/sonar/java/checks/tests/AbstractJUnit5NotCompliantModifierChecker.java deleted file mode 100644 index 324be9fe19f..00000000000 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/AbstractJUnit5NotCompliantModifierChecker.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * SonarQube Java - * Copyright (C) SonarSource Sàrl - * mailto:info AT sonarsource DOT com - * - * You can redistribute and/or modify this program under the terms of - * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the Sonar Source-Available License for more details. - * - * You should have received a copy of the Sonar Source-Available License - * along with this program; if not, see https://sonarsource.com/license/ssal/ - */ -package org.sonar.java.checks.tests; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.sonar.java.checks.helpers.QuickFixHelper; -import org.sonar.java.checks.helpers.UnitTestUtils; -import org.sonar.java.model.ModifiersUtils; -import org.sonar.java.reporting.AnalyzerMessage; -import org.sonar.java.reporting.JavaQuickFix; -import org.sonar.java.reporting.JavaTextEdit; -import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; -import org.sonar.plugins.java.api.tree.ClassTree; -import org.sonar.plugins.java.api.tree.MethodTree; -import org.sonar.plugins.java.api.tree.Modifier; -import org.sonar.plugins.java.api.tree.ModifierKeywordTree; -import org.sonar.plugins.java.api.tree.ModifiersTree; -import org.sonar.plugins.java.api.tree.Tree; -import org.sonar.plugins.java.api.tree.VariableTree; - -public abstract class AbstractJUnit5NotCompliantModifierChecker extends IssuableSubscriptionVisitor { - - public enum ModifierScope { - // annotation like @Nested that applies to class - CLASS, - // annotation like @BeforeAll that applies to static class method - CLASS_METHOD, - // annotation like @BeforeEach that applies to non-static method - INSTANCE_METHOD - } - - protected static final String WRONG_MODIFIER_ISSUE_MESSAGE = "Remove this '%s' modifier."; - - protected abstract boolean isNonCompliantModifier(Modifier modifier, ModifierScope modifierScope); - - protected abstract void raiseIssueOnNonCompliantReturnType(MethodTree methodTree); - - protected void raiseIssueOnNonCompliantModifier(ModifierKeywordTree modifier) { - QuickFixHelper.newIssue(context) - .forRule(this) - .onTree(modifier) - .withMessage(WRONG_MODIFIER_ISSUE_MESSAGE, modifier.keyword().text()) - .withQuickFix(() -> - JavaQuickFix.newQuickFix("Remove \"%s\" modifier", modifier.keyword().text()) - .addTextEdit(JavaTextEdit.removeTextSpan(AnalyzerMessage.textSpanBetween(modifier, true, QuickFixHelper.nextToken(modifier), false))) - .build()) - .report(); - } - - @Override - public List nodesToVisit() { - return Collections.singletonList(Tree.Kind.CLASS); - } - - @Override - public void visitNode(Tree tree) { - ClassTree classTree = (ClassTree) tree; - if (classTree.symbol().isAbstract()) { - return; - } - - List junit5ClassMethods = new ArrayList<>(); - List junit5InstanceMethods = new ArrayList<>(); - List nonJunit5Methods = new ArrayList<>(); - classTree.members().stream() - .filter(member -> member.is(Tree.Kind.METHOD)) - .map(MethodTree.class::cast) - .forEach(method -> { - if (UnitTestUtils.hasJUnitJupiterAnnotation(method) || UnitTestUtils.hasJUnit5InstanceLifecycleAnnotation(method)) { - if (isNotOverriding(method)) { - junit5InstanceMethods.add(method); - } - } else if (UnitTestUtils.hasJUnit5ClassLifecycleAnnotation(method)) { - if (isNotOverriding(method)) { - junit5ClassMethods.add(method); - } - } else { - nonJunit5Methods.add(method); - } - }); - - raiseIssueOnMethods(junit5ClassMethods, ModifierScope.CLASS_METHOD); - raiseIssueOnMethods(junit5InstanceMethods, ModifierScope.INSTANCE_METHOD); - boolean classHasJunit5InstanceMethods = !junit5InstanceMethods.isEmpty(); - if (classHasJunit5InstanceMethods) { - raiseIssueOnClass(nonJunit5Methods, classTree); - } - } - - private void raiseIssueOnMethods(List junit5ClassMethods, ModifierScope classMethod) { - for (MethodTree junit5ClassMethod : junit5ClassMethods) { - raiseIssueOnNotCompliantModifiers(junit5ClassMethod.modifiers(), classMethod); - raiseIssueOnNonCompliantReturnType(junit5ClassMethod); - } - } - - private void raiseIssueOnClass(List nonJunit5Methods, ClassTree classTree) { - boolean hasPublicStaticMethods = nonJunit5Methods.stream() - .map(MethodTree::modifiers) - .anyMatch(AbstractJUnit5NotCompliantModifierChecker::isPublicStatic); - - boolean hasPublicStaticFields = classTree.members().stream() - .filter(member -> member.is(Tree.Kind.VARIABLE)) - .map(VariableTree.class::cast) - .map(VariableTree::modifiers) - .anyMatch(AbstractJUnit5NotCompliantModifierChecker::isPublicStatic); - - // Can we change the visibility of the class? - if (hasPublicStaticMethods || hasPublicStaticFields) { - return; - } - raiseIssueOnNotCompliantModifiers(classTree.modifiers(), ModifierScope.CLASS); - } - - private static boolean isPublicStatic(ModifiersTree modifiers) { - return ModifiersUtils.hasAll(modifiers, Modifier.PUBLIC, Modifier.STATIC); - } - - private void raiseIssueOnNotCompliantModifiers(ModifiersTree modifierTree, ModifierScope modifierScope) { - modifierTree.modifiers().stream() - .filter(modifier -> isNonCompliantModifier(modifier.modifier(), modifierScope)) - .findFirst() - .ifPresent(this::raiseIssueOnNonCompliantModifier); - } - - private static boolean isNotOverriding(MethodTree tree) { - // When it cannot be decided, isOverriding will return null, we consider that it as an override to avoid FP. - return Boolean.FALSE.equals(tree.isOverriding()); - } - -} diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheck.java index ac17c5f1636..d74d0c127ca 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5DefaultPackageClassAndMethodCheck.java @@ -16,22 +16,113 @@ */ package org.sonar.java.checks.tests; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.sonar.check.Rule; +import org.sonar.java.checks.helpers.ClassPatternsUtils; +import org.sonar.java.checks.helpers.QuickFixHelper; +import org.sonar.java.checks.helpers.UnitTestUtils; +import org.sonar.java.reporting.AnalyzerMessage; +import org.sonar.java.reporting.JavaQuickFix; +import org.sonar.java.reporting.JavaTextEdit; +import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; +import org.sonar.plugins.java.api.JavaFileScannerContext; +import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.Modifier; +import org.sonar.plugins.java.api.tree.ModifierKeywordTree; +import org.sonar.plugins.java.api.tree.ModifiersTree; +import org.sonar.plugins.java.api.tree.Tree; @Rule(key = "S5786") -public class JUnit5DefaultPackageClassAndMethodCheck extends AbstractJUnit5NotCompliantModifierChecker { +public class JUnit5DefaultPackageClassAndMethodCheck extends IssuableSubscriptionVisitor { + + private static final String MESSAGE = "Remove redundant visibility modifiers from this test class and its methods."; + private static final String MODIFIER_MESSAGE = "Remove this '%s' modifier."; + private static final String QUICK_FIX_ALL = "Remove all redundant visibility modifiers"; @Override - protected boolean isNonCompliantModifier(Modifier modifier, ModifierScope modifierScope) { - // All visibility modifiers except 'private' handled by S5810 - return modifier == Modifier.PUBLIC || modifier == Modifier.PROTECTED; + public List nodesToVisit() { + return Collections.singletonList(Tree.Kind.CLASS); } @Override - protected void raiseIssueOnNonCompliantReturnType(MethodTree methodTree) { - // Handled by S5810 + public void visitNode(Tree tree) { + ClassTree classTree = (ClassTree) tree; + if (classTree.symbol().isAbstract() || (classTree.simpleName() == null)) { + return; + } + + UnitTestUtils.JUnit5MethodGroups groups = UnitTestUtils.groupJUnit5Methods(classTree); + List junit5ClassMethods = groups.classMethods(); + List junit5InstanceMethods = groups.instanceMethods(); + List nonJunit5Methods = groups.otherMethods(); + + List noncompliantModifiers = new ArrayList<>(); + collectNonCompliantModifiers(junit5ClassMethods, noncompliantModifiers); + collectNonCompliantModifiers(junit5InstanceMethods, noncompliantModifiers); + + if (!junit5InstanceMethods.isEmpty() && !ClassPatternsUtils.shouldBePublicClass(classTree, nonJunit5Methods)) { + if (noncompliantModifiers.isEmpty()) { + // Only the class modifier is noncompliant (no method violations): report on the modifier directly. + classTree.modifiers().modifiers().stream() + .filter(m -> isNonCompliantModifier(m.modifier())) + .findFirst() + .ifPresent(m -> QuickFixHelper.newIssue(context) + .forRule(this) + .onTree(m) + .withMessage(MODIFIER_MESSAGE, m.keyword().text()) + .withQuickFixes(() -> List.of(buildQuickFix(List.of(m)))) + .report()); + return; + } + addNonCompliantModifier(classTree.modifiers(), noncompliantModifiers); + } + + if (!noncompliantModifiers.isEmpty()) { + List secondaries = noncompliantModifiers.stream() + .map(m -> new JavaFileScannerContext.Location(String.format(MODIFIER_MESSAGE, m.keyword().text()), m)) + .toList(); + List modifiersForFix = new ArrayList<>(noncompliantModifiers); + QuickFixHelper.newIssue(context) + .forRule(this) + .onTree(classTree.simpleName()) + .withMessage(MESSAGE) + .withSecondaries(secondaries) + .withQuickFixes(() -> List.of(buildQuickFix(modifiersForFix))) + .report(); + } + } + + private static void collectNonCompliantModifiers(List methods, List modifiers) { + for (MethodTree method : methods) { + addNonCompliantModifier(method.modifiers(), modifiers); + } + } + + private static void addNonCompliantModifier(ModifiersTree modifiers, List result) { + modifiers.modifiers().stream() + .filter(m -> isNonCompliantModifier(m.modifier())) + .findFirst() + .ifPresent(result::add); + } + + private static JavaQuickFix buildQuickFix(List modifiers) { + List edits = modifiers.stream() + .map(m -> JavaTextEdit.removeTextSpan( + AnalyzerMessage.textSpanBetween(m, true, QuickFixHelper.nextToken(m), false))) + .toList(); + String description = modifiers.size() == 1 + ? String.format(MODIFIER_MESSAGE, modifiers.get(0).keyword().text()) + : QUICK_FIX_ALL; + return JavaQuickFix.newQuickFix(description) + .addTextEdits(edits) + .build(); } + private static boolean isNonCompliantModifier(Modifier modifier) { + // All visibility modifiers except 'private' handled by S5810 + return modifier == Modifier.PUBLIC || modifier == Modifier.PROTECTED; + } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5SilentlyIgnoreClassAndMethodCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5SilentlyIgnoreClassAndMethodCheck.java index 011da80e278..cf383c5f0f0 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5SilentlyIgnoreClassAndMethodCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/JUnit5SilentlyIgnoreClassAndMethodCheck.java @@ -19,33 +19,107 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - import org.sonar.check.Rule; +import org.sonar.java.checks.helpers.ClassPatternsUtils; import org.sonar.java.checks.helpers.QuickFixHelper; +import org.sonar.java.checks.helpers.UnitTestUtils; +import org.sonar.java.reporting.AnalyzerMessage; import org.sonar.java.reporting.JavaQuickFix; import org.sonar.java.reporting.JavaTextEdit; +import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.semantic.Type; import org.sonar.plugins.java.api.tree.BaseTreeVisitor; +import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.Modifier; +import org.sonar.plugins.java.api.tree.ModifierKeywordTree; +import org.sonar.plugins.java.api.tree.ModifiersTree; import org.sonar.plugins.java.api.tree.ReturnStatementTree; +import org.sonar.plugins.java.api.tree.Tree; import org.sonar.plugins.java.api.tree.TypeTree; @Rule(key = "S5810") -public class JUnit5SilentlyIgnoreClassAndMethodCheck extends AbstractJUnit5NotCompliantModifierChecker { +public class JUnit5SilentlyIgnoreClassAndMethodCheck extends IssuableSubscriptionVisitor { + + private enum ModifierScope { + // annotation like @Nested that applies to class + CLASS, + // annotation like @BeforeAll that applies to static class method + CLASS_METHOD, + // annotation like @BeforeEach that applies to non-static method + INSTANCE_METHOD + } + + private static final String WRONG_MODIFIER_ISSUE_MESSAGE = "Remove this '%s' modifier."; @Override - protected boolean isNonCompliantModifier(Modifier modifier, ModifierScope modifierScope) { - return modifier == Modifier.PRIVATE || (modifierScope == ModifierScope.INSTANCE_METHOD && modifier == Modifier.STATIC); + public List nodesToVisit() { + return Collections.singletonList(Tree.Kind.CLASS); } @Override - protected void raiseIssueOnNonCompliantReturnType(MethodTree methodTree) { + public void visitNode(Tree tree) { + ClassTree classTree = (ClassTree) tree; + if (classTree.symbol().isAbstract()) { + return; + } + + UnitTestUtils.JUnit5MethodGroups groups = UnitTestUtils.groupJUnit5Methods(classTree); + List junit5ClassMethods = groups.classMethods(); + List junit5InstanceMethods = groups.instanceMethods(); + List nonJunit5Methods = groups.otherMethods(); + + raiseIssueOnMethods(junit5ClassMethods, ModifierScope.CLASS_METHOD); + raiseIssueOnMethods(junit5InstanceMethods, ModifierScope.INSTANCE_METHOD); + boolean classHasJunit5InstanceMethods = !junit5InstanceMethods.isEmpty(); + if (classHasJunit5InstanceMethods) { + raiseIssueOnClass(nonJunit5Methods, classTree); + } + } + + private void raiseIssueOnMethods(List methods, ModifierScope scope) { + for (MethodTree method : methods) { + raiseIssueOnNotCompliantModifiers(method.modifiers(), scope); + raiseIssueOnNonCompliantReturnType(method); + } + } + + private void raiseIssueOnClass(List nonJunit5Methods, ClassTree classTree) { + if (ClassPatternsUtils.shouldBePublicClass(classTree, nonJunit5Methods)) { + return; + } + raiseIssueOnNotCompliantModifiers(classTree.modifiers(), ModifierScope.CLASS); + } + + private void raiseIssueOnNotCompliantModifiers(ModifiersTree modifierTree, ModifierScope modifierScope) { + modifierTree.modifiers().stream() + .filter(modifier -> isNonCompliantModifier(modifier.modifier(), modifierScope)) + .findFirst() + .ifPresent(this::raiseIssueOnNonCompliantModifier); + } + + private void raiseIssueOnNonCompliantModifier(ModifierKeywordTree modifier) { + QuickFixHelper.newIssue(context) + .forRule(this) + .onTree(modifier) + .withMessage(WRONG_MODIFIER_ISSUE_MESSAGE, modifier.keyword().text()) + .withQuickFix(() -> + JavaQuickFix.newQuickFix("Remove \"%s\" modifier", modifier.keyword().text()) + .addTextEdit(JavaTextEdit.removeTextSpan(AnalyzerMessage.textSpanBetween(modifier, true, QuickFixHelper.nextToken(modifier), false))) + .build()) + .report(); + } + + private static boolean isNonCompliantModifier(Modifier modifier, ModifierScope modifierScope) { + return modifier == Modifier.PRIVATE || (modifierScope == ModifierScope.INSTANCE_METHOD && modifier == Modifier.STATIC); + } + + private void raiseIssueOnNonCompliantReturnType(MethodTree methodTree) { TypeTree returnType = methodTree.returnType(); // returnType of METHOD is never null (unlike CONSTRUCTOR) Type type = returnType.symbolType(); boolean methodReturnAValue = !type.isUnknown() && !type.isVoid(); - if(methodReturnAValue && !methodTree.symbol().metadata().isAnnotatedWith("org.junit.jupiter.api.TestFactory")) { + if (methodReturnAValue && !methodTree.symbol().metadata().isAnnotatedWith("org.junit.jupiter.api.TestFactory")) { List textEdits = new ArrayList<>(); textEdits.add(JavaTextEdit.replaceTree(returnType, "void")); // Make return statements return void