This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch SUREFIRE-1585-tibor2 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
The following commit(s) were added to refs/heads/SUREFIRE-1585-tibor2 by this push: new 828d9a3 [SUREFIRE-1585] Align JUnit Platform version at runtime 828d9a3 is described below commit 828d9a3b913c8cd6a35592d45827ff78410e29b6 Author: tibordigana <tibordig...@apache.org> AuthorDate: Tue Feb 26 07:57:17 2019 +0100 [SUREFIRE-1585] Align JUnit Platform version at runtime --- maven-surefire-common/pom.xml | 27 +++++- .../plugin/surefire/AbstractSurefireMojo.java | 108 +++++++++++++-------- .../apache/maven/plugin/surefire/ProviderInfo.java | 2 +- .../surefire/SurefireDependencyResolver.java | 69 ++++++++++--- .../surefire/SurefireDependencyResolverTest.java | 6 +- 5 files changed, 149 insertions(+), 63 deletions(-) diff --git a/maven-surefire-common/pom.xml b/maven-surefire-common/pom.xml index f81f258..e95190b 100644 --- a/maven-surefire-common/pom.xml +++ b/maven-surefire-common/pom.xml @@ -81,6 +81,29 @@ <artifactId>maven-common-artifact-filters</artifactId> </dependency> <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-artifact-transfer</artifactId> + <version>0.10.1</version> + <exclusions> + <exclusion> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact</artifactId> + </exclusion> + <exclusion> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-component-annotations</artifactId> + </exclusion> + <exclusion> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-utils</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-java</artifactId> </dependency> @@ -165,8 +188,8 @@ </artifactSet> <relocations> <relocation> - <pattern>org.apache.maven.shared</pattern> - <shadedPattern>org.apache.maven.surefire.shade.common.org.apache.maven.shared</shadedPattern> + <pattern>org.apache.maven.shared.utils</pattern> + <shadedPattern>org.apache.maven.surefire.shade.common.org.apache.maven.shared.utils</shadedPattern> </relocation> <relocation> <pattern>org.apache.commons.io</pattern> 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 39e88c9..7d44afc 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 @@ -24,7 +24,9 @@ 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.model.Dependency; import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.repository.RepositorySystem; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; @@ -52,6 +54,7 @@ import org.apache.maven.plugin.surefire.util.DirectoryScanner; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter; +import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver; import org.apache.maven.shared.utils.io.FileUtils; import org.apache.maven.surefire.booter.ClassLoaderConfiguration; import org.apache.maven.surefire.booter.Classpath; @@ -92,6 +95,7 @@ import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; @@ -734,6 +738,9 @@ public abstract class AbstractSurefireMojo @Component private RepositorySystem repositorySystem; + @Component + private DependencyResolver dependencyResolver; + private Artifact surefireBooterArtifact; private Toolchain toolchain; @@ -795,7 +802,7 @@ public abstract class AbstractSurefireMojo */ protected Artifact getMojoArtifact() { - return pluginDescriptor.getPluginArtifact(); + return getPluginDescriptor().getPluginArtifact(); } private String getDefaultExcludes() @@ -803,7 +810,7 @@ public abstract class AbstractSurefireMojo return "**/*$*"; } - private SurefireDependencyResolver dependencyResolver; + private SurefireDependencyResolver surefireDependencyResolver; private TestListResolver specificTests; @@ -1016,11 +1023,11 @@ public abstract class AbstractSurefireMojo private void createDependencyResolver() { - dependencyResolver = new SurefireDependencyResolver( getRepositorySystem(), + surefireDependencyResolver = new SurefireDependencyResolver( getRepositorySystem(), getConsoleLogger(), getLocalRepository(), getRemoteRepositories(), getProjectRemoteRepositories(), - getPluginName() ); + getPluginName(), dependencyResolver ); } protected List<ProviderInfo> createProviders( TestClassPath testClasspath ) @@ -2576,7 +2583,9 @@ public abstract class AbstractSurefireMojo if ( existing == null ) { List<String> items = new ArrayList<>(); - for ( Artifact artifact : dependencyResolver.resolvePluginArtifact( surefireArtifact ).getArtifacts() ) + Set<Artifact> booterArtifacts = + surefireDependencyResolver.resolvePluginArtifact( surefireArtifact ).getArtifacts(); + for ( Artifact artifact : booterArtifacts ) { getConsoleLogger().debug( "Adding to " + getPluginName() + " booter test classpath: " + artifact.getFile().getAbsolutePath() @@ -2804,7 +2813,7 @@ public abstract class AbstractSurefireMojo { Artifact surefireArtifact = getBooterArtifact(); String version = surefireArtifact.getBaseVersion(); - return dependencyResolver.getProviderClasspath( "surefire-testng", version ); + return surefireDependencyResolver.getProviderClasspath( "surefire-testng", version ); } } @@ -2835,7 +2844,7 @@ public abstract class AbstractSurefireMojo // add the JUnit provider as default - it doesn't require JUnit to be present, // since it supports POJO tests. String version = surefireBooterArtifact.getBaseVersion(); - return dependencyResolver.getProviderClasspath( "surefire-junit3", version ); + return surefireDependencyResolver.getProviderClasspath( "surefire-junit3", version ); } } @@ -2874,7 +2883,7 @@ public abstract class AbstractSurefireMojo public Set<Artifact> getProviderClasspath() { String version = surefireBooterArtifact.getBaseVersion(); - return dependencyResolver.getProviderClasspath( "surefire-junit4", version ); + return surefireDependencyResolver.getProviderClasspath( "surefire-junit4", version ); } } @@ -2914,38 +2923,42 @@ public abstract class AbstractSurefireMojo @Override @Nonnull - public Set<Artifact> getProviderClasspath() + public Set<Artifact> getProviderClasspath() throws MojoExecutionException { String surefireVersion = surefireBooterArtifact.getBaseVersion(); Map<String, Artifact> providerArtifacts = - dependencyResolver.getProviderClasspathAsMap( "surefire-junit-platform", surefireVersion ); + surefireDependencyResolver.getProviderClasspathAsMap( "surefire-junit-platform", surefireVersion ); Map<String, Artifact> testDependencies = testClasspath.getTestDependencies(); if ( hasDependencyPlatformEngine( testDependencies ) ) { String filterTestDependency = "org.junit.platform:junit-platform-engine"; - logDebugOrCliShowErrors( "Test dependencies contain " + filterTestDependency ); + getConsoleLogger().debug( "Test dependencies contain " + filterTestDependency ); narrowProviderDependencies( filterTestDependency, providerArtifacts, testDependencies ); } - else if ( hasDependencyPlatformEngine( getPluginArtifactMap() ) ) - { - Set<Artifact> pluginArtifacts = - dependencyResolver.resolvePluginArtifactOffline( getMojoArtifact() ).getArtifacts(); - Map<String, Artifact> engineArtifacts = new HashMap<>( getPluginArtifactMap() ); - engineArtifacts.keySet().removeAll( artifactMapByVersionlessId( pluginArtifacts ).keySet() ); - providerArtifacts.putAll( engineArtifacts ); - alignVersions( providerArtifacts, engineArtifacts ); - } - else if ( hasDependencyJupiterAPI( testDependencies ) ) + else { - String engineGroupId = "org.junit.jupiter"; - String engineArtifactId = "junit-jupiter-engine"; - String engineCoordinates = engineGroupId + ":" + engineArtifactId; - String api = "org.junit.jupiter:junit-jupiter-api"; - logDebugOrCliShowErrors( "Test dependencies contain " + api + ". Resolving " + engineCoordinates ); - String engineVersion = testDependencies.get( api ).getBaseVersion(); - addEngineByApi( engineGroupId, engineArtifactId, engineVersion, - providerArtifacts, testDependencies ); + ProjectBuildingRequest request = getSession().getProjectBuildingRequest(); + Collection<Dependency> pluginDependencies = getPluginDescriptor().getPlugin().getDependencies(); + Set<Artifact> engines = + surefireDependencyResolver.resolvePluginDependencies( request, pluginDependencies ); + if ( hasDependencyPlatformEngine( engines ) ) + { + Map<String, Artifact> engineArtifacts = artifactMapByVersionlessId( engines ); + providerArtifacts.putAll( engineArtifacts ); + alignVersions( providerArtifacts, engineArtifacts ); + } + else if ( hasDependencyJupiterAPI( testDependencies ) ) + { + String engineGroupId = "org.junit.jupiter"; + String engineArtifactId = "junit-jupiter-engine"; + String engineCoordinates = engineGroupId + ":" + engineArtifactId; + String api = "org.junit.jupiter:junit-jupiter-api"; + getConsoleLogger().debug( "Test dependencies contain " + api + ". Resolving " + engineCoordinates ); + String engineVersion = testDependencies.get( api ).getBaseVersion(); + addEngineByApi( engineGroupId, engineArtifactId, engineVersion, + providerArtifacts, testDependencies ); + } } providerArtifacts.keySet().removeAll( testDependencies.keySet() ); return new LinkedHashSet<>( providerArtifacts.values() ); @@ -2979,7 +2992,7 @@ public abstract class AbstractSurefireMojo for ( Artifact engineDep : resolve( groupId, artifactId, version, classifier, type ) ) { providerArtifacts.remove( engineDep.getGroupId() + ":" + engineDep.getArtifactId() ); - logDebugOrCliShowErrors( "Removed artifact " + engineDep + getConsoleLogger().debug( "Removed artifact " + engineDep + " from provider. Already appears in test classpath." ); } alignVersions( providerArtifacts, testDependencies ); @@ -3003,9 +3016,9 @@ public abstract class AbstractSurefireMojo { ArtifactHandler handler = junitPlatformArtifact.getArtifactHandler(); Artifact artifact = new DefaultArtifact( g, a, v, null, t, c, handler ); - logDebugOrCliShowErrors( "Resolving artifact " + g + ":" + a + ":" + v ); - Set<Artifact> r = dependencyResolver.resolveProjectArtifact( artifact ).getArtifacts(); - logDebugOrCliShowErrors( "Resolved artifact " + g + ":" + a + ":" + v + " to " + r ); + getConsoleLogger().debug( "Resolving artifact " + g + ":" + a + ":" + v ); + Set<Artifact> r = surefireDependencyResolver.resolveProjectArtifact( artifact ).getArtifacts(); + getConsoleLogger().debug( "Resolved artifact " + g + ":" + a + ":" + v + " to " + r ); return r; } @@ -3015,17 +3028,30 @@ public abstract class AbstractSurefireMojo || hasGroupArtifactId( "org.junit.jupiter", "junit-jupiter-api", getProject().getArtifact() ); } - private boolean hasDependencyPlatformCommons( Map<String, Artifact> dependencies ) - { - return dependencies.containsKey( "org.junit.platform:junit-platform-commons" ) - || hasGroupArtifactId( "org.junit.platform", "junit-platform-commons", getProject().getArtifact() ); - } - private boolean hasDependencyPlatformEngine( Map<String, Artifact> dependencies ) { return dependencies.containsKey( "org.junit.platform:junit-platform-engine" ) || hasGroupArtifactId( "org.junit.platform", "junit-platform-engine", getProject().getArtifact() ); } + + private boolean hasDependencyPlatformEngine( Collection<Artifact> dependencies ) + { + if ( hasGroupArtifactId( "org.junit.platform", "junit-platform-engine", getProject().getArtifact() ) ) + { + return true; + } + + for ( Artifact dependency : dependencies ) + { + if ( dependency.getGroupId().equals( "org.junit.platform" ) + && dependency.getArtifactId().equals( "junit-platform-engine" ) ) + { + return true; + } + } + + return false; + } } final class JUnitCoreProviderInfo @@ -3072,7 +3098,7 @@ public abstract class AbstractSurefireMojo public Set<Artifact> getProviderClasspath() { String version = surefireBooterArtifact.getBaseVersion(); - return dependencyResolver.getProviderClasspath( "surefire-junit47", version ); + return surefireDependencyResolver.getProviderClasspath( "surefire-junit47", version ); } } @@ -3120,7 +3146,7 @@ public abstract class AbstractSurefireMojo @Nonnull public Set<Artifact> getProviderClasspath() { - return dependencyResolver.addProviderToClasspath( getPluginArtifactMap(), getMojoArtifact(), + return surefireDependencyResolver.addProviderToClasspath( getPluginArtifactMap(), getMojoArtifact(), getCommonArtifact(), getApiArtifact(), getLoggerApiArtifact() ); } } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java index cb63cc1..fea74fd 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java @@ -36,7 +36,7 @@ public interface ProviderInfo boolean isApplicable(); @Nonnull - Set<Artifact> getProviderClasspath(); + Set<Artifact> getProviderClasspath() throws MojoExecutionException; void addProviderProperties() throws MojoExecutionException; } 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 5c05a1f..170107c 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 @@ -19,6 +19,7 @@ package org.apache.maven.plugin.surefire; * under the License. */ +import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -29,18 +30,28 @@ import org.apache.maven.artifact.Artifact; 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.filter.ArtifactFilter; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.OverConstrainedVersionException; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.model.Dependency; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.repository.RepositorySystem; +import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter; +import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult; +import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver; +import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import static org.apache.maven.artifact.Artifact.SCOPE_TEST; +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; @@ -81,10 +92,13 @@ final class SurefireDependencyResolver private final String pluginName; + private final DependencyResolver depencencyResolver; + SurefireDependencyResolver( RepositorySystem repositorySystem, ConsoleLogger log, ArtifactRepository localRepository, List<ArtifactRepository> pluginRemoteRepositories, - List<ArtifactRepository> projectRemoteRepositories, String pluginName ) + List<ArtifactRepository> projectRemoteRepositories, String pluginName, + DependencyResolver depencencyResolver ) { this.repositorySystem = repositorySystem; this.log = log; @@ -92,6 +106,7 @@ final class SurefireDependencyResolver this.pluginRemoteRepositories = pluginRemoteRepositories; this.projectRemoteRepositories = projectRemoteRepositories; this.pluginName = pluginName; + this.depencencyResolver = depencencyResolver; } static boolean isWithinVersionSpec( @Nullable Artifact artifact, @Nonnull String versionSpec ) @@ -118,9 +133,25 @@ final class SurefireDependencyResolver } } - ArtifactResolutionResult resolvePluginArtifactOffline( Artifact artifact ) + Set<Artifact> resolvePluginDependencies( ProjectBuildingRequest request, Collection<Dependency> pluginDependencies ) + throws MojoExecutionException { - return resolveArtifact( artifact, null ); + try + { + Iterable<ArtifactResult> resolvedPluginDependencies = depencencyResolver.resolveDependencies( request, + pluginDependencies, null, ScopeFilter.including( SCOPE_COMPILE, SCOPE_RUNTIME ) ); + + Set<Artifact> resolved = new LinkedHashSet<>(); + for ( ArtifactResult resolvedPluginDependency : resolvedPluginDependencies ) + { + resolved.add( resolvedPluginDependency.getArtifact() ); + } + return resolved; + } + catch ( DependencyResolverException e ) + { + throw new MojoExecutionException( e.getLocalizedMessage(), e ); + } } ArtifactResolutionResult resolvePluginArtifact( Artifact artifact ) @@ -136,17 +167,11 @@ final class SurefireDependencyResolver private ArtifactResolutionResult resolveArtifact( Artifact artifact, List<ArtifactRepository> repositories ) { ArtifactResolutionRequest request = new ArtifactResolutionRequest() - .setArtifact( artifact ) - .setLocalRepository( localRepository ) - .setResolveTransitively( true ); - if ( repositories == null ) - { - request.setOffline( true ); - } - else - { - request.setRemoteRepositories( repositories ); - } + .setArtifact( artifact ) + .setLocalRepository( localRepository ) + .setResolveTransitively( true ) + .setCollectionFilter( new RuntimeArtifactFilter() ) + .setRemoteRepositories( repositories ); return repositorySystem.resolve( request ); } @@ -241,7 +266,19 @@ final class SurefireDependencyResolver dependency.setArtifactId( providerArtifactId ); dependency.setVersion( providerVersion ); dependency.setType( "jar" ); - dependency.setScope( SCOPE_TEST ); return dependency; } + + static class RuntimeArtifactFilter implements ArtifactFilter + { + private static final Collection<String> SCOPES = + asList( SCOPE_COMPILE, SCOPE_COMPILE_PLUS_RUNTIME, SCOPE_RUNTIME ); + + @Override + public boolean include( Artifact artifact ) + { + String scope = artifact.getScope(); + return !artifact.isOptional() && ( scope == null || SCOPES.contains( scope ) ); + } + } } 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 fb03f4a..fdb1bbe 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 @@ -145,7 +145,7 @@ public class SurefireDependencyResolverTest } ); SurefireDependencyResolver surefireDependencyResolver = - new SurefireDependencyResolver( repositorySystem, null, null, null, null, null ); + new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, null ); ArtifactResolutionResult actualResult = surefireDependencyResolver.resolvePluginArtifact( provider ); @@ -243,7 +243,7 @@ public class SurefireDependencyResolverTest ConsoleLogger log = mock( ConsoleLogger.class ); SurefireDependencyResolver surefireDependencyResolver = - new SurefireDependencyResolver( repositorySystem, log, null, null, null, null ); + new SurefireDependencyResolver( repositorySystem, log, null, null, null, null, null ); when( log.isDebugEnabled() ) .thenReturn( true ); @@ -349,7 +349,7 @@ public class SurefireDependencyResolverTest } ); SurefireDependencyResolver surefireDependencyResolver = - new SurefireDependencyResolver( repositorySystem, null, null, null, null, null ); + new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, null ); Map<String, Artifact> pluginArtifactsMapping = new HashMap<>(); pluginArtifactsMapping.put( plugin.getGroupId() + ":" + plugin.getArtifactId(), plugin );