Skip to content

Support JUnit 6 plug-in test launches#2109

Merged
iloveeclipse merged 2 commits intoeclipse-pde:masterfrom
trancexpress:gh2108
Nov 11, 2025
Merged

Support JUnit 6 plug-in test launches#2109
iloveeclipse merged 2 commits intoeclipse-pde:masterfrom
trancexpress:gh2108

Conversation

@trancexpress
Copy link
Contributor

Fixes: #2108

@trancexpress
Copy link
Contributor Author

trancexpress commented Nov 6, 2025

First error I run into:

package test;

import org.junit.jupiter.api.Test;

public class TestTest {

	@Test
	public void test() {
		System.out.println("test");
	}
}
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestPlugin3
Bundle-SymbolicName: TestPlugin3
Bundle-Version: 1.0.0.qualifier
Require-Bundle: org.eclipse.swt,
 org.eclipse.jface,
 org.junit,
 junit-jupiter-api
Automatic-Module-Name: TestPlugin3
Bundle-RequiredExecutionEnvironment: JavaSE-21
!ENTRY org.eclipse.ui 4 0 2025-11-06 16:09:36.024
!MESSAGE Unhandled event loop exception
!STACK 0
java.lang.NoClassDefFoundError: org/junit/platform/engine/support/hierarchical/HierarchicalTestEngine
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at org.eclipse.osgi.internal.framework.ContextFinder.loadClass(ContextFinder.java:150)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:536)
	at java.base/java.lang.Class.forName(Class.java:515)
	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1217)
	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1228)
	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
	at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
	at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
	at java.base/java.lang.Iterable.forEach(Iterable.java:74)
	at org.junit.platform.launcher.core.LauncherFactory.collectTestEngines(LauncherFactory.java:163)
	at org.junit.platform.launcher.core.LauncherFactory.createDefaultLauncher(LauncherFactory.java:140)
	at org.junit.platform.launcher.core.LauncherFactory.lambda$create$0(LauncherFactory.java:133)
	at org.junit.platform.launcher.core.DefaultLauncherSession.lambda$new$0(DefaultLauncherSession.java:67)
	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
	at org.junit.platform.launcher.core.DefaultLauncherSession.<init>(DefaultLauncherSession.java:67)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.createSession(SessionPerRequestLauncher.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.discover(SessionPerRequestLauncher.java:59)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestReference.<init>(JUnit6TestReference.java:47)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestLoader.createUnfilteredTest(JUnit6TestLoader.java:88)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestLoader.createTest(JUnit6TestLoader.java:69)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestLoader.loadTests(JUnit6TestLoader.java:56)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:504)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:748)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:443)
	at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:110)
	at org.eclipse.pde.internal.junit.runtime.PlatformUITestHarness.lambda$0(PlatformUITestHarness.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Testable.lambda$1(E4Testable.java:127)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:5083)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4548)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1147)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1038)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:677)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185)
	at org.eclipse.pde.internal.junit.runtime.NonUIThreadTestApplication.start(NonUIThreadTestApplication.java:58)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1387)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	... 63 more
diff --git a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/JUnitLaunchConfigurationDelegate.java b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/JUnitLaunchConfigurationDelegate.java
index dfd2610cdf..d561adbd4b 100644
--- a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/JUnitLaunchConfigurationDelegate.java
+++ b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/JUnitLaunchConfigurationDelegate.java
@@ -518,8 +518,12 @@ public class JUnitLaunchConfigurationDelegate extends org.eclipse.jdt.junit.laun
                fAllBundles = fModels.keySet().stream().collect(Collectors.groupingBy(m -> m.getPluginBase().getId(), LinkedHashMap::new, Collectors.toCollection(ArrayList::new)));
                launchMode = launch.getLaunchMode();
 
+               System.out.println("Before");
+               fModels.keySet().stream().map(IPluginModelBase::getBundleDescription).filter(d -> d.getSymbolicName().startsWith("junit")).forEach(System.out::println);
                // implicitly add the plug-ins required for JUnit testing if necessary
                JUnitLaunchRequirements.addRequiredJunitRuntimePlugins(configuration, fAllBundles, fModels);
+               System.out.println("After");
+               fModels.keySet().stream().map(IPluginModelBase::getBundleDescription).filter(d -> d.getSymbolicName().startsWith("junit")).forEach(System.out::println);
 
                String attribute = launch.getAttribute(PDE_JUNIT_SHOW_COMMAND);
                boolean isShowCommand = false;
Before
junit-platform-suite-api_6.0.1
junit-platform-launcher_6.0.1
junit-platform-engine_6.0.1
junit-jupiter-engine_6.0.1
junit-jupiter-api_6.0.1
junit-platform-commons_6.0.1
After
junit-platform-suite-api_6.0.1
junit-platform-launcher_6.0.1
junit-platform-engine_6.0.1
junit-jupiter-engine_6.0.1
junit-jupiter-api_6.0.1
junit-platform-commons_6.0.1
junit-platform-suite-engine_6.0.1
junit-jupiter-params_6.0.1

The available bundles seem fine... Maybe something to do with the removal of MultiBundleClassLoader?

@github-actions
Copy link

github-actions bot commented Nov 6, 2025

Test Results

   771 files  ± 0     771 suites  ±0   58m 30s ⏱️ + 6m 51s
 3 648 tests +11   3 594 ✅ +11   54 💤 ±0  0 ❌ ±0 
10 878 runs  +33  10 715 ✅ +33  163 💤 ±0  0 ❌ ±0 

Results for commit 3faacd2. ± Comparison against base commit b00ef59.

This pull request removes 3 and adds 14 tests. Note that renamed tests count towards both.
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnit5SuiteExecutionTest ‑ executePackage
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnit5SuiteExecutionTest ‑ executeProject
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnit5SuiteExecutionTest ‑ executeSuite
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executeMethod[JUnit6 Fragment]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executeMethod[JUnit6]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executePackage[JUnit6 Fragment]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executePackage[JUnit6]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executeProject[JUnit6 Fragment]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executeProject[JUnit6]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executeType[JUnit6 Fragment]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest ‑ executeType[JUnit6]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitSuiteExecutionTest ‑ executePackage[JUnit5]
JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitSuiteExecutionTest ‑ executePackage[JUnit6]
…

♻️ This comment has been updated with latest results.

@trancexpress
Copy link
Contributor Author

Next error is:

!ENTRY org.eclipse.ui 4 0 2025-11-06 18:03:17.711
!MESSAGE Unhandled event loop exception
!STACK 0
org.junit.platform.commons.PreconditionViolationException: Cannot create Launcher without at least one TestEngine; consider adding an engine implementation JAR to the classpath
	at org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:339)
	at org.junit.platform.launcher.core.DefaultLauncher.<init>(DefaultLauncher.java:61)
	at org.junit.platform.launcher.core.LauncherFactory.createDefaultLauncher(LauncherFactory.java:142)
	at org.junit.platform.launcher.core.LauncherFactory.lambda$create$0(LauncherFactory.java:133)
	at org.junit.platform.launcher.core.DefaultLauncherSession.lambda$new$0(DefaultLauncherSession.java:67)
	at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
	at org.junit.platform.launcher.core.DefaultLauncherSession.<init>(DefaultLauncherSession.java:67)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.createSession(SessionPerRequestLauncher.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.discover(SessionPerRequestLauncher.java:59)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestReference.<init>(JUnit6TestReference.java:47)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestLoader.createUnfilteredTest(JUnit6TestLoader.java:88)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestLoader.createTest(JUnit6TestLoader.java:69)
	at org.eclipse.jdt.internal.junit6.runner.JUnit6TestLoader.loadTests(JUnit6TestLoader.java:56)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:504)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:748)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:443)
	at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:111)
	at org.eclipse.pde.internal.junit.runtime.PlatformUITestHarness.lambda$0(PlatformUITestHarness.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Testable.lambda$1(E4Testable.java:127)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:5083)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4548)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1147)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1038)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:677)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185)
	at org.eclipse.pde.internal.junit.runtime.NonUIThreadTestApplication.start(NonUIThreadTestApplication.java:58)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1387)

@laeubi
Copy link
Contributor

laeubi commented Nov 6, 2025

@trancexpress we have added some import restirctions on some other parts of PDE/JDT that are used here.

Beside that, I would like to first see a successful run in pure JDT (is this already possible?) and maybe one should delay PDE support to next release... it really do not bring any value right now.

@trancexpress
Copy link
Contributor Author

@trancexpress we have added some import restirctions on some other parts of PDE/JDT that are used here.

I'll check what needs to change, no problem.

Beside that, I would like to first see a successful run in pure JDT (is this already possible?)

Only with the 2 PRs linked in #2108:

The SDK build is broken, so we cannot merge either. But once we merge them, yes, plain JUnit tests run with JUnit 6.

maybe one should delay PDE support to next release... it really do not bring any value right now.

We would have to add some sort of validation on the launch, and more. Right now the launch defaults to JUnit 6, as soon as eclipse-jdt/eclipse.jdt.ui#2560 is used.

For plug-in tests we'll need to filter out the JUnit 6 option, if we are delaying PDE support by a release. How much time do we have @iloveeclipse ?

@iloveeclipse
Copy link
Member

How much time do we have

Ideally "bigger" changes should be done before M3 planned for next thursday/friday.
Smaller improvements I guess can be done for RC1 too (21 November).

@trancexpress trancexpress marked this pull request as ready for review November 6, 2025 18:34
@trancexpress
Copy link
Contributor Author

With the latest changes here, as well as eclipse-jdt/eclipse.jdt#145 and
eclipse-jdt/eclipse.jdt.ui#2560, I can run:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestPlugin3Junit5
Bundle-SymbolicName: TestPlugin3Junit5
Bundle-Version: 1.0.0.qualifier
Require-Bundle: org.eclipse.swt,
 org.eclipse.jface,
 org.junit,
 junit-jupiter-api;bundle-version="[5,6)",
 junit-platform-suite-api;bundle-version="[1,2)"
Automatic-Module-Name: TestPlugin3Junit5
Bundle-RequiredExecutionEnvironment: JavaSE-21
package test;

import org.junit.jupiter.api.Test;

public class TestTestJUnit5 {

	@Test
	public void test() {
		System.out.println("test");
	}
}
package test;

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({
	TestTestJUnit5.class,
})
public class TSJUnit5 {

}
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestPlugin3
Bundle-SymbolicName: TestPlugin3Junit6
Bundle-Version: 1.0.0.qualifier
Require-Bundle: org.eclipse.swt,
 org.eclipse.jface,
 org.junit,
 junit-jupiter-api,
 junit-platform-suite-api
Automatic-Module-Name: TestPlugin3
Bundle-RequiredExecutionEnvironment: JavaSE-21
package test;

import org.junit.jupiter.api.Test;

public class TestTestJUnit6 {

	@Test
	public void test() {
		System.out.println("test");
	}
}
package test;

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

@Suite
@SelectClasses({
	TestTestJUnit6.class,
})
public class TSJUnit6 {

}

@iloveeclipse
Copy link
Member

With the latest changes here, as well as eclipse-jdt/eclipse.jdt#145 and
eclipse-jdt/eclipse.jdt.ui#2560, I can run:

With JUnit 5, correct? Because it is what manifest says.

@trancexpress
Copy link
Contributor Author

@laeubi it would be great if you can take a look. If you think we should delay JUnit 6 support until the next release, so that we get more manual testing, I think that would be fine as well. But we'll need to disable the plug-in test launch JUnit 6 choice. Unless we delay the entire JUnit 6 choice in launches.

@trancexpress
Copy link
Contributor Author

With JUnit 5, correct? Because it is what manifest says.

One set of manifest and sources with JUnit 5, the other set of manifest and sources with JUnit 6.

@trancexpress
Copy link
Contributor Author

trancexpress commented Nov 8, 2025

Seems like we don't have a build with the latest JUnit 6 changes in JDT UI. We'll have to wait more here.

I also see problems with #2113, maybe it will be best to include the new tests here. Similar to the JDT UI PR/tests.

@HannesWell
Copy link
Member

Seems like we don't have a build with the latest JUnit 6 changes in JDT UI. We'll have to wait more here.

Yes, tonight's I-build failed but I have already prepared a fix and I'm currently in the process of verifying it.
I'm also working on other unrelated changes that I'd like to have in soon, so I'll propably not kick off one I-build immediately.
Would you continue to work on this today or would tomorrows I-build be the one you use anyways?

I also see problems with #2113, maybe it will be best to include the new tests here. Similar to the JDT UI PR/tests.

I think that makes sense to have the new functionality tested immediately. This also makes it simpler to review and test this change.

@trancexpress
Copy link
Contributor Author

trancexpress commented Nov 8, 2025

Looks like JUnit 4 vintage test plug-in launches are broken with changes here.

package test;
import org.junit.Test;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
public class Test2 {

	@Test
	public void test() {

	}

}
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestJUnit4Vintage
Bundle-SymbolicName: TestJUnit4Vintage
Bundle-Version: 1.0.0.qualifier
Require-Bundle: org.junit;bundle-version="4.12.0",
 junit-platform-runner;bundle-version="[1.4.0,2.0.0)",
 junit-jupiter-api;bundle-version="[5.4.0,6.0.0)"
Automatic-Module-Name: TestJUnit4Vintage
Bundle-RequiredExecutionEnvironment: JavaSE-17

Among other problems I see in tests.

It might be good to look into disabling the JUnit 6 choice for plug-in test launches, in case we don't manage to fix everything that doesn't work until the end of the next week.

@trancexpress trancexpress force-pushed the gh2108 branch 3 times, most recently from 8a9777c to 92f906d Compare November 9, 2025 14:19
@trancexpress
Copy link
Contributor Author

trancexpress commented Nov 9, 2025

There are still some fails, but I have no idea what the problem is:

JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnit5SuiteExecutionTest.executePackage

test completed with Undefined

Stack trace

java.lang.AssertionError: test completed with Undefined
	at org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest.assertSuccessful(JUnitExecutionTest.java:145)
	at org.eclipse.pde.junit.runtime.tests.JUnit5SuiteExecutionTest.executePackage(JUnit5SuiteExecutionTest.java:68)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.pde.ui.tests.runtime.TestUtils$1.evaluate(TestUtils.java:267)

Standard error

[test] WARNING: Using incubator modules: jdk.incubator.vector

Standard out

test process terminated with exit value 0
command line: /opt/tools/java/openjdk/jdk-21/21.0.2/bin/java -Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true -Declipse.pde.launch=true --add-modules=ALL-SYSTEM -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -classpath /home/jenkins/agent/workspace/eclipse.pde_PR-2109/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.launcher/1.7.100.v20251014-1222/org.eclipse.equinox.launcher-1.7.100.v20251014-1222.jar::/home/jenkins/agent/workspace/eclipse.pde_PR-2109/ui/org.eclipse.pde.junit.runtime.tests/target/work/configuration/org.eclipse.osgi/130/0/.cp:/home/jenkins/agent/workspace/eclipse.pde_PR-2109/ui/org.eclipse.pde.junit.runtime.tests/target/work/configuration/org.eclipse.osgi/173/0/.cp:/home/jenkins/agent/workspace/eclipse.pde_PR-2109/ui/org.eclipse.pde.junit.runtime.tests/target/work/configuration/org.eclipse.osgi/402/0/.cp -XX:+ShowCodeDetailsInExceptionMessages org.eclipse.equinox.launcher.Main -os linux -ws gtk -arch x86_64 -nl en_US -consoleLog -version 3 -port 32843 -testLoaderClass org.eclipse.jdt.internal.junit6.runner.JUnit6TestLoader -loaderpluginname org.eclipse.jdt.junit6.runtime -packageNameFile /tmp/packageNames2137937247717463182.txt -application org.eclipse.pde.junit.runtime.coretestapplication -data /home/jenkins/agent/workspace/eclipse.pde_PR-2109/ui/org.eclipse.pde.junit.runtime.tests/target/work/data/verification.tests.junit5.suite_verification.tests.junit5.suite/workspace -configuration file:///home/jenkins/agent/workspace/eclipse.pde_PR-2109/ui/org.eclipse.pde.junit.runtime.tests/target/work/data/verification.tests.junit5.suite_verification.tests.junit5.suite/configuration/ -dev file:///home/jenkins/agent/workspace/eclipse.pde_PR-2109/ui/org.eclipse.pde.junit.runtime.tests/target/work/data/verification.tests.junit5.suite_verification.tests.junit5.suite/configuration/dev.properties -os linux -ws gtk -arch x86_64 -nl en_US -consoleLog -testpluginname verification.tests.junit5.suite
log file: 

no log file for: verification.tests.junit5.suite

The TestRoot has only this:

TestSuite: verification.tests.junit6.fragment : Not Started - Undefined (0)

I find no exception stack traces anywhere. I also can't find the log files from the test workspace... In case there is some logged errors.

Even the workspace passed with -data doesn't have a log file, or at least I don't find it:

➜  ~ ps -ef | grep 116529
sandreev  116529  104106  2 20:22 pts/1    00:01:22 /usr/lib/jvm/java-21-openjdk/bin/java -Dosgi.noShutdown=false -Dosgi.os=linux -Dosgi.ws=gtk -Dosgi.arch=x86_64 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8008 -Dosgi.clean=true -ea -jar /tmp/test/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.launcher/1.7.100.v20251014-1222/org.eclipse.equinox.launcher-1.7.100.v20251014-1222.jar -data /data/git/eclipse/eclipse.pde/ui/org.eclipse.pde.junit.runtime.tests/target/work/data -install /data/git/eclipse/eclipse.pde/ui/org.eclipse.pde.junit.runtime.tests/target/work -configuration /data/git/eclipse/eclipse.pde/ui/org.eclipse.pde.junit.runtime.tests/target/work/configuration -application org.eclipse.tycho.surefire.osgibooter.uitest -testproperties /data/git/eclipse/eclipse.pde/ui/org.eclipse.pde.junit.runtime.tests/target/surefire.properties
sandreev  129837  122109  0 21:19 pts/3    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox --exclude-dir=.venv --exclude-dir=venv 116529
➜  ~ ls -la /data/git/eclipse/eclipse.pde/ui/org.eclipse.pde.junit.runtime.tests/target/work/data
total 28
drwxr-xr-x 7 sandreev sandreev 4096 Nov  9 20:26 .
drwxr-xr-x 6 sandreev sandreev 4096 Nov  9 20:26 ..
drwxr-xr-x 3 sandreev sandreev 4096 Nov  9 20:26 .metadata
drwxr-xr-x 3 sandreev sandreev 4096 Nov  9 20:26 verification.tests.junit6.fragment_verification.tests.junit6.fragment
drwxr-xr-x 3 sandreev sandreev 4096 Nov  9 20:26 verification.tests.junit6_Test1
drwxr-xr-x 3 sandreev sandreev 4096 Nov  9 20:26 verification.tests.junit6_Test1.test1
drwxr-xr-x 3 sandreev sandreev 4096 Nov  9 20:26 verification.tests.junit6_verification.tests.junit6
➜  ~ ls -la /data/git/eclipse/eclipse.pde/ui/org.eclipse.pde.junit.runtime.tests/target/work/data/.metadata 
total 20
drwxr-xr-x  3 sandreev sandreev 4096 Nov  9 20:26 .
drwxr-xr-x  7 sandreev sandreev 4096 Nov  9 20:26 ..
-rw-r--r--  1 sandreev sandreev    0 Nov  9 20:26 .lock
-rw-r--r--  1 sandreev sandreev  100 Nov  9 20:26 .lock_info
drwxr-xr-x 13 sandreev sandreev 4096 Nov  9 20:26 .plugins
-rw-r--r--  1 sandreev sandreev  100 Nov  9 20:26 version.ini

Copying the test projects and manually launching the test cases / suites / packages works fine...

@iloveeclipse
Copy link
Member

@trancexpress
Copy link
Contributor Author

@laeubi lets move the discussion from #2111 (comment) to here.

See the current state:

b78311f

Not copying the projects in the test resources (in test-bundles folder) will get difficult. If we want to do that, it will probably be easier to generate the projects on-the-fly, instead of having test resources for them.

If you insist on this, IMO lets start that rewrite as a separate ticket.

@iloveeclipse
Copy link
Member

https://download.eclipse.org/eclipse/downloads/drops4/I20251110-0850 is there.

@trancexpress trancexpress force-pushed the gh2108 branch 2 times, most recently from 656853c to 5589556 Compare November 10, 2025 15:46
@iloveeclipse
Copy link
Member

Looks like Jenkins can't fetch the commit from fork again:

Pull request #2109 updated
10:46:22 Connecting to https://api.github.com/ using 323154/****** (github-app-pde)
Connecting to https://api.github.com/ to check permissions of obtain list of trancexpress for eclipse-pde/eclipse.pde
Loading trusted files from base branch master at b00ef59bfa7ad78dca617bdf90846e73f2115650 rather than 55895561c15b85e3d2b8f1330b343251764f3ac5

Could be related to https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/issues/6858 but could be another issue...

@trancexpress
Copy link
Contributor Author

trancexpress commented Nov 10, 2025

The Windows job ran into this failure:

 Tests run: 6, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 18.06 s <<< FAILURE! -- in JUnitRuntimeTests org.eclipse.pde.junit.runtime.tests.JUnitSuiteExecutionTest
org.eclipse.pde.junit.runtime.tests.JUnitSuiteExecutionTest.executePackage[JUnit6] -- Time elapsed: 3.463 s <<< FAILURE!
java.lang.AssertionError: test completed with Error
	at org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest.assertSuccessful(JUnitExecutionTest.java:144)
	at org.eclipse.pde.junit.runtime.tests.JUnitSuiteExecutionTest.executePackage(JUnitSuiteExecutionTest.java:88)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.pde.ui.tests.runtime.TestUtils$1.evaluate(TestUtils.java:267)
	Suppressed: java.lang.AssertionError: FailureTrace of TestSuite: verification.tests.junit6.suite.TestSuite : Completed - Error (0):

org.junit.platform.suite.engine.NoTestsDiscoveredException: Suite [verification.tests.junit6.suite.TestSuite] did not discover any tests
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)


		at org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest.addFailureTraces(JUnitExecutionTest.java:154)
		at org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest.addFailureTraces(JUnitExecutionTest.java:159)
		at org.eclipse.pde.junit.runtime.tests.JUnitExecutionTest.assertSuccessful(JUnitExecutionTest.java:145)
		... 3 more

Here the same test fails but for JUnit 5 and for the Linux job:

#2116 (comment)

Will have to investigate this, I guess we open an issue for it.

@trancexpress
Copy link
Contributor Author

trancexpress commented Nov 10, 2025

Another instability, this time in the Mac tests:

 Error:  Failed to execute goal org.eclipse.tycho:tycho-surefire-plugin:5.0.1-SNAPSHOT:test (default-test) on project org.eclipse.pde.genericeditor.extension.tests: An unexpected error occurred while launching the test runtime (process returned error code 143). The process logfile /Users/runner/work/eclipse.pde/eclipse.pde/ui/org.eclipse.pde.genericeditor.extension.tests/target/work/data/.metadata/.log might contain further details. Command-line used to launch the sub-process was /Users/runner/hostedtoolcache/Java_Temurin-Hotspot_jdk/21.0.9-10.0/arm64/Contents/Home/bin/java -Dosgi.noShutdown=false -Dosgi.os=macosx -Dosgi.ws=cocoa -Dosgi.arch=aarch64 -XstartOnFirstThread --add-modules=ALL-SYSTEM -Dosgi.clean=true -ea -jar /Users/runner/.m2/repository/p2/osgi/bundle/org.eclipse.equinox.launcher/1.7.100.v20251014-1222/org.eclipse.equinox.launcher-1.7.100.v20251014-1222.jar -data /Users/runner/work/eclipse.pde/eclipse.pde/ui/org.eclipse.pde.genericeditor.extension.tests/target/work/data -install /Users/runner/work/eclipse.pde/eclipse.pde/ui/org.eclipse.pde.genericeditor.extension.tests/target/work -configuration /Users/runner/work/eclipse.pde/eclipse.pde/ui/org.eclipse.pde.genericeditor.extension.tests/target/work/configuration -application org.eclipse.tycho.surefire.osgibooter.uitest -testproperties /Users/runner/work/eclipse.pde/eclipse.pde/ui/org.eclipse.pde.genericeditor.extension.tests/target/surefire.properties in working directory /Users/runner/work/eclipse.pde/eclipse.pde/ui/org.eclipse.pde.genericeditor.extension.tests -> [Help 1]
 Running org.eclipse.pde.genericeditor.extension.tests.UpdateUnitVersionsCommandTests
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.479 s <<< FAILURE! -- in org.eclipse.pde.genericeditor.extension.tests.UpdateUnitVersionsCommandTests
org.eclipse.pde.genericeditor.extension.tests.UpdateUnitVersionsCommandTests.testUpdateRequired -- Time elapsed: 0.296 s
org.eclipse.pde.genericeditor.extension.tests.UpdateUnitVersionsCommandTests.testVersionSort -- Time elapsed: 0.182 s <<< FAILURE!
org.junit.ComparisonFailure: 
ID: org.eclipse.fake.7 has the incorrect version. updatedText=<target>
<locations>
<location>
<unit id="org.eclipse.fake.1" version="0.0.0"/>
<unit id="org.eclipse.fake.2" version="0.0.0"/>
<unit id="org.eclipse.fake.3" version="0.0.0"/>
<unit id="org.eclipse.fake.4" version="0.0.0"/>
<unit id="org.eclipse.fake.5" version="0.0.0"/>
<unit id="org.eclipse.fake.6" version="0.0.0"/>
<unit id="org.eclipse.fake.7" version="0.0.0"/>
<repository location="bundleentry://369.fwk403344013/testing-files/testing-sites/MultipleUnitsConfirmSorting/"/>
</location>
</locations>
</target> expected:<[1.0.0.v2]> but was:<[0.0.0]>
	at org.junit.Assert.assertEquals(Assert.java:117)
	at org.eclipse.pde.genericeditor.extension.tests.UpdateUnitVersionsCommandTests.confirmVersionUpdates(UpdateUnitVersionsCommandTests.java:93)
	at org.eclipse.pde.genericeditor.extension.tests.UpdateUnitVersionsCommandTests.testVersionSort(UpdateUnitVersionsCommandTests.java:55)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.junit.runners.Suite.runChild(Suite.java:128)
	at org.junit.runners.Suite.runChild(Suite.java:27)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.apache.maven.surefire.junitcore.JUnitCore.run(JUnitCore.java:49)
	at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.createRequestAndRun(JUnitCoreWrapper.java:120)
	at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.executeEager(JUnitCoreWrapper.java:95)
	at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:75)
	at org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:69)
	at org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:146)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:137)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:148)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:88)
	at org.eclipse.tycho.surefire.osgibooter.OsgiSurefireBooter.invokeSureFire(OsgiSurefireBooter.java:195)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.tycho.surefire.osgibooter.OsgiSurefireBooter.run(OsgiSurefireBooter.java:116)
	at org.eclipse.tycho.surefire.osgibooter.AbstractUITestApplication$1.run(AbstractUITestApplication.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Testable.lambda$1(E4Testable.java:127)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4382)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4005)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1147)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1038)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:677)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185)
	at org.eclipse.tycho.surefire.osgibooter.UITestApplication.runApplication(UITestApplication.java:34)
	at org.eclipse.tycho.surefire.osgibooter.AbstractUITestApplication.run(AbstractUITestApplication.java:129)
	at org.eclipse.tycho.surefire.osgibooter.UITestApplication.start(UITestApplication.java:44)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1415)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1387)

@iloveeclipse I suggest we merge this.

Copy link
Member

@iloveeclipse iloveeclipse left a comment

Choose a reason for hiding this comment

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

I only reviewed in browser, change sounds good, just small style issue.

private static final Bundle BUNDLE = FrameworkUtil.getBundle(Caller.class);
private static final Bundle loaderBundle;
private static final Bundle BUNDLE;
private static final Bundle loaderBundleJUnit5;
Copy link
Member

Choose a reason for hiding this comment

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

Two constants should be upper case

Copy link
Member

@HannesWell HannesWell left a comment

Choose a reason for hiding this comment

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

Thank you @trancexpress for this enhancement. Great work!
And I'm glad to see that we have JUnit-6 support for PDE as well (soon).

I have reviewed and tested this and as far as I can tell, it works well.
I have just pushed a small update to address a few minor style issues (besides other the one from Andrey), also to make the code a bit more strict.
This update also includes the missing consideration of the version range I mentioned before.

With that I think this is ready.
If you want to apply more changes, please make sure to fetch the latest state before.

Copy link
Member

@iloveeclipse iloveeclipse left a comment

Choose a reason for hiding this comment

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

LGTM.
I've also smoke tested various use cases, with/without launch config dialogs, with/without JUnit5/6 dependencies, so far no problems found.
Let's merge.

@iloveeclipse iloveeclipse merged commit a2b45e2 into eclipse-pde:master Nov 11, 2025
19 checks passed
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.

Support JUnit 6 plug-in test launches

4 participants

Comments