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 6916415 [SUREFIRE-1585] Align JUnit Platform version at runtime 6916415 is described below commit 6916415ee428aa18e98c6cf1e3915315e41e04a3 Author: tibordigana <tibordig...@apache.org> AuthorDate: Thu Feb 28 06:17:49 2019 +0100 [SUREFIRE-1585] Align JUnit Platform version at runtime --- maven-surefire-common/pom.xml | 19 -- .../plugin/surefire/AbstractSurefireMojo.java | 58 +++--- .../plugin/surefire/AbstractSurefireMojoTest.java | 200 +++++++++++++++++++-- pom.xml | 39 +++- 4 files changed, 256 insertions(+), 60 deletions(-) diff --git a/maven-surefire-common/pom.xml b/maven-surefire-common/pom.xml index e95190b..674b673 100644 --- a/maven-surefire-common/pom.xml +++ b/maven-surefire-common/pom.xml @@ -83,25 +83,6 @@ <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> 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 7d44afc..ba7f1e0 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 @@ -869,9 +869,22 @@ public abstract class AbstractSurefireMojo private void setupStuff() { - createDependencyResolver(); - surefireBooterArtifact = getSurefireBooterArtifact(); - toolchain = getToolchain(); + surefireDependencyResolver = new SurefireDependencyResolver( getRepositorySystem(), + getConsoleLogger(), getLocalRepository(), + getRemoteRepositories(), + getProjectRemoteRepositories(), + getPluginName(), getDependencyResolver() ); + + surefireBooterArtifact = getBooterArtifact(); + if ( surefireBooterArtifact == null ) + { + throw new RuntimeException( "Unable to locate surefire-booter in the list of plugin artifacts" ); + } + + if ( getToolchainManager() != null ) + { + toolchain = getToolchainManager().getToolchainFromBuildContext( "jdk", getSession() ); + } } @Nonnull @@ -1021,15 +1034,6 @@ public abstract class AbstractSurefireMojo handleSummary( current, firstForkException ); } - private void createDependencyResolver() - { - surefireDependencyResolver = new SurefireDependencyResolver( getRepositorySystem(), - getConsoleLogger(), getLocalRepository(), - getRemoteRepositories(), - getProjectRemoteRepositories(), - getPluginName(), dependencyResolver ); - } - protected List<ProviderInfo> createProviders( TestClassPath testClasspath ) throws MojoExecutionException { @@ -1227,16 +1231,14 @@ public abstract class AbstractSurefireMojo this.repositorySystem = repositorySystem; } - final Toolchain getToolchain() + public DependencyResolver getDependencyResolver() { - Toolchain tc = null; - - if ( getToolchainManager() != null ) - { - tc = getToolchainManager().getToolchainFromBuildContext( "jdk", getSession() ); - } + return dependencyResolver; + } - return tc; + public void setDependencyResolver( DependencyResolver dependencyResolver ) + { + this.dependencyResolver = dependencyResolver; } private boolean existsModuleDescriptor() @@ -2374,16 +2376,6 @@ public abstract class AbstractSurefireMojo return new JdkAttributes( jvmToUse, isBuiltInJava9AtLeast() ); } - private Artifact getSurefireBooterArtifact() - { - Artifact artifact = getBooterArtifact(); - if ( artifact == null ) - { - throw new RuntimeException( "Unable to locate surefire-booter in the list of plugin artifacts" ); - } - return artifact; - } - /** * Where surefire stores its own temp files * @@ -3670,6 +3662,12 @@ public abstract class AbstractSurefireMojo this.dependenciesToScan = dependenciesToScan; } + @SuppressWarnings( "UnusedDeclaration" ) + void setPluginDescriptor( PluginDescriptor pluginDescriptor ) + { + this.pluginDescriptor = pluginDescriptor; + } + public PluginDescriptor getPluginDescriptor() { return pluginDescriptor; 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 78e135f..080f2b5 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 @@ -26,11 +26,18 @@ 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.versioning.VersionRange; +import org.apache.maven.execution.MavenSession; 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.AbstractSurefireMojo.JUnitPlatformProviderInfo; 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.shared.artifact.filter.resolve.TransformableFilter; +import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult; +import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver; import org.apache.maven.surefire.booter.ClassLoaderConfiguration; import org.apache.maven.surefire.booter.Classpath; import org.apache.maven.surefire.booter.StartupConfiguration; @@ -39,6 +46,7 @@ import org.codehaus.plexus.logging.Logger; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -59,16 +67,14 @@ import java.util.Set; import static java.io.File.separatorChar; import static java.util.Arrays.asList; -import static java.util.Collections.singleton; -import static java.util.Collections.singletonMap; +import static java.util.Collections.*; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersion; import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec; import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.MapAssert.entry; import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; @@ -444,6 +450,21 @@ public class AbstractSurefireMojoTest } } ); + DependencyResolver dependencyResolver = mock( DependencyResolver.class ); + when( dependencyResolver.resolveDependencies( any( ProjectBuildingRequest.class ), + ArgumentMatchers.<Dependency>anyCollection(), isNull( Collection.class ), + any( TransformableFilter.class ) ) ) + .thenAnswer( new Answer<Object>() + { + @Override + public Object answer( InvocationOnMock invocation ) + { + Collection deps = (Collection) invocation.getArguments()[1]; + assertThat( deps ).isEmpty(); + return emptySet(); + } + } ); + 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", @@ -480,8 +501,23 @@ public class AbstractSurefireMojoTest mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); + mojo.setDependencyResolver( dependencyResolver ); invokeMethod( mojo, "setupStuff" ); + + MavenSession session = mock( MavenSession.class ); + mojo.setSession( session ); + when( session.getProjectBuildingRequest() ) + .thenReturn( mock( ProjectBuildingRequest.class ) ); + + PluginDescriptor pluginDescriptor = mock( PluginDescriptor.class ); + mojo.setPluginDescriptor( pluginDescriptor ); + Plugin p = mock( Plugin.class ); + when( pluginDescriptor.getPlugin() ) + .thenReturn( p ); + when( p.getDependencies() ) + .thenReturn( Collections.<Dependency>emptyList() ); + JUnitPlatformProviderInfo prov = mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper ); @@ -747,10 +783,40 @@ public class AbstractSurefireMojoTest } } ); + DependencyResolver dependencyResolver = mock( DependencyResolver.class ); + when( dependencyResolver.resolveDependencies( any( ProjectBuildingRequest.class ), + ArgumentMatchers.<Dependency>anyCollection(), isNull( Collection.class ), + any( TransformableFilter.class ) ) ) + .thenAnswer( new Answer<Object>() + { + @Override + public Object answer( InvocationOnMock invocation ) + { + Collection deps = (Collection) invocation.getArguments()[1]; + assertThat( deps ).isEmpty(); + return emptySet(); + } + } ); + mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); + mojo.setDependencyResolver( dependencyResolver ); invokeMethod( mojo, "setupStuff" ); + + MavenSession session = mock( MavenSession.class ); + mojo.setSession( session ); + when( session.getProjectBuildingRequest() ) + .thenReturn( mock( ProjectBuildingRequest.class ) ); + + PluginDescriptor pluginDescriptor = mock( PluginDescriptor.class ); + mojo.setPluginDescriptor( pluginDescriptor ); + Plugin p = mock( Plugin.class ); + when( pluginDescriptor.getPlugin() ) + .thenReturn( p ); + when( p.getDependencies() ) + .thenReturn( Collections.<Dependency>emptyList() ); + JUnitPlatformProviderInfo prov = mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper ); Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath(); @@ -987,10 +1053,40 @@ public class AbstractSurefireMojoTest } } ); + DependencyResolver dependencyResolver = mock( DependencyResolver.class ); + when( dependencyResolver.resolveDependencies( any( ProjectBuildingRequest.class ), + ArgumentMatchers.<Dependency>anyCollection(), isNull( Collection.class ), + any( TransformableFilter.class ) ) ) + .thenAnswer( new Answer<Object>() + { + @Override + public Object answer( InvocationOnMock invocation ) + { + Collection deps = (Collection) invocation.getArguments()[1]; + assertThat( deps ).isEmpty(); + return emptySet(); + } + } ); + mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); + mojo.setDependencyResolver( dependencyResolver ); invokeMethod( mojo, "setupStuff" ); + + MavenSession session = mock( MavenSession.class ); + mojo.setSession( session ); + when( session.getProjectBuildingRequest() ) + .thenReturn( mock( ProjectBuildingRequest.class ) ); + + PluginDescriptor pluginDescriptor = mock( PluginDescriptor.class ); + mojo.setPluginDescriptor( pluginDescriptor ); + Plugin p = mock( Plugin.class ); + when( pluginDescriptor.getPlugin() ) + .thenReturn( p ); + when( p.getDependencies() ) + .thenReturn( Collections.<Dependency>emptyList() ); + JUnitPlatformProviderInfo prov = mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper ); Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath(); @@ -1158,22 +1254,22 @@ public class AbstractSurefireMojoTest final Artifact forkedBooter = new DefaultArtifact( "org.apache.maven.surefire", "surefire-booter", surefireVersion, null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact pluginDepJupiterEngine = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-engine", + final Artifact pluginDepJupiterEngine = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-engine", createFromVersion( "5.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact pluginDepPlatformEngine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine", + final Artifact pluginDepPlatformEngine = new DefaultArtifact( "org.junit.platform", "junit-platform-engine", createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact pluginDepJupiterApi = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-api", + final Artifact pluginDepJupiterApi = new DefaultArtifact( "org.junit.jupiter", "junit-jupiter-api", createFromVersion( "5.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact pluginDepApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api", + final Artifact pluginDepApiguardian = new DefaultArtifact( "org.apiguardian", "apiguardian-api", createFromVersion( "1.0.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact pluginDepCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons", + final Artifact pluginDepCommons = new DefaultArtifact( "org.junit.platform", "junit-platform-commons", createFromVersion( "1.4.0" ), null, "jar", null, mock( ArtifactHandler.class ) ); - Artifact pluginDepOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j", + final Artifact pluginDepOpentest4j = new DefaultArtifact( "org.opentest4j", "opentest4j", createFromVersion( "1.1.1" ), null, "jar", null, mock( ArtifactHandler.class ) ); Map<String, Artifact> pluginDependencies = new HashMap<>(); @@ -1275,12 +1371,62 @@ public class AbstractSurefireMojoTest } } ); + DependencyResolver dependencyResolver = mock( DependencyResolver.class ); + when( dependencyResolver.resolveDependencies( any( ProjectBuildingRequest.class ), + ArgumentMatchers.<Dependency>anyCollection(), isNull( Collection.class ), + any( TransformableFilter.class ) ) ) + .thenAnswer( new Answer<Object>() + { + @Override + public Object answer( InvocationOnMock invocation ) + { + Collection deps = (Collection) invocation.getArguments()[1]; + assertThat( deps ).hasSize( 1 ); + Dependency resolvable = (Dependency) deps.iterator().next(); + if ( "org.junit.jupiter".equals( resolvable.getGroupId() ) + && "junit-jupiter-engine".equals( resolvable.getArtifactId() ) + && "5.4.0".equals( resolvable.getVersion() ) ) + { + Set<ArtifactResult> 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(); + return null; + } + } + } ); + mojo.setRepositorySystem( repositorySystem ); mojo.setLogger( mock( Logger.class ) ); + mojo.setDependencyResolver( dependencyResolver ); invokeMethod( mojo, "setupStuff" ); + JUnitPlatformProviderInfo prov = mojo.createJUnitPlatformProviderInfo( junitPlatformArtifact, testClasspathWrapper ); + + MavenSession session = mock( MavenSession.class ); + mojo.setSession( session ); + when( session.getProjectBuildingRequest() ) + .thenReturn( mock( ProjectBuildingRequest.class ) ); + + PluginDescriptor pluginDescriptor = mock( PluginDescriptor.class ); + mojo.setPluginDescriptor( pluginDescriptor ); + Plugin p = mock( Plugin.class ); + when( pluginDescriptor.getPlugin() ) + .thenReturn( p ); + List<Dependency> directPluginDependencies = toDependencies( pluginDepJupiterEngine ); + when( p.getDependencies() ) + .thenReturn( directPluginDependencies ); + Set<Artifact> resolvedProviderArtifacts = prov.getProviderClasspath(); Artifact java5 = new DefaultArtifact( "org.apache.maven.surefire", "common-java5", @@ -1813,4 +1959,38 @@ public class AbstractSurefireMojoTest when( f.getAbsolutePath() ).thenReturn( absolutePath ); return f; } + + private static Dependency toDependency( Artifact artifact ) + { + Dependency dependency = new Dependency(); + dependency.setGroupId( artifact.getGroupId() ); + dependency.setArtifactId( artifact.getArtifactId() ); + dependency.setVersion( artifact.getBaseVersion() ); + dependency.setType( "jar" ); + return dependency; + } + + private static List<Dependency> toDependencies( Artifact... artifacts ) + { + List<Dependency> dependencies = new ArrayList<>(); + for ( Artifact artifact : artifacts ) + { + dependencies.add( toDependency( artifact) ); + } + return dependencies; + } + + private static ArtifactResult toArtifactResult( final Artifact artifact ) + { + class AR implements ArtifactResult + { + + @Override + public Artifact getArtifact() + { + return artifact; + } + } + return new AR(); + } } diff --git a/pom.xml b/pom.xml index 55f4ea5..a95596e 100644 --- a/pom.xml +++ b/pom.xml @@ -191,16 +191,53 @@ <groupId>org.apache.maven</groupId> <artifactId>maven-toolchain</artifactId> <version>3.0-alpha-2</version> + <exclusions> + <exclusion> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.maven</groupId> + <artifactId>maven-compat</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-common-artifact-filters</artifactId> - <version>3.0.1</version> + <version>3.1.0</version> <exclusions> <exclusion> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-plugin-testing-harness</artifactId> </exclusion> + <exclusion> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-shared-utils</artifactId> + </exclusion> + </exclusions> + </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>