From 2cfb801fdd37b70571603463023e083db0e0199e Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Tue, 25 Aug 2026 11:40:22 +0200 Subject: [PATCH 1/6] build(errorprone): decide test code by source set, not by task name The gate that chose how NullAway and SelfAssertion read a compile was `name.contains("Test")`, so it classified code by a coincidence in the task name. testng-test-kit is test code living in a main source set: its task is `compileJava`, so it received neither HandleTestAssertionLibraries nor the SelfAssertion opt-out, even though its org.testng.xml half is null-marked by the package-info.class on its compile classpath and checked today. The Error Prone plugin already models this. `compilingTestOnlyCode` takes its convention from the source set name and a module can override it, so the module declares what it is instead of being guessed at. Proven with a throwaway probe in the marked package of testng-test-kit -- `assertThat(s).isNotNull()` followed by a dereference -- which fails to compile before the change and passes after. A green build alone could not show this: the change has no other visible effect. --- .../main/kotlin/testng.errorprone.gradle.kts | 38 +++++++++---------- .../testng-test-kit-build.gradle.kts | 16 ++++++++ 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts b/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts index 6670bde6e8..0a91c6e998 100644 --- a/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts +++ b/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts @@ -12,8 +12,6 @@ dependencies { } tasks.withType().configureEach { - val testCompile = name.contains("Test") - options.errorprone { disableWarningsInGeneratedCode.set(true) @@ -33,22 +31,24 @@ tasks.withType().configureEach { // what makes @NullMarked mean what JSpecify says it means rather than roughly half of it. option("NullAway:JSpecifyMode", true) - if (testCompile) { - // SelfAssertion only fires on TestNG's own sample/fixture classes, where trivial - // assertions such as assertThat("abc").isEqualTo("abc") exist solely to give the - // runner a passing method. Production code keeps the check enabled. - disable("SelfAssertion") - - // NullAway stays on here: @NullMarked is per package, not per source set, so twelve - // test packages are already marked by the main package-info.class on their compile - // classpath. - // - // HandleTestAssertionLibraries teaches NullAway that assertThat(x).isNotNull() refines - // x. It is keyed on the task name, so testng-test-kit -- test code that lives in a main - // source set -- does not get it, even though its org.testng.xml half is marked and - // checked today. That is inert only because the AssertJ use in that module sits in the - // unmarked test package, so nothing there refines a nullable value yet. - option("NullAway:HandleTestAssertionLibraries", true) - } + // Which compiles carry test code. The Error Prone plugin derives compilingTestOnlyCode + // from the *source set* name and lets a module override it, so a module whose main source + // set holds test fixtures can declare that rather than be classified by whether its task + // name happens to contain "Test". testng-test-kit is exactly that module. + // + // orElse: a JavaCompile task that belongs to no source set gets no convention, and feeding + // an absent provider to the options below would make them unresolvable. + val testCode = compilingTestOnlyCode.orElse(false) + + // SelfAssertion only fires on TestNG's own sample/fixture classes, where trivial + // assertions such as assertThat("abc").isEqualTo("abc") exist solely to give the runner a + // passing method. Production code keeps the check enabled. + check("SelfAssertion", testCode.map { if (it) CheckSeverity.OFF else CheckSeverity.DEFAULT }) + + // NullAway stays on for test code: @NullMarked is per package, not per source set, so the + // test half of every marked main package is already marked by the package-info.class on + // its compile classpath. HandleTestAssertionLibraries is what teaches NullAway that + // assertThat(x).isNotNull() refines x. + option("NullAway:HandleTestAssertionLibraries", testCode.map { it.toString() }) } } diff --git a/testng-test-kit/testng-test-kit-build.gradle.kts b/testng-test-kit/testng-test-kit-build.gradle.kts index b214fd14c3..a9490851a2 100644 --- a/testng-test-kit/testng-test-kit-build.gradle.kts +++ b/testng-test-kit/testng-test-kit-build.gradle.kts @@ -1,9 +1,25 @@ +import net.ltgt.gradle.errorprone.errorprone + plugins { id("testng.kotlin-library") } description = "Test fixtures shared by the TestNG modules. Never published." +// Everything here is test code even though it lives in a main source set. testng.errorprone +// reads this flag, and so does Error Prone itself -- several of its checks skip a compile +// marked test-only -- so opting a module in is a coverage decision, not just a switch. +// +// Error Prone is optional: testng.java only applies it when -PskipErrorProne is off, and the +// OpenRewrite job turns it off because Error Prone is a javac plugin OpenRewrite never sees. +// Reaching for options.errorprone unconditionally fails task configuration in those builds, so +// the option is registered only once the plugin that owns the extension is there. +pluginManager.withPlugin("net.ltgt.errorprone") { + tasks.withType().configureEach { + options.errorprone.compilingTestOnlyCode.set(true) + } +} + dependencies { api(platform("org.jetbrains.kotlin:kotlin-bom:2.4.10")) api("org.jetbrains.kotlin:kotlin-stdlib") { From b19bcdebed54ff28d526d8c8435787a54e12a79f Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Tue, 25 Aug 2026 11:46:51 +0200 Subject: [PATCH 2/6] style(errorprone): clear the mechanical warning sites in reach Each of these is a rewrite javac itself suggests, with no change in behaviour: - empty parentheses on annotations in the test.enable fixtures. @Test and @Test() are the same annotation by definition (JLS 9.7.2) and TestNG reads annotations reflectively, so the two forms it paired were never distinct. - Boolean.FALSE/Boolean.TRUE where a primitive literal is meant. - the nested ConfigMethodArguments.Builder import, qualified at its uses. - parameters differing from the field they assign only by capitalisation. - a javadoc block sitting between @Override and the method it documents, which is a comment rather than javadoc where it stood. - toLowerCase without a locale. Not a bug fix: the suffixes Parser.canParse receives contain neither i nor I, so a Turkish default locale cannot reach them. It is insurance, and cheaper than the argument about whether it bites. - a field that was only ever written, with the writes that fed it. Only InconsistentCapitalization is emptied here. The counts the others were scoped against came from truncated compiler output -- javac stops reporting after 100 warnings per compile task -- so the real inventory is several times larger and the rest is worked through in the commits that follow. --- .../src/main/java/org/testng/JarFileUtils.java | 3 ++- .../src/main/java/org/testng/SuiteRunner.java | 14 +++++++------- testng-core/src/main/java/org/testng/TestNG.java | 10 ++++------ .../src/main/java/org/testng/TestRunner.java | 3 +-- .../java/org/testng/internal/BaseTestMethod.java | 2 +- testng-core/src/test/java/test/enable/A.java | 14 +++++++------- testng-core/src/test/java/test/enable/B.java | 14 +++++++------- testng-core/src/test/java/test/enable/C.java | 14 +++++++------- .../java/test/enable/Issue420BaseTestCase.java | 4 ++-- .../reports/EmailableReporterCommandLineTest.java | 3 ++- .../testng/internal/LiteWeightTestNGMethod.java | 4 ++-- .../test/groups/issue2232/samples/SampleTest.java | 14 +++----------- 12 files changed, 45 insertions(+), 54 deletions(-) diff --git a/testng-core/src/main/java/org/testng/JarFileUtils.java b/testng-core/src/main/java/org/testng/JarFileUtils.java index d6d5eebbc4..6d1fe0d198 100644 --- a/testng-core/src/main/java/org/testng/JarFileUtils.java +++ b/testng-core/src/main/java/org/testng/JarFileUtils.java @@ -9,6 +9,7 @@ import java.util.Enumeration; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -94,7 +95,7 @@ private boolean testngXmlExistsInJar(File jarFile, List classes) throws while (entries.hasMoreElements()) { JarEntry je = entries.nextElement(); String jeName = je.getName(); - if (Parser.canParse(jeName.toLowerCase())) { + if (Parser.canParse(jeName.toLowerCase(Locale.ROOT))) { InputStream inputStream = jf.getInputStream(je); File copyFile = new File(file, jeName); if (!copyFile.toPath().normalize().startsWith(file.toPath().normalize())) { diff --git a/testng-core/src/main/java/org/testng/SuiteRunner.java b/testng-core/src/main/java/org/testng/SuiteRunner.java index 6c966572f3..c8e97130c3 100644 --- a/testng-core/src/main/java/org/testng/SuiteRunner.java +++ b/testng-core/src/main/java/org/testng/SuiteRunner.java @@ -12,7 +12,6 @@ import org.testng.internal.*; import org.testng.internal.annotations.IAnnotationFinder; import org.testng.internal.invokers.ConfigMethodArguments; -import org.testng.internal.invokers.ConfigMethodArguments.Builder; import org.testng.internal.invokers.IInvocationStatus; import org.testng.internal.invokers.IInvoker; import org.testng.internal.invokers.InvokedMethod; @@ -241,6 +240,7 @@ public void setReportResults(boolean reportResults) { useDefaultListeners = reportResults; } + @Override public ITestListener getExitCodeListener() { return exitCodeListener; } @@ -262,12 +262,12 @@ private void invokeListeners(boolean start) { } } - private void setOutputDir(String outputdir) { - if (isStringBlank(outputdir) && useDefaultListeners) { - outputdir = DEFAULT_OUTPUT_DIR; + private void setOutputDir(String outputDir) { + if (isStringBlank(outputDir) && useDefaultListeners) { + outputDir = DEFAULT_OUTPUT_DIR; } - outputDir = null != outputdir ? new File(outputdir).getAbsolutePath() : null; + this.outputDir = null != outputDir ? new File(outputDir).getAbsolutePath() : null; } private ITestRunnerFactory buildRunnerFactory(Comparator comparator) { @@ -361,7 +361,7 @@ private void privateRun() { if (invoker != null) { if (!beforeSuiteMethods.values().isEmpty()) { ConfigMethodArguments arguments = - new Builder() + new ConfigMethodArguments.Builder() .usingConfigMethodsAs(beforeSuiteMethods.values()) .forSuite(xmlSuite) .usingParameters(xmlSuite.getParameters()) @@ -389,7 +389,7 @@ private void privateRun() { // if (!afterSuiteMethods.values().isEmpty()) { ConfigMethodArguments arguments = - new Builder() + new ConfigMethodArguments.Builder() .usingConfigMethodsAs(afterSuiteMethods.values()) .forSuite(xmlSuite) .usingParameters(xmlSuite.getAllParameters()) diff --git a/testng-core/src/main/java/org/testng/TestNG.java b/testng-core/src/main/java/org/testng/TestNG.java index 2989c251f5..5700f53662 100644 --- a/testng-core/src/main/java/org/testng/TestNG.java +++ b/testng-core/src/main/java/org/testng/TestNG.java @@ -878,9 +878,9 @@ public List getSuiteListeners() { private Integer m_suiteThreadPoolSize = CommandLineArgs.SUITE_THREAD_POOL_SIZE_DEFAULT; - private boolean m_randomizeSuites = Boolean.FALSE; + private boolean m_randomizeSuites = false; - private boolean m_alwaysRun = Boolean.TRUE; + private boolean m_alwaysRun = true; private Boolean m_preserveOrder = XmlSuite.DEFAULT_PRESERVE_ORDER; private @Nullable Boolean m_groupByInstances; @@ -1807,7 +1807,7 @@ public void configure(Map cmdLineArgs) { (String) cmdLineArgs.getOrDefault( CommandLineArgs.XML_PATH_IN_JAR, CommandLineArgs.XML_PATH_IN_JAR_DEFAULT); - result.mixed = (Boolean) cmdLineArgs.getOrDefault(CommandLineArgs.MIXED, Boolean.FALSE); + result.mixed = (Boolean) cmdLineArgs.getOrDefault(CommandLineArgs.MIXED, false); Object tmpValue = cmdLineArgs.get(CommandLineArgs.INCLUDE_ALL_DATA_DRIVEN_TESTS_WHEN_SKIPPING); if (tmpValue != null) { result.includeAllDataDrivenTestsWhenSkipping = Boolean.parseBoolean(tmpValue.toString()); @@ -1816,9 +1816,7 @@ public void configure(Map cmdLineArgs) { (Boolean) cmdLineArgs.get(CommandLineArgs.SKIP_FAILED_INVOCATION_COUNTS); result.failIfAllTestsSkipped = Boolean.parseBoolean( - cmdLineArgs - .getOrDefault(CommandLineArgs.FAIL_IF_ALL_TESTS_SKIPPED, Boolean.FALSE) - .toString()); + cmdLineArgs.getOrDefault(CommandLineArgs.FAIL_IF_ALL_TESTS_SKIPPED, false).toString()); result.spiListenersToSkip = (String) cmdLineArgs.getOrDefault(CommandLineArgs.LISTENERS_TO_SKIP_VIA_SPI, ""); String parallelMode = (String) cmdLineArgs.get(CommandLineArgs.PARALLEL); diff --git a/testng-core/src/main/java/org/testng/TestRunner.java b/testng-core/src/main/java/org/testng/TestRunner.java index bb6e3542af..f4fa4d3b55 100644 --- a/testng-core/src/main/java/org/testng/TestRunner.java +++ b/testng-core/src/main/java/org/testng/TestRunner.java @@ -53,7 +53,6 @@ import org.testng.internal.annotations.IAnnotationFinder; import org.testng.internal.invokers.AbstractParallelWorker; import org.testng.internal.invokers.ConfigMethodArguments; -import org.testng.internal.invokers.ConfigMethodArguments.Builder; import org.testng.internal.invokers.IInvoker; import org.testng.internal.invokers.Invoker; import org.testng.internal.objects.IObjectDispenser; @@ -668,7 +667,7 @@ private void beforeRun() { private void invokeTestConfigurations(ITestNGMethod[] testConfigurationMethods) { if (null != testConfigurationMethods && testConfigurationMethods.length > 0) { ConfigMethodArguments arguments = - new Builder() + new ConfigMethodArguments.Builder() .usingConfigMethodsAs(testConfigurationMethods) .forSuite(m_xmlTest.getSuite()) .usingParameters(m_xmlTest.getAllParameters()) diff --git a/testng-core/src/main/java/org/testng/internal/BaseTestMethod.java b/testng-core/src/main/java/org/testng/internal/BaseTestMethod.java index 51f0ccb002..274a54f870 100644 --- a/testng-core/src/main/java/org/testng/internal/BaseTestMethod.java +++ b/testng-core/src/main/java/org/testng/internal/BaseTestMethod.java @@ -777,11 +777,11 @@ public void setRetryAnalyzerClass(Class clazz) { m_retryAnalyzerClass = clazz == null ? DisabledRetryAnalyzer.class : clazz; } - @Override /** * @return the retry analyzer class, never null: it is {@link DisabledRetryAnalyzer} until a retry * analyzer is set, and the setter normalises null back to it. */ + @Override public Class getRetryAnalyzerClass() { return m_retryAnalyzerClass; } diff --git a/testng-core/src/test/java/test/enable/A.java b/testng-core/src/test/java/test/enable/A.java index 6818973ba1..37a1fb426f 100644 --- a/testng-core/src/test/java/test/enable/A.java +++ b/testng-core/src/test/java/test/enable/A.java @@ -11,7 +11,7 @@ public void testA() {} @Test public void testA2() {} - @Test() + @Test public void testA3() {} @Test(enabled = false) @@ -20,16 +20,16 @@ public void disabledA() {} @BeforeSuite public void beforeSuiteA() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteA2() {} @BeforeSuite(enabled = false) public void disabledBeforeSuiteA() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteNoRunA() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteNoRunA2() {} @BeforeSuite(enabled = false) @@ -47,16 +47,16 @@ public void disabledBeforeSuiteRunA() {} @AfterSuite public void afterSuiteA() {} - @AfterSuite() + @AfterSuite public void afterSuiteA2() {} @AfterSuite(enabled = false) public void disabledAfterSuiteA() {} - @AfterSuite() + @AfterSuite public void afterSuiteNoRunA() {} - @AfterSuite() + @AfterSuite public void afterSuiteNoRunA2() {} @AfterSuite(enabled = false) diff --git a/testng-core/src/test/java/test/enable/B.java b/testng-core/src/test/java/test/enable/B.java index f01a3e78c7..653a7666ed 100644 --- a/testng-core/src/test/java/test/enable/B.java +++ b/testng-core/src/test/java/test/enable/B.java @@ -12,13 +12,13 @@ public void testB() {} @Test public void testB2() {} - @Test() + @Test public void testB3() {} @Test(enabled = false) public void disabledB() {} - @BeforeSuite() + @BeforeSuite public void disabledBeforeSuiteB() {} @BeforeSuite @@ -27,10 +27,10 @@ public void disabledBeforeSuiteB2() {} @BeforeSuite(enabled = false) public void disabledBeforeSuiteB3() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteNoRunB() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteNoRunB2() {} @BeforeSuite(enabled = false) @@ -48,16 +48,16 @@ public void disabledBeforeSuiteRunB() {} @AfterSuite public void afterSuiteB() {} - @AfterSuite() + @AfterSuite public void afterSuiteB2() {} @AfterSuite(enabled = false) public void disabledAfterSuiteB() {} - @AfterSuite() + @AfterSuite public void afterSuiteNoRunB() {} - @AfterSuite() + @AfterSuite public void afterSuiteNoRunB2() {} @AfterSuite(enabled = false) diff --git a/testng-core/src/test/java/test/enable/C.java b/testng-core/src/test/java/test/enable/C.java index d310f255c2..84723febed 100644 --- a/testng-core/src/test/java/test/enable/C.java +++ b/testng-core/src/test/java/test/enable/C.java @@ -12,7 +12,7 @@ public void testC() {} @Test public void testC2() {} - @Test() + @Test public void testC3() {} @Test(enabled = false) @@ -21,16 +21,16 @@ public void disabledC() {} @BeforeSuite public void beforeSuiteC() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteC2() {} @BeforeSuite(enabled = false) public void disabledBeforeSuiteC() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteNoRunC() {} - @BeforeSuite() + @BeforeSuite public void beforeSuiteNoRunC2() {} @BeforeSuite(enabled = false) @@ -48,16 +48,16 @@ public void disabledBeforeSuiteRunC() {} @AfterSuite public void afterSuiteC() {} - @AfterSuite() + @AfterSuite public void afterSuiteC2() {} @AfterSuite(enabled = false) public void disabledAfterSuiteC() {} - @AfterSuite() + @AfterSuite public void afterSuiteNoRunC() {} - @AfterSuite() + @AfterSuite public void afterSuiteNoRunC2() {} @AfterSuite(enabled = false) diff --git a/testng-core/src/test/java/test/enable/Issue420BaseTestCase.java b/testng-core/src/test/java/test/enable/Issue420BaseTestCase.java index 2565f3e0f5..50b02d8be8 100644 --- a/testng-core/src/test/java/test/enable/Issue420BaseTestCase.java +++ b/testng-core/src/test/java/test/enable/Issue420BaseTestCase.java @@ -8,10 +8,10 @@ public abstract class Issue420BaseTestCase { @BeforeSuite(alwaysRun = true) public static void alwaysBeforeSuite() {} - @BeforeSuite() + @BeforeSuite public static void beforeSuite() {} - @AfterSuite() + @AfterSuite public static void afterSuite() {} @AfterSuite(alwaysRun = true) diff --git a/testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java b/testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java index 88d17c3aba..f8a38acd1b 100644 --- a/testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java +++ b/testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java @@ -4,6 +4,7 @@ import java.io.File; import java.lang.reflect.Method; +import java.util.Locale; import org.testng.TestNG; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -30,7 +31,7 @@ public void testReportsNameCustomizationViaMainMethodInvocationAndJVMArguments( @DataProvider(name = "getReporterNames") public Object[][] getReporterNames(Method method) { - if (method.getName().toLowerCase().contains("jvmarguments")) { + if (method.getName().toLowerCase(Locale.ROOT).contains("jvmarguments")) { return new Object[][] {{EmailableReporter2.class.getName(), "emailable.report2.name"}}; } return new Object[][] {{EmailableReporter2.class.getName()}}; diff --git a/testng-runner-api/src/main/java/org/testng/internal/LiteWeightTestNGMethod.java b/testng-runner-api/src/main/java/org/testng/internal/LiteWeightTestNGMethod.java index 284b66db5f..27425b4b50 100644 --- a/testng-runner-api/src/main/java/org/testng/internal/LiteWeightTestNGMethod.java +++ b/testng-runner-api/src/main/java/org/testng/internal/LiteWeightTestNGMethod.java @@ -295,8 +295,8 @@ public long getTimeOut() { } @Override - public void setTimeOut(long timeOut) { - this.timeout = timeOut; + public void setTimeOut(long timeout) { + this.timeout = timeout; } @Override diff --git a/testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java b/testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java index e921b33583..e5c9530484 100644 --- a/testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java +++ b/testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java @@ -8,17 +8,11 @@ @Test(groups = {"Group1", "Group2", "Group3"}) public class SampleTest { - private int variable = 0; - @BeforeClass - public void setUp() { - variable += 1; - } + public void setUp() {} @AfterMethod - public void tearDown() { - variable += 1; - } + public void tearDown() {} @DataProvider(name = "testData1") public Object[][] testData1() { @@ -28,7 +22,5 @@ public Object[][] testData1() { } @Test(dataProvider = "testData1") - public void test1(String test) { - variable += 1; - } + public void test1(String test) {} } From 8824fe12311c1e209b73a9fe07fe34feef99f6b0 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Tue, 25 Aug 2026 11:59:39 +0200 Subject: [PATCH 3/6] style(errorprone): apply the Error Prone fixes for four checks Machine output, kept in its own commit so it can be re-derived rather than read hunk by hunk. Produced by Error Prone's own patcher: -XepPatchChecks:MissingOverride,UnnecessaryParentheses,BadImport,BooleanLiteral,NotJavadoc -XepPatchLocation:IN_PLACE followed by autostyleApply, which is what puts the inserted annotations on their own line. MissingOverride, UnnecessaryParentheses, BadImport and BooleanLiteral are now empty. NotJavadoc has one site the patcher does not fix; it is handled by hand in the next commit. The parenthesis removals all keep their grouping, and the one Boolean.TRUE in a data provider boxes to the same cached instance the literal does. --- .../java/org/testng/annotations/ITestAnnotation.java | 6 ++++++ .../org/testng/internal/protocols/Processor.java | 4 ++-- .../main/java/org/testng/internal/DynamicGraph.java | 12 ++++++++++++ .../main/java/org/testng/internal/Parameters.java | 2 +- .../internal/RegexpExpectedExceptionsHolder.java | 1 + .../org/testng/internal/TestMethodContainer.java | 2 ++ .../internal/annotations/AnnotationHelper.java | 2 +- .../annotations/ConfigurationAnnotation.java | 1 + .../internal/annotations/DataProviderAnnotation.java | 1 + .../internal/annotations/FactoryAnnotation.java | 1 + .../internal/annotations/IBaseBeforeAfter.java | 5 +++++ .../org/testng/internal/invokers/BaseInvoker.java | 2 +- .../org/testng/internal/invokers/ConfigInvoker.java | 9 ++++++--- .../org/testng/internal/invokers/ExceptionUtils.java | 2 +- .../java/org/testng/internal/invokers/Invoker.java | 2 ++ .../org/testng/internal/invokers/MethodRunner.java | 3 +-- .../org/testng/internal/invokers/TestInvoker.java | 8 ++++++-- .../TestMethodWithDataProviderMethodWorker.java | 5 ++--- .../testng/internal/invokers/TestMethodWorker.java | 5 ++--- .../testng/internal/invokers/TestNgMethodUtils.java | 2 +- .../java/org/testng/reporters/JUnitXMLReporter.java | 2 +- .../org/testng/reporters/XMLSuiteResultWriter.java | 2 +- .../src/test/java/org/testng/internal/UtilsTest.java | 4 ++-- .../src/test/java/org/testng/xml/XmlSuiteTest.java | 1 + .../AnnotationTransformerDataProviderSampleTest.java | 3 +-- .../issue2312/RetryListener.java | 1 + .../test/attributes/issue2346/LocalTestListener.java | 4 ++++ .../test/configuration/MultipleBeforeGroupTest.java | 2 +- .../issue2664/cls/GroupDependenciesChildSample.java | 2 +- .../issue2664/cls/GroupDependenciesSample.java | 2 +- .../suite/GroupDependenciesChildSample.java | 2 +- .../issue2664/suite/GroupDependenciesSample.java | 2 +- .../issue2664/test/GroupDependenciesChildSample.java | 2 +- .../issue2664/test/GroupDependenciesSample.java | 2 +- .../configuration/issue3000/MyBaseTestSample.java | 1 + .../dataprovider/InstanceDataProviderSample.java | 3 +-- .../test/dataprovider/UnnamedDataProviderSample.java | 2 +- .../java/test/factory/FactoryDataProviderSample.java | 1 + .../test/java/test/factory/github2428/Reporter.java | 1 + .../java/test/factory/sample/Factory2TestSample.java | 2 +- .../java/test/github765/DuplicateCallsSample.java | 1 + .../src/test/java/test/guice/issue2427/Test1.java | 2 +- .../src/test/java/test/guice/issue2427/Test2.java | 2 +- .../invocationcount/DataProviderFalseFalseTest.java | 4 ++-- .../invocationcount/DataProviderFalseTrueTest.java | 2 +- .../invocationcount/DataProviderTrueFalseTest.java | 2 +- .../InvocationCountFalseFalseTest.java | 4 ++-- .../InvocationCountFalseTrueTest.java | 2 +- .../InvocationCountTrueFalseTest.java | 2 +- .../invocationcount/issue1719/DummyReporter.java | 1 + .../invocationcount/issue3180/RetryAnalyzer.java | 1 + .../src/test/java/test/invokedmethodlistener/A.java | 2 +- .../src/test/java/test/issue107/MySuiteListener.java | 1 + .../test/junitreports/LocalJUnitReportReporter.java | 1 + .../test/junitreports/LocalJUnitXMLReporter.java | 2 ++ .../java/test/listeners/AlterSuiteListenerTest.java | 3 +-- .../java/test/listeners/ResultContextListener.java | 1 + .../java/test/listeners/github1130/MyListener.java | 2 ++ .../java/test/listeners/github1284/Listener1284.java | 2 ++ .../java/test/listeners/github1319/TestSample.java | 3 +++ .../java/test/listeners/github1393/Listener1393.java | 1 + .../test/listeners/github2522/SkipTestSample.java | 4 ++-- .../ListenerInvocationDefaultBehaviorTest.java | 4 ++-- .../test/listeners/ordering/UniversalListener.java | 4 ++++ .../issue1726/PriorityInterceptor.java | 1 + .../test/methodselectors/ScriptNegativeTest.java | 4 ++-- .../java/test/name/github1046/TestClassSample.java | 2 +- testng-core/src/test/java/test/nested/GarfTest.java | 2 +- .../java/test/objectfactory/ClassObjectFactory.java | 1 + .../test/parameters/Issue1554TestClassSample.java | 2 +- .../src/test/java/test/regression/MyTestngTest.java | 4 ++-- .../src/test/java/test/regression/MyTestngTest2.java | 6 +++--- .../test/reports/issue1756/CustomTestNGReporter.java | 1 + .../java/test/reports/issue1756/SampleTestClass.java | 1 + .../java/test/retryAnalyzer/TestResultPruner.java | 2 +- .../test/retryAnalyzer/issue1946/RetryAnalyzer.java | 1 + .../src/test/java/test/sanitycheck/SampleTest1.java | 2 +- .../src/test/java/test/sanitycheck/SampleTest2.java | 2 +- .../src/test/java/test/sanitycheck/SampleTest3.java | 2 +- .../java/test/testng674/ReportingListenerFor674.java | 1 + .../parallelization/BaseParallelizationTest.java | 2 +- .../parallelization/TestNgRunStateListener.java | 2 +- .../src/test/java/test/xml/XmlVerifyTest.java | 5 ++--- 83 files changed, 139 insertions(+), 73 deletions(-) diff --git a/testng-core-api/src/main/java/org/testng/annotations/ITestAnnotation.java b/testng-core-api/src/main/java/org/testng/annotations/ITestAnnotation.java index bfbae6b38d..8734c1b23a 100644 --- a/testng-core-api/src/main/java/org/testng/annotations/ITestAnnotation.java +++ b/testng-core-api/src/main/java/org/testng/annotations/ITestAnnotation.java @@ -65,21 +65,27 @@ public interface ITestAnnotation extends ITestOrConfiguration, IDataProvidable { void setSingleThreaded(boolean f); + @Override String getDataProvider(); + @Override void setDataProvider(String v); /** * @return The class holding the data provider, or {@code null} when neither the method nor * anything it inherits from names one. */ + @Override @Nullable Class getDataProviderClass(); + @Override void setDataProviderClass(@Nullable Class v); + @Override String getDataProviderDynamicClass(); + @Override void setDataProviderDynamicClass(String v); void setRetryAnalyzer(Class c); diff --git a/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java b/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java index 1e2eaa0e4a..45b2b33765 100644 --- a/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java +++ b/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java @@ -47,8 +47,8 @@ protected static List findClassesInDirPackage( dir.listFiles( file -> (recursive && file.isDirectory()) - || (file.getName().endsWith(".class")) - || (file.getName().endsWith(".groovy"))); + || file.getName().endsWith(".class") + || file.getName().endsWith(".groovy")); Utils.log(CLS_NAME, 4, "Looking for test classes in the directory: " + dir); if (dirfiles == null) { diff --git a/testng-core/src/main/java/org/testng/internal/DynamicGraph.java b/testng-core/src/main/java/org/testng/internal/DynamicGraph.java index dbadec54db..bbb3abdb94 100644 --- a/testng-core/src/main/java/org/testng/internal/DynamicGraph.java +++ b/testng-core/src/main/java/org/testng/internal/DynamicGraph.java @@ -26,6 +26,7 @@ public class DynamicGraph implements IDynamicGraph { private Set visualisers = new HashSet<>(); /** Add a node to the graph. */ + @Override public boolean addNode(T node) { return m_nodesReady.add(node); } @@ -36,15 +37,18 @@ public boolean addNode(T node) { * @param from - Represents the edge that depends on another edge. * @param to - Represents the edge on which another edge depends upon. */ + @Override public void addEdge(int weight, T from, T to) { m_edges.addEdge(weight, from, to, false); } + @Override public void setVisualisers(Set listener) { visualisers = listener; } /** Add an edge between two nodes. */ + @Override public void addEdges(int weight, T from, Iterable tos) { for (T to : tos) { addEdge(weight, from, to); @@ -52,6 +56,7 @@ public void addEdges(int weight, T from, Iterable tos) { } /** @return a set of all the nodes that don't depend on any other nodes. */ + @Override public List getFreeNodes() { // Get a list of nodes that are ready and have no outgoing edges. Set free = new LinkedHashSet<>(m_nodesReady); @@ -85,6 +90,7 @@ public List getUpstreamDependenciesFor(T node) { return dependencies(m_edges.from(node)); } + @Override public List getDependenciesFor(T node) { return dependencies(m_edges.to(node)); } @@ -96,6 +102,7 @@ private List dependencies(@Nullable Map dependencies) { } /** Set the status for a set of nodes. */ + @Override public void setStatus(Collection nodes, Status status) { for (T n : nodes) { setStatus(n, status); @@ -103,6 +110,7 @@ public void setStatus(Collection nodes, Status status) { } /** Set the status for a node. */ + @Override public void setStatus(T node, Status status) { switch (status) { case RUNNING: @@ -149,14 +157,17 @@ public void setStatus(T node, Status status) { } /** @return the number of nodes in this graph. */ + @Override public int getNodeCount() { return m_nodesReady.size() + m_nodesRunning.size() + m_nodesFinished.size(); } + @Override public int getNodeCountWithStatus(Status status) { return getNodesWithStatus(status).size(); } + @Override public Set getNodesWithStatus(Status status) { switch (status) { case READY: @@ -191,6 +202,7 @@ private static String dotShortName(T t) { } /** @return a .dot file (GraphViz) version of this graph. */ + @Override public String toDot() { String FREE = "[style=filled color=yellow]"; String RUNNING = "[style=filled color=green]"; diff --git a/testng-core/src/main/java/org/testng/internal/Parameters.java b/testng-core/src/main/java/org/testng/internal/Parameters.java index a5f5cf7000..55c2854c09 100644 --- a/testng-core/src/main/java/org/testng/internal/Parameters.java +++ b/testng-core/src/main/java/org/testng/internal/Parameters.java @@ -428,7 +428,7 @@ private static void checkParameterTypes( if (parameterNames.length == 0) { // parameterNames is usually populated via the @Parameters annotation, so we would need to // apply our logic only when @Parameters annotation is not involved. - boolean invalid = (totalLength != 0) || (!validParameters(methodAnnotation, parameterTypes)); + boolean invalid = (totalLength != 0) || !validParameters(methodAnnotation, parameterTypes); if (invalid) { String annotation = methodAnnotation; if (!methodAnnotation.startsWith("@")) { diff --git a/testng-core/src/main/java/org/testng/internal/RegexpExpectedExceptionsHolder.java b/testng-core/src/main/java/org/testng/internal/RegexpExpectedExceptionsHolder.java index ac1831695e..b69e60f9f5 100644 --- a/testng-core/src/main/java/org/testng/internal/RegexpExpectedExceptionsHolder.java +++ b/testng-core/src/main/java/org/testng/internal/RegexpExpectedExceptionsHolder.java @@ -36,6 +36,7 @@ public boolean isThrowableMatching(Throwable ite) { && Pattern.compile(messageRegExp, Pattern.DOTALL).matcher(message).matches(); } + @Override public String getWrongExceptionMessage(Throwable ite) { return "The exception was thrown with the wrong message:" + " expected \"" diff --git a/testng-core/src/main/java/org/testng/internal/TestMethodContainer.java b/testng-core/src/main/java/org/testng/internal/TestMethodContainer.java index 7f140e086a..a4b3510f66 100644 --- a/testng-core/src/main/java/org/testng/internal/TestMethodContainer.java +++ b/testng-core/src/main/java/org/testng/internal/TestMethodContainer.java @@ -22,6 +22,7 @@ public TestMethodContainer(Supplier supplier) { this.supplier = supplier; } + @Override public ITestNGMethod[] getItems() { if (isCleared()) { // If the cached data was cleared, no longer try to refer to it, but instead @@ -40,6 +41,7 @@ public boolean isCleared() { return isCleared; } + @Override public void clearItems() { if (isCleared) { return; diff --git a/testng-core/src/main/java/org/testng/internal/annotations/AnnotationHelper.java b/testng-core/src/main/java/org/testng/internal/annotations/AnnotationHelper.java index 05719c4547..064a909842 100644 --- a/testng-core/src/main/java/org/testng/internal/annotations/AnnotationHelper.java +++ b/testng-core/src/main/java/org/testng/internal/annotations/AnnotationHelper.java @@ -258,7 +258,7 @@ public static ITestNGMethod[] findMethodsWithAnnotation( || isAnnotationPresent(annotationFinder, m); boolean isPublic = Modifier.isPublic(m.getModifiers()); boolean isSynthetic = m.isSynthetic(); - if ((isPublic && hasClassAnnotation && !isSynthetic && (!hasTestNGAnnotation)) + if ((isPublic && hasClassAnnotation && !isSynthetic && !hasTestNGAnnotation) || hasMethodAnnotation) { // Small hack to allow users to specify @Configuration classes even though diff --git a/testng-core/src/main/java/org/testng/internal/annotations/ConfigurationAnnotation.java b/testng-core/src/main/java/org/testng/internal/annotations/ConfigurationAnnotation.java index 6cb4eae66a..41c79a173e 100644 --- a/testng-core/src/main/java/org/testng/internal/annotations/ConfigurationAnnotation.java +++ b/testng-core/src/main/java/org/testng/internal/annotations/ConfigurationAnnotation.java @@ -198,6 +198,7 @@ public boolean isLastTimeOnly() { return m_lastTimeOnly; } + @Override public boolean isIgnoreFailure() { return m_ignoreFailure; } diff --git a/testng-core/src/main/java/org/testng/internal/annotations/DataProviderAnnotation.java b/testng-core/src/main/java/org/testng/internal/annotations/DataProviderAnnotation.java index 900ad921cc..966b8faa1b 100644 --- a/testng-core/src/main/java/org/testng/internal/annotations/DataProviderAnnotation.java +++ b/testng-core/src/main/java/org/testng/internal/annotations/DataProviderAnnotation.java @@ -67,6 +67,7 @@ public Class retryUsing() { return retryUsing; } + @Override public void cacheDataForTestRetries(boolean cache) { this.cachedDataForTestRetries = cache; } diff --git a/testng-core/src/main/java/org/testng/internal/annotations/FactoryAnnotation.java b/testng-core/src/main/java/org/testng/internal/annotations/FactoryAnnotation.java index e2f098097d..7b9bb809db 100644 --- a/testng-core/src/main/java/org/testng/internal/annotations/FactoryAnnotation.java +++ b/testng-core/src/main/java/org/testng/internal/annotations/FactoryAnnotation.java @@ -25,6 +25,7 @@ public void setDataProvider(String dataProvider) { m_dataProvider = dataProvider; } + @Override public void setDataProviderClass(@Nullable Class dataProviderClass) { m_dataProviderClass = dataProviderClass; } diff --git a/testng-core/src/main/java/org/testng/internal/annotations/IBaseBeforeAfter.java b/testng-core/src/main/java/org/testng/internal/annotations/IBaseBeforeAfter.java index 78080c6f59..deddf156ea 100644 --- a/testng-core/src/main/java/org/testng/internal/annotations/IBaseBeforeAfter.java +++ b/testng-core/src/main/java/org/testng/internal/annotations/IBaseBeforeAfter.java @@ -6,9 +6,11 @@ /** Base interface for IBeforeSuite, IAfterSuite, etc... */ public interface IBaseBeforeAfter extends ITestOrConfiguration { /** Whether methods on this class/method are enabled. */ + @Override boolean getEnabled(); /** The list of groups this class/method belongs to. */ + @Override String[] getGroups(); /** @@ -16,6 +18,7 @@ public interface IBaseBeforeAfter extends ITestOrConfiguration { * guaranteed to have been invoked before this method. Furthermore, if any of these methods was * not a SUCCESS, this test method will not be run and will be flagged as a SKIP. */ + @Override String[] getDependsOnGroups(); /** @@ -26,6 +29,7 @@ public interface IBaseBeforeAfter extends ITestOrConfiguration { * *

If some of these methods have been overloaded, all the overloaded versions will be run. */ + @Override String[] getDependsOnMethods(); /** @@ -47,6 +51,7 @@ public interface IBaseBeforeAfter extends ITestOrConfiguration { * The description for this method. The string used will appear in the HTML report and also on * standard output if verbose > 2. */ + @Override @Nullable String getDescription(); diff --git a/testng-core/src/main/java/org/testng/internal/invokers/BaseInvoker.java b/testng-core/src/main/java/org/testng/internal/invokers/BaseInvoker.java index b47d9b133d..71e2bc9489 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/BaseInvoker.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/BaseInvoker.java @@ -103,7 +103,7 @@ protected void runInvokedMethodListeners( } private boolean noListenersPresent() { - return (m_invokedMethodListeners == null) || (m_invokedMethodListeners.isEmpty()); + return (m_invokedMethodListeners == null) || m_invokedMethodListeners.isEmpty(); } /** diff --git a/testng-core/src/main/java/org/testng/internal/invokers/ConfigInvoker.java b/testng-core/src/main/java/org/testng/internal/invokers/ConfigInvoker.java index 8ba1d32319..0d43db80a1 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/ConfigInvoker.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/ConfigInvoker.java @@ -44,7 +44,6 @@ import org.testng.internal.TestResult; import org.testng.internal.Utils; import org.testng.internal.annotations.AnnotationHelper; -import org.testng.internal.invokers.ConfigMethodArguments.Builder; import org.testng.internal.thread.ThreadUtil; import org.testng.xml.XmlClass; import org.testng.xml.XmlSuite; @@ -99,6 +98,7 @@ public IConfiguration getConfiguration() { * @return false if this class has successfully run all its @Configuration method or true if at * least one of these methods failed. */ + @Override public boolean hasConfigurationFailureFor( @Nullable ITestNGMethod testNGMethod, String[] groups, @@ -171,6 +171,7 @@ public boolean hasConfigurationFailureFor( * * @param arguments - A {@link GroupConfigMethodArguments} object. */ + @Override public void invokeBeforeGroupsConfigurations(GroupConfigMethodArguments arguments) { String[] groups = arguments.getTestMethod().getGroups(); @@ -192,7 +193,7 @@ public void invokeBeforeGroupsConfigurations(GroupConfigMethodArguments argument // don't pass the IClass or the instance as the method may be external // the invocation must be similar to @BeforeTest/@BeforeSuite ConfigMethodArguments configMethodArguments = - new Builder() + new ConfigMethodArguments.Builder() .usingConfigMethodsAs(filteredConfigurations) .forSuite(arguments.getSuite()) .usingParameters(arguments.getParameters()) @@ -213,6 +214,7 @@ private static boolean isGroupLevelConfigurationMethod(ITestNGMethod itm) { return itm.hasBeforeGroupsConfiguration() || itm.hasAfterGroupsConfiguration(); } + @Override public void invokeAfterGroupsConfigurations(GroupConfigMethodArguments arguments) { // Skip this if the current method doesn't belong to any group // (only a method that belongs to a group can trigger the invocation @@ -232,7 +234,7 @@ public void invokeAfterGroupsConfigurations(GroupConfigMethodArguments arguments // don't pass the IClass or the instance as the method may be external // the invocation must be similar to @BeforeTest/@BeforeSuite ConfigMethodArguments configMethodArguments = - new Builder() + new ConfigMethodArguments.Builder() .usingConfigMethodsAs(filteredConfigurations) .forSuite(arguments.getSuite()) .usingParameters(arguments.getParameters()) @@ -247,6 +249,7 @@ public void invokeAfterGroupsConfigurations(GroupConfigMethodArguments arguments arguments.getGroupMethods().removeAfterGroups(filteredGroups); } + @Override public void invokeConfigurations(ConfigMethodArguments arguments) { if (arguments.getConfigMethods().length == 0) { log(5, "No configuration methods found"); diff --git a/testng-core/src/main/java/org/testng/internal/invokers/ExceptionUtils.java b/testng-core/src/main/java/org/testng/internal/invokers/ExceptionUtils.java index 32479616f1..50b81fed2e 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/ExceptionUtils.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/ExceptionUtils.java @@ -45,7 +45,7 @@ private static boolean sameInstance(ITestResult configResult, Object instance) { private static @Nullable Throwable getConfigFailureException(ITestContext context) { for (IInvokedMethod method : context.getSuite().getAllInvokedMethods()) { ITestNGMethod m = method.getTestMethod(); - if (m.isBeforeSuiteConfiguration() && (!method.getTestResult().isSuccess())) { + if (m.isBeforeSuiteConfiguration() && !method.getTestResult().isSuccess()) { return method.getTestResult().getThrowable(); } } diff --git a/testng-core/src/main/java/org/testng/internal/invokers/Invoker.java b/testng-core/src/main/java/org/testng/internal/invokers/Invoker.java index 40116e8295..e8fb1e9ba9 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/Invoker.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/Invoker.java @@ -66,10 +66,12 @@ public Invoker( suiteRunner); } + @Override public IConfigInvoker getConfigInvoker() { return m_configInvoker; } + @Override public ITestInvoker getTestInvoker() { return m_testInvoker; } diff --git a/testng-core/src/main/java/org/testng/internal/invokers/MethodRunner.java b/testng-core/src/main/java/org/testng/internal/invokers/MethodRunner.java index 781684bee5..cb8a83ca11 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/MethodRunner.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/MethodRunner.java @@ -24,7 +24,6 @@ import org.testng.internal.ObjectBag; import org.testng.internal.Parameters; import org.testng.internal.invokers.ITestInvoker.FailureContext; -import org.testng.internal.invokers.TestMethodArguments.Builder; import org.testng.internal.thread.Async; import org.testng.internal.thread.TestNGThreadFactory; import org.testng.internal.thread.ThreadUtil; @@ -56,7 +55,7 @@ public List runInSequence( List tmpResults = new ArrayList<>(); int tmpResultsIndex = -1; TestMethodArguments tmArguments = - new Builder() + new TestMethodArguments.Builder() .usingArguments(arguments) .withParameterValues(parameterValues) .withParametersIndex(parametersIndex) diff --git a/testng-core/src/main/java/org/testng/internal/invokers/TestInvoker.java b/testng-core/src/main/java/org/testng/internal/invokers/TestInvoker.java index 07e3632146..ff71a87118 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/TestInvoker.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/TestInvoker.java @@ -62,7 +62,6 @@ import org.testng.internal.TestListenerHelper; import org.testng.internal.TestResult; import org.testng.internal.Utils; -import org.testng.internal.invokers.GroupConfigMethodArguments.Builder; import org.testng.internal.invokers.InvokeMethodRunnable.TestNGRuntimeException; import org.testng.internal.thread.ThreadExecutionException; import org.testng.internal.thread.ThreadUtil; @@ -105,6 +104,7 @@ public ITestResultNotifier getNotifier() { return m_notifier; } + @Override public List invokeTestMethods( ITestNGMethod testMethod, ConfigurationGroupMethods groupMethods, @@ -181,7 +181,7 @@ public List invokeTestMethods( } testMethod.incrementCurrentInvocationCount(); GroupConfigMethodArguments args = - new Builder() + new GroupConfigMethodArguments.Builder() .forTestMethod(testMethod) .withGroupConfigMethods(groupMethods) .forInstance(instance) @@ -241,6 +241,7 @@ public List invokeTestMethods( * invoking @BeforeGroup, @BeforeMethod, @AfterMethod, @AfterGroup if it is the case for the * passed in @Test method. */ + @Override public ITestResult invokeTestMethod( TestMethodArguments arguments, XmlSuite suite, FailureContext failureContext) { // Mark this method with the current thread id @@ -249,6 +250,7 @@ public ITestResult invokeTestMethod( return invokeMethod(arguments, suite, failureContext); } + @Override public FailureContext retryFailed( TestMethodArguments arguments, List result, @@ -308,6 +310,7 @@ public FailureContext retryFailed( return failure; } + @Override public void runTestResultListener(ITestResult tr) { // For onTestStart method, still run as insert order // but regarding @@ -627,6 +630,7 @@ private void collectResults(ITestNGMethod testMethod, ITestResult result) { } } + @Override public void invokeListenersForSkippedTestResult(ITestResult r, IInvokedMethod invokedMethod) { if (m_configuration.alwaysRunListeners()) { runInvokedMethodListeners(BEFORE_INVOCATION, invokedMethod, r); diff --git a/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWithDataProviderMethodWorker.java b/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWithDataProviderMethodWorker.java index c27e2949b8..d7d2ddde78 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWithDataProviderMethodWorker.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWithDataProviderMethodWorker.java @@ -10,7 +10,6 @@ import org.testng.ITestNGMethod; import org.testng.ITestResult; import org.testng.internal.ConfigurationGroupMethods; -import org.testng.internal.invokers.TestMethodArguments.Builder; import org.testng.xml.XmlSuite; public class TestMethodWithDataProviderMethodWorker @@ -75,7 +74,7 @@ public List call() { try { tmpResults.add( m_testInvoker.invokeTestMethod( - new Builder() + new TestMethodArguments.Builder() .usingInstance(m_instance) .forTestMethod(m_testMethod) .withParameterValues(m_parameterValues) @@ -99,7 +98,7 @@ public List call() { m_failureCount = m_testInvoker .retryFailed( - new Builder() + new TestMethodArguments.Builder() .usingInstance(instance) .forTestMethod(m_testMethod) .withParameterValues(m_parameterValues) diff --git a/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWorker.java b/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWorker.java index 17c2000b10..aaf8df1daf 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWorker.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/TestMethodWorker.java @@ -30,7 +30,6 @@ import org.testng.internal.TestMethodComparator; import org.testng.internal.TestMethodContainer; import org.testng.internal.Utils; -import org.testng.internal.invokers.ConfigMethodArguments.Builder; import org.testng.thread.IWorker; /** @@ -207,7 +206,7 @@ protected void invokeBeforeClassMethods(ITestClass testClass, IMethodInstance mi listener.onBeforeClass(testClass); } ConfigMethodArguments attributes = - new Builder() + new ConfigMethodArguments.Builder() .forTestClass(testClass) .usingConfigMethodsAs( ((ITestClassConfigInfo) testClass) @@ -259,7 +258,7 @@ private void invokeAfterClassConfigurations( ITestClass testClass, List invokeInstances) { for (IMethodInstance invokeInstance : invokeInstances) { ConfigMethodArguments attributes = - new Builder() + new ConfigMethodArguments.Builder() .forTestClass(testClass) .forSuite(m_testContext.getSuite().getXmlSuite()) .usingParameters(m_parameters) diff --git a/testng-core/src/main/java/org/testng/internal/invokers/TestNgMethodUtils.java b/testng-core/src/main/java/org/testng/internal/invokers/TestNgMethodUtils.java index 94b54c6243..f40c94ae35 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/TestNgMethodUtils.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/TestNgMethodUtils.java @@ -97,7 +97,7 @@ static ITestNGMethod[] filterMethods( for (ITestNGMethod tm : methods) { String msg; if ((predicate.test(tm, testClass) && isSameInstance(tm, instance)) - && (!TestNgMethodUtils.containsConfigurationMethod(tm, vResult))) { + && !TestNgMethodUtils.containsConfigurationMethod(tm, vResult)) { msg = Utils.getVerbose() < 10 ? "" : "Keeping method " + tm + " for class " + testClass; vResult.add(tm); } else { diff --git a/testng-core/src/main/java/org/testng/reporters/JUnitXMLReporter.java b/testng-core/src/main/java/org/testng/reporters/JUnitXMLReporter.java index 0d48b14167..7c03776c18 100644 --- a/testng-core/src/main/java/org/testng/reporters/JUnitXMLReporter.java +++ b/testng-core/src/main/java/org/testng/reporters/JUnitXMLReporter.java @@ -218,7 +218,7 @@ private void createFailureElement(XMLStringBuffer doc, ITestResult tr) { if (t != null) { attrs.setProperty(XMLConstants.ATTR_TYPE, t.getClass().getName()); String message = t.getMessage(); - if ((message != null) && (!message.isEmpty())) { + if ((message != null) && !message.isEmpty()) { attrs.setProperty(XMLConstants.ATTR_MESSAGE, encodeAttr(message)); // ENCODE } doc.push(XMLConstants.FAILURE, attrs); diff --git a/testng-core/src/main/java/org/testng/reporters/XMLSuiteResultWriter.java b/testng-core/src/main/java/org/testng/reporters/XMLSuiteResultWriter.java index 1d6d07bdc7..8303e2a4b3 100644 --- a/testng-core/src/main/java/org/testng/reporters/XMLSuiteResultWriter.java +++ b/testng-core/src/main/java/org/testng/reporters/XMLSuiteResultWriter.java @@ -161,7 +161,7 @@ private void addTestResult(XMLStringBuffer xmlBuffer, ITestResult testResult) { Properties attribs = getTestResultAttributes(testResult); attribs.setProperty(XMLReporterConfig.ATTR_STATUS, getStatusString(testResult.getStatus())); if (testResult.wasRetried()) { - attribs.setProperty(XMLReporterConfig.ATTR_RETRIED, Boolean.TRUE.toString()); + attribs.setProperty(XMLReporterConfig.ATTR_RETRIED, "true"); } xmlBuffer.push(XMLReporterConfig.TAG_TEST_METHOD, attribs); addTestMethodParams(xmlBuffer, testResult); diff --git a/testng-core/src/test/java/org/testng/internal/UtilsTest.java b/testng-core/src/test/java/org/testng/internal/UtilsTest.java index d52ece0ebd..415616d49e 100644 --- a/testng-core/src/test/java/org/testng/internal/UtilsTest.java +++ b/testng-core/src/test/java/org/testng/internal/UtilsTest.java @@ -1,6 +1,5 @@ package org.testng.internal; -import static java.lang.String.valueOf; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; @@ -21,7 +20,8 @@ public class UtilsTest { @Test public void escapeUnicode() { assertThat(Utils.escapeUnicode("test")).isEqualTo("test"); - assertThat(Utils.escapeUnicode(valueOf(INVALID_CHAR))).isEqualTo(valueOf(REPLACEMENT_CHAR)); + assertThat(Utils.escapeUnicode(String.valueOf(INVALID_CHAR))) + .isEqualTo(String.valueOf(REPLACEMENT_CHAR)); } @Test diff --git a/testng-core/src/test/java/org/testng/xml/XmlSuiteTest.java b/testng-core/src/test/java/org/testng/xml/XmlSuiteTest.java index adc7dc7081..64c806c8bb 100644 --- a/testng-core/src/test/java/org/testng/xml/XmlSuiteTest.java +++ b/testng-core/src/test/java/org/testng/xml/XmlSuiteTest.java @@ -244,6 +244,7 @@ public void write(int b) { } // Netbeans IDE automatically overrides this toString() + @Override public String toString() { return this.string.toString(); } diff --git a/testng-core/src/test/java/test/annotationtransformer/AnnotationTransformerDataProviderSampleTest.java b/testng-core/src/test/java/test/annotationtransformer/AnnotationTransformerDataProviderSampleTest.java index ef4708d8e9..dfce2b526c 100644 --- a/testng-core/src/test/java/test/annotationtransformer/AnnotationTransformerDataProviderSampleTest.java +++ b/testng-core/src/test/java/test/annotationtransformer/AnnotationTransformerDataProviderSampleTest.java @@ -1,6 +1,5 @@ package test.annotationtransformer; -import static java.lang.Integer.valueOf; import static org.assertj.core.api.Assertions.assertThat; import org.testng.annotations.DataProvider; @@ -17,6 +16,6 @@ public Object[][] dp() { @Test(dataProvider = "dataProvider") public void f(Integer n) { - assertThat(n).isEqualTo(valueOf(42)); + assertThat(n).isEqualTo(Integer.valueOf(42)); } } diff --git a/testng-core/src/test/java/test/annotationtransformer/issue2312/RetryListener.java b/testng-core/src/test/java/test/annotationtransformer/issue2312/RetryListener.java index 4c1e2ced05..9c9fbb19ea 100644 --- a/testng-core/src/test/java/test/annotationtransformer/issue2312/RetryListener.java +++ b/testng-core/src/test/java/test/annotationtransformer/issue2312/RetryListener.java @@ -9,6 +9,7 @@ public class RetryListener implements IAnnotationTransformer { private static int executedNrOfTimes = 0; + @Override public void transform( ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { executedNrOfTimes++; diff --git a/testng-core/src/test/java/test/attributes/issue2346/LocalTestListener.java b/testng-core/src/test/java/test/attributes/issue2346/LocalTestListener.java index 5c40f959df..b7cec6078b 100644 --- a/testng-core/src/test/java/test/attributes/issue2346/LocalTestListener.java +++ b/testng-core/src/test/java/test/attributes/issue2346/LocalTestListener.java @@ -8,21 +8,25 @@ public class LocalTestListener implements ITestListener { public static Map data = new HashMap<>(); + @Override public void onTestStart(ITestResult iTestResult) { String key = "onTestStart_" + iTestResult.getMethod().getQualifiedName(); data.putIfAbsent(key, iTestResult.getAttributeNames().isEmpty()); } + @Override public void onTestSuccess(ITestResult iTestResult) { String key = "onTestSuccess_" + iTestResult.getMethod().getQualifiedName(); data.putIfAbsent(key, iTestResult.getAttributeNames().isEmpty()); } + @Override public void onTestFailure(ITestResult iTestResult) { String key = "onTestFailure_" + iTestResult.getMethod().getQualifiedName(); data.putIfAbsent(key, iTestResult.getAttributeNames().isEmpty()); } + @Override public void onTestSkipped(ITestResult iTestResult) { String key = "onTestSkipped_" + iTestResult.getMethod().getQualifiedName(); data.putIfAbsent(key, iTestResult.getAttributeNames().isEmpty()); diff --git a/testng-core/src/test/java/test/configuration/MultipleBeforeGroupTest.java b/testng-core/src/test/java/test/configuration/MultipleBeforeGroupTest.java index 5374f2239a..502b4dfcc6 100644 --- a/testng-core/src/test/java/test/configuration/MultipleBeforeGroupTest.java +++ b/testng-core/src/test/java/test/configuration/MultipleBeforeGroupTest.java @@ -14,7 +14,7 @@ public void beforeGroups() { m_count++; } - @Test() + @Test public void test() {} @Test(dependsOnMethods = "test") diff --git a/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesChildSample.java b/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesChildSample.java index bdd0f6b540..7f64f3781a 100644 --- a/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesChildSample.java +++ b/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesChildSample.java @@ -15,6 +15,6 @@ public void s2() {} dependsOnGroups = "g1") public void s1() {} - @Test() + @Test public void test3() {} } diff --git a/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesSample.java b/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesSample.java index 4083a028c9..90f8082c18 100644 --- a/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesSample.java +++ b/testng-core/src/test/java/test/configuration/issue2664/cls/GroupDependenciesSample.java @@ -18,6 +18,6 @@ public void s2() {} dependsOnGroups = "g1") public void s1() {} - @Test() + @Test public void test3() {} } diff --git a/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesChildSample.java b/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesChildSample.java index 4280cc80f9..5fec2f5687 100644 --- a/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesChildSample.java +++ b/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesChildSample.java @@ -15,6 +15,6 @@ public void s2() {} dependsOnGroups = "g1") public void s1() {} - @Test() + @Test public void test3() {} } diff --git a/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesSample.java b/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesSample.java index f076e41296..999c58e5eb 100644 --- a/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesSample.java +++ b/testng-core/src/test/java/test/configuration/issue2664/suite/GroupDependenciesSample.java @@ -18,6 +18,6 @@ public void s2() {} dependsOnGroups = "g1") public void s1() {} - @Test() + @Test public void test3() {} } diff --git a/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesChildSample.java b/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesChildSample.java index 55213e1f0d..231d5bc7b3 100644 --- a/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesChildSample.java +++ b/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesChildSample.java @@ -15,6 +15,6 @@ public void s2() {} dependsOnGroups = "g1") public void s1() {} - @Test() + @Test public void test3() {} } diff --git a/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesSample.java b/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesSample.java index f81aa8b0fb..46bb03c5bb 100644 --- a/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesSample.java +++ b/testng-core/src/test/java/test/configuration/issue2664/test/GroupDependenciesSample.java @@ -18,6 +18,6 @@ public void s2() {} dependsOnGroups = "g1") public void s1() {} - @Test() + @Test public void test3() {} } diff --git a/testng-core/src/test/java/test/configuration/issue3000/MyBaseTestSample.java b/testng-core/src/test/java/test/configuration/issue3000/MyBaseTestSample.java index ef2d6587db..fbfa64c496 100644 --- a/testng-core/src/test/java/test/configuration/issue3000/MyBaseTestSample.java +++ b/testng-core/src/test/java/test/configuration/issue3000/MyBaseTestSample.java @@ -5,6 +5,7 @@ abstract class MyBaseTestSample implements MyInterface { protected Object dependency; + @Override public void setDependency(Object ignored) {} @BeforeClass diff --git a/testng-core/src/test/java/test/dataprovider/InstanceDataProviderSample.java b/testng-core/src/test/java/test/dataprovider/InstanceDataProviderSample.java index a9c6de3a4b..a2d4a9b85a 100644 --- a/testng-core/src/test/java/test/dataprovider/InstanceDataProviderSample.java +++ b/testng-core/src/test/java/test/dataprovider/InstanceDataProviderSample.java @@ -1,6 +1,5 @@ package test.dataprovider; -import static java.lang.Integer.valueOf; import static org.assertj.core.api.Assertions.assertThat; import org.testng.annotations.DataProvider; @@ -15,6 +14,6 @@ public Object[][] dp() { @Test(dataProvider = "dp") public void f(Integer n) { - assertThat(n).isEqualTo(valueOf(hashCode())); + assertThat(n).isEqualTo(Integer.valueOf(hashCode())); } } diff --git a/testng-core/src/test/java/test/dataprovider/UnnamedDataProviderSample.java b/testng-core/src/test/java/test/dataprovider/UnnamedDataProviderSample.java index 47eed59b88..5286611490 100644 --- a/testng-core/src/test/java/test/dataprovider/UnnamedDataProviderSample.java +++ b/testng-core/src/test/java/test/dataprovider/UnnamedDataProviderSample.java @@ -10,6 +10,6 @@ public void doStuff(boolean t) {} @DataProvider public Object[][] unnamedDataProvider() { - return new Object[][] {{Boolean.TRUE}, {Boolean.FALSE}}; + return new Object[][] {{true}, {false}}; } } diff --git a/testng-core/src/test/java/test/factory/FactoryDataProviderSample.java b/testng-core/src/test/java/test/factory/FactoryDataProviderSample.java index 3986397ac8..f01b34824f 100644 --- a/testng-core/src/test/java/test/factory/FactoryDataProviderSample.java +++ b/testng-core/src/test/java/test/factory/FactoryDataProviderSample.java @@ -18,6 +18,7 @@ public static Object[][] dp() { }; } + @Override @Test public void f() {} } diff --git a/testng-core/src/test/java/test/factory/github2428/Reporter.java b/testng-core/src/test/java/test/factory/github2428/Reporter.java index 582f2aeea5..01deab14b0 100644 --- a/testng-core/src/test/java/test/factory/github2428/Reporter.java +++ b/testng-core/src/test/java/test/factory/github2428/Reporter.java @@ -15,6 +15,7 @@ public Set getResults() { return results; } + @Override public void generateReport( List xmlSuites, List suites, String outputDirectory) { suites diff --git a/testng-core/src/test/java/test/factory/sample/Factory2TestSample.java b/testng-core/src/test/java/test/factory/sample/Factory2TestSample.java index ea5bf6bade..622cc6d78e 100644 --- a/testng-core/src/test/java/test/factory/sample/Factory2TestSample.java +++ b/testng-core/src/test/java/test/factory/sample/Factory2TestSample.java @@ -8,7 +8,7 @@ */ public class Factory2TestSample { - @Factory() + @Factory public Object[] createObjects() { return new Object[] {new Factory2Sample(), new Factory2Sample()}; } diff --git a/testng-core/src/test/java/test/github765/DuplicateCallsSample.java b/testng-core/src/test/java/test/github765/DuplicateCallsSample.java index f7bf241221..7e8120780e 100644 --- a/testng-core/src/test/java/test/github765/DuplicateCallsSample.java +++ b/testng-core/src/test/java/test/github765/DuplicateCallsSample.java @@ -7,6 +7,7 @@ public class DuplicateCallsSample extends TestTemplate { + @Override @Test(dataProvider = "testParameters") public void callExecuteTest(Integer testParameters) { assertThat(testParameters > 0).isTrue(); diff --git a/testng-core/src/test/java/test/guice/issue2427/Test1.java b/testng-core/src/test/java/test/guice/issue2427/Test1.java index 105ba1ddb2..a4301895a8 100644 --- a/testng-core/src/test/java/test/guice/issue2427/Test1.java +++ b/testng-core/src/test/java/test/guice/issue2427/Test1.java @@ -5,7 +5,7 @@ import test.guice.issue2427.modules.TestModuleOne; @Guice(modules = {TestModuleOne.class}) -@Test() +@Test public class Test1 { public void shouldInstatiateModulesOnlyOnce() { // do nothing as test is about configuration part diff --git a/testng-core/src/test/java/test/guice/issue2427/Test2.java b/testng-core/src/test/java/test/guice/issue2427/Test2.java index b5ecff4f3b..d80c5b1a50 100644 --- a/testng-core/src/test/java/test/guice/issue2427/Test2.java +++ b/testng-core/src/test/java/test/guice/issue2427/Test2.java @@ -5,7 +5,7 @@ import test.guice.issue2427.modules.TestModuleTwo; @Guice(modules = {TestModuleTwo.class}) -@Test() +@Test public class Test2 { public void shouldInstatiateModulesOnlyOnce() { // do nothing as test is about configuration part diff --git a/testng-core/src/test/java/test/invocationcount/DataProviderFalseFalseTest.java b/testng-core/src/test/java/test/invocationcount/DataProviderFalseFalseTest.java index 9e726f8a4d..1207d12ded 100644 --- a/testng-core/src/test/java/test/invocationcount/DataProviderFalseFalseTest.java +++ b/testng-core/src/test/java/test/invocationcount/DataProviderFalseFalseTest.java @@ -4,9 +4,9 @@ import org.testng.annotations.BeforeMethod; public class DataProviderFalseFalseTest extends DataProviderBase { - @BeforeMethod() + @BeforeMethod public void beforeMethod() {} - @AfterMethod() + @AfterMethod public void afterMethod() {} } diff --git a/testng-core/src/test/java/test/invocationcount/DataProviderFalseTrueTest.java b/testng-core/src/test/java/test/invocationcount/DataProviderFalseTrueTest.java index a0b04726da..d4a51ab5dc 100644 --- a/testng-core/src/test/java/test/invocationcount/DataProviderFalseTrueTest.java +++ b/testng-core/src/test/java/test/invocationcount/DataProviderFalseTrueTest.java @@ -4,7 +4,7 @@ import org.testng.annotations.BeforeMethod; public class DataProviderFalseTrueTest extends DataProviderBase { - @BeforeMethod() + @BeforeMethod public void beforeMethod() {} @AfterMethod(lastTimeOnly = true) diff --git a/testng-core/src/test/java/test/invocationcount/DataProviderTrueFalseTest.java b/testng-core/src/test/java/test/invocationcount/DataProviderTrueFalseTest.java index 04bbbd5a67..8ec7307a44 100644 --- a/testng-core/src/test/java/test/invocationcount/DataProviderTrueFalseTest.java +++ b/testng-core/src/test/java/test/invocationcount/DataProviderTrueFalseTest.java @@ -7,6 +7,6 @@ public class DataProviderTrueFalseTest extends DataProviderBase { @BeforeMethod(firstTimeOnly = true) public void beforeMethod() {} - @AfterMethod() + @AfterMethod public void afterMethod() {} } diff --git a/testng-core/src/test/java/test/invocationcount/InvocationCountFalseFalseTest.java b/testng-core/src/test/java/test/invocationcount/InvocationCountFalseFalseTest.java index f058389be5..b4f98074a7 100644 --- a/testng-core/src/test/java/test/invocationcount/InvocationCountFalseFalseTest.java +++ b/testng-core/src/test/java/test/invocationcount/InvocationCountFalseFalseTest.java @@ -4,9 +4,9 @@ import org.testng.annotations.BeforeMethod; public class InvocationCountFalseFalseTest extends InvocationBase { - @BeforeMethod() + @BeforeMethod public void beforeMethod() {} - @AfterMethod() + @AfterMethod public void afterMethod() {} } diff --git a/testng-core/src/test/java/test/invocationcount/InvocationCountFalseTrueTest.java b/testng-core/src/test/java/test/invocationcount/InvocationCountFalseTrueTest.java index bad7376df5..3f07ad2321 100644 --- a/testng-core/src/test/java/test/invocationcount/InvocationCountFalseTrueTest.java +++ b/testng-core/src/test/java/test/invocationcount/InvocationCountFalseTrueTest.java @@ -4,7 +4,7 @@ import org.testng.annotations.BeforeMethod; public class InvocationCountFalseTrueTest extends InvocationBase { - @BeforeMethod() + @BeforeMethod public void beforeMethod() {} @AfterMethod(lastTimeOnly = true) diff --git a/testng-core/src/test/java/test/invocationcount/InvocationCountTrueFalseTest.java b/testng-core/src/test/java/test/invocationcount/InvocationCountTrueFalseTest.java index 2ec381647d..72ffe81c0f 100644 --- a/testng-core/src/test/java/test/invocationcount/InvocationCountTrueFalseTest.java +++ b/testng-core/src/test/java/test/invocationcount/InvocationCountTrueFalseTest.java @@ -7,6 +7,6 @@ public class InvocationCountTrueFalseTest extends InvocationBase { @BeforeMethod(firstTimeOnly = true) public void beforeMethod() {} - @AfterMethod() + @AfterMethod public void afterMethod() {} } diff --git a/testng-core/src/test/java/test/invocationcount/issue1719/DummyReporter.java b/testng-core/src/test/java/test/invocationcount/issue1719/DummyReporter.java index 179724c59a..a282746268 100644 --- a/testng-core/src/test/java/test/invocationcount/issue1719/DummyReporter.java +++ b/testng-core/src/test/java/test/invocationcount/issue1719/DummyReporter.java @@ -14,6 +14,7 @@ public class DummyReporter implements IReporter { private final Set success = new HashSet<>(); private final Set failedWithinSuccessPercentage = new HashSet<>(); + @Override public void generateReport( List xmlSuites, List suites, String outputDirectory) { suites.forEach( diff --git a/testng-core/src/test/java/test/invocationcount/issue3180/RetryAnalyzer.java b/testng-core/src/test/java/test/invocationcount/issue3180/RetryAnalyzer.java index 8feedd5e64..8e0debf264 100644 --- a/testng-core/src/test/java/test/invocationcount/issue3180/RetryAnalyzer.java +++ b/testng-core/src/test/java/test/invocationcount/issue3180/RetryAnalyzer.java @@ -11,6 +11,7 @@ public class RetryAnalyzer implements IRetryAnalyzer { /* * Retry method */ + @Override public boolean retry(ITestResult result) { return counter++ < retryLimit; } diff --git a/testng-core/src/test/java/test/invokedmethodlistener/A.java b/testng-core/src/test/java/test/invokedmethodlistener/A.java index de35280c51..103184f845 100644 --- a/testng-core/src/test/java/test/invokedmethodlistener/A.java +++ b/testng-core/src/test/java/test/invokedmethodlistener/A.java @@ -4,6 +4,6 @@ public class A { - @BeforeSuite() + @BeforeSuite public static void someMethod1() {} } diff --git a/testng-core/src/test/java/test/issue107/MySuiteListener.java b/testng-core/src/test/java/test/issue107/MySuiteListener.java index 85781b3ba5..06793766fc 100644 --- a/testng-core/src/test/java/test/issue107/MySuiteListener.java +++ b/testng-core/src/test/java/test/issue107/MySuiteListener.java @@ -6,6 +6,7 @@ import org.testng.xml.XmlSuite; public class MySuiteListener implements ISuiteListener { + @Override public void onStart(ISuite suite) { final XmlSuite xmlSuite = suite.getXmlSuite(); final Map parameters = xmlSuite.getParameters(); diff --git a/testng-core/src/test/java/test/junitreports/LocalJUnitReportReporter.java b/testng-core/src/test/java/test/junitreports/LocalJUnitReportReporter.java index 672a33e062..1a219aedd1 100644 --- a/testng-core/src/test/java/test/junitreports/LocalJUnitReportReporter.java +++ b/testng-core/src/test/java/test/junitreports/LocalJUnitReportReporter.java @@ -20,6 +20,7 @@ public void generateReport( testsuites.addAll(LocalJUnitXMLReporter.getSuites(files)); } + @Override public Testsuite getTestsuite(String name) { for (Testsuite suite : testsuites) { if (suite.getName().equals(name)) { diff --git a/testng-core/src/test/java/test/junitreports/LocalJUnitXMLReporter.java b/testng-core/src/test/java/test/junitreports/LocalJUnitXMLReporter.java index 695ba8cdc1..039db1f330 100644 --- a/testng-core/src/test/java/test/junitreports/LocalJUnitXMLReporter.java +++ b/testng-core/src/test/java/test/junitreports/LocalJUnitXMLReporter.java @@ -11,6 +11,7 @@ public class LocalJUnitXMLReporter extends JUnitXMLReporter implements TestsuiteRetriever { private final List testsuites = new ArrayList<>(); + @Override protected void generateReport(ITestContext context) { super.generateReport(context); String dir = context.getOutputDirectory(); @@ -19,6 +20,7 @@ protected void generateReport(ITestContext context) { testsuites.addAll(getSuites(files)); } + @Override public Testsuite getTestsuite(String name) { for (Testsuite suite : testsuites) { if (suite.getName().equals(name)) { diff --git a/testng-core/src/test/java/test/listeners/AlterSuiteListenerTest.java b/testng-core/src/test/java/test/listeners/AlterSuiteListenerTest.java index 59df8a91fb..33afbed72f 100644 --- a/testng-core/src/test/java/test/listeners/AlterSuiteListenerTest.java +++ b/testng-core/src/test/java/test/listeners/AlterSuiteListenerTest.java @@ -1,6 +1,5 @@ package test.listeners; -import static java.lang.String.valueOf; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; @@ -63,7 +62,7 @@ public void executionListenerWithXml3() { List tests = xmlSuite.getTests(); int i = 1; for (XmlTest xmlTest : tests) { - assertThat(xmlTest.getParameter("param")).isEqualTo(valueOf(i)); + assertThat(xmlTest.getParameter("param")).isEqualTo(String.valueOf(i)); i++; } } diff --git a/testng-core/src/test/java/test/listeners/ResultContextListener.java b/testng-core/src/test/java/test/listeners/ResultContextListener.java index 8580ea5b85..8477c789e6 100644 --- a/testng-core/src/test/java/test/listeners/ResultContextListener.java +++ b/testng-core/src/test/java/test/listeners/ResultContextListener.java @@ -8,6 +8,7 @@ public class ResultContextListener implements ITestListener { public static boolean contextProvided = false; + @Override public void onTestStart(ITestResult result) { ITestContext context = result.getTestContext(); if (context != null) { diff --git a/testng-core/src/test/java/test/listeners/github1130/MyListener.java b/testng-core/src/test/java/test/listeners/github1130/MyListener.java index b3308f48f4..7de051da0c 100644 --- a/testng-core/src/test/java/test/listeners/github1130/MyListener.java +++ b/testng-core/src/test/java/test/listeners/github1130/MyListener.java @@ -19,10 +19,12 @@ public MyListener() { } } + @Override public void onStart(ISuite suite) { beforeSuiteCount.add(this.toString()); } + @Override public void onBeforeClass(ITestClass testClass) { beforeClassCount.add(this.toString()); } diff --git a/testng-core/src/test/java/test/listeners/github1284/Listener1284.java b/testng-core/src/test/java/test/listeners/github1284/Listener1284.java index f4a6514ef5..dd61ad1140 100644 --- a/testng-core/src/test/java/test/listeners/github1284/Listener1284.java +++ b/testng-core/src/test/java/test/listeners/github1284/Listener1284.java @@ -21,10 +21,12 @@ public static Listener1284 getInstance() { return instance; } + @Override public void onBeforeClass(ITestClass iTestClass) { Listener1284.testList.add(iTestClass.getRealClass().getName() + " - Before Invocation"); } + @Override public void onAfterClass(ITestClass iTestClass) { Listener1284.testList.add(iTestClass.getRealClass().getName() + " - After Invocation"); } diff --git a/testng-core/src/test/java/test/listeners/github1319/TestSample.java b/testng-core/src/test/java/test/listeners/github1319/TestSample.java index a47d690c2d..456a339adb 100644 --- a/testng-core/src/test/java/test/listeners/github1319/TestSample.java +++ b/testng-core/src/test/java/test/listeners/github1319/TestSample.java @@ -54,14 +54,17 @@ public void afterSuite() { public static class Listener implements IConfigurationListener, ITestListener { public static Map maps = Maps.newConcurrentMap(); + @Override public void onConfigurationSuccess(ITestResult itr) { maps.put(itr.getMethod().getMethodName(), itr.getInstance()); } + @Override public void onConfigurationFailure(ITestResult itr) { maps.put(itr.getMethod().getMethodName(), itr.getInstance()); } + @Override public void onConfigurationSkip(ITestResult itr) { maps.put(itr.getMethod().getMethodName(), itr.getInstance()); } diff --git a/testng-core/src/test/java/test/listeners/github1393/Listener1393.java b/testng-core/src/test/java/test/listeners/github1393/Listener1393.java index ac7d7b7200..49d3743e83 100644 --- a/testng-core/src/test/java/test/listeners/github1393/Listener1393.java +++ b/testng-core/src/test/java/test/listeners/github1393/Listener1393.java @@ -5,6 +5,7 @@ public class Listener1393 extends TestListenerAdapter { + @Override public void onTestStart(ITestResult testContext) { super.onTestStart(testContext); System.out.println("In onTestStart"); diff --git a/testng-core/src/test/java/test/listeners/github2522/SkipTestSample.java b/testng-core/src/test/java/test/listeners/github2522/SkipTestSample.java index fab833cac5..797cc70ffb 100644 --- a/testng-core/src/test/java/test/listeners/github2522/SkipTestSample.java +++ b/testng-core/src/test/java/test/listeners/github2522/SkipTestSample.java @@ -5,12 +5,12 @@ public class SkipTestSample { private static boolean flag = true; - @Test() + @Test public void oneTest() { flag = false; } - @Test() + @Test public void twoTest() {} public static boolean getFlag() { diff --git a/testng-core/src/test/java/test/listeners/ordering/ListenerInvocationDefaultBehaviorTest.java b/testng-core/src/test/java/test/listeners/ordering/ListenerInvocationDefaultBehaviorTest.java index 4fe7225b61..d391af0554 100644 --- a/testng-core/src/test/java/test/listeners/ordering/ListenerInvocationDefaultBehaviorTest.java +++ b/testng-core/src/test/java/test/listeners/ordering/ListenerInvocationDefaultBehaviorTest.java @@ -625,10 +625,10 @@ public void testOrderForSymmetricOnAfterClass() { IEXECUTIONLISTENER_ON_EXECUTION_FINISH); try { - System.setProperty(RuntimeBehavior.SYMMETRIC_LISTENER_EXECUTION, Boolean.TRUE.toString()); + System.setProperty(RuntimeBehavior.SYMMETRIC_LISTENER_EXECUTION, "true"); runTest(symmetricExpected, SimpleTestClassWithBeforeAndAfterClass.class); } finally { - System.setProperty(RuntimeBehavior.SYMMETRIC_LISTENER_EXECUTION, Boolean.FALSE.toString()); + System.setProperty(RuntimeBehavior.SYMMETRIC_LISTENER_EXECUTION, "false"); } } diff --git a/testng-core/src/test/java/test/listeners/ordering/UniversalListener.java b/testng-core/src/test/java/test/listeners/ordering/UniversalListener.java index fa51fd2b34..c85d1ea1d7 100644 --- a/testng-core/src/test/java/test/listeners/ordering/UniversalListener.java +++ b/testng-core/src/test/java/test/listeners/ordering/UniversalListener.java @@ -51,18 +51,22 @@ public List getMessages() { return messages; } + @Override public void onConfigurationSuccess(ITestResult itr) { messages.add("org.testng.IConfigurationListener.onConfigurationSuccess(ITestResult itr)"); } + @Override public void onConfigurationFailure(ITestResult itr) { messages.add("org.testng.IConfigurationListener.onConfigurationFailure(ITestResult itr)"); } + @Override public void onConfigurationSkip(ITestResult itr) { messages.add("org.testng.IConfigurationListener.onConfigurationSkip(ITestResult itr)"); } + @Override public void beforeConfiguration(ITestResult tr) { messages.add("org.testng.IConfigurationListener.beforeConfiguration(ITestResult tr)"); } diff --git a/testng-core/src/test/java/test/methodinterceptors/issue1726/PriorityInterceptor.java b/testng-core/src/test/java/test/methodinterceptors/issue1726/PriorityInterceptor.java index 964ecda35d..ee496eb38d 100644 --- a/testng-core/src/test/java/test/methodinterceptors/issue1726/PriorityInterceptor.java +++ b/testng-core/src/test/java/test/methodinterceptors/issue1726/PriorityInterceptor.java @@ -9,6 +9,7 @@ public class PriorityInterceptor implements IMethodInterceptor { + @Override public List intercept(List methods, ITestContext context) { Comparator comparator = Comparator.comparingInt(PriorityInterceptor::getPriority); diff --git a/testng-core/src/test/java/test/methodselectors/ScriptNegativeTest.java b/testng-core/src/test/java/test/methodselectors/ScriptNegativeTest.java index afc4de2ea5..dad030b298 100644 --- a/testng-core/src/test/java/test/methodselectors/ScriptNegativeTest.java +++ b/testng-core/src/test/java/test/methodselectors/ScriptNegativeTest.java @@ -18,12 +18,12 @@ public class ScriptNegativeTest extends SimpleBaseTest { @BeforeMethod public void setup() { - System.setProperty("skip.caller.clsLoader", Boolean.TRUE.toString()); + System.setProperty("skip.caller.clsLoader", "true"); } @AfterMethod public void cleanup() { - System.setProperty("skip.caller.clsLoader", Boolean.FALSE.toString()); + System.setProperty("skip.caller.clsLoader", "false"); } @Test( diff --git a/testng-core/src/test/java/test/name/github1046/TestClassSample.java b/testng-core/src/test/java/test/name/github1046/TestClassSample.java index 1d96a9b01b..0cd40eabab 100644 --- a/testng-core/src/test/java/test/name/github1046/TestClassSample.java +++ b/testng-core/src/test/java/test/name/github1046/TestClassSample.java @@ -33,7 +33,7 @@ public void dontChangeName() {} @Override public void run(IHookCallBack callBack, ITestResult testResult) { - if (!("dontChangeName".equals(testResult.getMethod().getMethodName()))) { + if (!"dontChangeName".equals(testResult.getMethod().getMethodName())) { Object param = "999"; Object[] parameters = callBack.getParameters(); if (parameters.length != 0) { diff --git a/testng-core/src/test/java/test/nested/GarfTest.java b/testng-core/src/test/java/test/nested/GarfTest.java index 70ffbb3ad2..f912f16d4a 100644 --- a/testng-core/src/test/java/test/nested/GarfTest.java +++ b/testng-core/src/test/java/test/nested/GarfTest.java @@ -8,7 +8,7 @@ @Test(groups = {"unittest"}) public class GarfTest { - @Test() + @Test public void testGarf() { AccountTypeEnum foo = AccountTypeEnum.ClearingMember; assertThat(foo).isEqualTo(AccountTypeEnum.ClearingMember); diff --git a/testng-core/src/test/java/test/objectfactory/ClassObjectFactory.java b/testng-core/src/test/java/test/objectfactory/ClassObjectFactory.java index 9a89352de7..23a8120a82 100644 --- a/testng-core/src/test/java/test/objectfactory/ClassObjectFactory.java +++ b/testng-core/src/test/java/test/objectfactory/ClassObjectFactory.java @@ -6,6 +6,7 @@ public class ClassObjectFactory implements ITestObjectFactory { + @Override public T newInstance(Constructor constructor, Object... parameters) { T object = InstanceCreator.newInstance(constructor, parameters); if (object instanceof ISetValue) { diff --git a/testng-core/src/test/java/test/parameters/Issue1554TestClassSample.java b/testng-core/src/test/java/test/parameters/Issue1554TestClassSample.java index 4bcba30588..9f91727bfb 100644 --- a/testng-core/src/test/java/test/parameters/Issue1554TestClassSample.java +++ b/testng-core/src/test/java/test/parameters/Issue1554TestClassSample.java @@ -18,7 +18,7 @@ public void setUpTest(String browser, ITestContext context) { this.context = context; } - @Test() + @Test public void aTest() { assertThat(browser).isNotNull(); assertThat(context).isNotNull(); diff --git a/testng-core/src/test/java/test/regression/MyTestngTest.java b/testng-core/src/test/java/test/regression/MyTestngTest.java index 969df01231..6768996425 100644 --- a/testng-core/src/test/java/test/regression/MyTestngTest.java +++ b/testng-core/src/test/java/test/regression/MyTestngTest.java @@ -6,10 +6,10 @@ public class MyTestngTest { - @BeforeSuite() + @BeforeSuite public void beforeSuite(ITestContext tc) throws Exception {} - @BeforeTest() + @BeforeTest public void beforeTest(ITestContext tc) throws Exception { throw new RuntimeException("barfing now"); } diff --git a/testng-core/src/test/java/test/regression/MyTestngTest2.java b/testng-core/src/test/java/test/regression/MyTestngTest2.java index a2765ab43f..fe1717ab2d 100644 --- a/testng-core/src/test/java/test/regression/MyTestngTest2.java +++ b/testng-core/src/test/java/test/regression/MyTestngTest2.java @@ -7,14 +7,14 @@ public class MyTestngTest2 extends MyTestngTest { - @BeforeClass() + @BeforeClass public void beforeClass(ITestContext tc) throws Exception {} - @BeforeMethod() + @BeforeMethod public void beforeMethod(ITestContext tc) throws Exception { // throw new Exception("fail me"); } - @Test() + @Test public void test(ITestContext tc) {} } diff --git a/testng-core/src/test/java/test/reports/issue1756/CustomTestNGReporter.java b/testng-core/src/test/java/test/reports/issue1756/CustomTestNGReporter.java index 47cfcb01f9..bd50f7da7d 100644 --- a/testng-core/src/test/java/test/reports/issue1756/CustomTestNGReporter.java +++ b/testng-core/src/test/java/test/reports/issue1756/CustomTestNGReporter.java @@ -15,6 +15,7 @@ public List getLogs() { return logs; } + @Override public void generateReport( List xmlSuites, List suites, String outputDirectory) { getTestMehodSummary(suites); diff --git a/testng-core/src/test/java/test/reports/issue1756/SampleTestClass.java b/testng-core/src/test/java/test/reports/issue1756/SampleTestClass.java index dc0970c231..030a439434 100644 --- a/testng-core/src/test/java/test/reports/issue1756/SampleTestClass.java +++ b/testng-core/src/test/java/test/reports/issue1756/SampleTestClass.java @@ -27,6 +27,7 @@ public void test1() { @Test(dependsOnMethods = "test1") public void test2() {} + @Override public String getTestName() { return uri; } diff --git a/testng-core/src/test/java/test/retryAnalyzer/TestResultPruner.java b/testng-core/src/test/java/test/retryAnalyzer/TestResultPruner.java index 7ff549e72d..0401ccb90e 100644 --- a/testng-core/src/test/java/test/retryAnalyzer/TestResultPruner.java +++ b/testng-core/src/test/java/test/retryAnalyzer/TestResultPruner.java @@ -19,7 +19,7 @@ public void onFinish(ITestContext context) { if (!passed.isEmpty() && !skipped.isEmpty()) { context.getSkippedTests().removeResult(method); } - if (((!failedWithinSuccess.isEmpty()) || (!failed.isEmpty())) && !skipped.isEmpty()) { + if ((!failedWithinSuccess.isEmpty() || !failed.isEmpty()) && !skipped.isEmpty()) { context.getSkippedTests().removeResult(method); } } diff --git a/testng-core/src/test/java/test/retryAnalyzer/issue1946/RetryAnalyzer.java b/testng-core/src/test/java/test/retryAnalyzer/issue1946/RetryAnalyzer.java index 24182d71ee..9e79dac4a9 100644 --- a/testng-core/src/test/java/test/retryAnalyzer/issue1946/RetryAnalyzer.java +++ b/testng-core/src/test/java/test/retryAnalyzer/issue1946/RetryAnalyzer.java @@ -13,6 +13,7 @@ public class RetryAnalyzer implements IRetryAnalyzer { private int retryCount = 0; private static final int MAX_RETRY_COUNT = 1; + @Override public boolean retry(ITestResult result) { String prefix = "Attempt #" + retryCount; if (retryCount < MAX_RETRY_COUNT) { diff --git a/testng-core/src/test/java/test/sanitycheck/SampleTest1.java b/testng-core/src/test/java/test/sanitycheck/SampleTest1.java index 0b7cfeb844..ef8097bd24 100644 --- a/testng-core/src/test/java/test/sanitycheck/SampleTest1.java +++ b/testng-core/src/test/java/test/sanitycheck/SampleTest1.java @@ -3,6 +3,6 @@ import org.testng.annotations.Test; public class SampleTest1 { - @Test() + @Test public void test1() {} } diff --git a/testng-core/src/test/java/test/sanitycheck/SampleTest2.java b/testng-core/src/test/java/test/sanitycheck/SampleTest2.java index 03c23633c4..c895accdc7 100644 --- a/testng-core/src/test/java/test/sanitycheck/SampleTest2.java +++ b/testng-core/src/test/java/test/sanitycheck/SampleTest2.java @@ -3,6 +3,6 @@ import org.testng.annotations.Test; public class SampleTest2 { - @Test() + @Test public void test2() {} } diff --git a/testng-core/src/test/java/test/sanitycheck/SampleTest3.java b/testng-core/src/test/java/test/sanitycheck/SampleTest3.java index b9655d4d7b..ac614e18ac 100644 --- a/testng-core/src/test/java/test/sanitycheck/SampleTest3.java +++ b/testng-core/src/test/java/test/sanitycheck/SampleTest3.java @@ -3,6 +3,6 @@ import org.testng.annotations.Test; public class SampleTest3 { - @Test() + @Test public void test3() {} } diff --git a/testng-core/src/test/java/test/testng674/ReportingListenerFor674.java b/testng-core/src/test/java/test/testng674/ReportingListenerFor674.java index 9956a16d04..9fb21d5c53 100644 --- a/testng-core/src/test/java/test/testng674/ReportingListenerFor674.java +++ b/testng-core/src/test/java/test/testng674/ReportingListenerFor674.java @@ -13,6 +13,7 @@ public class ReportingListenerFor674 implements IReporter { private List errors = new ArrayList<>(); + @Override public void generateReport(List list, List suites, String s) { for (ISuite suite : suites) { for (ISuiteResult suiteResult : suite.getResults().values()) { diff --git a/testng-core/src/test/java/test/thread/parallelization/BaseParallelizationTest.java b/testng-core/src/test/java/test/thread/parallelization/BaseParallelizationTest.java index 0a647854f5..ca5acde54a 100644 --- a/testng-core/src/test/java/test/thread/parallelization/BaseParallelizationTest.java +++ b/testng-core/src/test/java/test/thread/parallelization/BaseParallelizationTest.java @@ -857,7 +857,7 @@ public static void verifySequentialSuites( + "pairs of a suite listener onStart event logger followed by a suite listener onFinish event logger: " + suiteLevelEventLogs) .isTrue(); - suiteListenerStartEventLogs.add((suiteLevelEventLogs.get(i))); + suiteListenerStartEventLogs.add(suiteLevelEventLogs.get(i)); } for (int i = 0; i < suiteListenerStartEventLogs.size() - 1; i++) { diff --git a/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateListener.java b/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateListener.java index 04327e6fc9..bdc4ecd21b 100644 --- a/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateListener.java +++ b/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateListener.java @@ -102,7 +102,7 @@ private TestNgRunStateTracker.EventLogBuilder buildEventLog( private TestNgRunStateTracker.EventLogBuilder buildEventLog( ITestResult result, TestNgRunEvent event) { - return (buildEventLog(result.getTestContext(), event)) + return buildEventLog(result.getTestContext(), event) .addData(METHOD_NAME, result.getMethod().getMethodName()) .addData(CLASS_NAME, result.getMethod().getRealClass().getCanonicalName()) .addData(CLASS_INSTANCE, result.getMethod().getInstance()) diff --git a/testng-core/src/test/java/test/xml/XmlVerifyTest.java b/testng-core/src/test/java/test/xml/XmlVerifyTest.java index def8e2accd..8a99b58b23 100644 --- a/testng-core/src/test/java/test/xml/XmlVerifyTest.java +++ b/testng-core/src/test/java/test/xml/XmlVerifyTest.java @@ -63,9 +63,8 @@ public void testThreadPoolRelatedAttributesPresentInXml() throws Exception { Node xmlSuite = allSuites.item(0); assertThat(xmlSuite.getNodeType()).isEqualTo(Node.ELEMENT_NODE); Element element = (Element) xmlSuite; - assertThat(element.getAttribute("use-global-thread-pool")).isEqualTo(Boolean.TRUE.toString()); - assertThat(element.getAttribute("share-thread-pool-for-data-providers")) - .isEqualTo(Boolean.TRUE.toString()); + assertThat(element.getAttribute("use-global-thread-pool")).isEqualTo("true"); + assertThat(element.getAttribute("share-thread-pool-for-data-providers")).isEqualTo("true"); } @AfterMethod From 2dde4558ec982aacfd535a305d7c8f90fe7b83c4 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Tue, 25 Aug 2026 12:05:02 +0200 Subject: [PATCH 4/6] style(errorprone): settle the remaining sites by hand The Error Prone patcher has no fix for these, or its fix would be wrong. Fixed: - toLowerCase without a locale, at every remaining site. All eight compare identifiers -- file suffixes, a protocol name, a scripting language name, a class name -- so Locale.ROOT is what they meant. - a stray "/////" separator at the end of a test file. javac parses a run of three or more slashes as a markdown documentation comment (JEP 467), so it parsed as documentation attached to nothing. - YamlSchema.mapKey now casts the setter through the same helper that key and listKey already use, which removes the single-call-site uncheckedCast the check was pointing at rather than suppressing it. Suppressed, with the reason at the site: - both finalizers in the github1461 leak test. One decrements the counter the test spins on until it reaches zero -- without it the wait never ends and the test fails on its timeOut -- and the other is the observation the test was written to make, so neither can go. - the String overload of newInstance, on the interface, the implementation and the override in SuiteRunner. The class is named rather than passed, so the type variable cannot appear in the formals, and the signature is public API. --- .../main/java/org/testng/ITestObjectFactory.java | 6 ++++++ .../java/org/testng/internal/PackageUtils.java | 5 +++-- .../testng/internal/objects/InstanceCreator.java | 4 ++++ .../org/testng/internal/protocols/Processor.java | 3 ++- .../src/main/java/org/testng/SuiteRunner.java | 10 ++++------ .../org/testng/internal/ScriptSelectorFactory.java | 5 +++-- .../src/main/java/org/testng/xml/TestNGURLs.java | 3 ++- .../java/test/github1461/MemoryLeakTestNg.java | 4 +++- ...yTestClassWithGlobalReferenceCounterSample.java | 4 +++- .../java/test/preserveorder/PreserveOrderTest.java | 4 +++- .../java/test/reports/EmailableReporterTest.java | 3 ++- .../src/test/java/test/uniquesuite/TestAfter.java | 2 -- .../main/java/org/testng/internal/YamlSchema.java | 14 +++----------- 13 files changed, 38 insertions(+), 29 deletions(-) diff --git a/testng-core-api/src/main/java/org/testng/ITestObjectFactory.java b/testng-core-api/src/main/java/org/testng/ITestObjectFactory.java index 97f7d4f46d..1facca7ecd 100644 --- a/testng-core-api/src/main/java/org/testng/ITestObjectFactory.java +++ b/testng-core-api/src/main/java/org/testng/ITestObjectFactory.java @@ -11,6 +11,12 @@ default T newInstance(Class cls, Object... parameters) { return InstanceCreator.newInstance(cls, parameters); } + // The sibling overloads take Class or Constructor, so T is inferred from the argument. + // This one identifies the class by name, so nothing in the formals carries T and the caller + // picks it by assignment -- newInstance("com.acme.Bar") will happily fill a Foo variable and + // fail with a ClassCastException at the call site. That is what the check flags, and it is + // published API, so it is suppressed rather than obeyed. + @SuppressWarnings("TypeParameterUnusedInFormals") default T newInstance(String clsName, Object... parameters) { return InstanceCreator.newInstance(clsName, parameters); } diff --git a/testng-core-api/src/main/java/org/testng/internal/PackageUtils.java b/testng-core-api/src/main/java/org/testng/internal/PackageUtils.java index afbcb0f61d..70df6df9c5 100644 --- a/testng-core-api/src/main/java/org/testng/internal/PackageUtils.java +++ b/testng-core-api/src/main/java/org/testng/internal/PackageUtils.java @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; @@ -108,8 +109,8 @@ public static String[] findClassesInPackage( for (int i = 0; i < classpathFragments.length; i++) { String path; - if (classpathFragments[i].toLowerCase().endsWith(".jar") - || classpathFragments[i].toLowerCase().endsWith(".zip")) { + String fragment = classpathFragments[i].toLowerCase(Locale.ROOT); + if (fragment.endsWith(".jar") || fragment.endsWith(".zip")) { path = classpathFragments[i] + "!/"; } else { if (classpathFragments[i].endsWith(File.separator)) { diff --git a/testng-core-api/src/main/java/org/testng/internal/objects/InstanceCreator.java b/testng-core-api/src/main/java/org/testng/internal/objects/InstanceCreator.java index 53fbe85d38..e6c97459cf 100644 --- a/testng-core-api/src/main/java/org/testng/internal/objects/InstanceCreator.java +++ b/testng-core-api/src/main/java/org/testng/internal/objects/InstanceCreator.java @@ -19,6 +19,10 @@ private InstanceCreator() { // Hide Constructor } + // Named by String rather than by Class, so T appears only in the return type and the cast + // below is unchecked -- which is the check's complaint. It implements the ITestObjectFactory + // overload of the same shape, so the signature is not ours to change. + @SuppressWarnings("TypeParameterUnusedInFormals") public static T newInstance(String className, Object... parameters) { Class clazz = ClassHelper.forName(className); Objects.requireNonNull(clazz, "Could not find a valid class"); diff --git a/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java b/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java index 45b2b33765..a9174428a8 100644 --- a/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java +++ b/testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java @@ -4,6 +4,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.regex.Pattern; import org.testng.internal.Utils; @@ -13,7 +14,7 @@ public abstract class Processor { public static Processor newInstance(String protocol) { Processor instance; - switch (protocol.toLowerCase()) { + switch (protocol.toLowerCase(Locale.ROOT)) { case "file": instance = new FileProcessor(); break; diff --git a/testng-core/src/main/java/org/testng/SuiteRunner.java b/testng-core/src/main/java/org/testng/SuiteRunner.java index c8e97130c3..131d45ac8c 100644 --- a/testng-core/src/main/java/org/testng/SuiteRunner.java +++ b/testng-core/src/main/java/org/testng/SuiteRunner.java @@ -155,6 +155,7 @@ public T newInstance(Class cls, Object... parameters) { } @Override + @SuppressWarnings("TypeParameterUnusedInFormals") // signature fixed by the interface public T newInstance(String clsName, Object... parameters) { try { return suiteObjectFactory.newInstance(clsName, parameters); @@ -262,12 +263,9 @@ private void invokeListeners(boolean start) { } } - private void setOutputDir(String outputDir) { - if (isStringBlank(outputDir) && useDefaultListeners) { - outputDir = DEFAULT_OUTPUT_DIR; - } - - this.outputDir = null != outputDir ? new File(outputDir).getAbsolutePath() : null; + private void setOutputDir(String dir) { + String resolved = isStringBlank(dir) && useDefaultListeners ? DEFAULT_OUTPUT_DIR : dir; + outputDir = null != resolved ? new File(resolved).getAbsolutePath() : null; } private ITestRunnerFactory buildRunnerFactory(Comparator comparator) { diff --git a/testng-core/src/main/java/org/testng/internal/ScriptSelectorFactory.java b/testng-core/src/main/java/org/testng/internal/ScriptSelectorFactory.java index 39f5d8eefb..6772b853f5 100644 --- a/testng-core/src/main/java/org/testng/internal/ScriptSelectorFactory.java +++ b/testng-core/src/main/java/org/testng/internal/ScriptSelectorFactory.java @@ -1,6 +1,7 @@ package org.testng.internal; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.ServiceLoader; @@ -20,12 +21,12 @@ public static ScriptMethodSelector getScriptSelector(XmlScript script) { throw new IllegalArgumentException("Language name must not be null"); } - String languageName = script.getLanguage().toLowerCase(); + String languageName = script.getLanguage().toLowerCase(Locale.ROOT); ScriptEngineFactory engineFactory = ENGINE_FACTORIES.get(languageName); if (engineFactory == null) { ServiceLoader loader = ServiceLoader.load(ScriptEngineFactory.class); for (ScriptEngineFactory factory : loader) { - ENGINE_FACTORIES.put(factory.getLanguageName().toLowerCase(), factory); + ENGINE_FACTORIES.put(factory.getLanguageName().toLowerCase(Locale.ROOT), factory); } engineFactory = ENGINE_FACTORIES.get(languageName); diff --git a/testng-core/src/main/java/org/testng/xml/TestNGURLs.java b/testng-core/src/main/java/org/testng/xml/TestNGURLs.java index 12b01d7a4a..26767a3da1 100644 --- a/testng-core/src/main/java/org/testng/xml/TestNGURLs.java +++ b/testng-core/src/main/java/org/testng/xml/TestNGURLs.java @@ -4,6 +4,7 @@ import java.net.URL; import java.util.Arrays; import java.util.List; +import java.util.Locale; final class TestNGURLs { @@ -13,7 +14,7 @@ private TestNGURLs() {} static boolean isDTDDomainInternallyKnownToTestNG(String publicId) { try { - URL url = new URL(publicId.toLowerCase().trim()); + URL url = new URL(publicId.toLowerCase(Locale.ROOT).trim()); return DOMAINS.contains(url.getHost()); } catch (MalformedURLException e) { return false; diff --git a/testng-core/src/test/java/test/github1461/MemoryLeakTestNg.java b/testng-core/src/test/java/test/github1461/MemoryLeakTestNg.java index d919692fd1..942076b56e 100644 --- a/testng-core/src/test/java/test/github1461/MemoryLeakTestNg.java +++ b/testng-core/src/test/java/test/github1461/MemoryLeakTestNg.java @@ -48,8 +48,10 @@ private static void runTest() { // create TestNG class TestNG testng = new TestNG() { + // Overriding finalize is the observation: the log line is how this test shows the + // TestNG instance is never reclaimed. @Override - @SuppressWarnings("deprecation") + @SuppressWarnings({"deprecation", "Finalize"}) protected void finalize() { // it seems that this object will never be finalized !!! log.debug("TestNG finalized"); diff --git a/testng-core/src/test/java/test/github1461/MyTestClassWithGlobalReferenceCounterSample.java b/testng-core/src/test/java/test/github1461/MyTestClassWithGlobalReferenceCounterSample.java index 944a47f1c1..d975ee33a2 100644 --- a/testng-core/src/test/java/test/github1461/MyTestClassWithGlobalReferenceCounterSample.java +++ b/testng-core/src/test/java/test/github1461/MyTestClassWithGlobalReferenceCounterSample.java @@ -27,8 +27,10 @@ public void aTestMethod2() { log.debug("test method 2"); } + // The finalizer is what decrements the counter MemoryLeakTestNg spins on. Without it that + // loop never reaches zero and the test fails on its timeOut. @Override - @SuppressWarnings("deprecation") + @SuppressWarnings({"deprecation", "Finalize"}) protected void finalize() { log.debug("finalize"); // this will be called when this object is removed from the heap diff --git a/testng-core/src/test/java/test/preserveorder/PreserveOrderTest.java b/testng-core/src/test/java/test/preserveorder/PreserveOrderTest.java index bb5c13b60e..a96a7af5bb 100644 --- a/testng-core/src/test/java/test/preserveorder/PreserveOrderTest.java +++ b/testng-core/src/test/java/test/preserveorder/PreserveOrderTest.java @@ -4,6 +4,7 @@ import java.util.Iterator; import java.util.List; +import java.util.Locale; import org.testng.ITestNGListener; import org.testng.TestNG; import org.testng.annotations.DataProvider; @@ -43,9 +44,10 @@ public void preserveClassOrder(Class[] tests) { assertThat(listener.getInvokedMethodNames()).hasSize(9); Iterator methods = listener.getInvokedMethodNames().iterator(); for (Class testClass : tests) { + String prefix = testClass.getSimpleName().toLowerCase(Locale.ROOT); for (int i = 1; i <= 3; i++) { String methodName = methods.next(); - assertThat(methodName).isEqualTo(testClass.getSimpleName().toLowerCase() + i); + assertThat(methodName).isEqualTo(prefix + i); } } } diff --git a/testng-core/src/test/java/test/reports/EmailableReporterTest.java b/testng-core/src/test/java/test/reports/EmailableReporterTest.java index 2f55ee50a4..f3b3857f7d 100644 --- a/testng-core/src/test/java/test/reports/EmailableReporterTest.java +++ b/testng-core/src/test/java/test/reports/EmailableReporterTest.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.lang.reflect.Method; import java.nio.file.Files; +import java.util.Locale; import org.testng.IReporter; import org.testng.ITestNGListener; import org.testng.TestNG; @@ -76,7 +77,7 @@ private static void runTest(Class... classes) { @DataProvider(name = "getReporterInstances") public Object[][] getReporterInstances(Method method) { - if (method.getName().toLowerCase().contains("jvmarguments")) { + if (method.getName().toLowerCase(Locale.ROOT).contains("jvmarguments")) { return new Object[][] {{new EmailableReporter2(), "emailable.report2.name"}}; } return new Object[][] {{new EmailableReporter2()}}; diff --git a/testng-core/src/test/java/test/uniquesuite/TestAfter.java b/testng-core/src/test/java/test/uniquesuite/TestAfter.java index ef9091e535..b4480ef950 100644 --- a/testng-core/src/test/java/test/uniquesuite/TestAfter.java +++ b/testng-core/src/test/java/test/uniquesuite/TestAfter.java @@ -25,5 +25,3 @@ public void afterTest() { BaseBefore.m_afterCount = 0; } } - -///// diff --git a/testng-yaml/src/main/java/org/testng/internal/YamlSchema.java b/testng-yaml/src/main/java/org/testng/internal/YamlSchema.java index 9115c46049..3fc2dbcfce 100644 --- a/testng-yaml/src/main/java/org/testng/internal/YamlSchema.java +++ b/testng-yaml/src/main/java/org/testng/internal/YamlSchema.java @@ -324,12 +324,9 @@ SchemaType listKey(String name, Class elementType, BiConsumer SchemaType mapKey( String name, Function, V> conversion, BiConsumer setter) { - return add( - new SchemaProperty( - name, - Map.class, - (target, value) -> - setter.accept(uncheckedCast(target), conversion.apply((Map) value)))); + BiConsumer converting = + (target, value) -> setter.accept(target, conversion.apply((Map) value)); + return add(new SchemaProperty(name, Map.class, cast(converting))); } /** An accepted spelling of {@code canonical} that warns when it is used. */ @@ -399,11 +396,6 @@ private SchemaType add(SchemaProperty property) { return this; } - @SuppressWarnings("unchecked") - private static V uncheckedCast(Object value) { - return (V) value; - } - @SuppressWarnings({"unchecked", "rawtypes"}) private static BiConsumer cast(BiConsumer setter) { return (BiConsumer) (BiConsumer) setter; From d848c1177f9b9bfb5e7656a2a3c1fd548bb1cf94 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Tue, 25 Aug 2026 12:09:20 +0200 Subject: [PATCH 5/6] style(errorprone): remove the variables nothing reads The Error Prone patcher was tried here first and rejected: it deletes the initialiser along with the variable, so it removed a parser.parse call that was the subject of its own test, the factory-parameter rows from the emailable report, createXmlInclude calls that build the XML the test then runs, and a static field initialiser that throws on purpose. All of that stayed green. These are by hand instead. Where the value really was dead it is gone. Where only the variable was dead the call stays: dumpParametersInfo, parser.parse and createXmlInclude are all kept and only their unread results dropped. EmailableReporter2's dead store was the one site this branch reported rather than fixed, as GITHUB-3418; it has since been fixed upstream by accumulating into hasRows instead of overwriting it. All that is left here is reading the parameters local already in hand rather than calling getParameters again. Two sites are named rather than annotated, because Error Prone reads an "unused" prefix as deliberate and a lambda parameter cannot carry an annotation at all: the Comparator lambda in TestHTMLReporterTest, and the local whose division by zero is what makes a @BeforeClass fail. Elsewhere the reason goes at the site with @SuppressWarnings("unused"), the spelling already used in this tree: the Comparator body on MethodSorting.NONE, the Guice-injected constructor parameters whose injection is what the sample proves, and the field whose evaluation is what makes class initialisation fail. Test2's constructor names UnusedVariable and UnusedMethod instead of that alias. It is never called and its parameter is never read, both deliberately, and the alias would have hidden the second one -- whose suggested fix is the no-arg constructor the comment at the site says must not exist. --- .../org/testng/internal/DataProviderLoader.java | 4 ---- .../java/org/testng/internal/MethodSorting.java | 2 ++ .../main/java/org/testng/internal/ObjectBag.java | 2 -- .../org/testng/internal/TestNGMethodFinder.java | 4 +--- .../org/testng/reporters/EmailableReporter2.java | 2 +- .../org/testng/xml/TestNGContentHandler.java | 2 -- .../src/test/java/org/testng/TestRunnerTest.java | 4 +++- .../testng/reporters/TestHTMLReporterTest.java | 2 +- .../java/org/testng/xml/SuiteXmlParserTest.java | 2 +- .../src/test/java/test/FileStringBufferTest.java | 1 - .../issue2729/BeforeConfigTestSample.java | 3 ++- .../test/factory/FactoryAndTestMethodTest.java | 6 +----- .../test/java/test/guice/issue2343/SampleA.java | 2 ++ .../test/java/test/guice/issue2343/SampleB.java | 2 ++ .../test/listeners/issue3238/BadUtility.java | 3 +++ .../LockUpInterceptorSampleTest.java | 16 +++------------- .../test/parameters/ParameterOverrideTest.java | 2 +- .../test/java/test/parameters/ShadowTest.java | 5 ++--- testng-core/src/test/java/test/pkg2/Test2.java | 5 +++++ .../EfficientPriorityParallelizationTest.java | 11 ----------- .../parallelization/TestNgRunStateTracker.java | 2 -- ...hFactoryUsingDataProviderAndNoDepsSample.java | 2 +- ...hFactoryUsingDataProviderAndNoDepsSample.java | 2 +- ...hFactoryUsingDataProviderAndNoDepsSample.java | 2 +- ...hFactoryUsingDataProviderAndNoDepsSample.java | 2 +- ...hFactoryUsingDataProviderAndNoDepsSample.java | 2 +- .../test/java/test/timeout/GitHub1314Sample.java | 2 +- 27 files changed, 36 insertions(+), 58 deletions(-) diff --git a/testng-core/src/main/java/org/testng/internal/DataProviderLoader.java b/testng-core/src/main/java/org/testng/internal/DataProviderLoader.java index 8f27cf3245..581438ab97 100644 --- a/testng-core/src/main/java/org/testng/internal/DataProviderLoader.java +++ b/testng-core/src/main/java/org/testng/internal/DataProviderLoader.java @@ -2,12 +2,8 @@ import java.io.IOException; import java.io.InputStream; -import org.testng.log4testng.Logger; public class DataProviderLoader extends ClassLoader { - private static final int BUFFER_SIZE = 1 << 20; - private static final Logger log = Logger.getLogger(DataProviderLoader.class); - public Class loadClazz(String path) throws ClassNotFoundException { Class clazz = findLoadedClass(path); if (clazz == null) { diff --git a/testng-core/src/main/java/org/testng/internal/MethodSorting.java b/testng-core/src/main/java/org/testng/internal/MethodSorting.java index 288cf134ef..0fe26b18e4 100644 --- a/testng-core/src/main/java/org/testng/internal/MethodSorting.java +++ b/testng-core/src/main/java/org/testng/internal/MethodSorting.java @@ -34,7 +34,9 @@ public String toString() { } }, NONE("none") { + // Comparator fixes the signature, and NONE compares nothing. @Override + @SuppressWarnings("unused") public int compare(ITestNGMethod o1, ITestNGMethod o2) { return 0; } diff --git a/testng-core/src/main/java/org/testng/internal/ObjectBag.java b/testng-core/src/main/java/org/testng/internal/ObjectBag.java index 0e584b0c20..5785ba1aac 100644 --- a/testng-core/src/main/java/org/testng/internal/ObjectBag.java +++ b/testng-core/src/main/java/org/testng/internal/ObjectBag.java @@ -7,7 +7,6 @@ import java.util.concurrent.ExecutorService; import java.util.function.Supplier; import org.testng.ISuite; -import org.testng.log4testng.Logger; import org.testng.xml.XmlSuite; /** @@ -16,7 +15,6 @@ */ public final class ObjectBag { - private static final Logger logger = Logger.getLogger(ObjectBag.class); private final Map, Object> bag = new ConcurrentHashMap<>(); private static final Map instances = new ConcurrentHashMap<>(); diff --git a/testng-core/src/main/java/org/testng/internal/TestNGMethodFinder.java b/testng-core/src/main/java/org/testng/internal/TestNGMethodFinder.java index 24c6d8e9ca..eb7b1ffcb1 100644 --- a/testng-core/src/main/java/org/testng/internal/TestNGMethodFinder.java +++ b/testng-core/src/main/java/org/testng/internal/TestNGMethodFinder.java @@ -40,8 +40,6 @@ enum MethodType { AFTER_GROUPS } - private static final Comparator NO_COMPARISON = (o1, o2) -> 0; - private final ITestObjectFactory objectFactory; private final RunInfo runInfo; private final IAnnotationFinder annotationFinder; @@ -49,7 +47,7 @@ enum MethodType { public TestNGMethodFinder( ITestObjectFactory objectFactory, RunInfo runInfo, IAnnotationFinder annotationFinder) { - this(objectFactory, runInfo, annotationFinder, NO_COMPARISON); + this(objectFactory, runInfo, annotationFinder, MethodSorting.NONE); } public TestNGMethodFinder( diff --git a/testng-core/src/main/java/org/testng/reporters/EmailableReporter2.java b/testng-core/src/main/java/org/testng/reporters/EmailableReporter2.java index cb29861a9b..c5baa5373e 100644 --- a/testng-core/src/main/java/org/testng/reporters/EmailableReporter2.java +++ b/testng-core/src/main/java/org/testng/reporters/EmailableReporter2.java @@ -466,7 +466,7 @@ private void writeScenario(int scenarioIndex, String label, ITestResult result) Object[] parameters = result.getParameters(); boolean hasRows = dumpParametersInfo("Factory Parameter", result.getFactoryParameters()); int parameterCount = parameters == null ? 0 : parameters.length; - hasRows |= dumpParametersInfo("Parameter", result.getParameters()); + hasRows |= dumpParametersInfo("Parameter", parameters); dumpAttributesInfo(result.getMethod().getAttributes()); // Write reporter messages (if any) diff --git a/testng-core/src/main/java/org/testng/xml/TestNGContentHandler.java b/testng-core/src/main/java/org/testng/xml/TestNGContentHandler.java index a51183d1d6..5607ba6b4b 100644 --- a/testng-core/src/main/java/org/testng/xml/TestNGContentHandler.java +++ b/testng-core/src/main/java/org/testng/xml/TestNGContentHandler.java @@ -144,7 +144,6 @@ enum Location { private final String m_fileName; private final boolean m_loadClasses; - private boolean m_validate = false; private boolean m_doctypeDeclared = false; /** @@ -221,7 +220,6 @@ public InputSource resolveEntity(String publicId, String systemId) m_doctypeDeclared = true; if (skipConsideringSystemId(systemId)) { - m_validate = true; InputStream stream = loadDtdUsingClassLoader(); if (stream != null) { // Buffer the classpath DTD so this resolver, rather than SAX, owns and closes the stream. diff --git a/testng-core/src/test/java/org/testng/TestRunnerTest.java b/testng-core/src/test/java/org/testng/TestRunnerTest.java index 1a19152c40..5c3ef8a241 100644 --- a/testng-core/src/test/java/org/testng/TestRunnerTest.java +++ b/testng-core/src/test/java/org/testng/TestRunnerTest.java @@ -10,6 +10,7 @@ import org.testng.annotations.Test; import org.testng.internal.Configuration; import org.testng.internal.IConfiguration; +import org.testng.internal.MethodSorting; import org.testng.internal.objects.DefaultTestObjectFactory; import org.testng.xml.XmlClass; import org.testng.xml.XmlSuite; @@ -96,7 +97,8 @@ private TestRunner createTestRunner(Class testClass) { listeners, classListeners, (ISuiteRunnerListener) suite); - SuiteRunner suite = new SuiteRunner(configuration, xmlSuite, outputDir, factory, (o1, o2) -> 0); + SuiteRunner suite = + new SuiteRunner(configuration, xmlSuite, outputDir, factory, MethodSorting.NONE); return factory.newTestRunner(suite, xmlTest, emptyList(), emptyList()); } } diff --git a/testng-core/src/test/java/org/testng/reporters/TestHTMLReporterTest.java b/testng-core/src/test/java/org/testng/reporters/TestHTMLReporterTest.java index 7f2a6f9a70..953a17f58d 100644 --- a/testng-core/src/test/java/org/testng/reporters/TestHTMLReporterTest.java +++ b/testng-core/src/test/java/org/testng/reporters/TestHTMLReporterTest.java @@ -33,7 +33,7 @@ public void generateTableParametersToStringShouldBeFailsafe() { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, true); - TestHTMLReporter.generateTable(pw, "title", tests, "cssClass", (t1, t2) -> 0); + TestHTMLReporter.generateTable(pw, "title", tests, "cssClass", (unusedLeft, unusedRight) -> 0); assertThat(sw.toString()) .contains("Parameters: org.testng.reporters.TestHTMLReporterTest$ThrowingOnToString@"); diff --git a/testng-core/src/test/java/org/testng/xml/SuiteXmlParserTest.java b/testng-core/src/test/java/org/testng/xml/SuiteXmlParserTest.java index f9fb724fe9..86efc96889 100644 --- a/testng-core/src/test/java/org/testng/xml/SuiteXmlParserTest.java +++ b/testng-core/src/test/java/org/testng/xml/SuiteXmlParserTest.java @@ -28,7 +28,7 @@ public void testParse(String fileName, boolean shouldWork) { SuiteXmlParser parser = new SuiteXmlParser(); try (FileInputStream stream = new FileInputStream(new File(PARENT, fileName))) { - XmlSuite suite = parser.parse(fileName, stream, false); + parser.parse(fileName, stream, false); if (!shouldWork) { fail("Parsing of " + fileName + " is supposed to fail"); } diff --git a/testng-core/src/test/java/test/FileStringBufferTest.java b/testng-core/src/test/java/test/FileStringBufferTest.java index d17eaa4fef..b4b11bc846 100644 --- a/testng-core/src/test/java/test/FileStringBufferTest.java +++ b/testng-core/src/test/java/test/FileStringBufferTest.java @@ -19,7 +19,6 @@ public void basic() { { FileStringBuffer fsb = new FileStringBuffer(5); String s = "0123456789"; - String s3 = s + s + s; fsb.append(s); fsb.append(s); diff --git a/testng-core/src/test/java/test/configuration/issue2729/BeforeConfigTestSample.java b/testng-core/src/test/java/test/configuration/issue2729/BeforeConfigTestSample.java index ee232b6554..faaef0ff05 100644 --- a/testng-core/src/test/java/test/configuration/issue2729/BeforeConfigTestSample.java +++ b/testng-core/src/test/java/test/configuration/issue2729/BeforeConfigTestSample.java @@ -9,8 +9,9 @@ public class BeforeConfigTestSample { @BeforeClass public void beforeClass() { + // The division is the point: this @BeforeClass has to fail. @SuppressWarnings("ConstantOverflow") - int i = 5 / 0; + int unused = 5 / 0; } @BeforeMethod diff --git a/testng-core/src/test/java/test/factory/FactoryAndTestMethodTest.java b/testng-core/src/test/java/test/factory/FactoryAndTestMethodTest.java index 9d8e7ef3a4..1581e375fb 100644 --- a/testng-core/src/test/java/test/factory/FactoryAndTestMethodTest.java +++ b/testng-core/src/test/java/test/factory/FactoryAndTestMethodTest.java @@ -11,7 +11,7 @@ public class FactoryAndTestMethodTest { @Factory(dataProvider = "data") public Object[] ohNo(String s) { - return makeNullArgTests(s); + return new Object[0]; } public static class NullArgsTest { @@ -27,10 +27,6 @@ public void test() { } } - private Object[] makeNullArgTests(String s) { - return new Object[0]; - } - @DataProvider(name = "data") public Object[][] makeData() { return new Object[][] {{"foo"}}; diff --git a/testng-core/src/test/java/test/guice/issue2343/SampleA.java b/testng-core/src/test/java/test/guice/issue2343/SampleA.java index 025fa61153..db13225c92 100644 --- a/testng-core/src/test/java/test/guice/issue2343/SampleA.java +++ b/testng-core/src/test/java/test/guice/issue2343/SampleA.java @@ -7,7 +7,9 @@ @Guice public class SampleA { + // Guice must be able to inject this; nothing needs to read it. @Inject + @SuppressWarnings("unused") public SampleA(final Person person) {} @Test diff --git a/testng-core/src/test/java/test/guice/issue2343/SampleB.java b/testng-core/src/test/java/test/guice/issue2343/SampleB.java index ebf7258f8b..9cc38366ad 100644 --- a/testng-core/src/test/java/test/guice/issue2343/SampleB.java +++ b/testng-core/src/test/java/test/guice/issue2343/SampleB.java @@ -7,7 +7,9 @@ @Guice public class SampleB { + // Guice must be able to inject this; nothing needs to read it. @Inject + @SuppressWarnings("unused") public SampleB(final Person person) {} @Test diff --git a/testng-core/src/test/java/test/listeners/issue3238/BadUtility.java b/testng-core/src/test/java/test/listeners/issue3238/BadUtility.java index 1da5b6d878..349a8de4ec 100644 --- a/testng-core/src/test/java/test/listeners/issue3238/BadUtility.java +++ b/testng-core/src/test/java/test/listeners/issue3238/BadUtility.java @@ -2,6 +2,9 @@ public class BadUtility { + // Never read on purpose: evaluating it is what makes class initialisation fail, which is + // the condition issue3238 is about. + @SuppressWarnings("unused") private static final int counter = evaluate(); private static int evaluate() { diff --git a/testng-core/src/test/java/test/methodinterceptors/LockUpInterceptorSampleTest.java b/testng-core/src/test/java/test/methodinterceptors/LockUpInterceptorSampleTest.java index ec07acd52b..f2c8f8aeaf 100644 --- a/testng-core/src/test/java/test/methodinterceptors/LockUpInterceptorSampleTest.java +++ b/testng-core/src/test/java/test/methodinterceptors/LockUpInterceptorSampleTest.java @@ -7,21 +7,11 @@ public class LockUpInterceptorSampleTest { @Test - public void one() { - log("one"); - } + public void one() {} @Test - public void two() { - log("two"); - } + public void two() {} @Test - public void three() { - log("three"); - } - - private static void log(String s) { - // System.out.println("[MITest] " + s); - } + public void three() {} } diff --git a/testng-core/src/test/java/test/parameters/ParameterOverrideTest.java b/testng-core/src/test/java/test/parameters/ParameterOverrideTest.java index 133834b588..7603237218 100644 --- a/testng-core/src/test/java/test/parameters/ParameterOverrideTest.java +++ b/testng-core/src/test/java/test/parameters/ParameterOverrideTest.java @@ -43,7 +43,7 @@ public void testOverrideParameter(String name, Status status) { clazz.getLocalParameters().put("InheritedFromClass", "InheritedFromClass"); XmlInclude includeF = createXmlInclude(clazz, "f"); - XmlInclude includeG = createXmlInclude(clazz, "g"); + createXmlInclude(clazz, "g"); switch (status) { case PASS_TEST: diff --git a/testng-core/src/test/java/test/parameters/ShadowTest.java b/testng-core/src/test/java/test/parameters/ShadowTest.java index 21dac7510a..3b6e7fa9fd 100644 --- a/testng-core/src/test/java/test/parameters/ShadowTest.java +++ b/testng-core/src/test/java/test/parameters/ShadowTest.java @@ -6,7 +6,6 @@ import org.testng.TestNG; import org.testng.annotations.Test; import org.testng.xml.XmlClass; -import org.testng.xml.XmlInclude; import org.testng.xml.XmlSuite; import org.testng.xml.XmlTest; import test.InvokedMethodNameListener; @@ -21,11 +20,11 @@ public void parametersShouldNotBeShadowed() { XmlClass class1 = createXmlClass(test, Shadow1Sample.class); class1.getLocalParameters().put("a", "First"); - XmlInclude include1 = createXmlInclude(class1, "test1"); + createXmlInclude(class1, "test1"); XmlClass class2 = createXmlClass(test, Shadow2Sample.class); class2.getLocalParameters().put("a", "Second"); - XmlInclude include2 = createXmlInclude(class2, "test2"); + createXmlInclude(class2, "test2"); TestNG tng = create(suite); diff --git a/testng-core/src/test/java/test/pkg2/Test2.java b/testng-core/src/test/java/test/pkg2/Test2.java index 55248f431b..2d1fd9e1d1 100644 --- a/testng-core/src/test/java/test/pkg2/Test2.java +++ b/testng-core/src/test/java/test/pkg2/Test2.java @@ -3,6 +3,11 @@ import test.pkg.PackageTest; public class Test2 { + // Never called, and the parameter is never read -- both on purpose, so both checks are named + // rather than left to the "unused" alias. PackageTest asserts this constructor does not run: it + // is how the test detects TestNG instantiating a class that holds no test methods. Dropping the + // parameter would turn it into a no-arg constructor and change what that assertion is exposed to. + @SuppressWarnings({"UnusedVariable", "UnusedMethod"}) private Test2(float afloat) { PackageTest.NON_TEST_CONSTRUCTOR = true; } diff --git a/testng-core/src/test/java/test/priority/parallel/EfficientPriorityParallelizationTest.java b/testng-core/src/test/java/test/priority/parallel/EfficientPriorityParallelizationTest.java index cb33de33a1..9e735db6e6 100644 --- a/testng-core/src/test/java/test/priority/parallel/EfficientPriorityParallelizationTest.java +++ b/testng-core/src/test/java/test/priority/parallel/EfficientPriorityParallelizationTest.java @@ -6,10 +6,7 @@ import static test.thread.parallelization.TestNgRunStateTracker.getAllSuiteListenerStartEventLogs; import static test.thread.parallelization.TestNgRunStateTracker.getAllTestLevelEventLogs; import static test.thread.parallelization.TestNgRunStateTracker.getAllTestMethodLevelEventLogs; -import static test.thread.parallelization.TestNgRunStateTracker.getSuiteAndTestLevelEventLogsForSuite; import static test.thread.parallelization.TestNgRunStateTracker.getSuiteLevelEventLogsForSuite; -import static test.thread.parallelization.TestNgRunStateTracker.getSuiteListenerFinishEventLog; -import static test.thread.parallelization.TestNgRunStateTracker.getSuiteListenerStartEventLog; import static test.thread.parallelization.TestNgRunStateTracker.getTestLevelEventLogsForSuite; import static test.thread.parallelization.TestNgRunStateTracker.getTestLevelEventLogsForTest; import static test.thread.parallelization.TestNgRunStateTracker.getTestListenerFinishEventLog; @@ -46,7 +43,6 @@ public class EfficientPriorityParallelizationTest extends BaseParallelizationTes private List testLevelEventLogs; private List testMethodLevelEventLogs; - private List suiteOneSuiteAndTestLevelEventLogs; private List suiteOneSuiteLevelEventLogs; private List suiteOneTestLevelEventLogs; private List suiteOneTestMethodLevelEventLogs; @@ -54,9 +50,6 @@ public class EfficientPriorityParallelizationTest extends BaseParallelizationTes private List suiteOneTestOneTestMethodLevelEventLogs; private List suiteOneTestTwoTestMethodLevelEventLogs; - private EventLog suiteOneSuiteListenerOnStartEventLog; - private EventLog suiteOneSuiteListenerOnFinishEventLog; - private EventLog suiteOneTestOneListenerOnStartEventLog; private EventLog suiteOneTestOneListenerOnFinishEventLog; @@ -120,7 +113,6 @@ public void setUp() { testLevelEventLogs = getAllTestLevelEventLogs(); testMethodLevelEventLogs = getAllTestMethodLevelEventLogs(); - suiteOneSuiteAndTestLevelEventLogs = getSuiteAndTestLevelEventLogsForSuite(SUITE_A); suiteOneSuiteLevelEventLogs = getSuiteLevelEventLogsForSuite(SUITE_A); suiteOneTestLevelEventLogs = getTestLevelEventLogsForSuite(SUITE_A); @@ -134,9 +126,6 @@ public void setUp() { testEventLogsMap.put(SUITE_A_TEST_A, getTestLevelEventLogsForTest(SUITE_A, SUITE_A_TEST_A)); testEventLogsMap.put(SUITE_A_TEST_B, getTestLevelEventLogsForTest(SUITE_A, SUITE_A_TEST_B)); - suiteOneSuiteListenerOnStartEventLog = getSuiteListenerStartEventLog(SUITE_A); - suiteOneSuiteListenerOnFinishEventLog = getSuiteListenerFinishEventLog(SUITE_A); - suiteOneTestOneListenerOnStartEventLog = getTestListenerStartEventLog(SUITE_A, SUITE_A_TEST_A); suiteOneTestOneListenerOnFinishEventLog = getTestListenerFinishEventLog(SUITE_A, SUITE_A_TEST_A); diff --git a/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateTracker.java b/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateTracker.java index 859e640e54..f8ecf617db 100644 --- a/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateTracker.java +++ b/testng-core/src/test/java/test/thread/parallelization/TestNgRunStateTracker.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -1009,7 +1008,6 @@ public String toString() { sb.append(", Data provider param: ").append(getData(EventInfo.DATA_PROVIDER_PARAM)); } - Date now = new Date(timeOfEvent); SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); sb.append(", Time of event: ").append(sdfDate.format(timeOfEvent)); diff --git a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassAFiveMethodsWithFactoryUsingDataProviderAndNoDepsSample.java b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassAFiveMethodsWithFactoryUsingDataProviderAndNoDepsSample.java index be76f8e266..2f22156604 100644 --- a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassAFiveMethodsWithFactoryUsingDataProviderAndNoDepsSample.java +++ b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassAFiveMethodsWithFactoryUsingDataProviderAndNoDepsSample.java @@ -161,7 +161,7 @@ public static Object[][] dataProvider(ITestContext context) { String dataProviderParam = params.get("dataProviderParam"); - String[] dataProviderVals = null; + String[] dataProviderVals; String classNamePattern = TestClassAFiveMethodsWithFactoryUsingDataProviderAndNoDepsSample.class.getSimpleName() + "("; diff --git a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassBFourMethodsWithFactoryUsingDataProviderAndNoDepsSample.java b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassBFourMethodsWithFactoryUsingDataProviderAndNoDepsSample.java index 8dec82732c..3a046db83e 100644 --- a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassBFourMethodsWithFactoryUsingDataProviderAndNoDepsSample.java +++ b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassBFourMethodsWithFactoryUsingDataProviderAndNoDepsSample.java @@ -138,7 +138,7 @@ public static Object[][] dataProvider(ITestContext context) { String dataProviderParam = params.get("dataProviderParam"); - String[] dataProviderVals = null; + String[] dataProviderVals; String classNamePattern = TestClassBFourMethodsWithFactoryUsingDataProviderAndNoDepsSample.class.getSimpleName() + "("; diff --git a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassCSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassCSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java index 81e55d20fd..6ebd375272 100644 --- a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassCSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java +++ b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassCSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java @@ -184,7 +184,7 @@ public static Object[][] dataProvider(ITestContext context) { String dataProviderParam = params.get("dataProviderParam"); - String[] dataProviderVals = null; + String[] dataProviderVals; String classNamePattern = TestClassCSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.class.getSimpleName() + "("; diff --git a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassDThreeMethodsWithFactoryUsingDataProviderAndNoDepsSample.java b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassDThreeMethodsWithFactoryUsingDataProviderAndNoDepsSample.java index 48f1ca254c..dfa54f7d8c 100644 --- a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassDThreeMethodsWithFactoryUsingDataProviderAndNoDepsSample.java +++ b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassDThreeMethodsWithFactoryUsingDataProviderAndNoDepsSample.java @@ -115,7 +115,7 @@ public static Object[][] dataProvider(ITestContext context) { String dataProviderParam = params.get("dataProviderParam"); - String[] dataProviderVals = null; + String[] dataProviderVals; String classNamePattern = TestClassDThreeMethodsWithFactoryUsingDataProviderAndNoDepsSample.class.getSimpleName() + "("; diff --git a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassFSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassFSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java index e6207bf2ae..919aef41e7 100644 --- a/testng-core/src/test/java/test/thread/parallelization/sample/TestClassFSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java +++ b/testng-core/src/test/java/test/thread/parallelization/sample/TestClassFSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.java @@ -184,7 +184,7 @@ public static Object[][] dataProvider(ITestContext context) { String dataProviderParam = params.get("dataProviderParam"); - String[] dataProviderVals = null; + String[] dataProviderVals; String classNamePattern = TestClassFSixMethodsWithFactoryUsingDataProviderAndNoDepsSample.class.getSimpleName() + "("; diff --git a/testng-core/src/test/java/test/timeout/GitHub1314Sample.java b/testng-core/src/test/java/test/timeout/GitHub1314Sample.java index 41a40f586d..2b7527f55b 100644 --- a/testng-core/src/test/java/test/timeout/GitHub1314Sample.java +++ b/testng-core/src/test/java/test/timeout/GitHub1314Sample.java @@ -15,7 +15,7 @@ private void iWorkWell() { private void iHangHorribly() { System.out.println("Test2"); while (true) { - int two = 1 + 1; + // hangs on purpose } } From 0cb61e21519f792ce630b8d6994bc805023b9003 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Tue, 25 Aug 2026 12:11:31 +0200 Subject: [PATCH 6/6] build(errorprone): fail on the checks that have no sites left Ten checks now have no occurrence anywhere in the build, so they can be errors instead of warnings. Until now none of them failed anything: they printed into an output long enough that nobody read it, which is the same as not running. Promotion is what makes the preceding commits hold. Verified by putting one violation back and watching the compile fail on it, rather than by reading the configuration. Checks that still have sites are untouched and stay warnings, MissingSummary among them. --- .../main/kotlin/testng.errorprone.gradle.kts | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts b/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts index 0a91c6e998..3394f20655 100644 --- a/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts +++ b/build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts @@ -22,7 +22,7 @@ tasks.withType().configureEach { // its jar is on the processor path, even for a task that disables the check below, and // NullAway refuses to start unless one of OnlyNullMarked or AnnotatedPackages is set. // Moving them into an else branch fails every test compile. - check("NullAway", CheckSeverity.ERROR) + error("NullAway") option("NullAway:OnlyNullMarked", true) // Without JSpecifyMode, NullAway reads declarations only and never looks inside a generic @@ -31,6 +31,31 @@ tasks.withType().configureEach { // what makes @NullMarked mean what JSpecify says it means rather than roughly half of it. option("NullAway:JSpecifyMode", true) + // Checks measured at zero unsuppressed sites, promoted from warning so the next + // violation stops the build instead of joining an output nobody reads. The sites that + // remain carry a @SuppressWarnings saying why. Finalize is here on new violations alone -- + // both of its sites are suppressed, because the finalizers are what the leak test watches. + // + // Measure before adding one: javac caps at 100 warnings per compile task and several + // tasks here are past that, so an ordinary build undercounts. Nothing raises the cap, so + // count from a throwaway init script that adds -Xmaxwarns rather than from a plain build. + // + // Promoting also takes a check out of disableWarningsInGeneratedCode above: Error Prone + // only honours that exemption while the check is below ERROR. Nothing here generates Java + // today, so the list costs nothing; a module that adds a processor pays for it. + error( + "BadImport", + "BooleanLiteral", + "Finalize", + "InconsistentCapitalization", + "MissingOverride", + "NotJavadoc", + "StringCaseLocaleUsage", + "TypeParameterUnusedInFormals", + "UnnecessaryParentheses", + "UnusedVariable", + ) + // Which compiles carry test code. The Error Prone plugin derives compilingTestOnlyCode // from the *source set* name and lets a module override it, so a module whose main source // set holds test fixtures can declare that rather than be classified by whether its task