You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2022/03/30 14:19:46 UTC
[maven-surefire] branch master updated: [SUREFIRE-2051] Propagate exceptions while resolving artifacts in `SurefireDependencyResolver`
This is an automated email from the ASF dual-hosted git repository.
tibordigana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
The following commit(s) were added to refs/heads/master by this push:
new f2c5671 [SUREFIRE-2051] Propagate exceptions while resolving artifacts in `SurefireDependencyResolver`
f2c5671 is described below
commit f2c5671f2b3299c1741ee640eadde6d1b8ae5b6d
Author: Halil Sener <ha...@datadoghq.com>
AuthorDate: Tue Mar 29 16:29:11 2022 +0200
[SUREFIRE-2051] Propagate exceptions while resolving artifacts in `SurefireDependencyResolver`
---
.../plugin/surefire/AbstractSurefireMojo.java | 27 +++++++++----
.../surefire/SurefireDependencyResolver.java | 31 ++++++++++++---
.../plugin/surefire/AbstractSurefireMojoTest.java | 2 +
.../surefire/SurefireDependencyResolverTest.java | 44 ++++++++++++++++++++--
4 files changed, 87 insertions(+), 17 deletions(-)
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 88602e5..1937d75 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
@@ -48,6 +48,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.artifact.resolver.ResolutionErrorHandler;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.artifact.versioning.ArtifactVersion;
@@ -801,6 +802,9 @@ public abstract class AbstractSurefireMojo
@Component
private ProviderDetector providerDetector;
+ @Component
+ private ResolutionErrorHandler resolutionErrorHandler;
+
private Toolchain toolchain;
private int effectiveForkCount = -1;
@@ -1001,6 +1005,7 @@ public abstract class AbstractSurefireMojo
getConsoleLogger(), getLocalRepository(),
getRemoteRepositories(),
getProjectRemoteRepositories(),
+ resolutionErrorHandler,
getPluginName(),
getSession().isOffline() );
@@ -2474,6 +2479,7 @@ public abstract class AbstractSurefireMojo
@Nonnull
private ForkConfiguration createForkConfiguration( @Nonnull Platform platform,
@Nonnull ResolvePathResultWrapper resolvedJavaModularityResult )
+ throws MojoExecutionException
{
File tmpDir = getSurefireTempDir();
@@ -2899,7 +2905,7 @@ public abstract class AbstractSurefireMojo
}
}
- private Classpath getArtifactClasspath( Artifact surefireArtifact )
+ private Classpath getArtifactClasspath( Artifact surefireArtifact ) throws MojoExecutionException
{
Classpath existing = classpathCache.getCachedClassPath( surefireArtifact.getArtifactId() );
if ( existing == null )
@@ -3154,7 +3160,7 @@ public abstract class AbstractSurefireMojo
@Override
@Nonnull
- public Set<Artifact> getProviderClasspath()
+ public Set<Artifact> getProviderClasspath() throws MojoExecutionException
{
Artifact surefireArtifact = getBooterArtifact();
String version = surefireArtifact.getBaseVersion();
@@ -3191,7 +3197,7 @@ public abstract class AbstractSurefireMojo
@Override
@Nonnull
- public Set<Artifact> getProviderClasspath()
+ public Set<Artifact> getProviderClasspath() throws MojoExecutionException
{
// add the JUnit provider as default - it doesn't require JUnit to be present,
// since it supports POJO tests.
@@ -3239,7 +3245,7 @@ public abstract class AbstractSurefireMojo
@Override
@Nonnull
- public Set<Artifact> getProviderClasspath()
+ public Set<Artifact> getProviderClasspath() throws MojoExecutionException
{
String version = getBooterArtifact().getBaseVersion();
return surefireDependencyResolver.getProviderClasspath( "surefire-junit4", version );
@@ -3365,7 +3371,7 @@ public abstract class AbstractSurefireMojo
}
private void addEngineByApi( String engineGroupId, String engineArtifactId, String engineVersion,
- Map<String, Artifact> providerArtifacts )
+ Map<String, Artifact> providerArtifacts ) throws MojoExecutionException
{
for ( Artifact dep : resolve( engineGroupId, engineArtifactId, engineVersion, null, "jar" ) )
{
@@ -3380,7 +3386,7 @@ public abstract class AbstractSurefireMojo
providerArtifacts.keySet().removeAll( testDependencies.keySet() );
}
- private void alignProviderVersions( Map<String, Artifact> providerArtifacts )
+ private void alignProviderVersions( Map<String, Artifact> providerArtifacts ) throws MojoExecutionException
{
String version = junitPlatformArtifact.getBaseVersion();
for ( Artifact launcherArtifact : resolve( PROVIDER_DEP_GID, PROVIDER_DEP_AID, version, null, "jar" ) )
@@ -3393,7 +3399,7 @@ public abstract class AbstractSurefireMojo
}
}
- private Set<Artifact> resolve( String g, String a, String v, String c, String t )
+ private Set<Artifact> resolve( String g, String a, String v, String c, String t ) throws MojoExecutionException
{
ArtifactHandler handler = junitPlatformArtifact.getArtifactHandler();
Artifact artifact = new DefaultArtifact( g, a, v, null, t, c, handler );
@@ -3471,7 +3477,7 @@ public abstract class AbstractSurefireMojo
@Override
@Nonnull
- public Set<Artifact> getProviderClasspath()
+ public Set<Artifact> getProviderClasspath() throws MojoExecutionException
{
String version = getBooterArtifact().getBaseVersion();
return surefireDependencyResolver.getProviderClasspath( "surefire-junit47", version );
@@ -4082,6 +4088,11 @@ public abstract class AbstractSurefireMojo
this.tempDir = tempDir;
}
+ public void setResolutionErrorHandler( ResolutionErrorHandler resolutionErrorHandler )
+ {
+ this.resolutionErrorHandler = resolutionErrorHandler;
+ }
+
private static String getEffectiveForkMode( String forkMode )
{
if ( "pertest".equalsIgnoreCase( forkMode ) )
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 081fed2..45de14d 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
@@ -32,8 +32,10 @@ import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
@@ -41,6 +43,7 @@ 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.repository.RepositorySystem;
@@ -87,8 +90,9 @@ final class SurefireDependencyResolver
private final List<ArtifactRepository> projectRemoteRepositories;
- private final String pluginName;
+ private final ResolutionErrorHandler resolutionErrorHandler;
+ private final String pluginName;
private final boolean offline;
@@ -96,6 +100,7 @@ final class SurefireDependencyResolver
ArtifactRepository localRepository,
List<ArtifactRepository> pluginRemoteRepositories,
List<ArtifactRepository> projectRemoteRepositories,
+ ResolutionErrorHandler resolutionErrorHandler,
String pluginName, boolean offline )
{
this.repositorySystem = repositorySystem;
@@ -103,6 +108,7 @@ final class SurefireDependencyResolver
this.localRepository = localRepository;
this.pluginRemoteRepositories = pluginRemoteRepositories;
this.projectRemoteRepositories = projectRemoteRepositories;
+ this.resolutionErrorHandler = resolutionErrorHandler;
this.pluginName = pluginName;
this.offline = offline;
}
@@ -132,6 +138,7 @@ final class SurefireDependencyResolver
}
Map<String, Artifact> resolvePluginDependencies( Plugin plugin, Map<String, Artifact> pluginResolvedDependencies )
+ throws MojoExecutionException
{
Map<String, Artifact> resolved = new LinkedHashMap<>();
Collection<Dependency> pluginDependencies = plugin.getDependencies();
@@ -153,28 +160,30 @@ final class SurefireDependencyResolver
return resolved;
}
- ArtifactResolutionResult resolvePluginArtifact( Artifact artifact )
+ ArtifactResolutionResult resolvePluginArtifact( Artifact artifact ) throws MojoExecutionException
{
return resolvePluginArtifact( artifact, new RuntimeArtifactFilter() );
}
- ArtifactResolutionResult resolveProjectArtifact( Artifact artifact )
+ ArtifactResolutionResult resolveProjectArtifact( Artifact artifact ) throws MojoExecutionException
{
return resolveProjectArtifact( artifact, new RuntimeArtifactFilter() );
}
private ArtifactResolutionResult resolvePluginArtifact( Artifact artifact, ArtifactFilter filter )
+ throws MojoExecutionException
{
return resolveArtifact( artifact, pluginRemoteRepositories, filter );
}
private ArtifactResolutionResult resolveProjectArtifact( Artifact artifact, ArtifactFilter filter )
+ throws MojoExecutionException
{
return resolveArtifact( artifact, projectRemoteRepositories, filter );
}
private ArtifactResolutionResult resolveArtifact( Artifact artifact, List<ArtifactRepository> repositories,
- ArtifactFilter filter )
+ ArtifactFilter filter ) throws MojoExecutionException
{
ArtifactResolutionRequest request = new ArtifactResolutionRequest()
.setOffline( offline )
@@ -184,11 +193,22 @@ final class SurefireDependencyResolver
.setCollectionFilter( filter )
.setRemoteRepositories( repositories );
- return repositorySystem.resolve( request );
+ ArtifactResolutionResult result = repositorySystem.resolve( request );
+ try
+ {
+ resolutionErrorHandler.throwErrors( request, result );
+ }
+ catch ( ArtifactResolutionException e )
+ {
+ throw new MojoExecutionException( e.getMessage(), e );
+ }
+
+ return result;
}
@Nonnull
Set<Artifact> getProviderClasspath( String providerArtifactId, String providerVersion )
+ throws MojoExecutionException
{
Dependency provider = toProviderDependency( providerArtifactId, providerVersion );
@@ -211,6 +231,7 @@ final class SurefireDependencyResolver
@Nonnull
Map<String, Artifact> getProviderClasspathAsMap( String providerArtifactId, String providerVersion )
+ throws MojoExecutionException
{
return artifactMapByVersionlessId( getProviderClasspath( providerArtifactId, providerVersion ) );
}
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 8bcf947..ec00a22 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
@@ -44,6 +44,7 @@ import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.DefaultResolutionErrorHandler;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
@@ -157,6 +158,7 @@ public class AbstractSurefireMojoTest
plugin.setVersion( mojoArtifact.getVersion() );
when( pluginDescriptor.getPlugin() ).thenReturn( plugin );
mojo.setPluginDescriptor( pluginDescriptor );
+ mojo.setResolutionErrorHandler( new DefaultResolutionErrorHandler() );
}
@Test
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 5593233..5b95122 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
@@ -27,12 +27,15 @@ import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.DefaultResolutionErrorHandler;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.surefire.SurefireDependencyResolver.RuntimeArtifactFilter;
import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
import org.apache.maven.repository.RepositorySystem;
@@ -49,6 +52,7 @@ import static java.util.Collections.singletonMap;
import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec;
import static org.apache.maven.plugin.surefire.SurefireDependencyResolver.PROVIDER_GROUP_ID;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -108,7 +112,7 @@ public class SurefireDependencyResolverTest
}
@Test
- public void testResolveArtifact() throws InvalidVersionSpecificationException
+ public void testResolveArtifact() throws InvalidVersionSpecificationException, MojoExecutionException
{
final Artifact provider = createArtifact( "surefire-junit-platform" );
RepositorySystem repositorySystem = mock( RepositorySystem.class );
@@ -152,7 +156,8 @@ public class SurefireDependencyResolverTest
} );
SurefireDependencyResolver surefireDependencyResolver =
- new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, false );
+ new SurefireDependencyResolver( repositorySystem, null, null, null, null,
+ new DefaultResolutionErrorHandler(), null, false );
ArtifactResolutionResult actualResult = surefireDependencyResolver.resolvePluginArtifact( provider );
@@ -246,7 +251,8 @@ public class SurefireDependencyResolverTest
ConsoleLogger log = mock( ConsoleLogger.class );
SurefireDependencyResolver surefireDependencyResolver =
- new SurefireDependencyResolver( repositorySystem, log, null, null, null, null, false );
+ new SurefireDependencyResolver( repositorySystem, log, null, null, null,
+ new DefaultResolutionErrorHandler(), null, false );
when( log.isDebugEnabled() )
.thenReturn( true );
@@ -276,6 +282,35 @@ public class SurefireDependencyResolverTest
}
@Test
+ public void testGetProviderClasspathShouldPropagateTheResolutionException() throws Exception
+ {
+ Artifact provider = createArtifact( "surefire-junit-platform" );
+ provider.setFile( null );
+
+ Set<Artifact> providerArtifacts = new LinkedHashSet<>();
+ providerArtifacts.add( provider );
+
+ ArtifactResolutionResult result = mock( ArtifactResolutionResult.class );
+ when( result.getArtifacts() ).thenReturn( providerArtifacts );
+ when( result.hasMetadataResolutionExceptions() ).thenReturn( true );
+ ArtifactResolutionException resolutionException =
+ new ArtifactResolutionException( "failed to resolve", provider );
+ when( result.getMetadataResolutionException( 0 ) ).thenReturn( resolutionException );
+
+ RepositorySystem repositorySystem = mock( RepositorySystem.class );
+ when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ).thenReturn( result );
+ when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenReturn( provider );
+
+ SurefireDependencyResolver surefireDependencyResolver =
+ new SurefireDependencyResolver( repositorySystem, mock( ConsoleLogger.class ), null, null, null,
+ new DefaultResolutionErrorHandler(), null, false );
+
+ assertThatThrownBy( () -> surefireDependencyResolver.getProviderClasspath( "surefire-junit-platform", "1" ) )
+ .isInstanceOf( MojoExecutionException.class )
+ .hasCause( resolutionException );
+ }
+
+ @Test
public void testResolvePluginDependencies() throws Exception
{
Dependency providerAsDependency = new Dependency();
@@ -306,7 +341,8 @@ public class SurefireDependencyResolverTest
singletonMap( PROVIDER_GROUP_ID + ":surefire-shadefire", providerAsArtifact );
SurefireDependencyResolver surefireDependencyResolver =
- new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, false );
+ new SurefireDependencyResolver( repositorySystem, null, null, null, null,
+ new DefaultResolutionErrorHandler(), null, false );
Map<String, Artifact> providers =
surefireDependencyResolver.resolvePluginDependencies( plugin, pluginResolvedDependencies );