Skip to content

Commit

Permalink
Provide only compatible JUnit 5 test engines in RemotePluginTestRunner
Browse files Browse the repository at this point in the history
Currently, it is possible that the RemotePluginTestRunner loads bundles
with "incompatible" test engines. This means, the engine is
version-incompatible with the TestEngine interface. In such a case, the
execution will fail, because the ServiceLoader tries to load this engine
as a provider for the TestEngine service but fails because it cannot
assign the engine to the TestEngine interface.
One such case is the execution of tests with Tycho, which can use a
different JUnit version than the one used in the JDT test bundles.

This change ensures that bundles providing incompatible engines are not
added to the class loader used for executing the test to ensure that
service loading for the engines does not fail.
  • Loading branch information
HeikoKlare authored and HannesWell committed Jan 30, 2024
1 parent f26df87 commit 69eb1b7
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
1 change: 1 addition & 0 deletions ui/org.eclipse.pde.junit.runtime/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ Export-Package: org.eclipse.pde.internal.junit.runtime;x-internal:=true
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.ui.testing;resolution:=optional
DynamicImport-Package: org.junit.platform.engine
Automatic-Module-Name: org.eclipse.pde.junit.runtime
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@
*******************************************************************************/
package org.eclipse.pde.internal.junit.runtime;

import static java.util.stream.Collectors.toCollection;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.List;
Expand Down Expand Up @@ -99,19 +102,34 @@ private static ClassLoader createJUnit5PluginClassLoader(String testPluginName)

private static List<Bundle> findTestEngineBundles() {
BundleContext bundleContext = FrameworkUtil.getBundle(RemotePluginTestRunner.class).getBundleContext();
List<Bundle> engineBundles = new ArrayList<>();
for (Bundle bundle : bundleContext.getBundles()) {
try {
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
Collection<String> listResources = bundleWiring.listResources("META-INF/services", "org.junit.platform.engine.TestEngine", BundleWiring.LISTRESOURCES_LOCAL); //$NON-NLS-1$//$NON-NLS-2$
if (!listResources.isEmpty()) {
engineBundles.add(bundle);
}
} catch (Exception e) {
// check the next bundle
return Arrays.stream(bundleContext.getBundles()).filter(RemotePluginTestRunner::providesCompatibleTestEngine).collect(toCollection(ArrayList::new));
}

/**
* Checks whether the bundle provides test engines.
* Ensures that test engines that can be loaded from the bundle
* are compatible with the TestEngine version in current scope.
* Otherwise, the JUnit platform's call to the ServiceLoader for
* retrieving available engines will fail.
* Incompatibilities can happen, e.g., in Tycho builds, where
* the org.eclipse.tycho.surefire.osgibooter bundle is found
* that may provide a different JUnit platform version than the
* one available via the Eclipse target platform.
*/
private static boolean providesCompatibleTestEngine(Bundle bundle) {
try {
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
String testEngineClass = "org.junit.platform.engine.TestEngine"; //$NON-NLS-1$
Collection<String> engineProviders = bundleWiring.listResources("META-INF/services", testEngineClass, BundleWiring.LISTRESOURCES_LOCAL); //$NON-NLS-1$
if (!engineProviders.isEmpty()) {
Class<?> thisTestEngine = Class.forName(testEngineClass);
Class<?> bundleTestEngine = bundle.loadClass(testEngineClass);
return thisTestEngine == bundleTestEngine;
}
} catch (Exception e) {
// skip this bundle
}
return engineBundles;
return false;
}

/**
Expand Down

0 comments on commit 69eb1b7

Please sign in to comment.