Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<feature
id="org.eclipse.pde.unittest.junit"
label="%featureName"
version="1.0.1200.qualifier"
version="1.0.1300.qualifier"
provider-name="%providerName"
license-feature="org.eclipse.license"
license-feature-version="0.0.0">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.internal.build.BundleHelper;
import org.osgi.framework.hooks.resolver.ResolverHook;

public class BundleValidationOperation implements IWorkspaceRunnable {

private static StateObjectFactory FACTORY;

private final Set<IPluginModelBase> fModels;
private final Dictionary<String, String>[] fProperties;
private final ResolverHook fResolverHook;
private State fState;

@SuppressWarnings("unchecked")
Expand All @@ -46,8 +48,13 @@ public BundleValidationOperation(Set<IPluginModelBase> models) {
}

public BundleValidationOperation(Set<IPluginModelBase> models, Dictionary<String, String>[] properties) {
this(models, properties, null);
}

public BundleValidationOperation(Set<IPluginModelBase> models, Dictionary<String, String>[] properties, ResolverHook resolverHook) {
fModels = models;
fProperties = properties;
fResolverHook = resolverHook;
}

@Override
Expand All @@ -57,6 +64,9 @@ public void run(IProgressMonitor monitor) throws CoreException {
}
SubMonitor subMonitor = SubMonitor.convert(monitor, fModels.size() + 1);
fState = FACTORY.createState(true);
if (fResolverHook != null) {
fState.setResolverHookFactory(c -> fResolverHook);
}
long id = 1;
for (IPluginModelBase fModel : fModels) {
BundleDescription bundle = fModel.getBundleDescription();
Expand Down
2 changes: 1 addition & 1 deletion ui/org.eclipse.pde.launching/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %name
Bundle-SymbolicName: org.eclipse.pde.launching;singleton:=true
Bundle-Version: 3.13.600.qualifier
Bundle-Version: 3.13.700.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-17
Bundle-Vendor: %provider-name
Require-Bundle: org.eclipse.jdt.junit.core;bundle-version="[3.6.0,4.0.0)",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package org.eclipse.pde.internal.launching;

import java.util.Arrays;
import java.util.Collection;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.internal.core.BundleValidationOperation;
import org.eclipse.pde.internal.launching.launcher.EclipsePluginValidationOperation;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
import org.osgi.framework.VersionRange;
import org.osgi.framework.hooks.resolver.ResolverHook;
import org.osgi.framework.wiring.BundleCapability;
import org.osgi.framework.wiring.BundleRequirement;
import org.osgi.framework.wiring.BundleRevision;

public final class JUnitEclipsePluginValidationOperation extends EclipsePluginValidationOperation implements ResolverHook {

private static final VersionRange JUNIT5_VERSION_RANGE = new VersionRange("[1.0.0,6.0.0)"); //$NON-NLS-1$

private static final String JUNIT_BUNDLE_PREFIX = "junit"; //$NON-NLS-1$

private final Map<BundleDescription, IStatus[]> errors;
private final VersionRange junitVersionRange;
private final int junitVersion;

@SuppressWarnings("restriction")
public JUnitEclipsePluginValidationOperation(ILaunchConfiguration configuration, Set<IPluginModelBase> models, String launchMode) {
super(configuration, models, launchMode);
errors = new HashMap<>(2);
org.eclipse.jdt.internal.junit.launcher.ITestKind testKind = org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfigurationConstants.getTestRunnerKind(configuration);
switch (testKind.getId()) {
case org.eclipse.jdt.internal.junit.launcher.TestKindRegistry.JUNIT5_TEST_KIND_ID -> {
junitVersionRange = JUNIT5_VERSION_RANGE;
junitVersion = 5;
}
default -> {
junitVersionRange = null;
junitVersion = -1;
}
}
}

protected BundleValidationOperation createOperation(Dictionary<String, String>[] properties) {
ResolverHook hook = junitVersionRange != null ? this : null;
BundleValidationOperation op = new BundleValidationOperation(fModels, properties, hook);
return op;
}

@Override
public void filterMatches(BundleRequirement requirement, Collection<BundleCapability> candidates) {
if (!isOptional(requirement)) {
BundleRevision requirementRevision = requirement.getRevision();
String requirementName = requirementRevision.getSymbolicName();
if (!requirementName.startsWith(JUNIT_BUNDLE_PREFIX)) {
Iterator<BundleCapability> iterator = candidates.iterator();
while (iterator.hasNext()) {
BundleCapability candidate = iterator.next();
BundleRevision candidateRevision = candidate.getRevision();
String name = candidateRevision.getSymbolicName();
Version version = candidateRevision.getVersion();
if (!junitVersionRange.includes(version) && name.startsWith(JUNIT_BUNDLE_PREFIX)) {
Version requirementVersion = requirementRevision.getVersion();
BundleDescription bundle = getState().getBundle(requirementName, requirementVersion);
if (bundle != null) {
String error = NLS.bind(PDEMessages.JUnitLaunchConfiguration_error_invalidJunitVersion, new Object[] {name, version, Integer.valueOf(junitVersion)});
IStatus[] bundleErrors = errors.computeIfAbsent(bundle, b -> new Status[0]);
if (!Arrays.stream(bundleErrors).map(IStatus::getMessage).anyMatch(m -> error.equals(m))) {
IStatus[] newBundleErrors = Arrays.copyOf(bundleErrors, bundleErrors.length + 1);
newBundleErrors[bundleErrors.length] = Status.error(error);
errors.put(bundle, newBundleErrors);
}
} else {
PDELaunchingPlugin.log(Status.error("Bundle not found: " + requirementName + " " + requirementVersion, new IllegalStateException())); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}
}
}

private boolean isOptional(BundleRequirement requirement) {
return Constants.RESOLUTION_OPTIONAL.equals(requirement.getDirectives().get(Constants.RESOLUTION_DIRECTIVE));
}

@Override
public void filterResolvable(Collection<BundleRevision> candidates) {
}

@Override
public void filterSingletonCollisions(BundleCapability singleton, Collection<BundleCapability> collisionCandidates) {
}

@Override
public void end() {
}

@Override
public boolean hasErrors() {
return super.hasErrors() || !errors.isEmpty();
}

@Override
public Map<Object, Object[]> getInput() {
Map<Object, Object[]> map = super.getInput();
map.putAll(errors);
return map;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class PDEMessages extends NLS {
public static String WorkbenchLauncherConfigurationDelegate_noStartup;
public static String JUnitLaunchConfiguration_error_notaplugin;
public static String JUnitLaunchConfiguration_error_missingPlugin;
public static String JUnitLaunchConfiguration_error_invalidJunitVersion;

public static String OSGiLaunchConfiguration_cannotFindLaunchConfiguration;
public static String OSGiLaunchConfiguration_selected;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,14 @@ public LaunchValidationOperation(ILaunchConfiguration configuration, Set<IPlugin

@Override
public void run(IProgressMonitor monitor) throws CoreException {
fOperation = new BundleValidationOperation(fModels, getPlatformProperties());
fOperation = createOperation(getPlatformProperties());
fOperation.run(monitor);
}

protected BundleValidationOperation createOperation(Dictionary<String, String>[] properties) {
return new BundleValidationOperation(fModels, properties);
}

@SuppressWarnings("unchecked")
protected Dictionary<String, String>[] getPlatformProperties() throws CoreException {
IExecutionEnvironment[] envs = getMatchingEnvironments();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ WorkbenchLauncherConfigurationDelegate_jrePathNotFound = The installation path t
WorkbenchLauncherConfigurationDelegate_noStartup = Launching failed. Bootstrap code cannot be found.
JUnitLaunchConfiguration_error_notaplugin = Could not launch the JUnit plug-in tests because project ''{0}'' is not a plug-in project.
JUnitLaunchConfiguration_error_missingPlugin = Required plug-in ''{0}'' could not be found.
JUnitLaunchConfiguration_error_invalidJunitVersion = {0} {1} is incompatible with JUnit {2} runtime selected for the launch.

OSGiLaunchConfiguration_cannotFindLaunchConfiguration=Cannot find the {0} OSGi framework.
OSGiLaunchConfiguration_selected=selected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,11 @@
import org.eclipse.pde.internal.core.util.CoreUtility;
import org.eclipse.pde.internal.core.util.VersionUtil;
import org.eclipse.pde.internal.launching.IPDEConstants;
import org.eclipse.pde.internal.launching.JUnitEclipsePluginValidationOperation;
import org.eclipse.pde.internal.launching.JUnitLaunchRequirements;
import org.eclipse.pde.internal.launching.PDELaunchingPlugin;
import org.eclipse.pde.internal.launching.PDEMessages;
import org.eclipse.pde.internal.launching.launcher.BundleLauncherHelper;
import org.eclipse.pde.internal.launching.launcher.EclipsePluginValidationOperation;
import org.eclipse.pde.internal.launching.launcher.LaunchArgumentsHelper;
import org.eclipse.pde.internal.launching.launcher.LaunchConfigurationHelper;
import org.eclipse.pde.internal.launching.launcher.LaunchPluginValidator;
Expand Down Expand Up @@ -610,7 +610,7 @@ protected void validateProjectDependencies(ILaunchConfiguration configuration, I
* a progress monitor
*/
protected void validatePluginDependencies(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException {
EclipsePluginValidationOperation op = new EclipsePluginValidationOperation(configuration, fModels.keySet(), launchMode);
JUnitEclipsePluginValidationOperation op = new JUnitEclipsePluginValidationOperation(configuration, fModels.keySet(), launchMode);
LaunchPluginValidator.runValidationOperation(op, monitor);
}
}
2 changes: 1 addition & 1 deletion ui/org.eclipse.pde.unittest.junit/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Automatic-Module-Name: org.eclipse.pde.unittest.junit
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.pde.unittest.junit;singleton:=true
Bundle-Version: 1.2.200.qualifier
Bundle-Version: 1.2.300.qualifier
Bundle-Activator: org.eclipse.pde.unittest.junit.JUnitPluginTestPlugin
Bundle-ActivationPolicy: lazy
Bundle-Vendor: %providerName
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@
import org.eclipse.pde.internal.core.TargetPlatformHelper;
import org.eclipse.pde.internal.core.util.CoreUtility;
import org.eclipse.pde.internal.launching.IPDEConstants;
import org.eclipse.pde.internal.launching.JUnitEclipsePluginValidationOperation;
import org.eclipse.pde.internal.launching.JUnitLaunchRequirements;
import org.eclipse.pde.internal.launching.launcher.BundleLauncherHelper;
import org.eclipse.pde.internal.launching.launcher.EclipsePluginValidationOperation;
import org.eclipse.pde.internal.launching.launcher.LaunchArgumentsHelper;
import org.eclipse.pde.internal.launching.launcher.LaunchConfigurationHelper;
import org.eclipse.pde.internal.launching.launcher.LaunchPluginValidator;
Expand Down Expand Up @@ -1233,8 +1233,8 @@ protected void validateProjectDependencies(ILaunchConfiguration configuration, I
*/
protected void validatePluginDependencies(ILaunchConfiguration configuration, IProgressMonitor monitor)
throws CoreException {
EclipsePluginValidationOperation op = new EclipsePluginValidationOperation(configuration, fModels.keySet(),
launchMode);
JUnitEclipsePluginValidationOperation op = new JUnitEclipsePluginValidationOperation(configuration,
fModels.keySet(), launchMode);
LaunchPluginValidator.runValidationOperation(op, monitor);
}
}
Loading