diff --git a/maven-surefire-common/pom.xml b/maven-surefire-common/pom.xml index f37f072cd5..05e5dc731a 100644 --- a/maven-surefire-common/pom.xml +++ b/maven-surefire-common/pom.xml @@ -62,10 +62,6 @@ org.apache.maven.shared maven-common-artifact-filters - - org.apache.maven.shared - maven-artifact-transfer - org.codehaus.plexus plexus-java 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 54ed1f82d4..d8b65ae968 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 @@ -30,7 +30,6 @@ import org.apache.maven.plugin.surefire.extensions.SurefireStatelessReporter; import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter; 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; @@ -58,7 +57,6 @@ 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.surefire.shared.utils.io.FileUtils; import org.apache.maven.surefire.booter.ClassLoaderConfiguration; import org.apache.maven.surefire.booter.Classpath; @@ -825,9 +823,6 @@ public abstract class AbstractSurefireMojo @Component private RepositorySystem repositorySystem; - @Component - private DependencyResolver dependencyResolver; - private Toolchain toolchain; private int effectiveForkCount = -1; @@ -1018,7 +1013,7 @@ private void setupStuff() throws MojoFailureException getConsoleLogger(), getLocalRepository(), getRemoteRepositories(), getProjectRemoteRepositories(), - getPluginName(), getDependencyResolver(), + getPluginName(), getSession().isOffline() ); if ( getBooterArtifact() == null ) @@ -1405,16 +1400,6 @@ public void setRepositorySystem( RepositorySystem repositorySystem ) this.repositorySystem = repositorySystem; } - public DependencyResolver getDependencyResolver() - { - return dependencyResolver; - } - - public void setDependencyResolver( DependencyResolver dependencyResolver ) - { - this.dependencyResolver = dependencyResolver; - } - private boolean existsModuleDescriptor( ResolvePathResultWrapper resolvedJavaModularityResult ) { return resolvedJavaModularityResult.getResolvePathResult() != null; @@ -3292,10 +3277,9 @@ public Set getProviderClasspath() throws MojoExecutionException surefireDependencyResolver.getProviderClasspathAsMap( "surefire-junit-platform", surefireVersion ); Map testDeps = testClasspath.getTestDependencies(); - ProjectBuildingRequest request = getSession().getProjectBuildingRequest(); Plugin plugin = getPluginDescriptor().getPlugin(); Map pluginDeps = - surefireDependencyResolver.resolvePluginDependencies( request, plugin, getPluginArtifactMap() ); + surefireDependencyResolver.resolvePluginDependencies( plugin, getPluginArtifactMap() ); if ( hasDependencyPlatformEngine( pluginDeps ) ) { @@ -3521,10 +3505,9 @@ public List getJpmsArguments( @Nonnull ProviderRequirements forkRequir @Nonnull public Set getProviderClasspath() throws MojoExecutionException { - ProjectBuildingRequest request = getSession().getProjectBuildingRequest(); Plugin plugin = getPluginDescriptor().getPlugin(); Map providerArtifacts = - surefireDependencyResolver.resolvePluginDependencies( request, plugin, getPluginArtifactMap() ); + surefireDependencyResolver.resolvePluginDependencies( plugin, getPluginArtifactMap() ); return new LinkedHashSet<>( providerArtifacts.values() ); } } 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 b6ce700549..081fed2e3b 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,9 @@ * under the License. */ +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; @@ -38,16 +41,8 @@ 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.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 java.util.Arrays.asList; import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE; @@ -55,7 +50,6 @@ 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. @@ -68,19 +62,19 @@ final class SurefireDependencyResolver static final String PROVIDER_GROUP_ID = "org.apache.maven.surefire"; private static final String[] PROVIDER_CLASSPATH_ORDER = { - "surefire-junit3", - "surefire-junit4", - "surefire-junit47", - "surefire-testng", - "surefire-junit-platform", - "surefire-api", - "surefire-logger-api", - "surefire-shared-utils", - "common-java5", - "common-junit3", - "common-junit4", - "common-junit48", - "common-testng-utils" + "surefire-junit3", + "surefire-junit4", + "surefire-junit47", + "surefire-testng", + "surefire-junit-platform", + "surefire-api", + "surefire-logger-api", + "surefire-shared-utils", + "common-java5", + "common-junit3", + "common-junit4", + "common-junit48", + "common-testng-utils" }; private final RepositorySystem repositorySystem; @@ -95,15 +89,14 @@ final class SurefireDependencyResolver private final String pluginName; - private final DependencyResolver dependencyResolver; private final boolean offline; SurefireDependencyResolver( RepositorySystem repositorySystem, ConsoleLogger log, ArtifactRepository localRepository, List pluginRemoteRepositories, - List projectRemoteRepositories, String pluginName, - DependencyResolver dependencyResolver, boolean offline ) + List projectRemoteRepositories, + String pluginName, boolean offline ) { this.repositorySystem = repositorySystem; this.log = log; @@ -111,7 +104,6 @@ final class SurefireDependencyResolver this.pluginRemoteRepositories = pluginRemoteRepositories; this.projectRemoteRepositories = projectRemoteRepositories; this.pluginName = pluginName; - this.dependencyResolver = dependencyResolver; this.offline = offline; } @@ -139,20 +131,17 @@ static boolean isWithinVersionSpec( @Nullable Artifact artifact, @Nonnull String } } - Map resolvePluginDependencies( ProjectBuildingRequest request, - Plugin plugin, Map pluginResolvedDependencies ) - throws MojoExecutionException + Map resolvePluginDependencies( Plugin plugin, Map pluginResolvedDependencies ) { + Map resolved = new LinkedHashMap<>(); Collection pluginDependencies = plugin.getDependencies(); - try - { - Iterable resolvedArtifacts = dependencyResolver.resolveDependencies( request, - pluginDependencies, null, including( RuntimeArtifactFilter.SCOPES ) ); - Map resolved = new LinkedHashMap<>(); - for ( ArtifactResult resolvedArtifact : resolvedArtifacts ) + for ( Dependency dependency : pluginDependencies ) + { + Artifact dependencyArtifact = repositorySystem.createDependencyArtifact( dependency ); + ArtifactResolutionResult artifactResolutionResult = resolvePluginArtifact( dependencyArtifact ); + for ( Artifact artifact : artifactResolutionResult.getArtifacts() ) { - Artifact artifact = resolvedArtifact.getArtifact(); String key = artifact.getGroupId() + ":" + artifact.getArtifactId(); Artifact resolvedPluginDependency = pluginResolvedDependencies.get( key ); if ( resolvedPluginDependency != null ) @@ -160,12 +149,8 @@ Map resolvePluginDependencies( ProjectBuildingRequest request, resolved.put( key, artifact ); } } - return resolved; - } - catch ( DependencyResolverException e ) - { - throw new MojoExecutionException( e.getLocalizedMessage(), e ); } + return resolved; } ArtifactResolutionResult resolvePluginArtifact( Artifact artifact ) @@ -192,12 +177,12 @@ private ArtifactResolutionResult resolveArtifact( Artifact artifact, List getProviderClasspathAsMap( String providerArtifactId, Stri return artifactMapByVersionlessId( getProviderClasspath( providerArtifactId, providerVersion ) ); } + // FIXME + // method argument should be unchanged + // what if providerArtifacts will be unmodifiable private static Set orderProviderArtifacts( Set providerArtifacts ) { Set orderedProviderArtifacts = new LinkedHashSet<>(); @@ -263,7 +251,7 @@ private static Dependency toProviderDependency( String providerArtifactId, Strin static class RuntimeArtifactFilter implements ArtifactFilter { private static final Collection SCOPES = - asList( SCOPE_COMPILE, SCOPE_COMPILE_PLUS_RUNTIME, SCOPE_RUNTIME ); + asList( SCOPE_COMPILE, SCOPE_COMPILE_PLUS_RUNTIME, SCOPE_RUNTIME ); private final Artifact filter; 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 da3bcfeb42..d5b08b5c8f 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 @@ -19,6 +19,22 @@ * under the License. */ +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.handler.ArtifactHandler; @@ -28,7 +44,6 @@ import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Dependency; -import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.descriptor.PluginDescriptor; @@ -38,17 +53,13 @@ import org.apache.maven.project.MavenProject; import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.repository.RepositorySystem; -import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; -import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult; -import org.apache.maven.shared.transfer.dependencies.DependableCoordinate; -import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver; +import org.apache.maven.surefire.api.suite.RunResult; +import org.apache.maven.surefire.api.util.DefaultScanResult; import org.apache.maven.surefire.booter.ClassLoaderConfiguration; import org.apache.maven.surefire.booter.Classpath; import org.apache.maven.surefire.booter.ModularClasspathConfiguration; import org.apache.maven.surefire.booter.StartupConfiguration; import org.apache.maven.surefire.extensions.ForkNodeFactory; -import org.apache.maven.surefire.api.suite.RunResult; -import org.apache.maven.surefire.api.util.DefaultScanResult; import org.apache.maven.toolchain.Toolchain; import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor; import org.codehaus.plexus.languages.java.jpms.LocationManager; @@ -71,28 +82,11 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - import static java.io.File.separatorChar; import static java.nio.file.Files.write; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; -import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersion; @@ -812,20 +806,37 @@ public void shouldSmartlyResolveJUnit5ProviderWithJUnit4() throws Exception 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 ) ); + + final Artifact pluginDependency = new DefaultArtifact( "org.junit.vintage", "junit-vintage-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; + 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() { @@ -838,6 +849,10 @@ public ArtifactResolutionResult answer( InvocationOnMock invocation ) { 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() ) ) @@ -901,31 +916,16 @@ else if ( "org.junit.platform".equals( artifact.getGroupId() ) mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); - mojo.setDependencyResolver( new DependencyResolverMock() - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - Collection dependencies, - Collection managedDependencies, - TransformableFilter filter ) - { - assertThat( dependencies ).hasSize( 1 ); - Dependency pluginDependency = dependencies.iterator().next(); - assertThat( pluginDependency.getGroupId() ).isEqualTo( "org.junit.vintage" ); - assertThat( pluginDependency.getArtifactId() ).isEqualTo( "junit-vintage-engine" ); - assertThat( pluginDependency.getVersion() ).isEqualTo( "5.4.0" ); - - Collection it = new ArrayList<>(); - it.add( toArtifactResult( pluginDep1 ) ); - it.add( toArtifactResult( pluginDep2 ) ); - it.add( toArtifactResult( pluginDep3 ) ); - it.add( toArtifactResult( pluginDep4 ) ); - it.add( toArtifactResult( pluginDep5 ) ); - it.add( toArtifactResult( pluginDep6 ) ); - it.add( toArtifactResult( pluginDep7 ) ); - return it; - } - } ); + + Set pluginDependencyArtifacts = new HashSet<>(); + pluginDependencyArtifacts.add( pluginDep1 ); + pluginDependencyArtifacts.add( pluginDep2 ); + pluginDependencyArtifacts.add( pluginDep3 ); + pluginDependencyArtifacts.add( pluginDep4 ); + pluginDependencyArtifacts.add( pluginDep5 ); + pluginDependencyArtifacts.add( pluginDep6 ); + pluginDependencyArtifacts.add( pluginDep7 ); + when( pluginDependencyResolutionResult.getArtifacts() ).thenReturn( pluginDependencyArtifacts ); invokeMethod( mojo, "setupStuff" ); @@ -937,8 +937,6 @@ public Iterable resolveDependencies( ProjectBuildingRequest buil Plugin p = mock( Plugin.class ); when( pluginDescriptor.getPlugin() ) .thenReturn( p ); - Artifact pluginDependency = new DefaultArtifact( "org.junit.vintage", "junit-vintage-engine", - createFromVersion( "5.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); when( p.getDependencies() ) .thenReturn( singletonList( toDependency( pluginDependency ) ) ); @@ -1095,18 +1093,6 @@ else if ( "org.junit.platform".equals( resolvable.getGroupId() ) mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); - mojo.setDependencyResolver( new DependencyResolverMock() - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - Collection dependencies, - Collection managedDependencies, - TransformableFilter filter ) - { - assertThat( dependencies ).isEmpty(); - return emptySet(); - } - } ); invokeMethod( mojo, "setupStuff" ); @@ -1227,18 +1213,6 @@ else if ( "org.junit.platform".equals( resolvable.getGroupId() ) mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); - mojo.setDependencyResolver( new DependencyResolverMock() - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - Collection dependencies, - Collection managedDependencies, - TransformableFilter filter ) - { - assertThat( dependencies ).isEmpty(); - return emptySet(); - } - } ); invokeMethod( mojo, "setupStuff" ); @@ -1369,18 +1343,6 @@ else if ( "org.junit.platform".equals( resolvable.getGroupId() ) mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); - mojo.setDependencyResolver( new DependencyResolverMock() - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - Collection dependencies, - Collection managedDependencies, - TransformableFilter filter ) - { - assertThat( dependencies ).isEmpty(); - return emptySet(); - } - } ); invokeMethod( mojo, "setupStuff" ); @@ -1502,18 +1464,6 @@ else if ( "org.junit.jupiter".equals( resolvable.getGroupId() ) mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); - mojo.setDependencyResolver( new DependencyResolverMock() - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - Collection dependencies, - Collection managedDependencies, - TransformableFilter filter ) - { - assertThat( dependencies ).isEmpty(); - return emptySet(); - } - } ); invokeMethod( mojo, "setupStuff" ); @@ -1651,18 +1601,6 @@ else if ( "org.junit.platform".equals( resolvable.getGroupId() ) mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); - mojo.setDependencyResolver( new DependencyResolverMock() - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - Collection dependencies, - Collection managedDependencies, - TransformableFilter filter ) - { - assertThat( dependencies ).isEmpty(); - return emptySet(); - } - } ); invokeMethod( mojo, "setupStuff" ); @@ -1771,6 +1709,7 @@ public void shouldSmartlyResolveJUnit5ProviderWithJupiterEngineInPluginDependenc 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() @@ -1778,13 +1717,25 @@ public void shouldSmartlyResolveJUnit5ProviderWithJupiterEngineInPluginDependenc @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; + 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() { @@ -1797,6 +1748,10 @@ public ArtifactResolutionResult answer( InvocationOnMock invocation ) { 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() ) ) @@ -1813,36 +1768,16 @@ else if ( "org.junit.platform".equals( resolvable.getGroupId() ) mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); - mojo.setDependencyResolver( new DependencyResolverMock() - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - Collection dependencies, - Collection managedDependencies, - TransformableFilter filter ) - { - assertThat( dependencies ).hasSize( 1 ); - Dependency resolvable = dependencies.iterator().next(); - if ( "org.junit.jupiter".equals( resolvable.getGroupId() ) - && "junit-jupiter-engine".equals( resolvable.getArtifactId() ) - && "5.4.0".equals( resolvable.getVersion() ) ) - { - Set resolvedPluginDeps = new HashSet<>(); - resolvedPluginDeps.add( toArtifactResult( pluginDepJupiterEngine ) ); - resolvedPluginDeps.add( toArtifactResult( pluginDepPlatformEngine ) ); - resolvedPluginDeps.add( toArtifactResult( pluginDepJupiterApi ) ); - resolvedPluginDeps.add( toArtifactResult( pluginDepApiguardian ) ); - resolvedPluginDeps.add( toArtifactResult( pluginDepCommons ) ); - resolvedPluginDeps.add( toArtifactResult( pluginDepOpentest4j ) ); - return resolvedPluginDeps; - } - else - { - fail( resolvable.getGroupId() + ":" + resolvable.getArtifactId() ); - return null; - } - } - } ); + + Set pluginDepJupiterEngineArtifacts = new HashSet<>(); + pluginDepJupiterEngineArtifacts.add( pluginDepJupiterEngine ); + pluginDepJupiterEngineArtifacts.add( pluginDepPlatformEngine ); + pluginDepJupiterEngineArtifacts.add( pluginDepJupiterApi ); + pluginDepJupiterEngineArtifacts.add( pluginDepApiguardian ); + pluginDepJupiterEngineArtifacts.add( pluginDepCommons ); + pluginDepJupiterEngineArtifacts.add( pluginDepOpentest4j ); + + when( pluginDepJupiterEngineResolutionResult.getArtifacts() ).thenReturn( pluginDepJupiterEngineArtifacts ); invokeMethod( mojo, "setupStuff" ); @@ -2562,38 +2497,4 @@ private static List toDependencies( Artifact... artifacts ) } return dependencies; } - - private static ArtifactResult toArtifactResult( final Artifact artifact ) - { - class AR implements ArtifactResult - { - - @Override - public Artifact getArtifact() - { - return artifact; - } - } - return new AR(); - } - - private abstract static class DependencyResolverMock implements DependencyResolver - { - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, - DependableCoordinate coordinate, - TransformableFilter filter ) - { - fail( "unexpected call of DependencyResolver" ); - return null; - } - - @Override - public Iterable resolveDependencies( ProjectBuildingRequest buildingRequest, Model model, - TransformableFilter filter ) - { - fail( "unexpected call of DependencyResolver" ); - return null; - } - } } 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 6905850d60..ebf0e1b7a8 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,6 +19,12 @@ * under the License. */ +import java.io.File; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.resolver.ArtifactResolutionRequest; @@ -27,46 +33,27 @@ 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.Collection; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; -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.mock; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import static org.powermock.reflect.Whitebox.invokeMethod; /** * @@ -81,7 +68,7 @@ public void shouldNotBeWithinRangeNullArtifact() { boolean result = SurefireDependencyResolver.isWithinVersionSpec( null, "[4.7,)" ); assertThat( result ) - .isFalse(); + .isFalse(); } @Test @@ -90,7 +77,7 @@ public void shouldNotBeWithinRange() throws InvalidVersionSpecificationException Artifact api = createArtifact( "junit", "junit", "4.6" ); boolean result = SurefireDependencyResolver.isWithinVersionSpec( api, "[4.7,)" ); assertThat( result ) - .isFalse(); + .isFalse(); } @Test @@ -99,7 +86,7 @@ public void shouldBeWithinRange() throws InvalidVersionSpecificationException Artifact api = createArtifact( "junit", "junit", "4.7" ); boolean result = SurefireDependencyResolver.isWithinVersionSpec( api, "[4.7,)" ); assertThat( result ) - .isTrue(); + .isTrue(); } @Test @@ -108,7 +95,7 @@ public void shouldBeFarWithinRange() throws InvalidVersionSpecificationException Artifact api = createArtifact( "junit", "junit", "4.13" ); boolean result = SurefireDependencyResolver.isWithinVersionSpec( api, "[4.7,)" ); assertThat( result ) - .isTrue(); + .isTrue(); } @Test @@ -127,70 +114,66 @@ public void testResolveArtifact() throws InvalidVersionSpecificationException RepositorySystem repositorySystem = mock( RepositorySystem.class ); final ArtifactResolutionResult expectedResult = mock( ArtifactResolutionResult.class ); when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ) - .then( new Answer() + .then( new Answer() + { + @Override + public ArtifactResolutionResult answer( InvocationOnMock invocation ) { - @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.getCache() ) - .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; - } - } ); + 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.getCache() ) + .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, null, null, false ); + new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, false ); ArtifactResolutionResult actualResult = surefireDependencyResolver.resolvePluginArtifact( provider ); assertThat( actualResult ) - .isSameAs( expectedResult ); + .isSameAs( expectedResult ); } @Test public void testGetProviderClasspath() throws Exception { - Artifact api = createArtifact( "surefire-api" ); - api.setFile( new File( "" ) ); + Artifact commonJunit4 = createArtifact( "common-junit4" ); + Artifact api = createArtifact( "surefire-api" ); final Artifact provider = createArtifact( "surefire-junit-platform" ); - provider.setFile( new File( "" ) ); - Artifact ext = createArtifact( "org.apiguardian", "apiguardian-api" ); - ext.setFile( new File( "" ) ); - Artifact logger = createArtifact( "surefire-logger-api" ); - logger.setFile( new File( "" ) ); Set providerArtifacts = new LinkedHashSet<>(); + providerArtifacts.add( commonJunit4 ); providerArtifacts.add( api ); providerArtifacts.add( provider ); providerArtifacts.add( ext ); @@ -198,198 +181,155 @@ public void testGetProviderClasspath() throws Exception final ArtifactResolutionResult result = mock( ArtifactResolutionResult.class ); when( result.getArtifacts() ) - .thenReturn( providerArtifacts ); + .thenReturn( providerArtifacts ); RepositorySystem repositorySystem = mock( RepositorySystem.class ); when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ) - .then( new Answer() + .then( new Answer() + { + @Override + public ArtifactResolutionResult answer( InvocationOnMock invocation ) { - @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.getCache() ) - .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; - } - } ); + 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.getCache() ) + .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() + .then( new Answer() + { + @Override + public Artifact answer( InvocationOnMock invocation ) { - @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; - } - } ); + 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, null, null, false ); + new SurefireDependencyResolver( repositorySystem, log, null, null, null, null, false ); when( log.isDebugEnabled() ) - .thenReturn( true ); + .thenReturn( true ); Set classpath = surefireDependencyResolver.getProviderClasspath( "surefire-junit-platform", "1" ); assertThat( classpath ) - .hasSize( 4 ); + .hasSize( 5 ); Iterator it = classpath.iterator(); + // result should be ordered + assertThat( it.next() ) + .isSameAs( provider ); + assertThat( it.next() ) - .isSameAs( provider ); + .isSameAs( api ); assertThat( it.next() ) - .isSameAs( api ); + .isSameAs( logger ); assertThat( it.next() ) - .isSameAs( logger ); + .isSameAs( commonJunit4 ); assertThat( it.next() ) - .isSameAs( ext ); + .isSameAs( ext ); } @Test - public void testAddProviderToClasspath() throws Exception + public void testResolvePluginDependencies() throws Exception { Dependency providerAsDependency = new Dependency(); providerAsDependency.setGroupId( PROVIDER_GROUP_ID ); providerAsDependency.setArtifactId( "surefire-shadefire" ); providerAsDependency.setVersion( "1" ); - final Artifact providerAsArtifact = createArtifact( "surefire-shadefire" ); + Artifact providerAsArtifact = createArtifact( "surefire-shadefire" ); - PluginDescriptor pluginDescriptor = PowerMockito.mock( PluginDescriptor.class ); - Plugin plugin = PowerMockito.mock( Plugin.class ); - when( pluginDescriptor.getPlugin() ) - .thenReturn( plugin ); + Plugin plugin = mock( Plugin.class ); when( plugin.getDependencies() ) .thenReturn( singletonList( providerAsDependency ) ); - DependencyResolver depencencyResolver = mock( DependencyResolver.class ); - SurefireDependencyResolver surefireDependencyResolver = - new SurefireDependencyResolver( null, null, null, null, null, null, depencencyResolver, false ); - - ProjectBuildingRequest request = mock( ProjectBuildingRequest.class ); - - ArgumentCaptor> dep = ArgumentCaptor.forClass( Collection.class ); - ArgumentCaptor 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 ) ); + RepositorySystem repositorySystem = mock( RepositorySystem.class ); + when( repositorySystem.createDependencyArtifact( providerAsDependency ) ) + .thenReturn( providerAsArtifact ); - final ArtifactResolutionResult resolutionResult = mock( ArtifactResolutionResult.class ); + ArtifactResolutionResult resolutionResult = mock( ArtifactResolutionResult.class ); when( resolutionResult.getArtifacts() ) .thenReturn( singleton( providerAsArtifact ) ); + ArgumentCaptor resolutionRequestCaptor = + ArgumentCaptor.forClass( ArtifactResolutionRequest.class ); + when( repositorySystem.resolve( resolutionRequestCaptor.capture() ) ) + .thenReturn( resolutionResult ); + Map pluginResolvedDependencies = singletonMap( PROVIDER_GROUP_ID + ":surefire-shadefire", providerAsArtifact ); - Map providers = - surefireDependencyResolver.resolvePluginDependencies( request, plugin, pluginResolvedDependencies ); - verify( depencencyResolver, times( 1 ) ) - .resolveDependencies( request, dep.getValue(), null, filter.getValue() ); + SurefireDependencyResolver surefireDependencyResolver = + new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, false ); + + Map providers = + surefireDependencyResolver.resolvePluginDependencies( plugin, pluginResolvedDependencies ); assertThat( providers.values() ) .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 - public void shouldOrderedProviderArtifacts() throws Exception - { - Artifact api = createArtifact( "surefire-api" ); - Artifact provider = createArtifact( "surefire-junit-platform" ); - Artifact ext = createArtifact( "org.apiguardian", "apiguardian-api" ); - Artifact logger = createArtifact( "surefire-logger-api" ); - - Set providerArtifacts = new LinkedHashSet<>(); - providerArtifacts.add( api ); - providerArtifacts.add( provider ); - providerArtifacts.add( ext ); - providerArtifacts.add( logger ); - - Iterator it = providerArtifacts.iterator(); - - assertThat( it.next() ) - .isEqualTo( api ); - - assertThat( it.next() ) - .isEqualTo( provider ); - - assertThat( it.next() ) - .isEqualTo( ext ); - - assertThat( it.next() ) - .isEqualTo( logger ); + assertThat( resolutionRequestCaptor.getAllValues() ) + .hasSize( 1 ); - Set actual = - invokeMethod( SurefireDependencyResolver.class, "orderProviderArtifacts", providerArtifacts ); + ArtifactResolutionRequest resolutionRequest = resolutionRequestCaptor.getValue(); - Set expected = new LinkedHashSet<>(); - expected.add( provider ); - expected.add( api ); - expected.add( logger ); - expected.add( ext ); + assertThat( resolutionRequest.getArtifact() ) + .isSameAs( providerAsArtifact ); - assertThat( actual ) - .isEqualTo( expected ); + verify( repositorySystem ).createDependencyArtifact( any( Dependency.class ) ); + verify( repositorySystem ).resolve( any( ArtifactResolutionRequest.class ) ); + verifyNoMoreInteractions( repositorySystem ); } private static Artifact createArtifact( String artifactId ) throws InvalidVersionSpecificationException @@ -398,15 +338,18 @@ private static Artifact createArtifact( String artifactId ) throws InvalidVersio } private static Artifact createArtifact( String groupId, String artifactId ) - throws InvalidVersionSpecificationException + throws InvalidVersionSpecificationException { return createArtifact( groupId, artifactId, "1" ); } private static Artifact createArtifact( String groupId, String artifactId, String version ) - throws InvalidVersionSpecificationException + throws InvalidVersionSpecificationException { VersionRange versionSpec = createFromVersionSpec( version ); - return new DefaultArtifact( groupId, artifactId, versionSpec, "compile", "jar", "", null ); + DefaultArtifact defaultArtifact = + new DefaultArtifact( groupId, artifactId, versionSpec, "compile", "jar", "", null ); + defaultArtifact.setFile( new File( "" ) ); + return defaultArtifact; } } diff --git a/pom.xml b/pom.xml index 0b9fd0c2b3..5989f85dec 100644 --- a/pom.xml +++ b/pom.xml @@ -216,33 +216,6 @@ - - org.apache.maven.shared - maven-artifact-transfer - 0.13.1 - - - org.apache.maven - maven-core - - - org.apache.maven - maven-artifact - - - org.codehaus.plexus - plexus-component-annotations - - - org.codehaus.plexus - plexus-utils - - - org.slf4j - slf4j-api - - - org.apache.maven.doxia doxia-sink-api @@ -602,6 +575,7 @@ .m2/** .m2 .travis.yml + .mvn/wrapper/maven-wrapper.properties