Skip to content

refactor+build: OpenRewrite cleanups, Java 17 target, and JDK 25 build on Gradle 9 - #3288

Closed
juherr wants to merge 21 commits into
testng-team:masterfrom
juherr:juherr/openrewrite-recipes
Closed

refactor+build: OpenRewrite cleanups, Java 17 target, and JDK 25 build on Gradle 9#3288
juherr wants to merge 21 commits into
testng-team:masterfrom
juherr:juherr/openrewrite-recipes

Conversation

@juherr

@juherr juherr commented Jul 24, 2026

Copy link
Copy Markdown
Member

What

OpenRewrite refactors (regenerated on top of the latest master)

  1. refactor: apply OpenRewrite common static analysis cleanups
  2. refactor: modernize Java 8 idioms to Java 11 APIs

The originally proposed TestNG-assertions → AssertJ migration was dropped: master already did it. Wildcard-import folding was disabled to keep the single-class import convention; formatting re-applied via Autostyle. Recipe outputs that produced invalid code were dropped case-by-case after review.

Java target 17 + single version source

  1. build: target Java 17 with a single shared version source — bytecode target 11 → 17; jdkBuildVersion / targetJavaVersion defined once in the root gradle.properties.
  2. build: read shared Java versions in the kotlin-dsl convention plugin.

Build on JDK 25, via Gradle 9

  1. build: build with JDK 25 by default and upgrade Error Prone for JDK 25jdkBuildVersion 21 → 25; error_prone_core 2.20 → 2.50 and gradle-errorprone-plugin 3.1.0 → 4.1.0 (EP 2.20 crashes on JDK 25); the new SelfAssertion check is disabled (it only flags intentional trivial assertions in sample/fixture tests).
  2. build: migrate to Gradle 9.6.1 (runs on JDK 25) — Gradle 9 runs on JDK 25 directly. Migration: wrapper 8.11.1 → 9.6.1; pluginManagement include of build-logic-commons; dirMode/fileModedirPermissions/filePermissions; BuildIdentifier.isCurrentBuild()buildPath; non-null manifest attributes; vlsi gradle-extensions 1.90 → 3.0.2; Shadow plugin johnrengelman:8.1.1com.gradleup.shadow:9.6.1.

Docs & CI

  1. docs(contributing) — Java 17 target, JDK 25 build, recommend mise.
  2. ci: pin ... workflow actions to their commit SHA — every action pinned to a full SHA with a version comment.
  3. ci,docs: run Gradle on JDK 25 — publish + test workflows provision a single JDK 25 (Temurin).
  4. docs: adopt Keep a Changelog format for CHANGES.txt — from 7.13.0 onward.

Verification

  • clean build -x test (all modules; compile, jars, javadoc, Autostyle, Error Prone, the shaded -all.jar) is green on Gradle 9.6.1 running on JDK 25 — 177 tasks, 0 errors.
  • Bytecode target confirmed Java 17 (class major version 61), driven solely by the shared gradle.properties.
  • All workflow YAML files parse.

Notes

  • Targeting Java 17 makes TestNG require Java 17+ at runtime (previously Java 11+) — a breaking change to own at release time.
  • Building now requires JDK 25 (Gradle 9 runs on it).
  • SelfAssertion was disabled rather than rewriting fixture assertions; revisit if preferred.
  • Tests were not run locally (-x test); a full suite run before merge is recommended — CI exercises it.

@juherr
juherr requested a review from krmahadevan as a code owner July 24, 2026 13:42
@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 422 files, which is 122 over the limit of 300.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 3ccb5b35-e5a3-4d08-acb9-e0d88f729a71

📥 Commits

Reviewing files that changed from the base of the PR and between feef123 and 0afcbe8.

⛔ Files ignored due to path filters (1)
  • gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
📒 Files selected for processing (422)
  • .github/CONTRIBUTING.md
  • .github/PULL_REQUEST_TEMPLATE.md
  • .github/workflows/combine-prs.yml
  • .github/workflows/gradle-wrapper-validation.yml
  • .github/workflows/label-commenter.yml
  • .github/workflows/matrix.mjs
  • .github/workflows/publish-maven-central.yml
  • .github/workflows/publish-snapshot.yml
  • .github/workflows/test.yml
  • .github/workflows/update-gradle-wrapper.yml
  • CHANGES.txt
  • build-logic-commons/gradle-plugin/build.gradle.kts
  • build-logic-commons/gradle-plugin/src/main/kotlin/build-logic.kotlin-dsl-gradle-plugin.gradle.kts
  • build-logic/basics/src/main/kotlin/testng.reproducible-builds.gradle.kts
  • build-logic/build-parameters/build.gradle.kts
  • build-logic/code-quality/build.gradle.kts
  • build-logic/code-quality/src/main/kotlin/testng.errorprone.gradle.kts
  • build-logic/code-quality/src/main/kotlin/testng.style.gradle.kts
  • build-logic/jvm/build.gradle.kts
  • build-logic/publishing/build.gradle.kts
  • build-logic/publishing/src/main/kotlin/buildlogic/OptionalFeaturesExtension.kt
  • build-logic/settings.gradle.kts
  • build.gradle.kts
  • gradle.properties
  • gradle/wrapper/gradle-wrapper.properties
  • gradlew
  • gradlew.bat
  • testng-collections/src/main/java/org/testng/collections/Objects.java
  • testng-core-api/src/main/java/org/testng/IAlterSuiteListener.java
  • testng-core-api/src/main/java/org/testng/IAttributes.java
  • testng-core-api/src/main/java/org/testng/IClass.java
  • testng-core-api/src/main/java/org/testng/IConfigurationListener2.java
  • testng-core-api/src/main/java/org/testng/IConfigureCallBack.java
  • testng-core-api/src/main/java/org/testng/IDataProviderMethod.java
  • testng-core-api/src/main/java/org/testng/IHookCallBack.java
  • testng-core-api/src/main/java/org/testng/IInstanceInfo.java
  • testng-core-api/src/main/java/org/testng/IInvokedMethod.java
  • testng-core-api/src/main/java/org/testng/IMethodSelectorContext.java
  • testng-core-api/src/main/java/org/testng/ISuite.java
  • testng-core-api/src/main/java/org/testng/ISuiteResult.java
  • testng-core-api/src/main/java/org/testng/ITestContext.java
  • testng-core-api/src/main/java/org/testng/ITestNGListener.java
  • testng-core-api/src/main/java/org/testng/ITestNGMethod.java
  • testng-core-api/src/main/java/org/testng/ITestResult.java
  • testng-core-api/src/main/java/org/testng/Reporter.java
  • testng-core-api/src/main/java/org/testng/annotations/CustomAttribute.java
  • testng-core-api/src/main/java/org/testng/annotations/Guice.java
  • testng-core-api/src/main/java/org/testng/annotations/IConfigurationAnnotation.java
  • testng-core-api/src/main/java/org/testng/annotations/IDataProviderAnnotation.java
  • testng-core-api/src/main/java/org/testng/annotations/ITestOrConfiguration.java
  • testng-core-api/src/main/java/org/testng/internal/AutoCloseableLock.java
  • testng-core-api/src/main/java/org/testng/internal/ConstructorOrMethod.java
  • testng-core-api/src/main/java/org/testng/internal/IParameterInfo.java
  • testng-core-api/src/main/java/org/testng/internal/KeyAwareAutoCloseableLock.java
  • testng-core-api/src/main/java/org/testng/internal/PackageUtils.java
  • testng-core-api/src/main/java/org/testng/internal/Utils.java
  • testng-core-api/src/main/java/org/testng/internal/protocols/Input.java
  • testng-core-api/src/main/java/org/testng/internal/protocols/Processor.java
  • testng-core-api/src/main/java/org/testng/log4testng/Logger.java
  • testng-core-api/src/main/java/org/testng/reporters/FileStringBuffer.java
  • testng-core-api/src/main/java/org/testng/reporters/RuntimeBehavior.java
  • testng-core-api/src/main/java/org/testng/reporters/XMLReporterConfig.java
  • testng-core-api/src/main/java/org/testng/reporters/XMLStringBuffer.java
  • testng-core-api/src/main/java/org/testng/reporters/XMLUtils.java
  • testng-core-api/src/main/java/org/testng/xml/XmlClass.java
  • testng-core-api/src/main/java/org/testng/xml/XmlDefine.java
  • testng-core-api/src/main/java/org/testng/xml/XmlDependencies.java
  • testng-core-api/src/main/java/org/testng/xml/XmlGroups.java
  • testng-core-api/src/main/java/org/testng/xml/XmlInclude.java
  • testng-core-api/src/main/java/org/testng/xml/XmlMethodSelector.java
  • testng-core-api/src/main/java/org/testng/xml/XmlMethodSelectors.java
  • testng-core-api/src/main/java/org/testng/xml/XmlPackage.java
  • testng-core-api/src/main/java/org/testng/xml/XmlRun.java
  • testng-core-api/src/main/java/org/testng/xml/XmlSuite.java
  • testng-core-api/src/main/java/org/testng/xml/XmlTest.java
  • testng-core-api/src/main/java/org/testng/xml/XmlWeaver.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/main/java/org/testng/Converter.java
  • testng-core/src/main/java/org/testng/JarFileUtils.java
  • testng-core/src/main/java/org/testng/SuiteResult.java
  • testng-core/src/main/java/org/testng/SuiteRunner.java
  • testng-core/src/main/java/org/testng/SuiteRunnerWorker.java
  • testng-core/src/main/java/org/testng/TestClass.java
  • testng-core/src/main/java/org/testng/TestListenerAdapter.java
  • testng-core/src/main/java/org/testng/TestNG.java
  • testng-core/src/main/java/org/testng/TestRunner.java
  • testng-core/src/main/java/org/testng/internal/BaseTestMethod.java
  • testng-core/src/main/java/org/testng/internal/ClassBasedWrapper.java
  • testng-core/src/main/java/org/testng/internal/ClassImpl.java
  • testng-core/src/main/java/org/testng/internal/Configuration.java
  • testng-core/src/main/java/org/testng/internal/ConfigurationGroupMethods.java
  • testng-core/src/main/java/org/testng/internal/ConfigurationMethod.java
  • testng-core/src/main/java/org/testng/internal/DefaultMethodSelectorContext.java
  • testng-core/src/main/java/org/testng/internal/DynamicGraph.java
  • testng-core/src/main/java/org/testng/internal/ExitCodeListener.java
  • testng-core/src/main/java/org/testng/internal/FactoryMethod.java
  • testng-core/src/main/java/org/testng/internal/FilteredParameters.java
  • testng-core/src/main/java/org/testng/internal/Graph.java
  • testng-core/src/main/java/org/testng/internal/IContainer.java
  • testng-core/src/main/java/org/testng/internal/IInstanceIdentity.java
  • testng-core/src/main/java/org/testng/internal/IObject.java
  • testng-core/src/main/java/org/testng/internal/IOrderMethods.java
  • testng-core/src/main/java/org/testng/internal/MethodGroupsHelper.java
  • testng-core/src/main/java/org/testng/internal/MethodHelper.java
  • testng-core/src/main/java/org/testng/internal/MethodInheritance.java
  • testng-core/src/main/java/org/testng/internal/MethodInstance.java
  • testng-core/src/main/java/org/testng/internal/NoOpTestClass.java
  • testng-core/src/main/java/org/testng/internal/ObjectBag.java
  • testng-core/src/main/java/org/testng/internal/ParameterInfo.java
  • testng-core/src/main/java/org/testng/internal/Parameters.java
  • testng-core/src/main/java/org/testng/internal/RunInfo.java
  • testng-core/src/main/java/org/testng/internal/Tarjan.java
  • testng-core/src/main/java/org/testng/internal/TestListenerHelper.java
  • testng-core/src/main/java/org/testng/internal/TestMethodContainer.java
  • testng-core/src/main/java/org/testng/internal/TestNGClassFinder.java
  • testng-core/src/main/java/org/testng/internal/TestNGMethod.java
  • testng-core/src/main/java/org/testng/internal/WrappedTestNGMethod.java
  • testng-core/src/main/java/org/testng/internal/XmlMethodSelector.java
  • testng-core/src/main/java/org/testng/internal/Yaml.java
  • testng-core/src/main/java/org/testng/internal/annotations/AnnotationHelper.java
  • testng-core/src/main/java/org/testng/internal/annotations/BaseBeforeAfter.java
  • testng-core/src/main/java/org/testng/internal/annotations/ConfigurationAnnotation.java
  • testng-core/src/main/java/org/testng/internal/annotations/DataProviderAnnotation.java
  • testng-core/src/main/java/org/testng/internal/annotations/FactoryAnnotation.java
  • testng-core/src/main/java/org/testng/internal/annotations/IBaseBeforeAfterMethod.java
  • testng-core/src/main/java/org/testng/internal/annotations/TestAnnotation.java
  • testng-core/src/main/java/org/testng/internal/annotations/TestOrConfiguration.java
  • testng-core/src/main/java/org/testng/internal/collections/Pair.java
  • testng-core/src/main/java/org/testng/internal/invokers/AbstractParallelWorker.java
  • testng-core/src/main/java/org/testng/internal/invokers/ConfigInvoker.java
  • testng-core/src/main/java/org/testng/internal/invokers/ConfigMethodArguments.java
  • testng-core/src/main/java/org/testng/internal/invokers/GroupConfigMethodArguments.java
  • testng-core/src/main/java/org/testng/internal/invokers/Invoker.java
  • testng-core/src/main/java/org/testng/internal/invokers/MethodRunner.java
  • testng-core/src/main/java/org/testng/internal/invokers/ParameterHandler.java
  • testng-core/src/main/java/org/testng/internal/invokers/TestInvoker.java
  • testng-core/src/main/java/org/testng/internal/invokers/TestMethodArguments.java
  • testng-core/src/main/java/org/testng/internal/invokers/TestMethodWorker.java
  • testng-core/src/main/java/org/testng/internal/invokers/TestNgMethodUtils.java
  • testng-core/src/main/java/org/testng/internal/objects/Dispenser.java
  • testng-core/src/main/java/org/testng/internal/objects/GuiceHelper.java
  • testng-core/src/main/java/org/testng/internal/objects/IObjectDispenser.java
  • testng-core/src/main/java/org/testng/internal/objects/ObjectFactoryImpl.java
  • testng-core/src/main/java/org/testng/internal/objects/pojo/BasicAttributes.java
  • testng-core/src/main/java/org/testng/internal/reflect/AbstractMethodMatcher.java
  • testng-core/src/main/java/org/testng/internal/reflect/AbstractNodeMethodMatcher.java
  • testng-core/src/main/java/org/testng/internal/reflect/DataProviderMethodMatcher.java
  • testng-core/src/main/java/org/testng/internal/reflect/ReflectionRecipes.java
  • testng-core/src/main/java/org/testng/internal/thread/ThreadUtil.java
  • testng-core/src/main/java/org/testng/internal/thread/graph/SuiteWorkerFactory.java
  • testng-core/src/main/java/org/testng/reporters/AbstractXmlReporter.java
  • testng-core/src/main/java/org/testng/reporters/DotTestListener.java
  • testng-core/src/main/java/org/testng/reporters/EmailableReporter2.java
  • testng-core/src/main/java/org/testng/reporters/ExitCodeListener.java
  • testng-core/src/main/java/org/testng/reporters/FailedReporter.java
  • testng-core/src/main/java/org/testng/reporters/JUnitReportReporter.java
  • testng-core/src/main/java/org/testng/reporters/JUnitXMLReporter.java
  • testng-core/src/main/java/org/testng/reporters/MethodInvocationKey.java
  • testng-core/src/main/java/org/testng/reporters/SuiteHTMLReporter.java
  • testng-core/src/main/java/org/testng/reporters/TestHTMLReporter.java
  • testng-core/src/main/java/org/testng/reporters/VerboseReporter.java
  • testng-core/src/main/java/org/testng/reporters/jq/BaseMultiSuitePanel.java
  • testng-core/src/main/java/org/testng/reporters/jq/BasePanel.java
  • testng-core/src/main/java/org/testng/reporters/jq/Model.java
  • testng-core/src/main/java/org/testng/reporters/jq/NavigatorPanel.java
  • testng-core/src/main/java/org/testng/reporters/jq/TestNgXmlPanel.java
  • testng-core/src/main/java/org/testng/reporters/jq/TimesPanel.java
  • testng-core/src/main/java/org/testng/thread/IWorker.java
  • testng-core/src/main/java/org/testng/util/RetryAnalyzerCount.java
  • testng-core/src/main/java/org/testng/xml/TestNGContentHandler.java
  • testng-core/src/main/java/org/testng/xml/internal/Parser.java
  • testng-core/src/test/java/NoPackageTest.java
  • testng-core/src/test/java/org/testng/JarFileUtilsTest.java
  • testng-core/src/test/java/org/testng/TestRunnerTest.java
  • testng-core/src/test/java/org/testng/internal/ConsoleReporter.java
  • testng-core/src/test/java/org/testng/internal/DynamicGraphTest.java
  • testng-core/src/test/java/org/testng/internal/KeyAwareAutoCloseableLockTest.java
  • testng-core/src/test/java/org/testng/internal/MethodMultiplyingInterceptor.java
  • testng-core/src/test/java/org/testng/internal/TestListenerHelperTest.java
  • testng-core/src/test/java/org/testng/internal/listeners/parameterindex/ParameterIndexTestListener.java
  • testng-core/src/test/java/org/testng/internal/objects/InstanceCreatorTest.java
  • testng-core/src/test/java/test/BaseDistributedTest.java
  • testng-core/src/test/java/test/BaseTest.java
  • testng-core/src/test/java/test/ClassConfigurations.java
  • testng-core/src/test/java/test/CtorCalledOnce.java
  • testng-core/src/test/java/test/Exclude.java
  • testng-core/src/test/java/test/GraphTest.java
  • testng-core/src/test/java/test/IndividualMethodsTest.java
  • testng-core/src/test/java/test/ParameterConstructorTest.java
  • testng-core/src/test/java/test/Test2.java
  • testng-core/src/test/java/test/access/BasePrivateAccessConfigurationMethods.java
  • testng-core/src/test/java/test/access/PrivateAccessConfigurationMethods.java
  • testng-core/src/test/java/test/alwaysrun/AlwaysRunAfter1.java
  • testng-core/src/test/java/test/alwaysrun/AlwaysRunAfter3.java
  • testng-core/src/test/java/test/alwaysrun/AlwaysRunBefore1.java
  • testng-core/src/test/java/test/annotationtransformer/AnnotationTransformerSampleTest.java
  • testng-core/src/test/java/test/annotationtransformer/MyParamTransformer.java
  • testng-core/src/test/java/test/annotationtransformer/MySuiteListener.java
  • testng-core/src/test/java/test/annotationtransformer/MySuiteListener2.java
  • testng-core/src/test/java/test/annotationtransformer/issue1790/TransformerImpl.java
  • testng-core/src/test/java/test/annotationtransformer/issue2312/RetryListener.java
  • testng-core/src/test/java/test/beforegroups/BeforeGroupsTest.java
  • testng-core/src/test/java/test/beforegroups/issue2229/TestClassSample.java
  • testng-core/src/test/java/test/bug90/Sample.java
  • testng-core/src/test/java/test/bug92/TestBase.java
  • testng-core/src/test/java/test/classgroup/First.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/conffailure/ClassWithFailedBeforeTestClassVerification.java
  • testng-core/src/test/java/test/configuration/Base3.java
  • testng-core/src/test/java/test/configuration/ConfigurationGroups1SampleTest.java
  • testng-core/src/test/java/test/configuration/ConfigurationGroups2SampleTest.java
  • testng-core/src/test/java/test/configuration/ConfigurationGroups3SampleTest.java
  • testng-core/src/test/java/test/configuration/ConfigurationGroups4SampleTest.java
  • testng-core/src/test/java/test/configuration/ConfigurationGroups5SampleTest.java
  • testng-core/src/test/java/test/configuration/ConfigurationGroups6SampleTest.java
  • testng-core/src/test/java/test/configuration/ConfigurationInheritGroupsSampleTest.java
  • testng-core/src/test/java/test/configuration/ConfigurationListenerSampleTest.java
  • testng-core/src/test/java/test/configuration/MultipleBeforeGroupTest.java
  • testng-core/src/test/java/test/configuration/ReflectMethodParametrizedConfigurationMethodTest.java
  • testng-core/src/test/java/test/configuration/SuiteFactoryOnceSample1Test.java
  • testng-core/src/test/java/test/configuration/github1338/BaseGitHub1338Sample.java
  • testng-core/src/test/java/test/configuration/issue2254/IssueTest.java
  • testng-core/src/test/java/test/configuration/issue2729/BeforeConfigSampleListener.java
  • testng-core/src/test/java/test/configuration/issue2743/SuiteRunnerIssueTestSample.java
  • testng-core/src/test/java/test/configuration/sample/ConfigurationTestSample.java
  • testng-core/src/test/java/test/configurationfailurepolicy/ClassWithSkippingBeforeMethod.java
  • testng-core/src/test/java/test/custom/CustomAttributesTransformer.java
  • testng-core/src/test/java/test/dataprovider/ConfigurationAndDataProvidersSample.java
  • testng-core/src/test/java/test/dataprovider/DataProviderRetryAnalyzer.java
  • testng-core/src/test/java/test/dataprovider/FailingIterableDataProvider.java
  • testng-core/src/test/java/test/dataprovider/MethodSample.java
  • testng-core/src/test/java/test/dataprovider/TestContextSample.java
  • testng-core/src/test/java/test/dataprovider/TestInstanceSample.java
  • testng-core/src/test/java/test/dataprovider/issue128/DataProviderParametersMismatchTest.java
  • testng-core/src/test/java/test/dataprovider/issue2819/DataProviderListenerForRetryAwareTests.java
  • testng-core/src/test/java/test/dataprovider/issue2819/SimpleRetry.java
  • testng-core/src/test/java/test/dataprovider/issue2819/TestClassSample.java
  • testng-core/src/test/java/test/dataprovider/issue2819/TestClassUsingDataProviderRetrySample.java
  • testng-core/src/test/java/test/dataprovider/issue2819/TestClassWithMultipleRetryImplSample.java
  • testng-core/src/test/java/test/dataprovider/issue2888/SkipDataProviderListener.java
  • testng-core/src/test/java/test/dataprovider/issue3237/SampleCacheTestCase.java
  • testng-core/src/test/java/test/dependent/ClassWide1Test.java
  • testng-core/src/test/java/test/dependent/DependentOnGroup1AlwaysRunSampleTest.java
  • testng-core/src/test/java/test/dependent/DependentOnGroup2AlwaysRunSampleTest.java
  • testng-core/src/test/java/test/dependent/DependentOnMethod1AlwaysRunSampleTest.java
  • testng-core/src/test/java/test/dependent/DependsOnProtectedMethodTest.java
  • testng-core/src/test/java/test/dependent/DifferentClassDependsOnGroupsTest1.java
  • testng-core/src/test/java/test/dependent/ImplicitGroupInclusion2SampleTest.java
  • testng-core/src/test/java/test/dependent/ImplicitGroupInclusion4SampleTest.java
  • testng-core/src/test/java/test/dependent/InstanceSkipSampleTest.java
  • testng-core/src/test/java/test/dependent/SampleDependentConfigurationMethods.java
  • testng-core/src/test/java/test/dependent/SampleDependentMethods.java
  • testng-core/src/test/java/test/dependent/SampleDependentMethods2.java
  • testng-core/src/test/java/test/dependent/SampleDependentMethods3.java
  • testng-core/src/test/java/test/factory/FactoryInSeparateClassTest.java
  • testng-core/src/test/java/test/factory/FactoryTest.java
  • testng-core/src/test/java/test/factory/FactoryWithInstanceInfoTest.java
  • testng-core/src/test/java/test/factory/NestedFactorySample.java
  • testng-core/src/test/java/test/factory/NestedStaticFactorySample.java
  • testng-core/src/test/java/test/factory/github1083/ArrayFactorySample.java
  • testng-core/src/test/java/test/factory/github1083/DataProviderArrayFactorySample.java
  • testng-core/src/test/java/test/factory/github1083/DataProviderInstanceInfoFactorySample.java
  • testng-core/src/test/java/test/factory/github1083/InstanceInfoFactorySample.java
  • testng-core/src/test/java/test/factory/github1131/EmptyConstructorSample.java
  • testng-core/src/test/java/test/factory/github328/ExcludedFactory.java
  • testng-core/src/test/java/test/factory/issue1041/ResultExtractor.java
  • testng-core/src/test/java/test/factory/issue1770/SampleTestBase.java
  • testng-core/src/test/java/test/factory/issue1924/TestclassSample.java
  • testng-core/src/test/java/test/failedreporter/FailedReporterParametersTest.java
  • testng-core/src/test/java/test/failedreporter/FailedReporterTest.java
  • testng-core/src/test/java/test/failures/issue1930/SimpleCliStatus.java
  • testng-core/src/test/java/test/github1362/LocalMethodInterceptor.java
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-core/src/test/java/test/github1461/MyTestClassWithGlobalReferenceCounterSample.java
  • testng-core/src/test/java/test/graph/LocalVisualiser.java
  • testng-core/src/test/java/test/groupinvocation/DummyTest2.java
  • testng-core/src/test/java/test/groups/issue1834/OutputGatheringListener.java
  • testng-core/src/test/java/test/groups/issue2232/samples/SampleTest.java
  • testng-core/src/test/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-core/src/test/java/test/inheritance/ClassScopeTest.java
  • testng-core/src/test/java/test/inject/InjectBeforeMethodTest.java
  • testng-core/src/test/java/test/invocationcount/FailedInvocationCountTest.java
  • testng-core/src/test/java/test/invocationcount/issue1719/IssueTest.java
  • testng-core/src/test/java/test/invocationcount/issue3180/RetryAnalyzer.java
  • testng-core/src/test/java/test/invokedmethodlistener/MyListener.java
  • testng-core/src/test/java/test/invokedmethodlistener/Sample2.java
  • testng-core/src/test/java/test/jason/Main.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-core/src/test/java/test/junitreports/Testcase.java
  • testng-core/src/test/java/test/junitreports/Testsuite.java
  • testng-core/src/test/java/test/justin/BaseTestCase.java
  • testng-core/src/test/java/test/listeners/AggregateSampleTest.java
  • testng-core/src/test/java/test/listeners/BaseWithListener.java
  • testng-core/src/test/java/test/listeners/ConfigurationListenerTest.java
  • testng-core/src/test/java/test/listeners/ExecutionListenerTest.java
  • testng-core/src/test/java/test/listeners/GitHub911Listener.java
  • testng-core/src/test/java/test/listeners/GitHub911Sample.java
  • testng-core/src/test/java/test/listeners/InterceptorInvokeTwiceSimulateListener.java
  • testng-core/src/test/java/test/listeners/LListener.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
  • testng-core/src/test/java/test/listeners/MultiListener.java
  • testng-core/src/test/java/test/listeners/MyMethodInterceptor.java
  • testng-core/src/test/java/test/listeners/ResultContextListener.java
  • testng-core/src/test/java/test/listeners/ResultListener.java
  • testng-core/src/test/java/test/listeners/SuiteAndInvokedMethodListenerTest.java
  • testng-core/src/test/java/test/listeners/SuiteListener.java
  • testng-core/src/test/java/test/listeners/SuiteListener2.java
  • testng-core/src/test/java/test/listeners/TestAndClassListener.java
  • testng-core/src/test/java/test/listeners/factory/SampleTestFactory.java
  • testng-core/src/test/java/test/listeners/factory/issue3120/CustomFactory.java
  • testng-core/src/test/java/test/listeners/factory/issue3120/FactoryListenerTestClassCombinedSample.java
  • testng-core/src/test/java/test/listeners/github2385/TestClassListener.java
  • testng-core/src/test/java/test/listeners/github2385/TestListener.java
  • testng-core/src/test/java/test/listeners/github2385/packages/TestPackageListener.java
  • testng-core/src/test/java/test/listeners/github2522/TestListener.java
  • testng-core/src/test/java/test/listeners/github551/ConfigListener.java
  • testng-core/src/test/java/test/listeners/ordering/UniversalListener.java
  • testng-core/src/test/java/test/methodinterceptors/Issue392Test.java
  • testng-core/src/test/java/test/methodinterceptors/Issue521Test.java
  • testng-core/src/test/java/test/methodinterceptors/RemoveAMethodInterceptor.java
  • testng-core/src/test/java/test/methods/SampleMethod1.java
  • testng-core/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • testng-core/src/test/java/test/methodselectors/Test2MethodSelector.java
  • testng-core/src/test/java/test/multiple/Test1.java
  • testng-core/src/test/java/test/name/github1046/LocalTestNameGatherer.java
  • testng-core/src/test/java/test/name/github1046/TestClassSample.java
  • testng-core/src/test/java/test/objectfactory/ClassObjectFactorySampleTest.java
  • testng-core/src/test/java/test/objectfactory/CombinedTestAndObjectFactorySample.java
  • testng-core/src/test/java/test/objectfactory/github1131/EmptyConstructorSample.java
  • testng-core/src/test/java/test/objectfactory/issue2676/LoggingObjectFactorySample.java
  • testng-core/src/test/java/test/override/OverrideTest.java
  • testng-core/src/test/java/test/pholser/Captor.java
  • testng-core/src/test/java/test/pkg/PackageTest.java
  • testng-core/src/test/java/test/pkg2/Test2.java
  • testng-core/src/test/java/test/priority/issue2137/OrderListener.java
  • testng-core/src/test/java/test/priority/parallel/EfficientPriorityParallelizationTest2.java
  • testng-core/src/test/java/test/reflect/ReflectionRecipesTest.java
  • testng-core/src/test/java/test/reflect/TestMethodMatcher.java
  • testng-core/src/test/java/test/reports/FailedReporterTest.java
  • testng-core/src/test/java/test/reports/ReportTest.java
  • testng-core/src/test/java/test/reports/UniqueReporterInjectionTest.java
  • testng-core/src/test/java/test/reports/issue3038/ExceptionAwareEmailableReporter.java
  • testng-core/src/test/java/test/retryAnalyzer/FactoryTest.java
  • testng-core/src/test/java/test/retryAnalyzer/InvocationCountTest.java
  • testng-core/src/test/java/test/retryAnalyzer/github1519/TestClassSample.java
  • testng-core/src/test/java/test/retryAnalyzer/github1600/Github1600Analyzer.java
  • testng-core/src/test/java/test/retryAnalyzer/github1706/NativeInjectionSample.java
  • testng-core/src/test/java/test/retryAnalyzer/github1706/ParameterInjectionSample.java
  • testng-core/src/test/java/test/retryAnalyzer/github2669/RetryTestSample.java
  • testng-core/src/test/java/test/retryAnalyzer/issue1241/MyRetry.java
  • testng-core/src/test/java/test/retryAnalyzer/issue1538/TestClassSampleWithTestMethodDependencies.java
  • testng-core/src/test/java/test/retryAnalyzer/issue1697/LocalReporter.java
  • testng-core/src/test/java/test/retryAnalyzer/issue1697/RetryForDataDrivenTest.java
  • testng-core/src/test/java/test/retryAnalyzer/issue1697/SampleTestclass.java
  • testng-core/src/test/java/test/retryAnalyzer/issue1946/RetryAnalyzer.java
  • testng-core/src/test/java/test/retryAnalyzer/issue2148/RetryAnalyzer.java
  • testng-core/src/test/java/test/retryAnalyzer/issue2684/RerunAnalyzer.java
  • testng-core/src/test/java/test/retryAnalyzer/issue2798/HashCodeAwareRetryAnalyzer.java
  • testng-core/src/test/java/test/retryAnalyzer/issue3231/InvocationCountRetrySample.java
  • testng-core/src/test/java/test/retryAnalyzer/issue3231/MutationSample.java
  • testng-core/src/test/java/test/retryAnalyzer/issue3231/RetryLimitSample.java
  • testng-core/src/test/java/test/sample/AfterClassCalledAtEnd.java
  • testng-core/src/test/java/test/sample/BaseAfterClassCalledAtEnd.java
  • testng-core/src/test/java/test/sample/BaseSample1.java
  • testng-core/src/test/java/test/sample/BaseSampleInheritance.java
  • testng-core/src/test/java/test/sample/Basic1.java
  • testng-core/src/test/java/test/sample/Basic2.java
  • testng-core/src/test/java/test/sample/ConverterSample3.java
  • testng-core/src/test/java/test/sample/InvocationCountTest.java
  • testng-core/src/test/java/test/sample/JUnitSample1.java
  • testng-core/src/test/java/test/sample/JUnitSample2.java
  • testng-core/src/test/java/test/sample/JUnitSample3.java
  • testng-core/src/test/java/test/sample/JUnitSample4.java
  • testng-core/src/test/java/test/sample/PartialGroupTest.java
  • testng-core/src/test/java/test/simple/IncludedExcludedTest.java
  • testng-core/src/test/java/test/skip/ReasonReporter.java
  • testng-core/src/test/java/test/test111/AbstractTest.java
  • testng-core/src/test/java/test/testng106/FailingSuiteFixture.java
  • testng-core/src/test/java/test/testng317/ClassA.java
  • testng-core/src/test/java/test/testng317/ClassB.java
  • testng-core/src/test/java/test/testng59/Test1.java
  • testng-core/src/test/java/test/testng59/Test2.java
  • testng-core/src/test/java/test/testng674/BeforeClassSkipExceptionTest.java
  • testng-core/src/test/java/test/testng674/ReportingListenerFor674.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/java/test/thread/ParallelWithFactorySampleTest.java
  • testng-core/src/test/java/test/thread/SuiteThreadCountTest.java
  • testng-core/src/test/java/test/thread/TestThreadCountTest.java
  • testng-core/src/test/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-core/src/test/java/test/thread/parallelization/BaseParallelizationTest.java
  • testng-core/src/test/java/test/thread/parallelization/ClassInstanceMethodKey.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase1Scenario2.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase2Scenario1.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase2Scenario2.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase3Scenario1.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase3Scenario2.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase4Scenario1.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase5Scenario2.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase6Scenario1.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase7Scenario2.java
  • testng-core/src/test/java/test/thread/parallelization/ParallelByMethodsTestCase8Scenario1.java
  • testng-core/src/test/java/test/thread/parallelization/TestNgRunStateListener.java
  • testng-core/src/test/java/test/timeout/TimeOutTest.java
  • testng-core/src/test/java/test/timeout/github2672/TimeoutStacktraceTest.java
  • testng-core/src/test/java/test/tmp/TestFixture.java
  • testng-core/src/test/java/test/tmp/verify/VerifyInterceptor.java
  • testng-core/src/test/java/test/triangle/Base.java
  • testng-core/src/test/java/test/triangle/CountCalls.java
  • testng-core/src/test/java/test/uniquesuite/BaseAfter.java
  • testng-core/src/test/java/test/uniquesuite/BaseBefore.java
  • testng-core/src/test/java/test/verify/VerifyTestListener.java
  • testng-core/src/test/java/test/xml/XmlVerifyTest.java
  • testng-core/src/test/java/test/yaml/YamlTest.java
  • testng-core/src/test/java/test_result/OrderAbidingListener.java
  • testng-core/src/test/java/test_result/issue1590/TestclassSample.java
  • testng-core/testng-core-build.gradle.kts
  • testng-runner-api/src/main/java/org/testng/internal/LiteWeightTestNGMethod.java
  • testng-runner-api/src/main/java/org/testng/internal/TestResult.java
  • testng-runner-api/src/main/java/org/testng/internal/invokers/IInvocationStatus.java
  • testng-test-kit/src/main/java/testhelper/PerformanceUtils.java
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng/testng-build.gradle.kts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

juherr added 2 commits July 24, 2026 16:16
Apply org.openrewrite.staticanalysis.CommonStaticAnalysis across all modules:
explicit-initialization removal, final on private fields, needed braces,
final classes (private-ctor only), equals-avoids-null, unnecessary parentheses,
lambda/method-reference simplifications, and related safe cleanups.

Wildcard-import folding was disabled to keep the single-class import
convention; final formatting re-applied via Autostyle (google-java-format).
Recipe changes that produced invalid code were dropped (unnecessary-explicit-
type-args on inference-sensitive data providers, finalize-calls-super without
a throws clause).
Apply org.openrewrite.java.migrate.Java8toJava11 (source-only subset):
- Paths.get(...) -> Path.of(...)
- Files.newBufferedWriter(path, UTF_8) -> newBufferedWriter(path) (UTF-8 default)
- redundant UTF-8 charset argument removal

Build-configuration version bumps from the composite recipe were dropped to
keep the Java 11 target and avoid touching build-logic. The try-with-resources
rewrite was dropped where it silently removed a required IOException handler.
@juherr
juherr force-pushed the juherr/openrewrite-recipes branch from 35a7e9e to ab91c85 Compare July 24, 2026 14:22
@juherr juherr changed the title refactor: apply OpenRewrite static-analysis, Java 11 and AssertJ migrations refactor: apply OpenRewrite static-analysis and Java 11 migration Jul 24, 2026
juherr added 3 commits July 24, 2026 16:46
Bump the compiled bytecode target from Java 11 to Java 17.

Define jdkBuildVersion and targetJavaVersion once in the root gradle.properties
as the single source of truth. The main build reads them through the
build-parameters plugin; build-logic-commons (a nested included build that does
not inherit the root gradle.properties) now reads them from disk instead of
hard-coding the versions.
Update the JDK requirements section to reflect the Java 17 bytecode target and
add mise as a recommended JDK version manager alongside SDKMAN! and Adoptium.
Pin actions/checkout and peaceiris/actions-label-commenter to a full commit SHA
with the version as a trailing comment, following GitHub's hardening guidance.
@juherr juherr changed the title refactor: apply OpenRewrite static-analysis and Java 11 migration refactor: OpenRewrite cleanups, bump Java target to 17, and build/CI housekeeping Jul 24, 2026
@juherr
juherr marked this pull request as draft July 24, 2026 14:50
juherr added 6 commits July 24, 2026 16:54
Replace the remaining hard-coded listOf(21, 11) with the jdkBuildVersion /
targetJavaVersion read from the root gradle.properties, matching build-logic-commons
and completing the single source of truth (target is now 17, not 11).
Pin every third-party and first-party action across all workflows to a full
commit SHA with the version as a trailing comment, following GitHub's hardening
guidance.
From 7.13.0 onward, structure entries per Keep a Changelog 1.1.0
(versioned heading + typed sections). Older releases are left untouched.
Set jdkBuildVersion=25 (the default build toolchain). Error Prone 2.20.0 crashes
on JDK 25 (NoSuchFieldError: TypeTag.UNKNOWN), so upgrade error_prone_core to
2.50.0 and gradle-errorprone-plugin to 4.1.0 (the latter passes the now-required
--should-stop=ifError=FLOW). Disable the SelfAssertion check, which only flags
intentional trivial assertions in TestNG's sample/fixture test classes.

Gradle 8.11 cannot run on JDK 25, so Gradle keeps running on JDK 21 while the
JDK 25 toolchain compiles TestNG. Bytecode target stays Java 17.
Provision JDK 25 (Temurin, the distribution recommended in CONTRIBUTING) as the
build toolchain in the publish and test workflows, keeping JDK 21 as the Gradle
launcher (last in the list becomes JAVA_HOME). Refresh the stale JDK 21 /
targetJavaVersion=11 comments.
Building now uses a JDK 25 toolchain while Gradle runs on JDK 21; the bytecode
target stays Java 17.
@juherr juherr changed the title refactor: OpenRewrite cleanups, bump Java target to 17, and build/CI housekeeping refactor+build: OpenRewrite cleanups, Java 17 target, and default build on JDK 25 Jul 24, 2026
juherr added 2 commits July 24, 2026 17:48
Gradle 9 runs on JDK 25, so Gradle itself now runs on the JDK 25 build toolchain
(no more JDK 21 launcher split). Migration changes:

- Wrapper 8.11.1 -> 9.6.1.
- build-logic/settings: include build-logic-commons via pluginManagement so its
  precompiled convention plugin resolves under Gradle 9.
- reproducible-builds: dirMode/fileMode -> dirPermissions/filePermissions.
- BuildIdentifier.isCurrentBuild() -> buildPath == ":" (removed in Gradle 9).
- Manifest attributes: non-null values (attributes() now requires Pair<String, Any>).
- vlsi gradle-extensions 1.90 -> 3.0.2 (Gradle.addBuildListener removed).
- Shadow plugin com.github.johnrengelman 8.1.1 -> com.gradleup.shadow 9.6.1.
Now that Gradle 9 runs on JDK 25, the publish and test workflows provision a
single JDK 25 (Temurin) that runs Gradle and builds TestNG, and CONTRIBUTING no
longer mentions a separate JDK 21 launcher.
@juherr juherr changed the title refactor+build: OpenRewrite cleanups, Java 17 target, and default build on JDK 25 refactor+build: OpenRewrite cleanups, Java 17 target, and JDK 25 build on Gradle 9 Jul 24, 2026
juherr added 8 commits July 24, 2026 18:00
TestNG now targets Java 17, so its classes no longer run on Java 11; remove 11
from the tested JDK matrix and trim the now-verbose JDK-setup comments.
…che note

Align the build-logic-commons jdkBuildVersion fallback with the default (25).
Update the configuration-cache note: vlsi gradle-extensions 3.0.2 is now
config-cache compatible, leaving com.github.autostyle as the only blocker
(unmaintained, no upstream fix); link the Gradle build-listeners requirement.
Autostyle (last release 4.0.1, effectively unmaintained) is replaced by
com.diffplug.spotless 8.8.0, keeping the same steps (import order, remove unused
imports, trim trailing whitespace, end with newline, google-java-format).

- Apply Spotless once at the root with apply false so all subprojects share a
  single build service (precompiled convention plugins load it per-project).
- Use the JavaParser-based removeUnusedImports engine; the default google-java-format
  engine throws NoClassDefFoundError for Guava in this build's classloader.
- Rename the skipAutostyle build parameter to skipSpotless.
- Reformat 86 files to Spotless's newer google-java-format, and update the docs.

Configuration cache stays disabled: Spotless's removeUnusedImports step is not yet
config-cache compatible (the old Autostyle blocker, Gradle.buildFinished, is gone).
Java 26 is released, so add it to the supported test matrix; the early-access
axis becomes 27 and 28 (both downloadable from jdk.java.net). Validated by
running matrix.mjs locally.
false is Gradle's default (the configuration cache is opt-in), so the explicit
setting and its comment only restated the convention.
…ending

Gradle 9 runs on JDK 25, so the separate JDK 21 launcher is no longer needed;
the setup-java list is the ascending test version + JDK 25 (kept last as JAVA_HOME).
The Tier 1 static-analysis recipe stripped the deprecated finalize()
method from MyTestClassWithGlobalReferenceCounterSample. That method is
the whole point of the fixture: it decrements the global instance counter
when the object is garbage-collected, which is how MemoryLeakTestNg
observes that instances are reclaimed. Without it the counter never
returns to zero, so testMemoryLeak spins until the 10s timeout and fails
on every JDK/OS in the matrix.

Restore the method so the leak-reproduction fixture works again.
@juherr
juherr marked this pull request as ready for review July 24, 2026 19:33
@juherr

juherr commented Jul 24, 2026

Copy link
Copy Markdown
Member Author

@vlsi Could you please review the Gradle changes and let me know if everything looks good?

@juherr

juherr commented Jul 24, 2026

Copy link
Copy Markdown
Member Author

@krmahadevan Sorry for the large diff. No rush—take the time you need.

@krmahadevan

Copy link
Copy Markdown
Member

@juherr - Are we bumping up the minimum requirement for running TestNG from JDK11 to JDK17 in this PR?

If yes, does it mean that this will be a major release or something of that sort? Historically upgrading JDK has always been a problem for us with respect to our users.

@krmahadevan

krmahadevan commented Jul 26, 2026

Copy link
Copy Markdown
Member

@krmahadevan Sorry for the large diff. No rush—take the time you need.

@juherr - If we could split this PR into different small ones each of which targets one aspect, it would be useful.

The below commits if they were independent PRs, we could merge them directly because they are purely mechanical in nature.

@juherr

juherr commented Jul 26, 2026

Copy link
Copy Markdown
Member Author

@krmahadevan @vlsi You're right. The Gradle changes became larger than expected. I'll split this into separate PRs:

  • Gradle upgrade
  • Raise the minimum supported JDK version (we only support the two latest LTS releases)
  • Codebase modernization

@juherr

juherr commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

superseed by #3308 and #3291

@juherr juherr closed this Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants