diff --git a/maven-surefire-common/pom.xml b/maven-surefire-common/pom.xml index 82abed6148..c9b10cbc43 100644 --- a/maven-surefire-common/pom.xml +++ b/maven-surefire-common/pom.xml @@ -52,6 +52,12 @@ maven-core provided + + org.eclipse.aether + aether-util + + 1.0.0.v20140518 + org.apache.maven.plugin-tools maven-plugin-annotations @@ -160,6 +166,10 @@ + + org.eclipse.sisu + sisu-maven-plugin + diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java index 2c0365627b..4286b90baf 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Properties; import java.util.Set; import java.util.SortedSet; @@ -45,8 +46,6 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.handler.ArtifactHandler; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ResolutionErrorHandler; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; import org.apache.maven.artifact.versioning.ArtifactVersion; @@ -77,7 +76,6 @@ import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; -import org.apache.maven.repository.RepositorySystem; import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter; import org.apache.maven.surefire.api.booter.ProviderParameterNames; import org.apache.maven.surefire.api.booter.Shutdown; @@ -282,13 +280,6 @@ public abstract class AbstractSurefireMojo extends AbstractMojo implements Suref @Parameter(defaultValue = "${project.build.testSourceDirectory}") private File testSourceDirectory; - /** - * ArtifactRepository of the localRepository. To obtain the directory of localRepository in unit tests use - * System.getProperty("localRepository"). - */ - @Parameter(defaultValue = "${localRepository}", required = true, readonly = true) - private ArtifactRepository localRepository; - /** * List of System properties to pass to a provider. * @@ -635,17 +626,6 @@ public abstract class AbstractSurefireMojo extends AbstractMojo implements Suref @Parameter(property = "trimStackTrace", defaultValue = "false") private boolean trimStackTrace; - /** - * The remote plugin repositories declared in the POM. - * - * @since 2.2 - */ - @Parameter(defaultValue = "${project.pluginArtifactRepositories}", readonly = true, required = true) - private List remoteRepositories; - - @Parameter(defaultValue = "${project.remoteArtifactRepositories}", required = true, readonly = true) - private List projectRemoteRepositories; - /** * Flag to disable the generation of report files in xml format. * Deprecated since 3.0.0-M4. @@ -771,15 +751,9 @@ public abstract class AbstractSurefireMojo extends AbstractMojo implements Suref @Component private LocationManager locationManager; - @Component - private RepositorySystem repositorySystem; - @Component private ProviderDetector providerDetector; - @Component - private ResolutionErrorHandler resolutionErrorHandler; - private Toolchain toolchain; private int effectiveForkCount = -1; @@ -855,6 +829,7 @@ private String getDefaultExcludes() { return "**/*$*"; } + @Component(role = SurefireDependencyResolver.class) private SurefireDependencyResolver surefireDependencyResolver; private TestListResolver specificTests; @@ -905,6 +880,10 @@ void setLogger(Logger logger) { this.logger = logger; } + void setSurefireDependencyResolver(SurefireDependencyResolver surefireDependencyResolver) { + this.surefireDependencyResolver = surefireDependencyResolver; + } + @Nonnull protected final PluginConsoleLogger getConsoleLogger() { if (consoleLogger == null) { @@ -952,15 +931,6 @@ private Toolchain getToolchain() throws MojoFailureException { } private void setupStuff() throws MojoFailureException { - surefireDependencyResolver = new SurefireDependencyResolver( - getRepositorySystem(), - getConsoleLogger(), - getLocalRepository(), - getRemoteRepositories(), - getProjectRemoteRepositories(), - resolutionErrorHandler, - getPluginName(), - getSession().isOffline()); if (getBooterArtifact() == null) { throw new RuntimeException("Unable to locate surefire-booter in the list of plugin artifacts"); @@ -1125,7 +1095,7 @@ private SurefireProperties setupProperties() { getSystemProperties(), getSystemPropertyVariables(), getUserProperties(), sysProps); result.setProperty("basedir", getBasedir().getAbsolutePath()); - result.setProperty("localRepository", getLocalRepository().getBasedir()); + result.setProperty("localRepository", getLocalRepositoryPath()); if (isForking()) { for (Object o : result.propertiesThatCannotBeSetASystemProperties()) { if (getArgLine() == null || !getArgLine().contains("-D" + o + "=")) { @@ -1269,14 +1239,6 @@ protected void logReportsDirectory() { logDebugOrCliShowErrors(capitalizeFirstLetter(getPluginName()) + " report directory: " + getReportsDirectory()); } - public RepositorySystem getRepositorySystem() { - return repositorySystem; - } - - public void setRepositorySystem(RepositorySystem repositorySystem) { - this.repositorySystem = repositorySystem; - } - private boolean existsModuleDescriptor(ResolvePathResultWrapper resolvedJavaModularityResult) { return resolvedJavaModularityResult.getResolvePathResult() != null; } @@ -2467,7 +2429,7 @@ private String getConfigChecksum() { checksum.add(getSkipAfterFailureCount()); checksum.add(getShutdown()); checksum.add(getExcludes()); - checksum.add(getLocalRepository()); + checksum.add(getLocalRepositoryPath()); checksum.add(getSystemProperties()); checksum.add(getSystemPropertyVariables()); checksum.add(getSystemPropertiesFile()); @@ -2505,8 +2467,6 @@ private String getConfigChecksum() { checksum.add(getParallel()); checksum.add(isParallelOptimized()); checksum.add(isTrimStackTrace()); - checksum.add(getRemoteRepositories()); - checksum.add(getProjectRemoteRepositories()); checksum.add(isDisableXmlReport()); checksum.add(isUseSystemClassLoader()); checksum.add(isUseManifestOnlyJar()); @@ -2610,13 +2570,9 @@ private Classpath getArtifactClasspath(Artifact surefireArtifact) throws MojoExe Classpath existing = classpathCache.getCachedClassPath(surefireArtifact.getArtifactId()); if (existing == null) { List items = new ArrayList<>(); - Set booterArtifacts = surefireDependencyResolver - .resolvePluginArtifact(surefireArtifact) - .getArtifacts(); + Set booterArtifacts = surefireDependencyResolver.resolveArtifacts( + session.getRepositorySession(), project.getRemotePluginRepositories(), surefireArtifact); for (Artifact artifact : booterArtifacts) { - getConsoleLogger() - .debug("Adding to " + getPluginName() + " booter test classpath: " - + artifact.getFile().getAbsolutePath() + " Scope: " + artifact.getScope()); items.add(artifact.getFile().getAbsolutePath()); } existing = new Classpath(items); @@ -2797,7 +2753,8 @@ public List getJpmsArguments(@Nonnull ProviderRequirements forkRequire public Set getProviderClasspath() throws MojoExecutionException { Artifact surefireArtifact = getBooterArtifact(); String version = surefireArtifact.getBaseVersion(); - return surefireDependencyResolver.getProviderClasspath("surefire-testng", version); + return surefireDependencyResolver.getProviderClasspath( + session.getRepositorySession(), project.getRemotePluginRepositories(), "surefire-testng", version); } } @@ -2828,7 +2785,8 @@ public Set getProviderClasspath() throws MojoExecutionException { // add the JUnit provider as default - it doesn't require JUnit to be present, // since it supports POJO tests. String version = getBooterArtifact().getBaseVersion(); - return surefireDependencyResolver.getProviderClasspath("surefire-junit3", version); + return surefireDependencyResolver.getProviderClasspath( + session.getRepositorySession(), project.getRemotePluginRepositories(), "surefire-junit3", version); } } @@ -2866,7 +2824,8 @@ public List getJpmsArguments(@Nonnull ProviderRequirements forkRequire @Nonnull public Set getProviderClasspath() throws MojoExecutionException { String version = getBooterArtifact().getBaseVersion(); - return surefireDependencyResolver.getProviderClasspath("surefire-junit4", version); + return surefireDependencyResolver.getProviderClasspath( + session.getRepositorySession(), project.getRemotePluginRepositories(), "surefire-junit4", version); } } @@ -2915,13 +2874,19 @@ public List getJpmsArguments(@Nonnull ProviderRequirements forkRequire @Nonnull public Set getProviderClasspath() throws MojoExecutionException { String surefireVersion = getBooterArtifact().getBaseVersion(); - Map providerArtifacts = - surefireDependencyResolver.getProviderClasspathAsMap("surefire-junit-platform", surefireVersion); + Map providerArtifacts = surefireDependencyResolver.getProviderClasspathAsMap( + session.getRepositorySession(), + project.getRemotePluginRepositories(), + "surefire-junit-platform", + surefireVersion); Map testDeps = testClasspath.getTestDependencies(); Plugin plugin = getPluginDescriptor().getPlugin(); - Map pluginDeps = - surefireDependencyResolver.resolvePluginDependencies(plugin, getPluginArtifactMap()); + Map pluginDeps = surefireDependencyResolver.resolvePluginDependencies( + session.getRepositorySession(), + project.getRemotePluginRepositories(), + plugin, + getPluginArtifactMap()); if (hasDependencyPlatformEngine(pluginDeps)) { providerArtifacts.putAll(pluginDeps); @@ -3006,8 +2971,8 @@ private Set resolve(String g, String a, String v, String c, String t) ArtifactHandler handler = junitPlatformArtifact.getArtifactHandler(); Artifact artifact = new DefaultArtifact(g, a, v, null, t, c, handler); getConsoleLogger().debug("Resolving artifact " + g + ":" + a + ":" + v); - Set r = - surefireDependencyResolver.resolveProjectArtifact(artifact).getArtifacts(); + Set r = surefireDependencyResolver.resolveArtifacts( + session.getRepositorySession(), project.getRemoteProjectRepositories(), artifact); getConsoleLogger().debug("Resolved artifact " + g + ":" + a + ":" + v + " to " + r); return r; } @@ -3071,7 +3036,8 @@ public List getJpmsArguments(@Nonnull ProviderRequirements forkRequire @Nonnull public Set getProviderClasspath() throws MojoExecutionException { String version = getBooterArtifact().getBaseVersion(); - return surefireDependencyResolver.getProviderClasspath("surefire-junit47", version); + return surefireDependencyResolver.getProviderClasspath( + session.getRepositorySession(), project.getRemotePluginRepositories(), "surefire-junit47", version); } } @@ -3118,8 +3084,11 @@ public List getJpmsArguments(@Nonnull ProviderRequirements forkRequire @Nonnull public Set getProviderClasspath() throws MojoExecutionException { Plugin plugin = getPluginDescriptor().getPlugin(); - Map providerArtifacts = - surefireDependencyResolver.resolvePluginDependencies(plugin, getPluginArtifactMap()); + Map providerArtifacts = surefireDependencyResolver.resolvePluginDependencies( + session.getRepositorySession(), + project.getRemotePluginRepositories(), + plugin, + getPluginArtifactMap()); return new LinkedHashSet<>(providerArtifacts.values()); } } @@ -3140,13 +3109,11 @@ File createSurefireBootDirectoryInTemp() { } @Override - public ArtifactRepository getLocalRepository() { - return localRepository; - } - - @Override - public void setLocalRepository(ArtifactRepository localRepository) { - this.localRepository = localRepository; + public String getLocalRepositoryPath() { + return Optional.ofNullable( + session.getRepositorySession().getLocalRepository().getBasedir()) + .map(File::getAbsolutePath) + .orElse("."); } public Properties getSystemProperties() { @@ -3383,24 +3350,6 @@ public void setTrimStackTrace(boolean trimStackTrace) { this.trimStackTrace = trimStackTrace; } - public List getProjectRemoteRepositories() { - return projectRemoteRepositories; - } - - @SuppressWarnings("UnusedDeclaration") - public void setProjectRemoteRepositories(List projectRemoteRepositories) { - this.projectRemoteRepositories = projectRemoteRepositories; - } - - public List getRemoteRepositories() { - return remoteRepositories; - } - - @SuppressWarnings("UnusedDeclaration") - public void setRemoteRepositories(List remoteRepositories) { - this.remoteRepositories = remoteRepositories; - } - public boolean isDisableXmlReport() { return disableXmlReport; } @@ -3556,10 +3505,6 @@ public void setTempDir(String tempDir) { this.tempDir = tempDir; } - public void setResolutionErrorHandler(ResolutionErrorHandler resolutionErrorHandler) { - this.resolutionErrorHandler = resolutionErrorHandler; - } - private static final class ClasspathCache { private final Map classpaths = new HashMap<>(4); diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java index 9af9db2780..b581a88bbf 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java @@ -20,6 +20,9 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; import java.util.Collection; import java.util.Iterator; @@ -28,14 +31,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactResolutionException; -import org.apache.maven.artifact.resolver.ArtifactResolutionRequest; -import org.apache.maven.artifact.resolver.ArtifactResolutionResult; -import org.apache.maven.artifact.resolver.ResolutionErrorHandler; -import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; @@ -43,13 +42,17 @@ import org.apache.maven.model.Dependency; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; -import org.apache.maven.repository.RepositorySystem; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.resolution.DependencyRequest; +import org.eclipse.aether.resolution.DependencyResolutionException; +import org.eclipse.aether.resolution.DependencyResult; +import org.eclipse.aether.util.artifact.JavaScopes; +import org.eclipse.aether.util.filter.DependencyFilterUtils; -import static java.util.Arrays.asList; -import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE; -import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE_PLUS_RUNTIME; -import static org.apache.maven.artifact.Artifact.SCOPE_RUNTIME; import static org.apache.maven.artifact.ArtifactUtils.artifactMapByVersionlessId; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec; @@ -59,7 +62,10 @@ * @author Stephen Connolly * @author Kristian Rosenvold */ -final class SurefireDependencyResolver { +@Named +@Singleton +class SurefireDependencyResolver { + static final String PROVIDER_GROUP_ID = "org.apache.maven.surefire"; private static final String[] PROVIDER_CLASSPATH_ORDER = { @@ -80,37 +86,9 @@ final class SurefireDependencyResolver { private final RepositorySystem repositorySystem; - private final ConsoleLogger log; - - private final ArtifactRepository localRepository; - - private final List pluginRemoteRepositories; - - private final List projectRemoteRepositories; - - private final ResolutionErrorHandler resolutionErrorHandler; - - private final String pluginName; - - private final boolean offline; - - SurefireDependencyResolver( - RepositorySystem repositorySystem, - ConsoleLogger log, - ArtifactRepository localRepository, - List pluginRemoteRepositories, - List projectRemoteRepositories, - ResolutionErrorHandler resolutionErrorHandler, - String pluginName, - boolean offline) { + @Inject + SurefireDependencyResolver(RepositorySystem repositorySystem) { this.repositorySystem = repositorySystem; - this.log = log; - this.localRepository = localRepository; - this.pluginRemoteRepositories = pluginRemoteRepositories; - this.projectRemoteRepositories = projectRemoteRepositories; - this.resolutionErrorHandler = resolutionErrorHandler; - this.pluginName = pluginName; - this.offline = offline; } static boolean isWithinVersionSpec(@Nullable Artifact artifact, @Nonnull String versionSpec) { @@ -129,15 +107,19 @@ static boolean isWithinVersionSpec(@Nullable Artifact artifact, @Nonnull String } } - Map resolvePluginDependencies(Plugin plugin, Map pluginResolvedDependencies) + Map resolvePluginDependencies( + RepositorySystemSession session, + List repositories, + Plugin plugin, + Map pluginResolvedDependencies) throws MojoExecutionException { Map resolved = new LinkedHashMap<>(); Collection pluginDependencies = plugin.getDependencies(); for (Dependency dependency : pluginDependencies) { - Artifact dependencyArtifact = repositorySystem.createDependencyArtifact(dependency); - ArtifactResolutionResult artifactResolutionResult = resolvePluginArtifact(dependencyArtifact); - for (Artifact artifact : artifactResolutionResult.getArtifacts()) { + Set artifacts = resolveDependencies( + session, repositories, RepositoryUtils.toDependency(dependency, session.getArtifactTypeRegistry())); + for (Artifact artifact : artifacts) { String key = artifact.getGroupId() + ":" + artifact.getArtifactId(); Artifact resolvedPluginDependency = pluginResolvedDependencies.get(key); if (resolvedPluginDependency != null) { @@ -148,69 +130,65 @@ Map resolvePluginDependencies(Plugin plugin, Map resolveArtifacts( + RepositorySystemSession session, List repositories, Artifact artifact) throws MojoExecutionException { - return resolveArtifact(artifact, pluginRemoteRepositories, filter); + return resolveDependencies(session, repositories, RepositoryUtils.toDependency(artifact, null)); } - private ArtifactResolutionResult resolveProjectArtifact(Artifact artifact, ArtifactFilter filter) + private Set resolveDependencies( + RepositorySystemSession session, + List repositories, + org.eclipse.aether.graph.Dependency dependency) throws MojoExecutionException { - return resolveArtifact(artifact, projectRemoteRepositories, filter); - } - - private ArtifactResolutionResult resolveArtifact( - Artifact artifact, List repositories, ArtifactFilter filter) - throws MojoExecutionException { - ArtifactResolutionRequest request = new ArtifactResolutionRequest() - .setOffline(offline) - .setArtifact(artifact) - .setLocalRepository(localRepository) - .setResolveTransitively(true) - .setCollectionFilter(filter) - .setRemoteRepositories(repositories); - ArtifactResolutionResult result = repositorySystem.resolve(request); try { - resolutionErrorHandler.throwErrors(request, result); - } catch (ArtifactResolutionException e) { + + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRoot(dependency); + collectRequest.setRepositories(repositories); + + DependencyRequest request = new DependencyRequest(); + request.setCollectRequest(collectRequest); + request.setFilter(DependencyFilterUtils.classpathFilter(JavaScopes.RUNTIME)); + + DependencyResult dependencyResult = repositorySystem.resolveDependencies(session, request); + return dependencyResult.getArtifactResults().stream() + .map(ArtifactResult::getArtifact) + .map(RepositoryUtils::toArtifact) + .collect(Collectors.toSet()); + + } catch (DependencyResolutionException e) { throw new MojoExecutionException(e.getMessage(), e); } - - return result; } @Nonnull - Set getProviderClasspath(String providerArtifactId, String providerVersion) + Set getProviderClasspath( + RepositorySystemSession session, + List repositories, + String providerArtifactId, + String providerVersion) throws MojoExecutionException { Dependency provider = toProviderDependency(providerArtifactId, providerVersion); - Artifact providerArtifact = repositorySystem.createDependencyArtifact(provider); + org.eclipse.aether.graph.Dependency dependency = + RepositoryUtils.toDependency(provider, session.getArtifactTypeRegistry()); - ArtifactResolutionResult result = resolvePluginArtifact(providerArtifact); + Set result = resolveDependencies(session, repositories, dependency); - if (log.isDebugEnabled()) { - for (Artifact artifact : result.getArtifacts()) { - String artifactPath = artifact.getFile().getAbsolutePath(); - String scope = artifact.getScope(); - log.debug("Adding to " + pluginName + " test classpath: " + artifactPath + " Scope: " + scope); - } - } - - return orderProviderArtifacts(result.getArtifacts()); + return orderProviderArtifacts(result); } @Nonnull - Map getProviderClasspathAsMap(String providerArtifactId, String providerVersion) + Map getProviderClasspathAsMap( + RepositorySystemSession session, + List repositories, + String providerArtifactId, + String providerVersion) throws MojoExecutionException { - return artifactMapByVersionlessId(getProviderClasspath(providerArtifactId, providerVersion)); + return artifactMapByVersionlessId( + getProviderClasspath(session, repositories, providerArtifactId, providerVersion)); } // FIXME @@ -240,27 +218,4 @@ private static Dependency toProviderDependency(String providerArtifactId, String dependency.setType("jar"); return dependency; } - - static class RuntimeArtifactFilter implements ArtifactFilter { - private static final Collection SCOPES = - asList(SCOPE_COMPILE, SCOPE_COMPILE_PLUS_RUNTIME, SCOPE_RUNTIME); - - private final Artifact filter; - - RuntimeArtifactFilter() { - this(null); - } - - RuntimeArtifactFilter(Artifact filter) { - this.filter = filter; - } - - @Override - public boolean include(Artifact artifact) { - String scope = artifact.getScope(); - return (filter == null || artifact.equals(filter)) - && !artifact.isOptional() - && (scope == null || SCOPES.contains(scope)); - } - } } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java index 2d4b838959..d69cb88287 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java @@ -21,8 +21,6 @@ import java.io.File; import java.util.List; -import org.apache.maven.artifact.repository.ArtifactRepository; - /** * This interface contains all the common parameters that have different implementations in Surefire vs IntegrationTest * @@ -73,9 +71,7 @@ public interface SurefireExecutionParameters { void setExcludes(List excludes); - ArtifactRepository getLocalRepository(); - - void setLocalRepository(ArtifactRepository localRepository); + String getLocalRepositoryPath(); boolean isPrintSummary(); diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ChecksumCalculator.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ChecksumCalculator.java index 498d6c95db..04ddf7bc05 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ChecksumCalculator.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ChecksumCalculator.java @@ -26,7 +26,6 @@ import java.util.Map; import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.repository.ArtifactRepository; import static java.nio.charset.StandardCharsets.UTF_8; @@ -68,10 +67,6 @@ public void add(File workingDirectory) { appendObject(workingDirectory); } - public void add(ArtifactRepository localRepository) { - appendObject(localRepository); - } - public void add(List items) { if (items != null) { for (Object item : items) { diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java index 76e3729547..0fc3ccded1 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java @@ -40,10 +40,6 @@ import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.artifact.handler.DefaultArtifactHandler; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactResolutionRequest; -import org.apache.maven.artifact.resolver.ArtifactResolutionResult; -import org.apache.maven.artifact.resolver.DefaultResolutionErrorHandler; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Dependency; @@ -54,8 +50,6 @@ import org.apache.maven.plugin.surefire.booterclient.Platform; import org.apache.maven.plugin.surefire.log.PluginConsoleLogger; import org.apache.maven.project.MavenProject; -import org.apache.maven.project.ProjectBuildingRequest; -import org.apache.maven.repository.RepositorySystem; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.api.util.DefaultScanResult; import org.apache.maven.surefire.api.util.SureFireFileManager; @@ -81,8 +75,6 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @@ -95,6 +87,7 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; +import static org.apache.maven.artifact.ArtifactUtils.artifactMapByVersionlessId; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersion; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec; import static org.apache.maven.surefire.shared.lang3.JavaVersion.JAVA_9; @@ -102,9 +95,9 @@ import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_WINDOWS; import static org.assertj.core.api.Assertions.assertThat; import static org.codehaus.plexus.languages.java.jpms.ModuleNameSource.MODULEDESCRIPTOR; -import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -162,7 +155,6 @@ public void setupMojo() { plugin.setVersion(mojoArtifact.getVersion()); when(pluginDescriptor.getPlugin()).thenReturn(plugin); mojo.setPluginDescriptor(pluginDescriptor); - mojo.setResolutionErrorHandler(new DefaultResolutionErrorHandler()); } @Test @@ -857,143 +849,20 @@ public void shouldSmartlyResolveJUnit5ProviderWithJUnit4() throws Exception { TestClassPath testClasspathWrapper = new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); - mojo.setRemoteRepositories(Collections.emptyList()); - mojo.setProjectRemoteRepositories(Collections.emptyList()); - RepositorySystem repositorySystem = mock(RepositorySystem.class); + SurefireDependencyResolver dependencyResolver = mock(SurefireDependencyResolver.class); + mojo.setSurefireDependencyResolver(dependencyResolver); - final Artifact surefireProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - - final Artifact pluginDependency = new DefaultArtifact( - "org.junit.vintage", - "junit-vintage-engine", - createFromVersion("5.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + when(dependencyResolver.getProviderClasspathAsMap(any(), any(), anyString(), anyString())) + .thenReturn(artifactMapByVersionlessId(createSurefireProviderResolutionResult(surefireVersion))); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenAnswer(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Dependency dependency = (Dependency) invocation.getArguments()[0]; - if (dependency.getArtifactId().equals("surefire-junit-platform")) { - return surefireProvider; - } else if (dependency.getArtifactId().equals("junit-vintage-engine")) { - return pluginDependency; - } else { - fail(dependency.getGroupId() + ":" + dependency.getArtifactId()); - return null; - } - } - }); - - final ArtifactResolutionResult surefireProviderResolutionResult = mock(ArtifactResolutionResult.class); - final ArtifactResolutionResult pluginDependencyResolutionResult = mock(ArtifactResolutionResult.class); - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .thenAnswer(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - ArtifactResolutionRequest req = - (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact artifact = req.getArtifact(); - if (artifact == surefireProvider) { - return surefireProviderResolutionResult; - } else if (artifact == pluginDependency) { - return pluginDependencyResolutionResult; - } else if ("org.junit.platform".equals(artifact.getGroupId()) - && "junit-platform-launcher".equals(artifact.getArtifactId()) - && "1.4.0".equals(artifact.getVersion())) { - return createExpectedJUnitPlatformLauncherResolutionResult(); - } else { - fail(artifact.getGroupId() + ":" + artifact.getArtifactId()); - return null; - } - } - }); - - Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact apiguardian = new DefaultArtifact( - "org.apiguardian", - "apiguardian-api", - createFromVersion("1.0.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact engine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact commons = new DefaultArtifact( - "org.junit.platform", - "junit-platform-commons", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact opentest4j = new DefaultArtifact( - "org.opentest4j", - "opentest4j", - createFromVersion("1.1.1"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Set providerArtifacts = new HashSet<>(); - providerArtifacts.add(surefireProvider); - providerArtifacts.add(java5); - providerArtifacts.add(launcher); - providerArtifacts.add(apiguardian); - providerArtifacts.add(engine); - providerArtifacts.add(commons); - providerArtifacts.add(opentest4j); - - when(surefireProviderResolutionResult.getArtifacts()).thenReturn(providerArtifacts); + when(dependencyResolver.resolveArtifacts(any(), any(), any())) + .thenReturn(createExpectedJUnitPlatformLauncherResolutionResult()); final Artifact pluginDep1 = new DefaultArtifact( - "org.junit.vintage", - "junit-vintage-engine", - createFromVersion("5.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.vintage", "junit-vintage-engine", createFromVersion("5.4.0"), null, "jar", "", null); final Artifact pluginDep2 = new DefaultArtifact( - "org.apiguardian", - "apiguardian-api", - createFromVersion("1.0.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apiguardian", "apiguardian-api", createFromVersion("1.0.0"), null, "jar", "", null); final Artifact pluginDep3 = new DefaultArtifact( "org.junit.platform", @@ -1036,7 +905,6 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { addPluginDependencies(pluginDep1, pluginDep2, pluginDep3, pluginDep4, pluginDep5, pluginDep6, pluginDep7); - mojo.setRepositorySystem(repositorySystem); mojo.setLogger(mock(Logger.class)); Set pluginDependencyArtifacts = new HashSet<>(); @@ -1047,17 +915,14 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { pluginDependencyArtifacts.add(pluginDep5); pluginDependencyArtifacts.add(pluginDep6); pluginDependencyArtifacts.add(pluginDep7); - when(pluginDependencyResolutionResult.getArtifacts()).thenReturn(pluginDependencyArtifacts); - - invokeMethod(mojo, "setupStuff"); - when(mojo.getSession().getProjectBuildingRequest()).thenReturn(mock(ProjectBuildingRequest.class)); + when(dependencyResolver.resolvePluginDependencies(any(), any(), any(), any())) + .thenReturn(artifactMapByVersionlessId(pluginDependencyArtifacts)); PluginDescriptor pluginDescriptor = mock(PluginDescriptor.class); mojo.setPluginDescriptor(pluginDescriptor); Plugin p = mock(Plugin.class); when(pluginDescriptor.getPlugin()).thenReturn(p); - when(p.getDependencies()).thenReturn(singletonList(toDependency(pluginDependency))); Artifact junitPlatformArtifact = invokeMethod(mojo, "getJUnit5Artifact"); assertThat(junitPlatformArtifact.getGroupId()).isEqualTo("org.junit.platform"); @@ -1070,69 +935,22 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { assertThat(prov.isApplicable()).isTrue(); Artifact expectedProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact expectedCommonJava5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact expectedLauncher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.4.0"), null, "jar", "", null); Artifact expectedApiguardian = new DefaultArtifact( - "org.apiguardian", - "apiguardian-api", - createFromVersion("1.0.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apiguardian", "apiguardian-api", createFromVersion("1.0.0"), null, "jar", "", null); Artifact expectedJUnit5Engine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact expectedOpentest4j = new DefaultArtifact( - "org.opentest4j", - "opentest4j", - createFromVersion("1.1.1"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-engine", createFromVersion("1.4.0"), null, "jar", "", null); + Artifact expectedOpentest4j = + new DefaultArtifact("org.opentest4j", "opentest4j", createFromVersion("1.1.1"), null, "jar", "", null); Artifact expectedPlatformCommons = new DefaultArtifact( - "org.junit.platform", - "junit-platform-commons", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-commons", createFromVersion("1.4.0"), null, "jar", "", null); Artifact expectedEngine = new DefaultArtifact( - "org.junit.vintage", - "junit-vintage-engine", - createFromVersion("5.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.vintage", "junit-vintage-engine", createFromVersion("5.4.0"), null, "jar", "", null); + assertThat(prov.getProviderClasspath()) .hasSize(8) .containsOnly( @@ -1239,109 +1057,16 @@ public void shouldSmartlyResolveJUnit5ProviderWithVintage() throws Exception { TestClassPath testClasspathWrapper = new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); - mojo.setRemoteRepositories(Collections.emptyList()); - mojo.setProjectRemoteRepositories(Collections.emptyList()); - RepositorySystem repositorySystem = mock(RepositorySystem.class); - final Artifact surefireProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenAnswer(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Dependency provider = (Dependency) invocation.getArguments()[0]; - assertThat(provider.getGroupId()).isEqualTo("org.apache.maven.surefire"); - assertThat(provider.getArtifactId()).isEqualTo("surefire-junit-platform"); - return surefireProvider; - } - }); - final ArtifactResolutionResult surefireProviderResolutionResult = mock(ArtifactResolutionResult.class); - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .thenAnswer(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - ArtifactResolutionRequest req = - (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact resolvable = req.getArtifact(); - if (resolvable == surefireProvider) { - return surefireProviderResolutionResult; - } else if ("org.junit.platform".equals(resolvable.getGroupId()) - && "junit-platform-launcher".equals(resolvable.getArtifactId()) - && "1.4.0".equals(resolvable.getVersion())) { - return createExpectedJUnitPlatformLauncherResolutionResult(); - } else { - fail(resolvable.getGroupId() + ":" + resolvable.getArtifactId()); - return null; - } - } - }); + SurefireDependencyResolver dependencyResolver = mock(SurefireDependencyResolver.class); + mojo.setSurefireDependencyResolver(dependencyResolver); - Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact apiguardian = new DefaultArtifact( - "org.apiguardian", - "apiguardian-api", - createFromVersion("1.0.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact engine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact commons = new DefaultArtifact( - "org.junit.platform", - "junit-platform-commons", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact opentest4j = new DefaultArtifact( - "org.opentest4j", - "opentest4j", - createFromVersion("1.1.1"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Set providerArtifacts = new HashSet<>(); - providerArtifacts.add(surefireProvider); - providerArtifacts.add(java5); - providerArtifacts.add(launcher); - providerArtifacts.add(apiguardian); - providerArtifacts.add(engine); - providerArtifacts.add(commons); - providerArtifacts.add(opentest4j); - when(surefireProviderResolutionResult.getArtifacts()).thenReturn(providerArtifacts); + when(dependencyResolver.getProviderClasspathAsMap(any(), any(), anyString(), anyString())) + .thenReturn(artifactMapByVersionlessId(createSurefireProviderResolutionResult(surefireVersion))); - mojo.setRepositorySystem(repositorySystem); - mojo.setLogger(mock(Logger.class)); + when(dependencyResolver.resolveArtifacts(any(), any(), any())) + .thenReturn(createExpectedJUnitPlatformLauncherResolutionResult()); - invokeMethod(mojo, "setupStuff"); + mojo.setLogger(mock(Logger.class)); PluginDescriptor pluginDescriptor = mock(PluginDescriptor.class); mojo.setPluginDescriptor(pluginDescriptor); @@ -1360,29 +1085,11 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { assertThat(prov.isApplicable()).isTrue(); Artifact expectedProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact expectedCommonJava5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact expectedLauncher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.4.0"), null, "jar", "", null); assertThat(prov.getProviderClasspath()) .hasSize(3) .containsOnly(expectedProvider, expectedCommonJava5, expectedLauncher); @@ -1441,54 +1148,19 @@ public void shouldSmartlyResolveJUnit5ProviderWithJUnit5Commons() throws Excepti TestClassPath testClasspathWrapper = new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); - mojo.setRemoteRepositories(Collections.emptyList()); - mojo.setProjectRemoteRepositories(Collections.emptyList()); - RepositorySystem repositorySystem = mock(RepositorySystem.class); - final Artifact surefireProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenAnswer(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Dependency provider = (Dependency) invocation.getArguments()[0]; - assertThat(provider.getGroupId()).isEqualTo("org.apache.maven.surefire"); - assertThat(provider.getArtifactId()).isEqualTo("surefire-junit-platform"); - return surefireProvider; - } - }); - - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .thenAnswer(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - ArtifactResolutionRequest req = - (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact resolvable = req.getArtifact(); - if (resolvable == surefireProvider) { - return createSurefireProviderResolutionResult(surefireVersion); - } else if ("org.junit.platform".equals(resolvable.getGroupId()) - && "junit-platform-launcher".equals(resolvable.getArtifactId()) - && "1.4.0".equals(resolvable.getVersion())) { - return createExpectedJUnitPlatformLauncherResolutionResult(); - } else { - fail(resolvable.getGroupId() + ":" + resolvable.getArtifactId()); - return null; - } - } - }); - - mojo.setRepositorySystem(repositorySystem); + SurefireDependencyResolver dependencyResolver = mock(SurefireDependencyResolver.class); + mojo.setSurefireDependencyResolver(dependencyResolver); + + when(dependencyResolver.getProviderClasspathAsMap(any(), any(), anyString(), anyString())) + .thenReturn(artifactMapByVersionlessId(createSurefireProviderResolutionResult(surefireVersion))); + + when(dependencyResolver.resolveArtifacts(any(), any(), any())) + .thenReturn(createExpectedJUnitPlatformLauncherResolutionResult()); + mojo.setLogger(mock(Logger.class)); invokeMethod(mojo, "setupStuff"); - when(mojo.getSession().getProjectBuildingRequest()).thenReturn(mock(ProjectBuildingRequest.class)); - PluginDescriptor pluginDescriptor = mock(PluginDescriptor.class); mojo.setPluginDescriptor(pluginDescriptor); Plugin p = mock(Plugin.class); @@ -1508,45 +1180,15 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { Set resolvedProviderArtifacts = prov.getProviderClasspath(); Artifact provider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.4.0"), null, "jar", "", null); Artifact engine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact opentest4j = new DefaultArtifact( - "org.opentest4j", - "opentest4j", - createFromVersion("1.1.1"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-engine", createFromVersion("1.4.0"), null, "jar", "", null); + Artifact opentest4j = + new DefaultArtifact("org.opentest4j", "opentest4j", createFromVersion("1.1.1"), null, "jar", "", null); assertThat(resolvedProviderArtifacts).hasSize(5).containsOnly(provider, java5, launcher, engine, opentest4j); assertThat(testClasspathWrapper.getTestDependencies()) @@ -1620,48 +1262,15 @@ public void shouldSmartlyResolveJUnit5ProviderWithJUnit5Engine() throws Exceptio TestClassPath testClasspathWrapper = new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); - mojo.setRemoteRepositories(Collections.emptyList()); - mojo.setProjectRemoteRepositories(Collections.emptyList()); - RepositorySystem repositorySystem = mock(RepositorySystem.class); - final Artifact surefireProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenAnswer(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Dependency provider = (Dependency) invocation.getArguments()[0]; - assertThat(provider.getGroupId()).isEqualTo("org.apache.maven.surefire"); - assertThat(provider.getArtifactId()).isEqualTo("surefire-junit-platform"); - return surefireProvider; - } - }); - - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .thenAnswer(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - ArtifactResolutionRequest req = - (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact resolvable = req.getArtifact(); - if (resolvable == surefireProvider) { - return createSurefireProviderResolutionResult(surefireVersion); - } else if ("org.junit.platform".equals(resolvable.getGroupId()) - && "junit-platform-launcher".equals(resolvable.getArtifactId()) - && "1.4.0".equals(resolvable.getVersion())) { - return createExpectedJUnitPlatformLauncherResolutionResult(); - } else { - fail(resolvable.getGroupId() + ":" + resolvable.getArtifactId()); - return null; - } - } - }); - - mojo.setRepositorySystem(repositorySystem); + SurefireDependencyResolver dependencyResolver = mock(SurefireDependencyResolver.class); + mojo.setSurefireDependencyResolver(dependencyResolver); + + when(dependencyResolver.getProviderClasspathAsMap(any(), any(), anyString(), anyString())) + .thenReturn(artifactMapByVersionlessId(createSurefireProviderResolutionResult(surefireVersion))); + + when(dependencyResolver.resolveArtifacts(any(), any(), any())) + .thenReturn(createExpectedJUnitPlatformLauncherResolutionResult()); + mojo.setLogger(mock(Logger.class)); invokeMethod(mojo, "setupStuff"); @@ -1676,24 +1285,16 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { assertThat(prov.isApplicable()).isTrue(); - Set resolvedProviderArtifacts = prov.getProviderClasspath(); + Artifact surefireProvider = new DefaultArtifact( + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.4.0"), null, "jar", "", null); + + Set resolvedProviderArtifacts = prov.getProviderClasspath(); + assertThat(resolvedProviderArtifacts).hasSize(3).containsOnly(surefireProvider, java5, launcher); assertThat(testClasspathWrapper.getTestDependencies()) @@ -1766,60 +1367,40 @@ public void shouldSmartlyResolveJUnit5ProviderWithJupiterApi() throws Exception File testClassesDirectory = new File("target/test-classes"); - TestClassPath testClasspathWrapper = - new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); + TestClassPath testClasspathWrapper = + new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); + + SurefireDependencyResolver dependencyResolver = mock(SurefireDependencyResolver.class); + mojo.setSurefireDependencyResolver(dependencyResolver); + + when(dependencyResolver.getProviderClasspathAsMap(any(), any(), anyString(), anyString())) + .thenReturn(artifactMapByVersionlessId(createSurefireProviderResolutionResult(surefireVersion))); + + Artifact jUnitPlatformLauncherArtifact = new DefaultArtifact( + "org.junit.platform", + "junit-platform-launcher", + createFromVersion("1.4.0"), + null, + "jar", + null, + mock(ArtifactHandler.class)); + + when(dependencyResolver.resolveArtifacts(any(), any(), eq(jUnitPlatformLauncherArtifact))) + .thenReturn(createExpectedJUnitPlatformLauncherResolutionResult()); - mojo.setRemoteRepositories(Collections.emptyList()); - mojo.setProjectRemoteRepositories(Collections.emptyList()); - RepositorySystem repositorySystem = mock(RepositorySystem.class); - final Artifact surefireProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, + Artifact jupiterEngineArtifact = new DefaultArtifact( + "org.junit.jupiter", + "junit-jupiter-engine", + createFromVersion("5.4.0"), null, "jar", null, mock(ArtifactHandler.class)); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenAnswer(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Dependency provider = (Dependency) invocation.getArguments()[0]; - assertThat(provider.getGroupId()).isEqualTo("org.apache.maven.surefire"); - assertThat(provider.getArtifactId()).isEqualTo("surefire-junit-platform"); - return surefireProvider; - } - }); - - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .thenAnswer(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - ArtifactResolutionRequest req = - (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact resolvable = req.getArtifact(); - if (resolvable == surefireProvider) { - return createSurefireProviderResolutionResult(surefireVersion); - } else if ("org.junit.platform".equals(resolvable.getGroupId()) - && "junit-platform-launcher".equals(resolvable.getArtifactId()) - && "1.4.0".equals(resolvable.getVersion())) { - return createExpectedJUnitPlatformLauncherResolutionResult(); - } else if ("org.junit.jupiter".equals(resolvable.getGroupId()) - && "junit-jupiter-engine".equals(resolvable.getArtifactId()) - && "5.4.0".equals(resolvable.getVersion())) { - return createJupiterEngineResolutionResult(); - } else { - fail(resolvable.getGroupId() + ":" + resolvable.getArtifactId()); - return null; - } - } - }); - - mojo.setRepositorySystem(repositorySystem); - mojo.setLogger(mock(Logger.class)); - invokeMethod(mojo, "setupStuff"); + when(dependencyResolver.resolveArtifacts(any(), any(), eq(jupiterEngineArtifact))) + .thenReturn(createJupiterEngineResolutionResult()); - when(mojo.getSession().getProjectBuildingRequest()).thenReturn(mock(ProjectBuildingRequest.class)); + mojo.setLogger(mock(Logger.class)); PluginDescriptor pluginDescriptor = mock(PluginDescriptor.class); mojo.setPluginDescriptor(pluginDescriptor); @@ -1837,40 +1418,26 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { assertThat(prov.isApplicable()).isTrue(); - Set resolvedProviderArtifacts = prov.getProviderClasspath(); + final Artifact surefireProvider = new DefaultArtifact( + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.4.0"), null, "jar", "", null); Artifact jupiterEngine = new DefaultArtifact( "org.junit.jupiter", - "junit-jupiter-engine", + "junit-jupiter-engine", ///// <------ createFromVersion("5.4.0"), null, "jar", - null, - mock(ArtifactHandler.class)); + "", + null); Artifact platformEngine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-engine", createFromVersion("1.4.0"), null, "jar", "", null); + + Set resolvedProviderArtifacts = prov.getProviderClasspath(); + assertThat(resolvedProviderArtifacts) .hasSize(5) .containsOnly(surefireProvider, java5, launcher, jupiterEngine, platformEngine); @@ -1968,51 +1535,16 @@ public void shouldSmartlyResolveJUnit5ProviderWithJupiterEngine() throws Excepti TestClassPath testClasspathWrapper = new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); - mojo.setRemoteRepositories(Collections.emptyList()); - mojo.setProjectRemoteRepositories(Collections.emptyList()); - RepositorySystem repositorySystem = mock(RepositorySystem.class); - final Artifact surefireProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenAnswer(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Dependency provider = (Dependency) invocation.getArguments()[0]; - assertThat(provider.getGroupId()).isEqualTo("org.apache.maven.surefire"); - assertThat(provider.getArtifactId()).isEqualTo("surefire-junit-platform"); - return surefireProvider; - } - }); - - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .thenAnswer(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - ArtifactResolutionRequest req = - (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact resolvable = req.getArtifact(); - if (resolvable == surefireProvider) { - return createSurefireProviderResolutionResult(surefireVersion); - } else if ("org.junit.platform".equals(resolvable.getGroupId()) - && "junit-platform-launcher".equals(resolvable.getArtifactId()) - && "1.4.0".equals(resolvable.getVersion())) { - return createExpectedJUnitPlatformLauncherResolutionResult(); - } else { - fail(resolvable.getGroupId() + ":" + resolvable.getArtifactId()); - return null; - } - } - }); - - mojo.setRepositorySystem(repositorySystem); - mojo.setLogger(mock(Logger.class)); + SurefireDependencyResolver dependencyResolver = mock(SurefireDependencyResolver.class); + mojo.setSurefireDependencyResolver(dependencyResolver); - invokeMethod(mojo, "setupStuff"); + when(dependencyResolver.getProviderClasspathAsMap(any(), any(), anyString(), anyString())) + .thenReturn(artifactMapByVersionlessId(createSurefireProviderResolutionResult(surefireVersion))); + + when(dependencyResolver.resolveArtifacts(any(), any(), any())) + .thenReturn(createExpectedJUnitPlatformLauncherResolutionResult()); + + mojo.setLogger(mock(Logger.class)); Artifact junitPlatformArtifact = invokeMethod(mojo, "getJUnit5Artifact"); assertThat(junitPlatformArtifact.getGroupId()).isEqualTo("org.junit.platform"); @@ -2024,24 +1556,15 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { assertThat(prov.isApplicable()).isTrue(); - Set resolvedProviderArtifacts = prov.getProviderClasspath(); - + Artifact surefireProvider = new DefaultArtifact( + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.4.0"), null, "jar", "", null); + + Set resolvedProviderArtifacts = prov.getProviderClasspath(); + assertThat(resolvedProviderArtifacts).hasSize(3).containsOnly(surefireProvider, java5, launcher); assertThat(testClasspathWrapper.getTestDependencies()) @@ -2078,13 +1601,7 @@ public void shouldSmartlyResolveJUnit5ProviderWithJupiterEngineInPluginDependenc mock(ArtifactHandler.class)); final Artifact pluginDepJupiterEngine = new DefaultArtifact( - "org.junit.jupiter", - "junit-jupiter-engine", - createFromVersion("5.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.jupiter", "junit-jupiter-engine", createFromVersion("5.4.0"), null, "jar", "", null); final Artifact pluginDepPlatformEngine = new DefaultArtifact( "org.junit.platform", @@ -2131,14 +1648,15 @@ public void shouldSmartlyResolveJUnit5ProviderWithJupiterEngineInPluginDependenc null, mock(ArtifactHandler.class)); - mojo.getPluginArtifactMap().put("org.apache.maven.surefire:maven-surefire-plugin", plugin); - mojo.getPluginArtifactMap().put("org.apache.maven.surefire:surefire-booter", forkedBooter); - mojo.getPluginArtifactMap().put("org.junit.jupiter:junit-jupiter-engine", pluginDepJupiterEngine); - mojo.getPluginArtifactMap().put("org.junit.platform:junit-platform-engine", pluginDepPlatformEngine); - mojo.getPluginArtifactMap().put("org.junit.jupiter:junit-jupiter-api", pluginDepJupiterApi); - mojo.getPluginArtifactMap().put("org.apiguardian:apiguardian-api", pluginDepApiguardian); - mojo.getPluginArtifactMap().put("org.junit.platform:junit-platform-commons", pluginDepCommons); - mojo.getPluginArtifactMap().put("org.opentest4j:opentest4j", pluginDepOpentest4j); + addPluginDependencies( + plugin, + forkedBooter, + pluginDepJupiterEngine, + pluginDepPlatformEngine, + pluginDepJupiterApi, + pluginDepApiguardian, + pluginDepCommons, + pluginDepOpentest4j); MavenProject mavenProject = new MavenProject(); mavenProject.setArtifact(new DefaultArtifact( @@ -2200,58 +1718,15 @@ public void shouldSmartlyResolveJUnit5ProviderWithJupiterEngineInPluginDependenc TestClassPath testClasspathWrapper = new TestClassPath(testArtifacts, classesDirectory, testClassesDirectory, null); - mojo.setRemoteRepositories(Collections.emptyList()); - mojo.setProjectRemoteRepositories(Collections.emptyList()); - RepositorySystem repositorySystem = mock(RepositorySystem.class); + SurefireDependencyResolver dependencyResolver = mock(SurefireDependencyResolver.class); + mojo.setSurefireDependencyResolver(dependencyResolver); + + when(dependencyResolver.getProviderClasspathAsMap(any(), any(), anyString(), anyString())) + .thenReturn(artifactMapByVersionlessId(createSurefireProviderResolutionResult(surefireVersion))); + + when(dependencyResolver.resolveArtifacts(any(), any(), any())) + .thenReturn(createExpectedJUnitPlatformLauncherResolutionResult()); - final Artifact surefireProvider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenAnswer(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Dependency dependency = (Dependency) invocation.getArguments()[0]; - if (dependency.getArtifactId().equals("surefire-junit-platform")) { - return surefireProvider; - } else if (dependency.getArtifactId().equals("junit-jupiter-engine")) { - return pluginDepJupiterEngine; - } else { - fail(dependency.getGroupId() + ":" + dependency.getArtifactId()); - return null; - } - } - }); - - final ArtifactResolutionResult pluginDepJupiterEngineResolutionResult = mock(ArtifactResolutionResult.class); - - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .thenAnswer(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - ArtifactResolutionRequest req = - (ArtifactResolutionRequest) invocation.getArguments()[0]; - Artifact resolvable = req.getArtifact(); - if (resolvable == surefireProvider) { - return createSurefireProviderResolutionResult(surefireVersion); - } else if (resolvable == pluginDepJupiterEngine) { - return pluginDepJupiterEngineResolutionResult; - } else if ("org.junit.platform".equals(resolvable.getGroupId()) - && "junit-platform-launcher".equals(resolvable.getArtifactId()) - && "1.4.0".equals(resolvable.getVersion())) { - return createExpectedJUnitPlatformLauncherResolutionResult(); - } else { - fail(resolvable.getGroupId() + ":" + resolvable.getArtifactId()); - return null; - } - } - }); - - mojo.setRepositorySystem(repositorySystem); mojo.setLogger(mock(Logger.class)); Set pluginDepJupiterEngineArtifacts = new HashSet<>(); @@ -2262,9 +1737,8 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { pluginDepJupiterEngineArtifacts.add(pluginDepCommons); pluginDepJupiterEngineArtifacts.add(pluginDepOpentest4j); - when(pluginDepJupiterEngineResolutionResult.getArtifacts()).thenReturn(pluginDepJupiterEngineArtifacts); - - invokeMethod(mojo, "setupStuff"); + when(dependencyResolver.resolvePluginDependencies(any(), any(), any(), any())) + .thenReturn(artifactMapByVersionlessId(pluginDepJupiterEngineArtifacts)); Artifact junitPlatformArtifact = invokeMethod(mojo, "getJUnit5Artifact"); assertThat(junitPlatformArtifact.getGroupId()).isEqualTo("org.junit.platform"); @@ -2276,8 +1750,6 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { assertThat(prov.isApplicable()).isTrue(); - when(mojo.getSession().getProjectBuildingRequest()).thenReturn(mock(ProjectBuildingRequest.class)); - PluginDescriptor pluginDescriptor = mock(PluginDescriptor.class); mojo.setPluginDescriptor(pluginDescriptor); Plugin p = mock(Plugin.class); @@ -2285,40 +1757,19 @@ public ArtifactResolutionResult answer(InvocationOnMock invocation) { List directPluginDependencies = toDependencies(pluginDepJupiterEngine); when(p.getDependencies()).thenReturn(directPluginDependencies); - Set resolvedProviderArtifacts = prov.getProviderClasspath(); - + Artifact surefireProvider = new DefaultArtifact( + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.4.0"), null, "jar", "", null); Artifact jupiterEngine = new DefaultArtifact( - "org.junit.jupiter", - "junit-jupiter-engine", - createFromVersion("5.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.jupiter", "junit-jupiter-engine", createFromVersion("5.4.0"), null, "jar", "", null); Artifact platformEngine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-engine", createFromVersion("1.4.0"), null, "jar", "", null); + + Set resolvedProviderArtifacts = prov.getProviderClasspath(); + assertThat(resolvedProviderArtifacts) .hasSize(5) .containsOnly(surefireProvider, java5, launcher, jupiterEngine, platformEngine); @@ -2354,178 +1805,65 @@ public void shouldConvertJunitEngineParameters() throws Exception { assertThat(properties).containsEntry("excludejunit5engines", "e1,e2"); } - private static ArtifactResolutionResult createJUnitPlatformLauncherResolutionResult( + private static Set createJUnitPlatformLauncherResolutionResult( Artifact junit5Engine, Artifact apiguardian, Artifact commons, Artifact opentest4j) { - ArtifactResolutionResult launcherResolutionResult = mock(ArtifactResolutionResult.class); Set resolvedLauncherArtifacts = new HashSet<>(); Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - commons.getVersionRange(), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", commons.getVersionRange(), null, "jar", "", null); resolvedLauncherArtifacts.add(launcher); resolvedLauncherArtifacts.add(apiguardian); resolvedLauncherArtifacts.add(junit5Engine); resolvedLauncherArtifacts.add(commons); resolvedLauncherArtifacts.add(opentest4j); resolvedLauncherArtifacts.remove(null); - when(launcherResolutionResult.getArtifacts()).thenReturn(resolvedLauncherArtifacts); - return launcherResolutionResult; + return resolvedLauncherArtifacts; } - private static ArtifactResolutionResult createJupiterEngineResolutionResult() { - ArtifactResolutionResult launcherResolutionResult = mock(ArtifactResolutionResult.class); + private static Set createJupiterEngineResolutionResult() { Set resolvedLauncherArtifacts = new HashSet<>(); resolvedLauncherArtifacts.add(new DefaultArtifact( - "org.junit.jupiter", - "junit-jupiter-engine", - createFromVersion("5.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class))); - resolvedLauncherArtifacts.add(new DefaultArtifact( - "org.junit.jupiter", - "junit-jupiter-api", - createFromVersion("5.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class))); + "org.junit.jupiter", "junit-jupiter-engine", createFromVersion("5.4.0"), null, "jar", "", null)); resolvedLauncherArtifacts.add(new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class))); + "org.junit.jupiter", "junit-jupiter-api", createFromVersion("5.4.0"), null, "jar", "", null)); resolvedLauncherArtifacts.add(new DefaultArtifact( - "org.apiguardian", - "apiguardian-api", - createFromVersion("1.0.0"), - null, - "jar", - null, - mock(ArtifactHandler.class))); + "org.junit.platform", "junit-platform-engine", createFromVersion("1.4.0"), null, "jar", "", null)); resolvedLauncherArtifacts.add(new DefaultArtifact( - "org.opentest4j", - "opentest4j", - createFromVersion("1.1.1"), - null, - "jar", - null, - mock(ArtifactHandler.class))); + "org.apiguardian", "apiguardian-api", createFromVersion("1.0.0"), null, "jar", "", null)); + resolvedLauncherArtifacts.add( + new DefaultArtifact("org.opentest4j", "opentest4j", createFromVersion("1.1.1"), null, "jar", "", null)); resolvedLauncherArtifacts.add(new DefaultArtifact( - "org.junit.platform", - "junit-platform-commons", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class))); - when(launcherResolutionResult.getArtifacts()).thenReturn(resolvedLauncherArtifacts); - return launcherResolutionResult; + "org.junit.platform", "junit-platform-commons", createFromVersion("1.4.0"), null, "jar", "", null)); + return resolvedLauncherArtifacts; } - private static ArtifactResolutionResult createExpectedJUnitPlatformLauncherResolutionResult() { + private static Set createExpectedJUnitPlatformLauncherResolutionResult() { Artifact engine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-engine", createFromVersion("1.4.0"), null, "jar", "", null); Artifact commons = new DefaultArtifact( - "org.junit.platform", - "junit-platform-commons", - createFromVersion("1.4.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-commons", createFromVersion("1.4.0"), null, "jar", "", null); Artifact apiguardian = new DefaultArtifact( - "org.apiguardian", - "apiguardian-api", - createFromVersion("1.0.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact opentest4j = new DefaultArtifact( - "org.opentest4j", - "opentest4j", - createFromVersion("1.1.1"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apiguardian", "apiguardian-api", createFromVersion("1.0.0"), null, "jar", "", null); + Artifact opentest4j = + new DefaultArtifact("org.opentest4j", "opentest4j", createFromVersion("1.1.1"), null, "jar", "", null); return createJUnitPlatformLauncherResolutionResult(engine, apiguardian, commons, opentest4j); } - private static ArtifactResolutionResult createSurefireProviderResolutionResult(VersionRange surefireVersion) { - ArtifactResolutionResult surefirePlatformResolutionResult = mock(ArtifactResolutionResult.class); + private static Set createSurefireProviderResolutionResult(VersionRange surefireVersion) { Artifact provider = new DefaultArtifact( - "org.apache.maven.surefire", - "surefire-junit-platform", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "surefire-junit-platform", surefireVersion, null, "jar", "", null); Artifact java5 = new DefaultArtifact( - "org.apache.maven.surefire", - "common-java5", - surefireVersion, - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apache.maven.surefire", "common-java5", surefireVersion, null, "jar", "", null); Artifact launcher = new DefaultArtifact( - "org.junit.platform", - "junit-platform-launcher", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-launcher", createFromVersion("1.3.2"), null, "jar", "", null); Artifact apiguardian = new DefaultArtifact( - "org.apiguardian", - "apiguardian-api", - createFromVersion("1.0.0"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.apiguardian", "apiguardian-api", createFromVersion("1.0.0"), null, "jar", "", null); Artifact engine = new DefaultArtifact( - "org.junit.platform", - "junit-platform-engine", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-engine", createFromVersion("1.3.2"), null, "jar", "", null); Artifact commons = new DefaultArtifact( - "org.junit.platform", - "junit-platform-commons", - createFromVersion("1.3.2"), - null, - "jar", - null, - mock(ArtifactHandler.class)); - Artifact opentest4j = new DefaultArtifact( - "org.opentest4j", - "opentest4j", - createFromVersion("1.1.1"), - null, - "jar", - null, - mock(ArtifactHandler.class)); + "org.junit.platform", "junit-platform-commons", createFromVersion("1.3.2"), null, "jar", "", null); + Artifact opentest4j = + new DefaultArtifact("org.opentest4j", "opentest4j", createFromVersion("1.1.1"), null, "jar", "", null); Set providerArtifacts = new HashSet<>(); providerArtifacts.add(provider); @@ -2536,8 +1874,7 @@ private static ArtifactResolutionResult createSurefireProviderResolutionResult(V providerArtifacts.add(commons); providerArtifacts.add(opentest4j); - when(surefirePlatformResolutionResult.getArtifacts()).thenReturn(providerArtifacts); - return surefirePlatformResolutionResult; + return providerArtifacts; } @Test @@ -2576,17 +1913,29 @@ private void addPluginDependencies(Artifact... deps) { */ public static class Mojo extends AbstractSurefireMojo implements SurefireReportParameters { private File mainBuildPath; + private File testClassesDirectory; + private boolean useModulePath; + private int failOnFlakeCount; + private String[] includeJUnit5Engines; + private String[] excludeJUnit5Engines; + private List projectTestArtifacts; + private File includesFile; + private File excludesFile; + private List includes; + private List excludes; + private String test; + private boolean testFailureIgnore; private JUnitPlatformProviderInfo createJUnitPlatformProviderInfo( diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireDependencyResolverTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireDependencyResolverTest.java index c8f3b1890f..60b9428118 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireDependencyResolverTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireDependencyResolverTest.java @@ -19,40 +19,44 @@ package org.apache.maven.plugin.surefire; import java.io.File; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; -import org.apache.maven.artifact.resolver.ArtifactResolutionException; -import org.apache.maven.artifact.resolver.ArtifactResolutionRequest; -import org.apache.maven.artifact.resolver.ArtifactResolutionResult; -import org.apache.maven.artifact.resolver.DefaultResolutionErrorHandler; +import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.model.Dependency; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.surefire.SurefireDependencyResolver.RuntimeArtifactFilter; -import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; -import org.apache.maven.repository.RepositorySystem; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.ArtifactTypeRegistry; +import org.eclipse.aether.resolution.ArtifactRequest; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.resolution.DependencyRequest; +import org.eclipse.aether.resolution.DependencyResolutionException; +import org.eclipse.aether.resolution.DependencyResult; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.ArgumentCaptor; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec; import static org.apache.maven.plugin.surefire.SurefireDependencyResolver.PROVIDER_GROUP_ID; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.any; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -101,39 +105,29 @@ public void shouldBeFailWithinRange() throws InvalidVersionSpecificationExceptio } @Test - public void testResolveArtifact() throws InvalidVersionSpecificationException, MojoExecutionException { - final Artifact provider = createArtifact("surefire-junit-platform"); + public void testResolveArtifact() + throws InvalidVersionSpecificationException, MojoExecutionException, DependencyResolutionException { + + Artifact provider = createArtifact("surefire-junit-platform"); RepositorySystem repositorySystem = mock(RepositorySystem.class); - final ArtifactResolutionResult expectedResult = mock(ArtifactResolutionResult.class); - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .then(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - Object[] args = invocation.getArguments(); - assertThat(args).hasSize(1); - ArtifactResolutionRequest request = (ArtifactResolutionRequest) args[0]; - assertThat(request.getArtifact()).isSameAs(provider); - assertThat(request.isResolveTransitively()).isTrue(); - assertThat(request.getArtifactDependencies()).isNull(); - assertThat(request.getRemoteRepositories()).isNull(); - assertThat(request.getLocalRepository()).isNull(); - assertThat(request.getCollectionFilter()).isNotNull(); - assertThat(request.getCollectionFilter()).isInstanceOf(RuntimeArtifactFilter.class); - assertThat(request.getManagedVersionMap()).isNull(); - assertThat(request.getMirrors()).isEmpty(); - assertThat(request.getProxies()).isEmpty(); - assertThat(request.getResolutionFilter()).isNull(); - assertThat(request.getServers()).isEmpty(); - return expectedResult; - } - }); - - SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver( - repositorySystem, null, null, null, null, new DefaultResolutionErrorHandler(), null, false); - - ArtifactResolutionResult actualResult = surefireDependencyResolver.resolvePluginArtifact(provider); - - assertThat(actualResult).isSameAs(expectedResult); + RepositorySystemSession session = mock(RepositorySystemSession.class); + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(DependencyRequest.class); + + DependencyResult result = new DependencyResult(new DependencyRequest()); + when(repositorySystem.resolveDependencies(eq(session), requestCaptor.capture())) + .thenReturn(result); + + SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver(repositorySystem); + surefireDependencyResolver.resolveArtifacts(session, Collections.emptyList(), provider); + + DependencyRequest value = requestCaptor.getValue(); + assertThat(value).isNotNull(); + org.eclipse.aether.graph.Dependency requestDependency = + value.getCollectRequest().getRoot(); + assertThat(requestDependency.getArtifact().getGroupId()).isEqualTo(provider.getGroupId()); + assertThat(requestDependency.getArtifact().getArtifactId()).isEqualTo(provider.getArtifactId()); + assertThat(requestDependency.getArtifact().getVersion()).isEqualTo(provider.getVersion()); + assertThat(requestDependency.getArtifact().getExtension()).isEqualTo(provider.getType()); } @Test @@ -141,7 +135,7 @@ public void testGetProviderClasspath() throws Exception { Artifact commonJunit4 = createArtifact("common-junit4"); Artifact api = createArtifact("surefire-api"); - final Artifact provider = createArtifact("surefire-junit-platform"); + Artifact provider = createArtifact("surefire-junit-platform"); Artifact ext = createArtifact("org.apiguardian", "apiguardian-api"); Artifact logger = createArtifact("surefire-logger-api"); @@ -152,104 +146,53 @@ public void testGetProviderClasspath() throws Exception { providerArtifacts.add(ext); providerArtifacts.add(logger); - final ArtifactResolutionResult result = mock(ArtifactResolutionResult.class); - when(result.getArtifacts()).thenReturn(providerArtifacts); + List artifactResults = providerArtifacts.stream() + .map(RepositoryUtils::toArtifact) + .map(a -> new ArtifactResult(new ArtifactRequest()).setArtifact(a)) + .collect(Collectors.toList()); + + DependencyResult result = new DependencyResult(new DependencyRequest()); + result.setArtifactResults(artifactResults); RepositorySystem repositorySystem = mock(RepositorySystem.class); - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))) - .then(new Answer() { - @Override - public ArtifactResolutionResult answer(InvocationOnMock invocation) { - Object[] args = invocation.getArguments(); - assertThat(args).hasSize(1); - ArtifactResolutionRequest request = (ArtifactResolutionRequest) args[0]; - assertThat(request.getArtifact()).isSameAs(provider); - assertThat(request.isResolveTransitively()).isTrue(); - assertThat(request.getArtifactDependencies()).isNull(); - assertThat(request.getRemoteRepositories()).isNull(); - assertThat(request.getLocalRepository()).isNull(); - assertThat(request.getCollectionFilter()).isNotNull(); - assertThat(request.getCollectionFilter()).isInstanceOf(RuntimeArtifactFilter.class); - assertThat(request.getManagedVersionMap()).isNull(); - assertThat(request.getMirrors()).isEmpty(); - assertThat(request.getProxies()).isEmpty(); - assertThat(request.getResolutionFilter()).isNull(); - assertThat(request.getServers()).isEmpty(); - return result; - } - }); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).then(new Answer() { - @Override - public Artifact answer(InvocationOnMock invocation) { - Object[] args = invocation.getArguments(); - assertThat(args).hasSize(1); - Dependency request = (Dependency) args[0]; - assertThat(request.getGroupId()).isEqualTo(provider.getGroupId()); - assertThat(request.getArtifactId()).isEqualTo(provider.getArtifactId()); - assertThat(request.getVersion()).isEqualTo(provider.getVersion()); - assertThat(request.getType()).isEqualTo(provider.getType()); - assertThat(request.getScope()).isNull(); - return provider; - } - }); - - ConsoleLogger log = mock(ConsoleLogger.class); - - SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver( - repositorySystem, log, null, null, null, new DefaultResolutionErrorHandler(), null, false); - - when(log.isDebugEnabled()).thenReturn(true); - - Set classpath = surefireDependencyResolver.getProviderClasspath("surefire-junit-platform", "1"); + RepositorySystemSession session = mock(RepositorySystemSession.class); + + when(session.getArtifactTypeRegistry()).thenReturn(mock(ArtifactTypeRegistry.class)); + when(repositorySystem.resolveDependencies(eq(session), any())).thenReturn(result); + + SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver(repositorySystem); + Set classpath = surefireDependencyResolver.getProviderClasspath( + session, Collections.emptyList(), "surefire-junit-platform", "1"); assertThat(classpath).hasSize(5); Iterator it = classpath.iterator(); // result should be ordered - assertThat(it.next()).isSameAs(provider); - - assertThat(it.next()).isSameAs(api); - - assertThat(it.next()).isSameAs(logger); - - assertThat(it.next()).isSameAs(commonJunit4); - - assertThat(it.next()).isSameAs(ext); + assertThat(it.next()).isEqualTo(provider); + assertThat(it.next()).isEqualTo(api); + assertThat(it.next()).isEqualTo(logger); + assertThat(it.next()).isEqualTo(commonJunit4); + assertThat(it.next()).isEqualTo(ext); } @Test public void testGetProviderClasspathShouldPropagateTheResolutionException() throws Exception { - Artifact provider = createArtifact("surefire-junit-platform"); - provider.setFile(null); - Set providerArtifacts = new LinkedHashSet<>(); - providerArtifacts.add(provider); + RepositorySystem repositorySystem = mock(RepositorySystem.class); + RepositorySystemSession session = mock(RepositorySystemSession.class); + when(session.getArtifactTypeRegistry()).thenReturn(mock(ArtifactTypeRegistry.class)); - ArtifactResolutionResult result = mock(ArtifactResolutionResult.class); - when(result.getArtifacts()).thenReturn(providerArtifacts); - when(result.hasMetadataResolutionExceptions()).thenReturn(true); - ArtifactResolutionException resolutionException = - new ArtifactResolutionException("failed to resolve", provider); - when(result.getMetadataResolutionException(0)).thenReturn(resolutionException); + DependencyResolutionException dependencyResolutionException = + new DependencyResolutionException(new DependencyResult(new DependencyRequest()), new Exception()); + when(repositorySystem.resolveDependencies(eq(session), any())).thenThrow(dependencyResolutionException); - RepositorySystem repositorySystem = mock(RepositorySystem.class); - when(repositorySystem.resolve(any(ArtifactResolutionRequest.class))).thenReturn(result); - when(repositorySystem.createDependencyArtifact(any(Dependency.class))).thenReturn(provider); - - SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver( - repositorySystem, - mock(ConsoleLogger.class), - null, - null, - null, - new DefaultResolutionErrorHandler(), - null, - false); - - assertThatThrownBy(() -> surefireDependencyResolver.getProviderClasspath("surefire-junit-platform", "1")) + SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver(repositorySystem); + + assertThatThrownBy(() -> surefireDependencyResolver.getProviderClasspath( + session, Collections.emptyList(), "surefire-junit-platform", "1")) .isInstanceOf(MojoExecutionException.class) - .hasCause(resolutionException); + .hasCause(dependencyResolutionException); } @Test @@ -265,34 +208,28 @@ public void testResolvePluginDependencies() throws Exception { when(plugin.getDependencies()).thenReturn(singletonList(providerAsDependency)); RepositorySystem repositorySystem = mock(RepositorySystem.class); - when(repositorySystem.createDependencyArtifact(providerAsDependency)).thenReturn(providerAsArtifact); + RepositorySystemSession session = mock(RepositorySystemSession.class); + when(session.getArtifactTypeRegistry()).thenReturn(mock(ArtifactTypeRegistry.class)); - ArtifactResolutionResult resolutionResult = mock(ArtifactResolutionResult.class); - when(resolutionResult.getArtifacts()).thenReturn(singleton(providerAsArtifact)); + ArtifactResult artifactResult = + new ArtifactResult(new ArtifactRequest().setArtifact(RepositoryUtils.toArtifact(providerAsArtifact))); + artifactResult.setArtifact(RepositoryUtils.toArtifact(providerAsArtifact)); + DependencyResult result = new DependencyResult(new DependencyRequest()); + result.setArtifactResults(Collections.singletonList(artifactResult)); - ArgumentCaptor resolutionRequestCaptor = - ArgumentCaptor.forClass(ArtifactResolutionRequest.class); - when(repositorySystem.resolve(resolutionRequestCaptor.capture())).thenReturn(resolutionResult); + when(repositorySystem.resolveDependencies(eq(session), any())).thenReturn(result); Map pluginResolvedDependencies = singletonMap(PROVIDER_GROUP_ID + ":surefire-shadefire", providerAsArtifact); - SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver( - repositorySystem, null, null, null, null, new DefaultResolutionErrorHandler(), null, false); + SurefireDependencyResolver surefireDependencyResolver = new SurefireDependencyResolver(repositorySystem); - Map providers = - surefireDependencyResolver.resolvePluginDependencies(plugin, pluginResolvedDependencies); + Map providers = surefireDependencyResolver.resolvePluginDependencies( + session, Collections.emptyList(), plugin, pluginResolvedDependencies); assertThat(providers.values()).hasSize(1).containsOnly(providerAsArtifact); - assertThat(resolutionRequestCaptor.getAllValues()).hasSize(1); - - ArtifactResolutionRequest resolutionRequest = resolutionRequestCaptor.getValue(); - - assertThat(resolutionRequest.getArtifact()).isSameAs(providerAsArtifact); - - verify(repositorySystem).createDependencyArtifact(any(Dependency.class)); - verify(repositorySystem).resolve(any(ArtifactResolutionRequest.class)); + verify(repositorySystem).resolveDependencies(eq(session), any()); verifyNoMoreInteractions(repositorySystem); } @@ -308,8 +245,8 @@ private static Artifact createArtifact(String groupId, String artifactId) private static Artifact createArtifact(String groupId, String artifactId, String version) throws InvalidVersionSpecificationException { VersionRange versionSpec = createFromVersionSpec(version); - DefaultArtifact defaultArtifact = - new DefaultArtifact(groupId, artifactId, versionSpec, "compile", "jar", "", null); + DefaultArtifact defaultArtifact = new DefaultArtifact( + groupId, artifactId, versionSpec, null, "jar", null, new DefaultArtifactHandler("jar")); defaultArtifact.setFile(new File("")); return defaultArtifact; }