Skip to content

refactor(core): extract the command line front end out of testng-core - #3307

Open
juherr wants to merge 1 commit into
testng-team:masterfrom
juherr:juherr/extract-jcommander-module
Open

refactor(core): extract the command line front end out of testng-core#3307
juherr wants to merge 1 commit into
testng-team:masterfrom
juherr:juherr/extract-jcommander-module

Conversation

@juherr

@juherr juherr commented Jul 29, 2026

Copy link
Copy Markdown
Member

Fixes # .

Did you remember to?

  • Add test case(s)
  • Update CHANGES.txt
  • Auto applied styling via ./gradlew autostyleApply

Why

testng-core depends on org.jcommander:jcommander in api scope, so every consumer gets the parsing library whether or not it drives TestNG from a command line. The coupling runs deep: CommandLineArgs is a @Parameter-annotated POJO, TestNG holds a static JCommander field, and TestNG.configure(CommandLineArgs) mixes applying configuration with CLI-only string-to-object conversion.

This picks up #2612 and finishes it, with the additional goal that no CLI logic remains in the core.

What

Two new modules:

Module Contents
testng-cli CliOptions, CliConfigurer, AbstractCliRunner — parser-agnostic, no JCommander
testng-jcommander the JCommander implementation, plus the relocated Converter

testng-core keeps a minimal ServiceLoader SPI, ITestNGCliRunner, and nothing else CLI-shaped. Both modules are bundled into the merged org.testng:testng jar, so java -cp testng.jar org.testng.TestNG suite.xml behaves exactly as before.

Implementations never terminate the JVM: an unusable command line comes back as a TestNGException, and only TestNG.main turns it into a message, a usage banner and exit code 1. System.exit no longer appears anywhere in testng-cli or testng-jcommander.

Compatibility

7.x compatibility is kept through frozen @Deprecated shims: CommandLineArgs (annotations stripped), TestNG.configure(CommandLineArgs), TestNG.validateCommandLineParameters, TestNG.main, TestNG.privateMain.

CliConfigurerParityTest compares the state the frozen path and the new path produce, field by field — nothing else keeps them in sync.

Behaviour changes worth reviewing:

  • TestNG.privateMain throws where it used to System.exit on a bad command line. TestNG.main is unchanged.
  • TestNG.validateCommandLineParameters reports failures as TestNGException instead of JCommander's ParameterException. Both unchecked, signature unchanged, but a caller catching ParameterException no longer catches it.
  • TestNG.setThreadCount raises a TestNGException below 1 instead of printing the usage banner and calling System.exit(1). No library setter should be able to kill an embedder's JVM; the command line output is unchanged because TestNG.main turns that exception into the same message and exit code.
  • org.testng.Converter moved to org.testng.cli.jcommander.Converter. Still in testng.jar; no shim.
  • New setListenerComparatorClass / setListenerFactoryClass / setExecutorServiceFactoryClass / setInjectorFactoryClass. Named rather than overloaded on purpose, so that existing calls passing a bare null keep compiling; this follows the setTestRunnerFactoryClass precedent already in TestNG.

testng-core no longer brings JCommander transitively — embedders that relied on it being on the classpath have to declare it.

Tests

testng-test-kit becomes the shared test-fixture library so the 22 tests whose subject is the command line could move to testng-jcommander. The 243 classes extending SimpleBaseTest are untouched.

I diffed the executed test classes against master to prove nothing stopped running: 386 → 385 classes, the single removal being test.methodselectors.CommandLineTest, which moved wholesale. The 12414 → 12192 test-count delta is entirely 37 relocated or de-duplicated methods × the 6 invocations the suite applies to each class.

Full build green: testng-core 12192 · testng-jcommander 39 · testng-cli 14 · testng-asserts 181 · testng-test-osgi 4 — 0 failures.

Verified end to end against the built jar, not just by tests:

  • java -cp testng.jar org.testng.TestNG suite.xml → exit 0
  • the same without JCommander → actionable message, no NoClassDefFoundError
  • org.testng.cli.jcommander.Converter -d … → writes the YAML
  • the OSGi test now instantiates the provider inside Felix instead of only resolving its name

Deliberately not done

The two modules are not published on their own. Only :testng is published today, so publishing them would ship org.testng.cli.* and its META-INF/services entry in two artifacts at once — duplicate classes and duplicate service registrations that neither Gradle nor Maven can dedupe. That is a packaging change for the next major; tracked in #3301.

Two pre-existing bugs are preserved for parity and now carry a FIXME rather than staying invisible: -propagateDataProviderFailureAsTestFailure is applied on every run regardless of its value, and -alwaysrunlisteners cannot be switched off from the command line.

Summary by CodeRabbit

  • New Features

    • Added a modular CLI front end with suite/test selection, listeners/reporting, grouping, parallel execution, and custom factory wiring.
    • Enabled SPI-based CLI runner discovery; the bundled jar preserves the java -cp testng.jar org.testng.TestNG suite.xml workflow.
    • Added new configuration setters for listener/executor/injector wiring and command-line method selection.
  • Bug Fixes

    • Invalid CLI options now fail via TestNGException with consistent error reporting; setThreadCount(<1) now throws instead of exiting.
  • Documentation

    • Documented legacy command-line deprecations, updated CLI validation behavior, and noted Converter relocation for 7.13+.

@juherr
juherr requested a review from krmahadevan as a code owner July 29, 2026 12:18
@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The CLI front end is split from testng-core into testng-cli and testng-jcommander. TestNG discovers CLI runners through ServiceLoader, while shared option configuration, JCommander parsing, packaging, compatibility APIs, fixtures, and command-line tests are updated.

Changes

CLI modularization

Layer / File(s) Summary
Core CLI contract and delegation
testng-core/..., testng/testng-build.gradle.kts, CHANGES.txt
Adds the CLI runner SPI and ServiceLoader resolution, delegates TestNG.main and privateMain, exposes configuration APIs, and removes JCommander from core’s API path.
CLI options and shared configuration
testng-cli/...
Adds CliOptions, validation, configuration mapping, parsing exceptions, and parity checks with legacy command-line state.
JCommander runner implementation
testng-jcommander/...
Adds JCommander option declarations, conversion to CliOptions, usage output, SPI registration, and the relocated converter.
CLI parser and integration validation
testng-jcommander/src/test/...
Adds coverage for parsing, listeners, factories, reporters, selectors, failure policies, executors, jars, and forked execution.
Shared test fixtures and helpers
testng-test-kit/...
Adds reusable suite, jar, listener, selector, reporter, executor, and TestNG helper fixtures.
Core test migration
testng-core/src/test/...
Removes core CLI-dependent tests and updates remaining tests to use API, XML, annotation, and shared-helper paths.
Build and deployment validation
settings.gradle.kts, testng-test-osgi/..., testng/testng-build.gradle.kts
Registers the new modules, shades the JCommander runner into the merged jar, and verifies CLI runner discovery in the OSGi test.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

Suggested reviewers: krmahadevan

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.16% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: extracting TestNG's command-line front end from testng-core.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ 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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
testng/testng-build.gradle.kts (1)

67-92: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Export org.testng.cli.jcommander in the merged TestNG bundle.

TestNG#main/TestNG#privateMain document using org.testng.cli.jcommander.JCommanderCliRunner as the replacement for the deprecated command-line entry points, and this package is currently imported by the bundled JCommander frontend. Add it to Export-Package so OSGi consumers can resolve the documented runner class without SPI-Fly provider-only access.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@testng/testng-build.gradle.kts` around lines 67 - 92, Add
org.testng.cli.jcommander to the Export-Package list in the merged TestNG bundle
configuration. Keep the existing package exports unchanged so OSGi consumers can
resolve TestNG#main/privateMain’s documented JCommanderCliRunner.
🧹 Nitpick comments (2)
testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java (1)

54-85: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Parity test skips every class-loading field.

None of listener, listenerFactory, listenerComparator, objectFactory, testRunnerFactory, threadPoolFactoryClass, dependencyInjectorFactoryClass, methodSelectors, or reporter are populated. These are precisely the fields whose conversion logic changed the most (raw casts + m_objectFactory.newInstance chains → asSubclass/uncheckedSubclass), so the parity test currently can't catch a regression in that logic.

Consider adding concrete (test-fixture) class names for these fields so the class-loading/casting paths are actually exercised by the parity comparison.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java` around
lines 54 - 85, Extend populatedCliOptions() to assign concrete test-fixture
class names to listener, listenerFactory, listenerComparator, objectFactory,
testRunnerFactory, threadPoolFactoryClass, dependencyInjectorFactoryClass,
methodSelectors, and reporter. Use compatible fixture implementations for each
field so CliOptions conversion and parity comparison exercise the updated
asSubclass/uncheckedSubclass class-loading paths.
testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java (1)

31-51: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add a timeout guard around the forked-process wait.

process.waitFor() has no bound; if the forked TestNG process hangs, this test (and the build) stalls indefinitely instead of failing.

♻️ Proposed fix
-    Process process = builder.inheritIO().start();
-    process.waitFor();
-
-    return process.exitValue();
+    Process process = builder.inheritIO().start();
+    boolean finished = process.waitFor(60, TimeUnit.SECONDS);
+    if (!finished) {
+      process.destroyForcibly();
+      throw new AssertionError("Forked TestNG process did not terminate within the timeout");
+    }
+
+    return process.exitValue();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java`
around lines 31 - 51, Update the exec method’s forked-process wait to use a
bounded timeout instead of unconditionally calling process.waitFor(). Fail the
test when the timeout expires, and preserve returning the completed process’s
exit value for normal termination.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGES.txt`:
- Around line 5-8: Update the deprecation entry in CHANGES.txt to state that the
listed APIs remain available but with the behavior changes described in the
subsequent entries, rather than claiming they work unchanged. Keep the existing
removal timeline and API list intact.

In `@testng-bom/testng-bom-build.gradle.kts`:
- Around line 11-15: Remove the projects.testngCli and projects.testngJcommander
entries from the BOM dependencies, while retaining the published
testngCollections, testngCoreApi, and testngCore modules. Do not expose the
deferred unpublished coordinates until issue `#3301` is resolved.

In `@testng-core/src/main/java/org/testng/CliRunners.java`:
- Around line 77-97: Update the load method’s duplicate-provider check after the
first successful it.next() so its subsequent it.hasNext() runs in a separate
guarded block; if that peek throws ServiceConfigurationError or
RuntimeException, ignore it and still return the already-loaded runner. Keep the
existing failure handling for initial ServiceLoader iteration and runner
loading, while preserving the warning when another provider is detected.

In `@testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java`:
- Around line 48-49: Replace every failed-result assertion in
CommandLineTest.java at lines 48-49, 58-59, 69-70, 80-81, 91-92, 103-104,
113-114, 124-125, 147-148, 167-168, and 188-190: calls passing
tla.getFailedTests() must use assertFailedTestNames instead of
assertPassedTestNames, while leaving passed-result assertions unchanged.

In
`@testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java`:
- Around line 50-61: Update the JVM property handling around TestNG.privateMain:
capture the original value before System.setProperty, then restore that value in
the finally block, calling System.clearProperty when the property was previously
absent. Preserve the existing jvm != null guard and test execution flow.

In
`@testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java`:
- Around line 57-62: Update the generated-suite setup in
CustomExecutorServiceFactoryCommandLineTest so an IOException from
Files.writeString is propagated or causes the test to fail, rather than being
ignored. Preserve adding successfully written suite paths to suites, and ensure
write failures cannot silently reduce the test to a single-suite run.

In
`@testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java`:
- Around line 12-21: Update LocalLogAggregator’s static log state so each
TestNG.privateMain run starts with cleared logs, using an explicit reset or
equivalent per-run lifecycle hook. Change getLogs() to return a snapshot copy
rather than the live backing set, while preserving concurrent collection during
afterInvocation.

In
`@testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java`:
- Around line 13-19: Update the setUp method’s failure condition so it is
reachable during the single `@BeforeClass` invocation, such as triggering when
variable reaches 1; preserve the exception and existing setup behavior while
ensuring the failure-policy test exercises the configuration failure.

In `@testng-test-kit/src/main/java/test/TestHelper.java`:
- Around line 35-37: Update the temporary-resource helpers in TestHelper,
including the XML file creation and related directory creation paths, to
establish reliable cleanup: either expose the generated resources so each caller
explicitly deletes them during teardown or register guaranteed cleanup for every
created file and directory. Ensure cleanup also runs when the test or CLI
invocation fails.

In `@testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt`:
- Around line 341-345: Update the File-based grep overload to manage and close
the FileReader it creates before returning, while preserving delegation to the
existing grep(Reader, String, MutableList<String>) implementation and its
results.

---

Outside diff comments:
In `@testng/testng-build.gradle.kts`:
- Around line 67-92: Add org.testng.cli.jcommander to the Export-Package list in
the merged TestNG bundle configuration. Keep the existing package exports
unchanged so OSGi consumers can resolve TestNG#main/privateMain’s documented
JCommanderCliRunner.

---

Nitpick comments:
In `@testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java`:
- Around line 54-85: Extend populatedCliOptions() to assign concrete
test-fixture class names to listener, listenerFactory, listenerComparator,
objectFactory, testRunnerFactory, threadPoolFactoryClass,
dependencyInjectorFactoryClass, methodSelectors, and reporter. Use compatible
fixture implementations for each field so CliOptions conversion and parity
comparison exercise the updated asSubclass/uncheckedSubclass class-loading
paths.

In
`@testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java`:
- Around line 31-51: Update the exec method’s forked-process wait to use a
bounded timeout instead of unconditionally calling process.waitFor(). Fail the
test when the timeout expires, and preserve returning the completed process’s
exit value for normal termination.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6bfc25c1-215f-4ea8-9e3c-8274509560d1

📥 Commits

Reviewing files that changed from the base of the PR and between 5f79329 and df02482.

📒 Files selected for processing (97)
  • CHANGES.txt
  • settings.gradle.kts
  • testng-asserts/src/test/java/testhelper/PerformanceUtils.java
  • testng-asserts/testng-asserts-build.gradle.kts
  • testng-bom/testng-bom-build.gradle.kts
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-core/src/main/java/org/testng/TestNG.java
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-core/src/test/java/test/groups/issue2232/IssueTest.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/testng-core-build.gradle.kts
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderCliRunner.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-jcommander/src/main/resources/META-INF/services/org.testng.ITestNGCliRunner
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-jcommander/src/test/resources/1332.xml
  • testng-jcommander/src/test/resources/methodselector-in-xml.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTest.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTestExclusions.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-jcommander/testng-jcommander-build.gradle.kts
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest1.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest2.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest3.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest4.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-test-kit/src/main/java/test/groups/issue2232/Issue2232Suites.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringLog.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringSampleTest.java
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng-test-kit/src/main/java/test/reports/ReporterSample.java
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ExecutorServiceFactory.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-test-kit/src/main/java/test/thread/issue3066/TestClassSample.java
  • testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt
  • testng-test-kit/src/main/resources/jarfileutils/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng/testng-build.gradle.kts
💤 Files with no reviewable changes (8)
  • testng-asserts/testng-asserts-build.gradle.kts
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java

Comment thread CHANGES.txt Outdated
Comment thread testng-bom/testng-bom-build.gradle.kts Outdated
Comment thread testng-core/src/main/java/org/testng/CliRunners.java
Comment thread testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java Outdated
Comment thread testng-test-kit/src/main/java/test/TestHelper.java

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
testng/testng-build.gradle.kts (1)

67-92: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Export org.testng.cli.jcommander in the merged TestNG bundle.

TestNG#main/TestNG#privateMain document using org.testng.cli.jcommander.JCommanderCliRunner as the replacement for the deprecated command-line entry points, and this package is currently imported by the bundled JCommander frontend. Add it to Export-Package so OSGi consumers can resolve the documented runner class without SPI-Fly provider-only access.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@testng/testng-build.gradle.kts` around lines 67 - 92, Add
org.testng.cli.jcommander to the Export-Package list in the merged TestNG bundle
configuration. Keep the existing package exports unchanged so OSGi consumers can
resolve TestNG#main/privateMain’s documented JCommanderCliRunner.
🧹 Nitpick comments (2)
testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java (1)

54-85: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Parity test skips every class-loading field.

None of listener, listenerFactory, listenerComparator, objectFactory, testRunnerFactory, threadPoolFactoryClass, dependencyInjectorFactoryClass, methodSelectors, or reporter are populated. These are precisely the fields whose conversion logic changed the most (raw casts + m_objectFactory.newInstance chains → asSubclass/uncheckedSubclass), so the parity test currently can't catch a regression in that logic.

Consider adding concrete (test-fixture) class names for these fields so the class-loading/casting paths are actually exercised by the parity comparison.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java` around
lines 54 - 85, Extend populatedCliOptions() to assign concrete test-fixture
class names to listener, listenerFactory, listenerComparator, objectFactory,
testRunnerFactory, threadPoolFactoryClass, dependencyInjectorFactoryClass,
methodSelectors, and reporter. Use compatible fixture implementations for each
field so CliOptions conversion and parity comparison exercise the updated
asSubclass/uncheckedSubclass class-loading paths.
testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java (1)

31-51: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add a timeout guard around the forked-process wait.

process.waitFor() has no bound; if the forked TestNG process hangs, this test (and the build) stalls indefinitely instead of failing.

♻️ Proposed fix
-    Process process = builder.inheritIO().start();
-    process.waitFor();
-
-    return process.exitValue();
+    Process process = builder.inheritIO().start();
+    boolean finished = process.waitFor(60, TimeUnit.SECONDS);
+    if (!finished) {
+      process.destroyForcibly();
+      throw new AssertionError("Forked TestNG process did not terminate within the timeout");
+    }
+
+    return process.exitValue();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java`
around lines 31 - 51, Update the exec method’s forked-process wait to use a
bounded timeout instead of unconditionally calling process.waitFor(). Fail the
test when the timeout expires, and preserve returning the completed process’s
exit value for normal termination.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGES.txt`:
- Around line 5-8: Update the deprecation entry in CHANGES.txt to state that the
listed APIs remain available but with the behavior changes described in the
subsequent entries, rather than claiming they work unchanged. Keep the existing
removal timeline and API list intact.

In `@testng-bom/testng-bom-build.gradle.kts`:
- Around line 11-15: Remove the projects.testngCli and projects.testngJcommander
entries from the BOM dependencies, while retaining the published
testngCollections, testngCoreApi, and testngCore modules. Do not expose the
deferred unpublished coordinates until issue `#3301` is resolved.

In `@testng-core/src/main/java/org/testng/CliRunners.java`:
- Around line 77-97: Update the load method’s duplicate-provider check after the
first successful it.next() so its subsequent it.hasNext() runs in a separate
guarded block; if that peek throws ServiceConfigurationError or
RuntimeException, ignore it and still return the already-loaded runner. Keep the
existing failure handling for initial ServiceLoader iteration and runner
loading, while preserving the warning when another provider is detected.

In `@testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java`:
- Around line 48-49: Replace every failed-result assertion in
CommandLineTest.java at lines 48-49, 58-59, 69-70, 80-81, 91-92, 103-104,
113-114, 124-125, 147-148, 167-168, and 188-190: calls passing
tla.getFailedTests() must use assertFailedTestNames instead of
assertPassedTestNames, while leaving passed-result assertions unchanged.

In
`@testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java`:
- Around line 50-61: Update the JVM property handling around TestNG.privateMain:
capture the original value before System.setProperty, then restore that value in
the finally block, calling System.clearProperty when the property was previously
absent. Preserve the existing jvm != null guard and test execution flow.

In
`@testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java`:
- Around line 57-62: Update the generated-suite setup in
CustomExecutorServiceFactoryCommandLineTest so an IOException from
Files.writeString is propagated or causes the test to fail, rather than being
ignored. Preserve adding successfully written suite paths to suites, and ensure
write failures cannot silently reduce the test to a single-suite run.

In
`@testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java`:
- Around line 12-21: Update LocalLogAggregator’s static log state so each
TestNG.privateMain run starts with cleared logs, using an explicit reset or
equivalent per-run lifecycle hook. Change getLogs() to return a snapshot copy
rather than the live backing set, while preserving concurrent collection during
afterInvocation.

In
`@testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java`:
- Around line 13-19: Update the setUp method’s failure condition so it is
reachable during the single `@BeforeClass` invocation, such as triggering when
variable reaches 1; preserve the exception and existing setup behavior while
ensuring the failure-policy test exercises the configuration failure.

In `@testng-test-kit/src/main/java/test/TestHelper.java`:
- Around line 35-37: Update the temporary-resource helpers in TestHelper,
including the XML file creation and related directory creation paths, to
establish reliable cleanup: either expose the generated resources so each caller
explicitly deletes them during teardown or register guaranteed cleanup for every
created file and directory. Ensure cleanup also runs when the test or CLI
invocation fails.

In `@testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt`:
- Around line 341-345: Update the File-based grep overload to manage and close
the FileReader it creates before returning, while preserving delegation to the
existing grep(Reader, String, MutableList<String>) implementation and its
results.

---

Outside diff comments:
In `@testng/testng-build.gradle.kts`:
- Around line 67-92: Add org.testng.cli.jcommander to the Export-Package list in
the merged TestNG bundle configuration. Keep the existing package exports
unchanged so OSGi consumers can resolve TestNG#main/privateMain’s documented
JCommanderCliRunner.

---

Nitpick comments:
In `@testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java`:
- Around line 54-85: Extend populatedCliOptions() to assign concrete
test-fixture class names to listener, listenerFactory, listenerComparator,
objectFactory, testRunnerFactory, threadPoolFactoryClass,
dependencyInjectorFactoryClass, methodSelectors, and reporter. Use compatible
fixture implementations for each field so CliOptions conversion and parity
comparison exercise the updated asSubclass/uncheckedSubclass class-loading
paths.

In
`@testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java`:
- Around line 31-51: Update the exec method’s forked-process wait to use a
bounded timeout instead of unconditionally calling process.waitFor(). Fail the
test when the timeout expires, and preserve returning the completed process’s
exit value for normal termination.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6bfc25c1-215f-4ea8-9e3c-8274509560d1

📥 Commits

Reviewing files that changed from the base of the PR and between 5f79329 and df02482.

📒 Files selected for processing (97)
  • CHANGES.txt
  • settings.gradle.kts
  • testng-asserts/src/test/java/testhelper/PerformanceUtils.java
  • testng-asserts/testng-asserts-build.gradle.kts
  • testng-bom/testng-bom-build.gradle.kts
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-core/src/main/java/org/testng/TestNG.java
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-core/src/test/java/test/groups/issue2232/IssueTest.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/testng-core-build.gradle.kts
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderCliRunner.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-jcommander/src/main/resources/META-INF/services/org.testng.ITestNGCliRunner
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-jcommander/src/test/resources/1332.xml
  • testng-jcommander/src/test/resources/methodselector-in-xml.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTest.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTestExclusions.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-jcommander/testng-jcommander-build.gradle.kts
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest1.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest2.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest3.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest4.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-test-kit/src/main/java/test/groups/issue2232/Issue2232Suites.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringLog.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringSampleTest.java
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng-test-kit/src/main/java/test/reports/ReporterSample.java
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ExecutorServiceFactory.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-test-kit/src/main/java/test/thread/issue3066/TestClassSample.java
  • testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt
  • testng-test-kit/src/main/resources/jarfileutils/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng/testng-build.gradle.kts
💤 Files with no reviewable changes (8)
  • testng-asserts/testng-asserts-build.gradle.kts
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
🛑 Comments failed to post (3)
testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java (1)

12-21: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Reset the static log set between CLI runs.

Because logs is static and getLogs() exposes the live set, later TestNG.privateMain invocations can observe prior results. Add per-run state or an explicit reset, and return a snapshot rather than the mutable backing set.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java`
around lines 12 - 21, Update LocalLogAggregator’s static log state so each
TestNG.privateMain run starts with cleared logs, using an explicit reset or
equivalent per-run lifecycle hook. Change getLogs() to return a snapshot copy
rather than the live backing set, while preserving concurrent collection during
afterInvocation.
testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java (1)

13-19: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Make the failing setup reachable.

@BeforeClass runs once for this class, so variable changes from 0 to 1; the variable == 4 branch can never execute during setup. The failure-policy integration test can therefore pass without exercising a configuration failure. Align the trigger with the lifecycle, such as failing on the first @BeforeClass invocation or moving the condition to a per-test configuration method.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java`
around lines 13 - 19, Update the setUp method’s failure condition so it is
reachable during the single `@BeforeClass` invocation, such as triggering when
variable reaches 1; preserve the exception and existing setup behavior while
ensuring the failure-policy test exercises the configuration failure.
testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt (1)

341-345: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Close the FileReader owned by this overload.

The delegated reader is never closed, so repeated file scans leak descriptors.

Proposed fix
 protected fun grep(
     fileName: File,
     regexp: String,
     resultLines: MutableList<String>
-) = grep(FileReader(fileName), regexp, resultLines)
+) = FileReader(fileName).use { grep(it, regexp, resultLines) }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

        protected fun grep(
            fileName: File,
            regexp: String,
            resultLines: MutableList<String>
        ) = FileReader(fileName).use { grep(it, regexp, resultLines) }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt` around lines 341 -
345, Update the File-based grep overload to manage and close the FileReader it
creates before returning, while preserving delegation to the existing
grep(Reader, String, MutableList<String>) implementation and its results.

@juherr
juherr force-pushed the juherr/extract-jcommander-module branch from df02482 to 924d410 Compare July 29, 2026 12:53

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@testng-core/src/main/java/org/testng/TestNG.java`:
- Around line 275-281: Rename the Class-based overloads to distinct names to
preserve compilation for explicit null calls: update setListenerComparator to
setListenerComparatorClass at testng-core/src/main/java/org/testng/TestNG.java
lines 275-281, and apply the same Class-variant rename to the executor,
listener, and injector factory setters at lines 858-860, 870-872, and 2109-2111.
Update any internal references or callers to use the renamed methods while
leaving the object-based setters unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 610e15dd-3865-4943-93d2-b91b39521a74

📥 Commits

Reviewing files that changed from the base of the PR and between df02482 and 924d410.

📒 Files selected for processing (17)
  • CHANGES.txt
  • settings.gradle.kts
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-core/src/main/java/org/testng/TestNG.java
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
💤 Files with no reviewable changes (2)
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
🚧 Files skipped from review as they are similar to previous changes (14)
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • settings.gradle.kts
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • CHANGES.txt
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-cli/testng-cli-build.gradle.kts

Comment thread testng-core/src/main/java/org/testng/TestNG.java
@juherr
juherr force-pushed the juherr/extract-jcommander-module branch from 924d410 to 700e9cb Compare July 29, 2026 13:41

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@testng-core/src/main/java/org/testng/TestNG.java`:
- Around line 1856-1869: Update the Javadoc for TestNG.addReporter(String) to
state that reporter resolution and instantiation occur synchronously, including
the warning for null or empty input and the exception/failure behavior when the
configured class is not an IReporter. Remove the inaccurate claim that invalid
reporters fail later during instantiation.
- Around line 1453-1462: Ensure the CLI path used by TestNG.privateMain()
rejects non-positive -threadcount values by throwing or reporting
TestNGException without invoking JVM termination. Update the relevant CLI
parsing/validation or TestNG.setThreadCount(int), while preserving normal
handling for positive thread counts and privateMain()’s non-termination
contract.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4e557936-754e-46e6-a220-bec3f93338fe

📥 Commits

Reviewing files that changed from the base of the PR and between 924d410 and 700e9cb.

📒 Files selected for processing (94)
  • CHANGES.txt
  • settings.gradle.kts
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-core/src/main/java/org/testng/TestNG.java
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-core/src/test/java/test/groups/issue2232/IssueTest.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/testng-core-build.gradle.kts
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderCliRunner.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-jcommander/src/main/resources/META-INF/services/org.testng.ITestNGCliRunner
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-jcommander/src/test/resources/1332.xml
  • testng-jcommander/src/test/resources/methodselector-in-xml.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTest.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTestExclusions.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-jcommander/testng-jcommander-build.gradle.kts
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest1.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest2.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest3.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest4.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-test-kit/src/main/java/test/groups/issue2232/Issue2232Suites.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringLog.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringSampleTest.java
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng-test-kit/src/main/java/test/reports/ReporterSample.java
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ExecutorServiceFactory.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-test-kit/src/main/java/test/thread/issue3066/TestClassSample.java
  • testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt
  • testng-test-kit/src/main/resources/jarfileutils/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng/testng-build.gradle.kts
💤 Files with no reviewable changes (7)
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
🚧 Files skipped from review as they are similar to previous changes (68)
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-cli/testng-cli-build.gradle.kts
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringSampleTest.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-jcommander/src/main/resources/META-INF/services/org.testng.ITestNGCliRunner
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest2.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTestExclusions.xml
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTest.xml
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-kit/src/main/java/test/reports/ReporterSample.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest1.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-test-kit/src/main/java/test/groups/issue2232/Issue2232Suites.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringLog.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • CHANGES.txt
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng/testng-build.gradle.kts

Comment thread testng-core/src/main/java/org/testng/TestNG.java
Comment thread testng-core/src/main/java/org/testng/TestNG.java
@juherr
juherr force-pushed the juherr/extract-jcommander-module branch from 700e9cb to 601a311 Compare July 29, 2026 13:58

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java`:
- Around line 27-36: Ensure temporary JAR files returned by
JarCreator.generateJar are deleted after test consumption. Prefer adding
explicit cleanup at each caller with reliable finally/teardown handling, or
update generateJar to schedule deletion for every returned File while preserving
the existing generation behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b1ba8228-7b6e-4cc2-b928-21e4775e4196

📥 Commits

Reviewing files that changed from the base of the PR and between 700e9cb and 601a311.

📒 Files selected for processing (94)
  • CHANGES.txt
  • settings.gradle.kts
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-core/src/main/java/org/testng/TestNG.java
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-core/src/test/java/test/groups/issue2232/IssueTest.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/testng-core-build.gradle.kts
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderCliRunner.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-jcommander/src/main/resources/META-INF/services/org.testng.ITestNGCliRunner
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-jcommander/src/test/resources/1332.xml
  • testng-jcommander/src/test/resources/methodselector-in-xml.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTest.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTestExclusions.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-jcommander/testng-jcommander-build.gradle.kts
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest1.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest2.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest3.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest4.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-test-kit/src/main/java/test/groups/issue2232/Issue2232Suites.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringLog.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringSampleTest.java
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng-test-kit/src/main/java/test/reports/ReporterSample.java
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ExecutorServiceFactory.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-test-kit/src/main/java/test/thread/issue3066/TestClassSample.java
  • testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt
  • testng-test-kit/src/main/resources/jarfileutils/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng/testng-build.gradle.kts
💤 Files with no reviewable changes (7)
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
🚧 Files skipped from review as they are similar to previous changes (74)
  • testng-jcommander/src/test/resources/methodselector-in-xml.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest4.java
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-test-kit/src/main/java/test/thread/issue3066/TestClassSample.java
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest3.java
  • testng-jcommander/testng-jcommander-build.gradle.kts
  • testng-jcommander/src/test/resources/1332.xml
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ExecutorServiceFactory.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-jcommander/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • settings.gradle.kts
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-core/testng-core-build.gradle.kts
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderCliRunner.java
  • testng-core/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • CHANGES.txt
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-core/src/test/java/test/groups/issue2232/IssueTest.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-core/src/main/java/org/testng/TestNG.java

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java`:
- Around line 27-36: Ensure temporary JAR files returned by
JarCreator.generateJar are deleted after test consumption. Prefer adding
explicit cleanup at each caller with reliable finally/teardown handling, or
update generateJar to schedule deletion for every returned File while preserving
the existing generation behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b1ba8228-7b6e-4cc2-b928-21e4775e4196

📥 Commits

Reviewing files that changed from the base of the PR and between 700e9cb and 601a311.

📒 Files selected for processing (94)
  • CHANGES.txt
  • settings.gradle.kts
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-core/src/main/java/org/testng/TestNG.java
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-core/src/test/java/test/groups/issue2232/IssueTest.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/testng-core-build.gradle.kts
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderCliRunner.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-jcommander/src/main/resources/META-INF/services/org.testng.ITestNGCliRunner
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-jcommander/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • testng-jcommander/src/test/java/test/reports/EmailableReporterCommandLineTest.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-jcommander/src/test/resources/1332.xml
  • testng-jcommander/src/test/resources/methodselector-in-xml.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTest.xml
  • testng-jcommander/src/test/resources/test/methodselectors/sampleTestExclusions.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-jcommander/testng-jcommander-build.gradle.kts
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest1.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest2.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest3.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest4.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-test-kit/src/main/java/test/groups/issue2232/Issue2232Suites.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringLog.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/WiringSampleTest.java
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng-test-kit/src/main/java/test/reports/ReporterSample.java
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ExecutorServiceFactory.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-test-kit/src/main/java/test/thread/issue3066/TestClassSample.java
  • testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt
  • testng-test-kit/src/main/resources/jarfileutils/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng/testng-build.gradle.kts
💤 Files with no reviewable changes (7)
  • testng-core/src/test/java/test/TestHelper.java
  • testng-core/src/test/java/test/listeners/factory/TestNGFactoryTest.java
  • testng-core/src/test/java/test/thread/CustomExecutorServiceFactoryTest.java
  • testng-core/src/test/resources/testng.xml
  • testng-core/src/test/java/test/reports/EmailableReporterTest.java
  • testng-core/src/test/java/test/commandline/CommandLineOverridesXml.java
  • testng-core/src/test/java/test/listeners/ListenersTest.java
🚧 Files skipped from review as they are similar to previous changes (74)
  • testng-jcommander/src/test/resources/methodselector-in-xml.xml
  • testng-jcommander/src/test/resources/testnames/main-suite.xml
  • testng-cli/src/main/java/org/testng/cli/CliParseException.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTest.java
  • testng-cli/testng-cli-build.gradle.kts
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestCase.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/SecondWiringListener.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleB.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/ReverseNameListenerComparator.java
  • testng-jcommander/src/test/java/test/methodselectors/MethodSelectorInSuiteCommandLineTest.java
  • testng-core/src/main/java/org/testng/ITestNGCliRunner.java
  • testng-cli/src/main/java/org/testng/cli/AbstractCliRunner.java
  • testng-cli/src/test/java/org/testng/cli/CliOptionNamesTest.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest5.java
  • testng-test-kit/src/main/java/test/methodselectors/SampleTest.java
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest4.java
  • testng-jcommander/src/test/resources/testng-methodselectors.xml
  • testng-jcommander/src/test/java/test/listeners/factory/TestNGFactoryCommandLineTest.java
  • testng-test-kit/src/main/java/test/thread/issue3066/TestClassSample.java
  • testng-test-kit/src/main/resources/jarfileutils/testng-tests.xml
  • testng-jcommander/src/test/java/test/configurationfailurepolicy/FailurePolicyCommandLineTest.java
  • testng-test-kit/src/main/java/test/methodselectors/Test2MethodSelector.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/Converter.java
  • testng-test-kit/src/main/java/test/commandline/issue341/TestSampleA.java
  • testng-test-kit/src/main/resources/jarfileutils/childofchild/childofchild.xml
  • testng-test-kit/testng-test-kit-build.gradle.kts
  • testng-test-kit/src/main/java/org/testng/jarfileutils/org/testng/SampleTest3.java
  • testng-jcommander/testng-jcommander-build.gradle.kts
  • testng-jcommander/src/test/resources/1332.xml
  • testng-core/src/test/java/test/github1417/YetAnotherTestClassSample.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ExecutorServiceFactory.java
  • testng-test-kit/src/main/java/test/methodselectors/NoTestSelector.java
  • testng-test-kit/src/main/java/test/methodselectors/AllTestsMethodSelector.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest.java
  • testng-test-kit/src/main/resources/jarfileutils/child/child.xml
  • testng-test-kit/src/main/java/test/testnames/TestNamesFeature.java
  • testng-test-kit/src/main/java/test/listeners/cliwiring/FirstWiringListener.java
  • testng-jcommander/src/test/java/test/groups/issue2232/IssueCommandLineTest.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerValidateTest.java
  • testng-test-kit/src/main/kotlin/test/SimpleBaseTest.kt
  • testng-test-kit/src/main/java/test/configurationfailurepolicy/ClassWithFailedBeforeMethodAndMultipleTests.java
  • testng-jcommander/src/test/java/test/methodselectors/NoTest1MethodSelector.java
  • settings.gradle.kts
  • testng-test-kit/src/main/java/org/testng/testhelper/OutputDirectoryPatch.java
  • testng-core/testng-core-build.gradle.kts
  • testng-test-kit/src/main/java/test/InvokedMethodNameListener.java
  • testng-core/src/main/java/org/testng/CliRunners.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderCliRunner.java
  • testng-core/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java
  • testng-jcommander/src/test/java/test/thread/CustomExecutorServiceFactoryCommandLineTest.java
  • testng-core/src/test/java/test/methodselectors/MethodSelectorInSuiteTest.java
  • testng-jcommander/src/test/java/test/listeners/ListenerWiringCommandLineTest.java
  • testng-test-kit/src/main/java/test/thread/issue3066/Issue3066ThreadPoolExecutor.java
  • testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java
  • testng-test-kit/src/main/java/test/TestHelper.java
  • testng-jcommander/src/test/resources/testng-configfailure.xml
  • testng-test-kit/src/main/java/test/listeners/factory/SampleTestFactory.java
  • testng-jcommander/src/test/java/org/testng/cli/jcommander/JCommanderCliRunnerTest.java
  • testng-core/src/test/java/test/configurationfailurepolicy/FailurePolicyTest.java
  • CHANGES.txt
  • testng-test-kit/src/main/java/test/listeners/factory/ExampleListener.java
  • testng-core/src/test/java/test/groups/issue2232/IssueTest.java
  • testng-cli/src/main/java/org/testng/cli/CliOptions.java
  • testng-test-kit/src/main/java/test/commandline/issue341/LocalLogAggregator.java
  • testng-cli/src/test/java/org/testng/cli/CliConfigurerParityTest.java
  • testng-test-kit/src/main/java/test/groups/issue2232/samples/SampleTest2.java
  • testng-cli/src/main/java/org/testng/cli/CliConfigurer.java
  • testng-core/src/main/java/org/testng/CommandLineArgs.java
  • testng-jcommander/src/test/java/test/methodselectors/CommandLineTest.java
  • testng-jcommander/src/main/java/org/testng/cli/jcommander/JCommanderOptions.java
  • testng-core/src/test/java/test/junitreports/JUnitReportsTest.java
  • testng-test-osgi/src/test/java/org/testng/test/osgi/PlainOsgiTest.java
  • testng-test-kit/src/main/resources/jarfileutils/child/childofchild/childofchild.xml
  • testng-core/src/main/java/org/testng/TestNG.java
🛑 Comments failed to post (1)
testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java (1)

27-36: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
ast-grep outline testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java --view expanded
rg -n -C 6 '\bJarCreator\s*\.\s*generateJar\s*\(' . -g '*.java' -g '*.kt'

Repository: testng-team/testng

Length of output: 4801


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "## test files"
wc -l testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java \
      testng-core/src/test/java/org/testng/JarFileUtilsTest.java \
      testng-core/src/test/java/test/cli/CliTest.java

echo
echo "## CommandLineOverridesXmlCommandLineTest lifecycle terms"
rg -n "delete|deleteOnExit|AfterClass|AfterTest|BeforeClass|jarfile|generateJar|testjar" testng-jcommander/src/test/java/test/commandline/CommandLineOverridesXmlCommandLineTest.java || true

echo
echo "## JarFileUtilsTest lifecycle terms"
rg -n "delete|deleteOnExit|AfterClass|AfterTest|BeforeClass|jar|generateJar" testng-core/src/test/java/org/testng/JarFileUtilsTest.java || true

echo
echo "## CliTest lifecycle terms"
rg -n "delete|deleteOnExit|AfterClass|AfterTest|AfterMethods|BeforeClass|AfterClass|jarfile|jar|generateJar|setTestJar" testng-core/src/test/java/test/cli/CliTest.java || true

Repository: testng-team/testng

Length of output: 2290


Delete generated test JARs after consumption.

generateJar returns temp files to callers, but the test call sites do not establish cleanup ownership or schedule deletion. Add cleanup at the call sites, or make generateJar schedule deletion for returned files.

🧰 Tools
🪛 ast-grep (0.45.0)

[warning] 29-29: Invalid permissions for temporary file
Context: File jarFile = File.createTempFile(prefix, ".jar");
Note: [CWE-378] Creation of Temporary File With Insecure Permissions. Security best practice.

(tempfile-permissions)


[warning] 29-29: Temporary file not deleted
Context: File.createTempFile(prefix, ".jar")
Note: [CWE-377] Insecure Temporary File. Security best practice.

(tempfile-delete)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@testng-test-kit/src/main/java/org/testng/testhelper/JarCreator.java` around
lines 27 - 36, Ensure temporary JAR files returned by JarCreator.generateJar are
deleted after test consumption. Prefer adding explicit cleanup at each caller
with reliable finally/teardown handling, or update generateJar to schedule
deletion for every returned File while preserving the existing generation
behavior.

@juherr juherr mentioned this pull request Jul 29, 2026
2 tasks
@juherr
juherr force-pushed the juherr/extract-jcommander-module branch from 601a311 to 6274834 Compare July 29, 2026 14:28
@juherr

juherr commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

@krmahadevan ready for your review

testng-core depended on org.jcommander:jcommander in `api` scope, so every
consumer got the parsing library whether or not it drove TestNG from a command
line. The coupling ran deep: CommandLineArgs was a @Parameter-annotated POJO,
TestNG held a static JCommander field, and TestNG.configure(CommandLineArgs)
mixed applying configuration with CLI-only string-to-object conversion.

The front end now lives in two new modules:

  testng-cli         CliOptions, CliConfigurer, AbstractCliRunner - no parser
  testng-jcommander  the JCommander implementation, plus Converter

testng-core keeps a minimal ServiceLoader SPI, ITestNGCliRunner, so that
"java -cp testng.jar org.testng.TestNG suite.xml" is unchanged: both modules are
bundled into the merged jar. Implementations never terminate the JVM - an
unusable command line comes back as a TestNGException, and only TestNG.main
turns it into a message, a usage banner and exit code 1.

TestNG.setThreadCount now raises a TestNGException below 1 instead of printing
the usage banner and calling System.exit(1), so that no library setter can kill
an embedder's JVM. The command line output is unchanged: TestNG.main turns that
exception into the same message and the same exit code.

Backward compatibility for 7.x is kept through frozen @deprecated shims:
CommandLineArgs (annotations stripped), TestNG.configure(CommandLineArgs),
TestNG.validateCommandLineParameters, TestNG.main and TestNG.privateMain.
TestNG.configure(Map), the method Maven Surefire calls, still builds a
CommandLineArgs, so removing that class depends on Surefire moving first.
CliConfigurerParityTest compares the state both paths produce, field by field,
because nothing else keeps the frozen copy in sync with the live one.

testng-test-kit becomes the shared test-fixture library, so the 22 tests whose
subject is the command line could move to testng-jcommander. The 243 classes
extending SimpleBaseTest are unaffected.

The two modules are deliberately not published on their own, and are kept out of
the BOM for the same reason: that would ship org.testng.cli.* and its service
registration in two artifacts at once. It is a packaging change for the next
major, tracked in testng-team#3301.

Supersedes testng-team#2612.
@juherr
juherr force-pushed the juherr/extract-jcommander-module branch from 6274834 to 56cde42 Compare July 30, 2026 08:09
@juherr

juherr commented Jul 30, 2026

Copy link
Copy Markdown
Member Author

@krmahadevan please review

@krmahadevan

Copy link
Copy Markdown
Member

@krmahadevan please review

You are on fire @juherr 🔥

@juherr

juherr commented Jul 30, 2026

Copy link
Copy Markdown
Member Author

🧑‍🚒

@krmahadevan

Copy link
Copy Markdown
Member

@juherr - Please give me sometime to go through this. It is a large PR. Hope that is fine. I will get back in a day or two.

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