This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch resolver in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
commit 0d0db5c83284ea4376fce252ed8379d9c191b22a Author: tibordigana <tibordig...@apache.org> AuthorDate: Sun Jan 19 21:57:29 2020 +0100 dependencies for dynamic provider contain Maven artifacts from the MOJO plugin --- maven-failsafe-plugin/pom.xml | 5 - .../plugin/surefire/AbstractSurefireMojo.java | 14 +- .../surefire/SurefireDependencyResolver.java | 75 +++++---- .../surefire/SurefireDependencyResolverTest.java | 185 +++++++++------------ pom.xml | 10 +- 5 files changed, 127 insertions(+), 162 deletions(-) diff --git a/maven-failsafe-plugin/pom.xml b/maven-failsafe-plugin/pom.xml index 915d47e..a6474f4 100644 --- a/maven-failsafe-plugin/pom.xml +++ b/maven-failsafe-plugin/pom.xml @@ -70,11 +70,6 @@ <scope>provided</scope> </dependency> <dependency> - <groupId>org.apache.maven.surefire</groupId> - <artifactId>surefire-shared-utils</artifactId> - <version>3.0.0-M4</version> - </dependency> - <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> 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 7604c03..9387b54 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,7 @@ 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.model.Plugin; import org.apache.maven.plugin.surefire.extensions.SurefireConsoleOutputReporter; import org.apache.maven.plugin.surefire.extensions.SurefireStatelessReporter; import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter; @@ -3015,9 +3015,8 @@ public abstract class AbstractSurefireMojo else { ProjectBuildingRequest request = getSession().getProjectBuildingRequest(); - Collection<Dependency> pluginDependencies = getPluginDescriptor().getPlugin().getDependencies(); - Set<Artifact> engines = - surefireDependencyResolver.resolvePluginDependencies( request, pluginDependencies ); + Plugin plugin = getPluginDescriptor().getPlugin(); + Set<Artifact> engines = surefireDependencyResolver.resolvePluginDependencies( request, plugin ); if ( hasDependencyPlatformEngine( engines ) ) { Map<String, Artifact> engineArtifacts = artifactMapByVersionlessId( engines ); @@ -3220,10 +3219,11 @@ public abstract class AbstractSurefireMojo @Override @Nonnull - public Set<Artifact> getProviderClasspath() + public Set<Artifact> getProviderClasspath() throws MojoExecutionException { - return surefireDependencyResolver.addProviderToClasspath( getPluginArtifactMap(), getMojoArtifact(), - getApiArtifact(), getLoggerApiArtifact() ); + ProjectBuildingRequest request = getSession().getProjectBuildingRequest(); + Plugin plugin = getPluginDescriptor().getPlugin(); + return surefireDependencyResolver.resolvePluginDependencies( request, plugin ); } } 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 16cb6c8..f430fc4 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 @@ -36,11 +36,11 @@ 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.model.Plugin; 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; @@ -54,6 +54,7 @@ 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; +import static org.apache.maven.shared.artifact.filter.resolve.ScopeFilter.including; /** * Does dependency resolution and artifact handling for the surefire plugin. @@ -133,13 +134,14 @@ final class SurefireDependencyResolver } } - Set<Artifact> resolvePluginDependencies( ProjectBuildingRequest request, Collection<Dependency> pluginDependencies ) + Set<Artifact> resolvePluginDependencies( ProjectBuildingRequest request, Plugin plugin ) throws MojoExecutionException { + Collection<Dependency> pluginDependencies = plugin.getDependencies(); try { Iterable<ArtifactResult> resolvedPluginDependencies = depencencyResolver.resolveDependencies( request, - pluginDependencies, null, ScopeFilter.including( SCOPE_COMPILE, SCOPE_RUNTIME ) ); + pluginDependencies, null, including( SCOPE_COMPILE, SCOPE_COMPILE_PLUS_RUNTIME, SCOPE_RUNTIME ) ); Set<Artifact> resolved = new LinkedHashSet<>(); for ( ArtifactResult resolvedPluginDependency : resolvedPluginDependencies ) @@ -156,21 +158,35 @@ final class SurefireDependencyResolver ArtifactResolutionResult resolvePluginArtifact( Artifact artifact ) { - return resolveArtifact( artifact, pluginRemoteRepositories ); + return resolvePluginArtifact( artifact, new RuntimeArtifactFilter() ); } ArtifactResolutionResult resolveProjectArtifact( Artifact artifact ) { - return resolveArtifact( artifact, projectRemoteRepositories ); + return resolveProjectArtifact( artifact, new RuntimeArtifactFilter() ); } - private ArtifactResolutionResult resolveArtifact( Artifact artifact, List<ArtifactRepository> repositories ) + private ArtifactResolutionResult resolvePluginArtifact( Artifact artifact, ArtifactFilter filter ) + { + return resolveArtifact( artifact, pluginRemoteRepositories, filter ); + } + + private ArtifactResolutionResult resolveProjectArtifact( Artifact artifact, ArtifactFilter filter ) + { + return resolveArtifact( artifact, projectRemoteRepositories, filter ); + } + + private ArtifactResolutionResult resolveArtifact( Artifact artifact, List<ArtifactRepository> repositories, + ArtifactFilter filter ) { ArtifactResolutionRequest request = new ArtifactResolutionRequest() + //.setOffline( ) + // .setForceUpdate( ) + // set mirrors, proxies, servers - see MavenSession.Settings .setArtifact( artifact ) .setLocalRepository( localRepository ) .setResolveTransitively( true ) - .setCollectionFilter( new RuntimeArtifactFilter() ) + .setCollectionFilter( filter ) .setRemoteRepositories( repositories ); return repositorySystem.resolve( request ); @@ -204,36 +220,6 @@ final class SurefireDependencyResolver return artifactMapByVersionlessId( getProviderClasspath( providerArtifactId, providerVersion ) ); } - Set<Artifact> addProviderToClasspath( Map<String, Artifact> pluginArtifactMap, Artifact mojoPluginArtifact, - Artifact surefireApi, Artifact surefireLoggerApi ) - { - Set<Artifact> providerArtifacts = new LinkedHashSet<>(); - ArtifactResolutionResult artifactResolutionResult = resolvePluginArtifact( mojoPluginArtifact ); - for ( Artifact artifact : pluginArtifactMap.values() ) - { - if ( !artifactResolutionResult.getArtifacts().contains( artifact ) ) - { - providerArtifacts.add( artifact ); - for ( Artifact dependency : resolvePluginArtifact( artifact ).getArtifacts() ) - { - String groupId = dependency.getGroupId(); - String artifactId = dependency.getArtifactId(); - if ( groupId.equals( surefireApi.getGroupId() ) - && artifactId.equals( surefireApi.getArtifactId() ) ) - { - providerArtifacts.add( surefireApi ); - } - else if ( groupId.equals( surefireLoggerApi.getGroupId() ) - && artifactId.equals( surefireLoggerApi.getArtifactId() ) ) - { - providerArtifacts.add( surefireLoggerApi ); - } - } - } - } - return orderProviderArtifacts( providerArtifacts ); - } - private static Set<Artifact> orderProviderArtifacts( Set<Artifact> providerArtifacts ) { Set<Artifact> orderedProviderArtifacts = new LinkedHashSet<>(); @@ -269,11 +255,24 @@ final class SurefireDependencyResolver private static final Collection<String> 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 !artifact.isOptional() && ( scope == null || SCOPES.contains( scope ) ); + return ( filter == null || artifact.equals( filter ) ) + && !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 1ea7002..e593cc6 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 @@ -21,38 +21,48 @@ package org.apache.maven.plugin.surefire; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; -import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.resolver.ArtifactResolutionRequest; import org.apache.maven.artifact.resolver.ArtifactResolutionResult; 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.descriptor.PluginDescriptor; +import org.apache.maven.plugin.surefire.SurefireDependencyResolver.RuntimeArtifactFilter; 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.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 org.powermock.api.mockito.PowerMockito; import java.io.File; -import java.util.HashMap; -import java.util.HashSet; +import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashSet; -import java.util.Map; import java.util.Set; -import static java.util.Arrays.asList; import static java.util.Collections.singleton; -import static org.apache.maven.artifact.versioning.VersionRange.createFromVersion; +import static java.util.Collections.singletonList; +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.versioning.VersionRange.createFromVersionSpec; import static org.apache.maven.plugin.surefire.SurefireDependencyResolver.PROVIDER_GROUP_ID; import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.any; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.isNull; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.powermock.reflect.Whitebox.invokeMethod; @@ -114,7 +124,7 @@ public class SurefireDependencyResolverTest final Artifact provider = createArtifact( "surefire-junit-platform" ); RepositorySystem repositorySystem = mock( RepositorySystem.class ); final ArtifactResolutionResult expectedResult = mock( ArtifactResolutionResult.class ); - when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ) + when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ) .then( new Answer<ArtifactResolutionResult>() { @Override @@ -137,7 +147,9 @@ public class SurefireDependencyResolverTest assertThat( request.getCache() ) .isNull(); assertThat( request.getCollectionFilter() ) - .isNull(); + .isNotNull(); + assertThat( request.getCollectionFilter() ) + .isInstanceOf( RuntimeArtifactFilter.class ); assertThat( request.getManagedVersionMap() ) .isNull(); assertThat( request.getMirrors() ) @@ -182,8 +194,6 @@ public class SurefireDependencyResolverTest providerArtifacts.add( ext ); providerArtifacts.add( logger ); - final String providerVersion = "5.3.1"; - final ArtifactResolutionResult result = mock( ArtifactResolutionResult.class ); when( result.getArtifacts() ) .thenReturn( providerArtifacts ); @@ -212,7 +222,9 @@ public class SurefireDependencyResolverTest assertThat( request.getCache() ) .isNull(); assertThat( request.getCollectionFilter() ) - .isNull(); + .isNotNull(); + assertThat( request.getCollectionFilter() ) + .isInstanceOf( RuntimeArtifactFilter.class ); assertThat( request.getManagedVersionMap() ) .isNull(); assertThat( request.getMirrors() ) @@ -237,15 +249,15 @@ public class SurefireDependencyResolverTest .hasSize( 1 ); Dependency request = (Dependency) args[0]; assertThat( request.getGroupId() ) - .isEqualTo( "org.apache.maven.surefire" ); + .isEqualTo( provider.getGroupId() ); assertThat( request.getArtifactId() ) - .isEqualTo( "surefire-junit-platform" ); + .isEqualTo( provider.getArtifactId() ); assertThat( request.getVersion() ) - .isEqualTo( providerVersion ); + .isEqualTo( provider.getVersion() ); assertThat( request.getType() ) - .isEqualTo( "jar" ); + .isEqualTo( provider.getType() ); assertThat( request.getScope() ) - .isEqualTo( "test" ); + .isNull(); return provider; } } ); @@ -258,7 +270,7 @@ public class SurefireDependencyResolverTest when( log.isDebugEnabled() ) .thenReturn( true ); - Set<Artifact> classpath = surefireDependencyResolver.getProviderClasspath( "surefire-junit-platform", "5.3.1" ); + Set<Artifact> classpath = surefireDependencyResolver.getProviderClasspath( "surefire-junit-platform", "1" ); assertThat( classpath ) .hasSize( 4 ); @@ -281,101 +293,57 @@ public class SurefireDependencyResolverTest @Test public void testAddProviderToClasspath() throws Exception { - final Artifact plugin = createArtifact( "maven-surefire-plugin" ); - final Artifact common = createArtifact( "maven-surefire-common" ); - final Artifact api = createArtifact( "surefire-api" ); - final Artifact provider = createArtifact( "surefire-junit-platform" ); - final Artifact ext = createArtifact( "org.apiguardian", "apiguardian-api" ); - final Artifact logger = createArtifact( "surefire-logger-api" ); - - Set<Artifact> pluginArtifacts = new LinkedHashSet<>(); - pluginArtifacts.add( plugin ); - pluginArtifacts.add( common ); - pluginArtifacts.add( api ); - pluginArtifacts.add( logger ); - - ArtifactFactory artifactFactory = mock( ArtifactFactory.class ); - VersionRange pluginVersion = createFromVersion( "3.0.0" ); - when( artifactFactory.createDependencyArtifact( eq( "org.apache.maven.surefire" ), - eq( "maven-surefire-plugin" ), - eq( pluginVersion ), - eq( "jar" ), - isNull( String.class ), - eq( "compile" ) ) ) - .thenReturn( plugin ); - - final ArtifactResolutionResult pluginResult = mock( ArtifactResolutionResult.class ); - when( pluginResult.getArtifacts() ) - .thenReturn( pluginArtifacts ); - - final ArtifactResolutionResult apiResult = mock( ArtifactResolutionResult.class ); - when( apiResult.getArtifacts() ) - .thenReturn( singleton( api ) ); - - final ArtifactResolutionResult loggerResult = mock( ArtifactResolutionResult.class ); - when( loggerResult.getArtifacts() ) - .thenReturn( singleton( logger ) ); - - final ArtifactResolutionResult extResult = mock( ArtifactResolutionResult.class ); - when( extResult.getArtifacts() ) - .thenReturn( singleton( ext ) ); - - final ArtifactResolutionResult providerResult = mock( ArtifactResolutionResult.class ); - when( providerResult.getArtifacts() ) - .thenReturn( new HashSet<>( asList( provider, api, logger, ext ) ) ); + Dependency providerAsDependency = new Dependency(); + providerAsDependency.setGroupId( PROVIDER_GROUP_ID ); + providerAsDependency.setArtifactId( "surefire-shadefire" ); + providerAsDependency.setVersion( "1" ); - RepositorySystem repositorySystem = mock( RepositorySystem.class ); - when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ) - .then( new Answer<ArtifactResolutionResult>() - { - @Override - public ArtifactResolutionResult answer( InvocationOnMock invocation ) - { - Object[] args = invocation.getArguments(); - assertThat( args ).hasSize( 1 ); - ArtifactResolutionRequest request = (ArtifactResolutionRequest) args[0]; - Artifact artifactToResolve = request.getArtifact(); - if ( artifactToResolve == plugin ) - { - return pluginResult; - } - else if ( artifactToResolve == provider ) - { - return providerResult; - } - else if ( artifactToResolve == api ) - { - return apiResult; - } - else if ( artifactToResolve == logger ) - { - return loggerResult; - } - else if ( artifactToResolve == ext ) - { - return extResult; - } - throw new AssertionError( "what artifact are we going to resolve? " + artifactToResolve ); - } - } ); + final Artifact providerAsArtifact = createArtifact( "surefire-shadefire" ); + PluginDescriptor pluginDescriptor = PowerMockito.mock( PluginDescriptor.class ); + Plugin plugin = PowerMockito.mock( Plugin.class ); + when( pluginDescriptor.getPlugin() ) + .thenReturn( plugin ); + when( plugin.getDependencies() ) + .thenReturn( singletonList( providerAsDependency ) ); + + DependencyResolver depencencyResolver = mock( DependencyResolver.class ); SurefireDependencyResolver surefireDependencyResolver = - new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, null ); + new SurefireDependencyResolver( null, null, null, null, null, null, depencencyResolver ); + + ProjectBuildingRequest request = mock( ProjectBuildingRequest.class ); - Map<String, Artifact> pluginArtifactsMapping = new HashMap<>(); - pluginArtifactsMapping.put( plugin.getGroupId() + ":" + plugin.getArtifactId(), plugin ); - pluginArtifactsMapping.put( common.getGroupId() + ":" + common.getArtifactId(), common ); - pluginArtifactsMapping.put( api.getGroupId() + ":" + api.getArtifactId(), api ); - pluginArtifactsMapping.put( logger.getGroupId() + ":" + logger.getArtifactId(), logger ); - pluginArtifactsMapping.put( provider.getGroupId() + ":" + provider.getArtifactId(), provider ); - pluginArtifactsMapping.put( ext.getGroupId() + ":" + ext.getArtifactId(), ext ); + ArgumentCaptor<Collection<Dependency>> dep = ArgumentCaptor.forClass( Collection.class ); + ArgumentCaptor<ScopeFilter> filter = ArgumentCaptor.forClass( ScopeFilter.class ); + ArtifactResult result = mock( ArtifactResult.class ); + when( result.getArtifact() ).thenReturn( providerAsArtifact ); + when( depencencyResolver.resolveDependencies( same( request ), dep.capture(), isNull( Collection.class ), + filter.capture() ) ) + .thenReturn( singleton( result ) ); - Set<Artifact> cp = - surefireDependencyResolver.addProviderToClasspath( pluginArtifactsMapping, plugin, api, logger ); + final ArtifactResolutionResult resolutionResult = mock( ArtifactResolutionResult.class ); + when( resolutionResult.getArtifacts() ) + .thenReturn( singleton( providerAsArtifact ) ); - assertThat( cp ) - .hasSize( 4 ) - .containsOnly( provider, api, logger, ext ); + Set<Artifact> providers = surefireDependencyResolver.resolvePluginDependencies( request, plugin ); + + verify( depencencyResolver, times( 1 ) ) + .resolveDependencies( request, dep.getValue(), null, filter.getValue() ); + + assertThat( providers ) + .hasSize( 1 ) + .containsOnly( providerAsArtifact ); + + assertThat( dep.getValue() ) + .hasSize( 1 ) + .containsOnly( providerAsDependency ); + + assertThat( filter.getValue().getIncluded() ) + .containsOnly( SCOPE_COMPILE, SCOPE_COMPILE_PLUS_RUNTIME, SCOPE_RUNTIME ); + + assertThat( filter.getValue().getExcluded() ) + + .isNull(); } @Test @@ -424,7 +392,6 @@ public class SurefireDependencyResolverTest return createArtifact( PROVIDER_GROUP_ID, artifactId ); } - private static Artifact createArtifact( String groupId, String artifactId ) throws InvalidVersionSpecificationException { diff --git a/pom.xml b/pom.xml index 0f6d440..1bcb356 100644 --- a/pom.xml +++ b/pom.xml @@ -219,11 +219,15 @@ <exclusions> <exclusion> <groupId>org.apache.maven.shared</groupId> - <artifactId>maven-plugin-testing-harness</artifactId> + <artifactId>maven-shared-utils</artifactId> </exclusion> <exclusion> - <groupId>org.apache.maven.shared</groupId> - <artifactId>maven-shared-utils</artifactId> + <groupId>org.apache.maven</groupId> + <artifactId>maven-model</artifactId> + </exclusion> + <exclusion> + <groupId>org.sonatype.sisu</groupId> + <artifactId>sisu-inject-plexus</artifactId> </exclusion> </exclusions> </dependency>