Skip to content

Commit f2c5671

Browse files
hisenerTibor17
authored andcommitted
[SUREFIRE-2051] Propagate exceptions while resolving artifacts in SurefireDependencyResolver
1 parent 92b9061 commit f2c5671

File tree

4 files changed

+87
-17
lines changed

4 files changed

+87
-17
lines changed

maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.apache.maven.artifact.DefaultArtifact;
4949
import org.apache.maven.artifact.handler.ArtifactHandler;
5050
import org.apache.maven.artifact.repository.ArtifactRepository;
51+
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
5152
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
5253
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
5354
import org.apache.maven.artifact.versioning.ArtifactVersion;
@@ -801,6 +802,9 @@ public abstract class AbstractSurefireMojo
801802
@Component
802803
private ProviderDetector providerDetector;
803804

805+
@Component
806+
private ResolutionErrorHandler resolutionErrorHandler;
807+
804808
private Toolchain toolchain;
805809

806810
private int effectiveForkCount = -1;
@@ -1001,6 +1005,7 @@ private void setupStuff() throws MojoFailureException
10011005
getConsoleLogger(), getLocalRepository(),
10021006
getRemoteRepositories(),
10031007
getProjectRemoteRepositories(),
1008+
resolutionErrorHandler,
10041009
getPluginName(),
10051010
getSession().isOffline() );
10061011

@@ -2474,6 +2479,7 @@ private ForkNodeFactory getForkNodeFactory()
24742479
@Nonnull
24752480
private ForkConfiguration createForkConfiguration( @Nonnull Platform platform,
24762481
@Nonnull ResolvePathResultWrapper resolvedJavaModularityResult )
2482+
throws MojoExecutionException
24772483
{
24782484
File tmpDir = getSurefireTempDir();
24792485

@@ -2899,7 +2905,7 @@ private <T> void showArray( T[] array, String setting )
28992905
}
29002906
}
29012907

2902-
private Classpath getArtifactClasspath( Artifact surefireArtifact )
2908+
private Classpath getArtifactClasspath( Artifact surefireArtifact ) throws MojoExecutionException
29032909
{
29042910
Classpath existing = classpathCache.getCachedClassPath( surefireArtifact.getArtifactId() );
29052911
if ( existing == null )
@@ -3154,7 +3160,7 @@ public List<String[]> getJpmsArguments( @Nonnull ProviderRequirements forkRequir
31543160

31553161
@Override
31563162
@Nonnull
3157-
public Set<Artifact> getProviderClasspath()
3163+
public Set<Artifact> getProviderClasspath() throws MojoExecutionException
31583164
{
31593165
Artifact surefireArtifact = getBooterArtifact();
31603166
String version = surefireArtifact.getBaseVersion();
@@ -3191,7 +3197,7 @@ public List<String[]> getJpmsArguments( @Nonnull ProviderRequirements forkRequir
31913197

31923198
@Override
31933199
@Nonnull
3194-
public Set<Artifact> getProviderClasspath()
3200+
public Set<Artifact> getProviderClasspath() throws MojoExecutionException
31953201
{
31963202
// add the JUnit provider as default - it doesn't require JUnit to be present,
31973203
// since it supports POJO tests.
@@ -3239,7 +3245,7 @@ public List<String[]> getJpmsArguments( @Nonnull ProviderRequirements forkRequir
32393245

32403246
@Override
32413247
@Nonnull
3242-
public Set<Artifact> getProviderClasspath()
3248+
public Set<Artifact> getProviderClasspath() throws MojoExecutionException
32433249
{
32443250
String version = getBooterArtifact().getBaseVersion();
32453251
return surefireDependencyResolver.getProviderClasspath( "surefire-junit4", version );
@@ -3365,7 +3371,7 @@ private List<String[]> getJpmsArgs()
33653371
}
33663372

33673373
private void addEngineByApi( String engineGroupId, String engineArtifactId, String engineVersion,
3368-
Map<String, Artifact> providerArtifacts )
3374+
Map<String, Artifact> providerArtifacts ) throws MojoExecutionException
33693375
{
33703376
for ( Artifact dep : resolve( engineGroupId, engineArtifactId, engineVersion, null, "jar" ) )
33713377
{
@@ -3380,7 +3386,7 @@ private void narrowDependencies( Map<String, Artifact> providerArtifacts,
33803386
providerArtifacts.keySet().removeAll( testDependencies.keySet() );
33813387
}
33823388

3383-
private void alignProviderVersions( Map<String, Artifact> providerArtifacts )
3389+
private void alignProviderVersions( Map<String, Artifact> providerArtifacts ) throws MojoExecutionException
33843390
{
33853391
String version = junitPlatformArtifact.getBaseVersion();
33863392
for ( Artifact launcherArtifact : resolve( PROVIDER_DEP_GID, PROVIDER_DEP_AID, version, null, "jar" ) )
@@ -3393,7 +3399,7 @@ private void alignProviderVersions( Map<String, Artifact> providerArtifacts )
33933399
}
33943400
}
33953401

3396-
private Set<Artifact> resolve( String g, String a, String v, String c, String t )
3402+
private Set<Artifact> resolve( String g, String a, String v, String c, String t ) throws MojoExecutionException
33973403
{
33983404
ArtifactHandler handler = junitPlatformArtifact.getArtifactHandler();
33993405
Artifact artifact = new DefaultArtifact( g, a, v, null, t, c, handler );
@@ -3471,7 +3477,7 @@ public List<String[]> getJpmsArguments( @Nonnull ProviderRequirements forkRequir
34713477

34723478
@Override
34733479
@Nonnull
3474-
public Set<Artifact> getProviderClasspath()
3480+
public Set<Artifact> getProviderClasspath() throws MojoExecutionException
34753481
{
34763482
String version = getBooterArtifact().getBaseVersion();
34773483
return surefireDependencyResolver.getProviderClasspath( "surefire-junit47", version );
@@ -4082,6 +4088,11 @@ public void setTempDir( String tempDir )
40824088
this.tempDir = tempDir;
40834089
}
40844090

4091+
public void setResolutionErrorHandler( ResolutionErrorHandler resolutionErrorHandler )
4092+
{
4093+
this.resolutionErrorHandler = resolutionErrorHandler;
4094+
}
4095+
40854096
private static String getEffectiveForkMode( String forkMode )
40864097
{
40874098
if ( "pertest".equalsIgnoreCase( forkMode ) )

maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,18 @@
3232

3333
import org.apache.maven.artifact.Artifact;
3434
import org.apache.maven.artifact.repository.ArtifactRepository;
35+
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
3536
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
3637
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
38+
import org.apache.maven.artifact.resolver.ResolutionErrorHandler;
3739
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
3840
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
3941
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
4042
import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
4143
import org.apache.maven.artifact.versioning.VersionRange;
4244
import org.apache.maven.model.Dependency;
4345
import org.apache.maven.model.Plugin;
46+
import org.apache.maven.plugin.MojoExecutionException;
4447
import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
4548
import org.apache.maven.repository.RepositorySystem;
4649

@@ -87,22 +90,25 @@ final class SurefireDependencyResolver
8790

8891
private final List<ArtifactRepository> projectRemoteRepositories;
8992

90-
private final String pluginName;
93+
private final ResolutionErrorHandler resolutionErrorHandler;
9194

95+
private final String pluginName;
9296

9397
private final boolean offline;
9498

9599
SurefireDependencyResolver( RepositorySystem repositorySystem, ConsoleLogger log,
96100
ArtifactRepository localRepository,
97101
List<ArtifactRepository> pluginRemoteRepositories,
98102
List<ArtifactRepository> projectRemoteRepositories,
103+
ResolutionErrorHandler resolutionErrorHandler,
99104
String pluginName, boolean offline )
100105
{
101106
this.repositorySystem = repositorySystem;
102107
this.log = log;
103108
this.localRepository = localRepository;
104109
this.pluginRemoteRepositories = pluginRemoteRepositories;
105110
this.projectRemoteRepositories = projectRemoteRepositories;
111+
this.resolutionErrorHandler = resolutionErrorHandler;
106112
this.pluginName = pluginName;
107113
this.offline = offline;
108114
}
@@ -132,6 +138,7 @@ static boolean isWithinVersionSpec( @Nullable Artifact artifact, @Nonnull String
132138
}
133139

134140
Map<String, Artifact> resolvePluginDependencies( Plugin plugin, Map<String, Artifact> pluginResolvedDependencies )
141+
throws MojoExecutionException
135142
{
136143
Map<String, Artifact> resolved = new LinkedHashMap<>();
137144
Collection<Dependency> pluginDependencies = plugin.getDependencies();
@@ -153,28 +160,30 @@ Map<String, Artifact> resolvePluginDependencies( Plugin plugin, Map<String, Arti
153160
return resolved;
154161
}
155162

156-
ArtifactResolutionResult resolvePluginArtifact( Artifact artifact )
163+
ArtifactResolutionResult resolvePluginArtifact( Artifact artifact ) throws MojoExecutionException
157164
{
158165
return resolvePluginArtifact( artifact, new RuntimeArtifactFilter() );
159166
}
160167

161-
ArtifactResolutionResult resolveProjectArtifact( Artifact artifact )
168+
ArtifactResolutionResult resolveProjectArtifact( Artifact artifact ) throws MojoExecutionException
162169
{
163170
return resolveProjectArtifact( artifact, new RuntimeArtifactFilter() );
164171
}
165172

166173
private ArtifactResolutionResult resolvePluginArtifact( Artifact artifact, ArtifactFilter filter )
174+
throws MojoExecutionException
167175
{
168176
return resolveArtifact( artifact, pluginRemoteRepositories, filter );
169177
}
170178

171179
private ArtifactResolutionResult resolveProjectArtifact( Artifact artifact, ArtifactFilter filter )
180+
throws MojoExecutionException
172181
{
173182
return resolveArtifact( artifact, projectRemoteRepositories, filter );
174183
}
175184

176185
private ArtifactResolutionResult resolveArtifact( Artifact artifact, List<ArtifactRepository> repositories,
177-
ArtifactFilter filter )
186+
ArtifactFilter filter ) throws MojoExecutionException
178187
{
179188
ArtifactResolutionRequest request = new ArtifactResolutionRequest()
180189
.setOffline( offline )
@@ -184,11 +193,22 @@ private ArtifactResolutionResult resolveArtifact( Artifact artifact, List<Artifa
184193
.setCollectionFilter( filter )
185194
.setRemoteRepositories( repositories );
186195

187-
return repositorySystem.resolve( request );
196+
ArtifactResolutionResult result = repositorySystem.resolve( request );
197+
try
198+
{
199+
resolutionErrorHandler.throwErrors( request, result );
200+
}
201+
catch ( ArtifactResolutionException e )
202+
{
203+
throw new MojoExecutionException( e.getMessage(), e );
204+
}
205+
206+
return result;
188207
}
189208

190209
@Nonnull
191210
Set<Artifact> getProviderClasspath( String providerArtifactId, String providerVersion )
211+
throws MojoExecutionException
192212
{
193213
Dependency provider = toProviderDependency( providerArtifactId, providerVersion );
194214

@@ -211,6 +231,7 @@ Set<Artifact> getProviderClasspath( String providerArtifactId, String providerVe
211231

212232
@Nonnull
213233
Map<String, Artifact> getProviderClasspathAsMap( String providerArtifactId, String providerVersion )
234+
throws MojoExecutionException
214235
{
215236
return artifactMapByVersionlessId( getProviderClasspath( providerArtifactId, providerVersion ) );
216237
}

maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.apache.maven.artifact.repository.ArtifactRepository;
4545
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
4646
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
47+
import org.apache.maven.artifact.resolver.DefaultResolutionErrorHandler;
4748
import org.apache.maven.artifact.versioning.VersionRange;
4849
import org.apache.maven.execution.MavenSession;
4950
import org.apache.maven.model.Dependency;
@@ -157,6 +158,7 @@ public void setupMojo()
157158
plugin.setVersion( mojoArtifact.getVersion() );
158159
when( pluginDescriptor.getPlugin() ).thenReturn( plugin );
159160
mojo.setPluginDescriptor( pluginDescriptor );
161+
mojo.setResolutionErrorHandler( new DefaultResolutionErrorHandler() );
160162
}
161163

162164
@Test

maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireDependencyResolverTest.java

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@
2727

2828
import org.apache.maven.artifact.Artifact;
2929
import org.apache.maven.artifact.DefaultArtifact;
30+
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
3031
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
3132
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
33+
import org.apache.maven.artifact.resolver.DefaultResolutionErrorHandler;
3234
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
3335
import org.apache.maven.artifact.versioning.VersionRange;
3436
import org.apache.maven.model.Dependency;
3537
import org.apache.maven.model.Plugin;
38+
import org.apache.maven.plugin.MojoExecutionException;
3639
import org.apache.maven.plugin.surefire.SurefireDependencyResolver.RuntimeArtifactFilter;
3740
import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
3841
import org.apache.maven.repository.RepositorySystem;
@@ -49,6 +52,7 @@
4952
import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec;
5053
import static org.apache.maven.plugin.surefire.SurefireDependencyResolver.PROVIDER_GROUP_ID;
5154
import static org.assertj.core.api.Assertions.assertThat;
55+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5256
import static org.mockito.Mockito.any;
5357
import static org.mockito.Mockito.mock;
5458
import static org.mockito.Mockito.verify;
@@ -108,7 +112,7 @@ public void shouldBeFailWithinRange() throws InvalidVersionSpecificationExceptio
108112
}
109113

110114
@Test
111-
public void testResolveArtifact() throws InvalidVersionSpecificationException
115+
public void testResolveArtifact() throws InvalidVersionSpecificationException, MojoExecutionException
112116
{
113117
final Artifact provider = createArtifact( "surefire-junit-platform" );
114118
RepositorySystem repositorySystem = mock( RepositorySystem.class );
@@ -152,7 +156,8 @@ public ArtifactResolutionResult answer( InvocationOnMock invocation )
152156
} );
153157

154158
SurefireDependencyResolver surefireDependencyResolver =
155-
new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, false );
159+
new SurefireDependencyResolver( repositorySystem, null, null, null, null,
160+
new DefaultResolutionErrorHandler(), null, false );
156161

157162
ArtifactResolutionResult actualResult = surefireDependencyResolver.resolvePluginArtifact( provider );
158163

@@ -246,7 +251,8 @@ public Artifact answer( InvocationOnMock invocation )
246251
ConsoleLogger log = mock( ConsoleLogger.class );
247252

248253
SurefireDependencyResolver surefireDependencyResolver =
249-
new SurefireDependencyResolver( repositorySystem, log, null, null, null, null, false );
254+
new SurefireDependencyResolver( repositorySystem, log, null, null, null,
255+
new DefaultResolutionErrorHandler(), null, false );
250256

251257
when( log.isDebugEnabled() )
252258
.thenReturn( true );
@@ -275,6 +281,35 @@ public Artifact answer( InvocationOnMock invocation )
275281
.isSameAs( ext );
276282
}
277283

284+
@Test
285+
public void testGetProviderClasspathShouldPropagateTheResolutionException() throws Exception
286+
{
287+
Artifact provider = createArtifact( "surefire-junit-platform" );
288+
provider.setFile( null );
289+
290+
Set<Artifact> providerArtifacts = new LinkedHashSet<>();
291+
providerArtifacts.add( provider );
292+
293+
ArtifactResolutionResult result = mock( ArtifactResolutionResult.class );
294+
when( result.getArtifacts() ).thenReturn( providerArtifacts );
295+
when( result.hasMetadataResolutionExceptions() ).thenReturn( true );
296+
ArtifactResolutionException resolutionException =
297+
new ArtifactResolutionException( "failed to resolve", provider );
298+
when( result.getMetadataResolutionException( 0 ) ).thenReturn( resolutionException );
299+
300+
RepositorySystem repositorySystem = mock( RepositorySystem.class );
301+
when( repositorySystem.resolve( any( ArtifactResolutionRequest.class ) ) ).thenReturn( result );
302+
when( repositorySystem.createDependencyArtifact( any( Dependency.class ) ) ).thenReturn( provider );
303+
304+
SurefireDependencyResolver surefireDependencyResolver =
305+
new SurefireDependencyResolver( repositorySystem, mock( ConsoleLogger.class ), null, null, null,
306+
new DefaultResolutionErrorHandler(), null, false );
307+
308+
assertThatThrownBy( () -> surefireDependencyResolver.getProviderClasspath( "surefire-junit-platform", "1" ) )
309+
.isInstanceOf( MojoExecutionException.class )
310+
.hasCause( resolutionException );
311+
}
312+
278313
@Test
279314
public void testResolvePluginDependencies() throws Exception
280315
{
@@ -306,7 +341,8 @@ public void testResolvePluginDependencies() throws Exception
306341
singletonMap( PROVIDER_GROUP_ID + ":surefire-shadefire", providerAsArtifact );
307342

308343
SurefireDependencyResolver surefireDependencyResolver =
309-
new SurefireDependencyResolver( repositorySystem, null, null, null, null, null, false );
344+
new SurefireDependencyResolver( repositorySystem, null, null, null, null,
345+
new DefaultResolutionErrorHandler(), null, false );
310346

311347
Map<String, Artifact> providers =
312348
surefireDependencyResolver.resolvePluginDependencies( plugin, pluginResolvedDependencies );

0 commit comments

Comments
 (0)