1 package org.apache.maven.plugins.assembly.utils;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.hamcrest.Matchers;
23
24 import junit.framework.TestCase;
25 import org.apache.maven.artifact.Artifact;
26 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
27 import org.apache.maven.model.Model;
28 import org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException;
29 import org.apache.maven.project.MavenProject;
30 import org.codehaus.plexus.logging.Logger;
31 import org.codehaus.plexus.logging.console.ConsoleLogger;
32 import org.easymock.classextension.EasyMockSupport;
33 import org.junit.Assert;
34
35 import java.util.ArrayList;
36 import java.util.Arrays;
37 import java.util.Collections;
38 import java.util.HashSet;
39 import java.util.List;
40 import java.util.Set;
41
42 import static org.easymock.EasyMock.expect;
43
44 public class FilterUtilsTest
45 extends TestCase
46 {
47
48 private final EasyMockSupport mockManager = new EasyMockSupport();
49
50 private Logger logger;
51
52 private static Model buildModel( final String groupId, final String artifactId )
53 {
54 final Model model = new Model();
55 model.setGroupId( groupId );
56 model.setArtifactId( artifactId );
57
58 return model;
59 }
60
61 @Override
62 public void setUp()
63 {
64 clearAll();
65 }
66
67 private void clearAll()
68 {
69 logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
70 }
71
72 public void testFilterArtifacts_ShouldThrowExceptionUsingStrictModeWithUnmatchedInclude()
73 {
74 final Artifact artifact = mockManager.createMock( Artifact.class );
75
76 expect( artifact.getGroupId() ).andReturn( "group" ).atLeastOnce();
77
78 expect( artifact.getArtifactId() ).andReturn( "artifact" ).atLeastOnce();
79
80 expect( artifact.getId() ).andReturn( "group:artifact:type:version" ).atLeastOnce();
81
82 expect( artifact.getDependencyConflictId() ).andReturn( "group:artifact:type" ).atLeastOnce();
83
84 final List<String> includes = new ArrayList<String>();
85
86 includes.add( "other.group:other-artifact:type:version" );
87
88 final List<String> excludes = Collections.emptyList();
89
90 final Set<Artifact> artifacts = new HashSet<Artifact>();
91 artifacts.add( artifact );
92
93 mockManager.replayAll();
94
95 try
96 {
97 FilterUtils.filterArtifacts( artifacts, includes, excludes, true, false, logger );
98
99 fail( "Should fail because of unmatched include." );
100 }
101 catch ( final InvalidAssemblerConfigurationException e )
102 {
103
104 }
105
106 mockManager.verifyAll();
107 }
108
109 public void testFilterArtifacts_ShouldNotRemoveArtifactDirectlyIncluded()
110 throws InvalidAssemblerConfigurationException
111 {
112 verifyArtifactInclusion( "group", "artifact", "group:artifact", null, null, null );
113 verifyArtifactInclusion( "group", "artifact", "group:artifact:jar", null, null, null );
114 }
115
116 public void testFilterArtifacts_ShouldNotRemoveArtifactTransitivelyIncluded()
117 throws InvalidAssemblerConfigurationException
118 {
119 verifyArtifactInclusion( "group", "artifact", "group:dependentArtifact", null,
120 Arrays.asList( "current:project:jar:1.0", "group:dependentArtifact:jar:version" ),
121 null );
122 }
123
124 public void testFilterArtifacts_ShouldRemoveArtifactTransitivelyExcluded()
125 throws InvalidAssemblerConfigurationException
126 {
127 verifyArtifactExclusion( "group", "artifact", null, "group:dependentArtifact",
128 Arrays.asList( "current:project:jar:1.0", "group:dependentArtifact:jar:version" ),
129 null );
130 }
131
132 public void testFilterArtifacts_ShouldRemoveArtifactDirectlyExcluded()
133 throws InvalidAssemblerConfigurationException
134 {
135 verifyArtifactExclusion( "group", "artifact", null, "group:artifact", null, null );
136
137 clearAll();
138
139 verifyArtifactExclusion( "group", "artifact", null, "group:artifact:jar", null, null );
140 }
141
142 public void testFilterArtifacts_ShouldNotRemoveArtifactNotIncludedAndNotExcluded()
143 throws InvalidAssemblerConfigurationException
144 {
145 verifyArtifactInclusion( "group", "artifact", null, null, null, null );
146 verifyArtifactInclusion( "group", "artifact", null, null, null, null );
147 }
148
149 public void testFilterArtifacts_ShouldRemoveArtifactExcludedByAdditionalFilter()
150 throws InvalidAssemblerConfigurationException
151 {
152 final ArtifactFilter filter = new ArtifactFilter()
153 {
154
155 public boolean include( final Artifact artifact )
156 {
157 return false;
158 }
159
160 };
161
162 verifyArtifactExclusion( "group", "artifact", "fail:fail", null, null, filter );
163 }
164
165 public void testFilterProjects_ShouldNotRemoveProjectDirectlyIncluded()
166 {
167 verifyProjectInclusion( "group", "artifact", "group:artifact", null, null );
168 verifyProjectInclusion( "group", "artifact", "group:artifact:jar", null, null );
169 }
170
171 public void testFilterProjects_ShouldNotRemoveProjectTransitivelyIncluded()
172 {
173 verifyProjectInclusion( "group", "artifact", "group:dependentArtifact", null,
174 Arrays.asList( "current:project:jar:1.0", "group:dependentArtifact:jar:version" ) );
175 }
176
177 public void testFilterProjects_ShouldRemoveProjectTransitivelyExcluded()
178 {
179 verifyProjectExclusion( "group", "artifact", null, "group:dependentArtifact",
180 Arrays.asList( "current:project:jar:1.0", "group:dependentArtifact:jar:version" ) );
181 }
182
183 public void testFilterProjects_ShouldRemoveProjectDirectlyExcluded()
184 {
185 verifyProjectExclusion( "group", "artifact", null, "group:artifact", null );
186 verifyProjectExclusion( "group", "artifact", null, "group:artifact:jar", null );
187 }
188
189 public void testFilterProjects_ShouldNotRemoveProjectNotIncludedAndNotExcluded()
190 {
191 verifyProjectInclusion( "group", "artifact", null, null, null );
192 verifyProjectInclusion( "group", "artifact", null, null, null );
193 }
194
195 public void testTransitiveScopes()
196 {
197 Assert.assertThat( FilterUtils.newScopeFilter( "compile" ).getIncluded(),
198 Matchers.containsInAnyOrder( "compile", "provided", "system" ) );
199
200 Assert.assertThat( FilterUtils.newScopeFilter( "provided" ).getIncluded(),
201 Matchers.containsInAnyOrder( "provided" ) );
202
203 Assert.assertThat( FilterUtils.newScopeFilter( "system" ).getIncluded(),
204 Matchers.containsInAnyOrder( "system" ) );
205
206 Assert.assertThat( FilterUtils.newScopeFilter( "runtime" ).getIncluded(),
207 Matchers.containsInAnyOrder( "compile", "runtime" ) );
208
209 Assert.assertThat( FilterUtils.newScopeFilter( "test" ).getIncluded(),
210 Matchers.containsInAnyOrder( "compile", "provided", "runtime", "system", "test" ) );
211
212 }
213
214 private void verifyArtifactInclusion( final String groupId, final String artifactId, final String inclusionPattern,
215 final String exclusionPattern, final List<String> depTrail,
216 final ArtifactFilter additionalFilter )
217 throws InvalidAssemblerConfigurationException
218 {
219 verifyArtifactFiltering( groupId, artifactId, inclusionPattern, exclusionPattern, depTrail, true,
220 additionalFilter );
221 }
222
223 private void verifyArtifactExclusion( final String groupId, final String artifactId, final String inclusionPattern,
224 final String exclusionPattern, final List<String> depTrail,
225 final ArtifactFilter additionalFilter )
226 throws InvalidAssemblerConfigurationException
227 {
228 verifyArtifactFiltering( groupId, artifactId, inclusionPattern, exclusionPattern, depTrail, false,
229 additionalFilter );
230 }
231
232 private void verifyArtifactFiltering( final String groupId, final String artifactId, final String inclusionPattern,
233 final String exclusionPattern, final List<String> depTrail,
234 final boolean verifyInclusion, final ArtifactFilter additionalFilter )
235 throws InvalidAssemblerConfigurationException
236 {
237 final ArtifactMockAndControl mac = new ArtifactMockAndControl( groupId, artifactId, depTrail );
238
239 mockManager.replayAll();
240
241 List<String> inclusions;
242 if ( inclusionPattern != null )
243 {
244 inclusions = Collections.singletonList( inclusionPattern );
245 }
246 else
247 {
248 inclusions = Collections.emptyList();
249 }
250
251 List<String> exclusions;
252 if ( exclusionPattern != null )
253 {
254 exclusions = Collections.singletonList( exclusionPattern );
255 }
256 else
257 {
258 exclusions = Collections.emptyList();
259 }
260
261 final Set<Artifact> artifacts = new HashSet<Artifact>();
262 artifacts.add( mac.artifact );
263
264 FilterUtils.filterArtifacts( artifacts, inclusions, exclusions, false, depTrail != null, logger,
265 additionalFilter );
266
267 if ( verifyInclusion )
268 {
269 assertEquals( 1, artifacts.size() );
270 assertEquals( mac.artifact.getDependencyConflictId(),
271 artifacts.iterator().next().getDependencyConflictId() );
272 }
273 else
274 {
275
276 mac.artifact.getDependencyConflictId();
277
278 assertTrue( artifacts.isEmpty() );
279 }
280
281 mockManager.verifyAll();
282
283
284 mockManager.resetAll();
285 }
286
287 private void verifyProjectInclusion( final String groupId, final String artifactId, final String inclusionPattern,
288 final String exclusionPattern, final List<String> depTrail )
289 {
290 verifyProjectFiltering( groupId, artifactId, inclusionPattern, exclusionPattern, depTrail, true );
291 }
292
293 private void verifyProjectExclusion( final String groupId, final String artifactId, final String inclusionPattern,
294 final String exclusionPattern, final List<String> depTrail )
295 {
296 verifyProjectFiltering( groupId, artifactId, inclusionPattern, exclusionPattern, depTrail, false );
297 }
298
299 private void verifyProjectFiltering( final String groupId, final String artifactId, final String inclusionPattern,
300 final String exclusionPattern, final List<String> depTrail,
301 final boolean verifyInclusion )
302 {
303 final ProjectWithArtifactMockControl pmac = new ProjectWithArtifactMockControl( groupId, artifactId, depTrail );
304
305 mockManager.replayAll();
306
307
308 pmac.mac.artifact.getDependencyConflictId();
309
310 final Set<MavenProject> projects = new HashSet<MavenProject>();
311 projects.add( pmac );
312
313 List<String> inclusions;
314 if ( inclusionPattern != null )
315 {
316 inclusions = Collections.singletonList( inclusionPattern );
317 }
318 else
319 {
320 inclusions = Collections.emptyList();
321 }
322
323 List<String> exclusions;
324 if ( exclusionPattern != null )
325 {
326 exclusions = Collections.singletonList( exclusionPattern );
327 }
328 else
329 {
330 exclusions = Collections.emptyList();
331 }
332
333 final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, "test" );
334
335 Set<MavenProject> result =
336 FilterUtils.filterProjects( projects, inclusions, exclusions, depTrail != null, logger );
337
338 if ( verifyInclusion )
339 {
340 assertEquals( 1, result.size() );
341 assertEquals( pmac.getId(), result.iterator().next().getId() );
342 }
343 else
344 {
345 assertTrue( result.isEmpty() );
346 }
347
348 mockManager.verifyAll();
349
350
351 mockManager.resetAll();
352 }
353
354 private final class ProjectWithArtifactMockControl
355 extends MavenProject
356 {
357 final ArtifactMockAndControl mac;
358
359 ProjectWithArtifactMockControl( final String groupId, final String artifactId, final List<String> depTrail )
360 {
361 super( buildModel( groupId, artifactId ) );
362
363 mac = new ArtifactMockAndControl( groupId, artifactId, depTrail );
364
365 setArtifact( mac.artifact );
366
367 setVersion( "1.0" );
368 }
369
370 }
371
372 private final class ArtifactMockAndControl
373 {
374 final Artifact artifact;
375
376 final String groupId;
377
378 final String artifactId;
379
380 final List<String> dependencyTrail;
381
382 ArtifactMockAndControl( final String groupId, final String artifactId, final List<String> dependencyTrail )
383 {
384 this.groupId = groupId;
385 this.artifactId = artifactId;
386 this.dependencyTrail = dependencyTrail;
387
388 artifact = mockManager.createMock( Artifact.class );
389
390
391 enableGetDependencyConflictId();
392 enableGetGroupIdArtifactIdAndId();
393
394 if ( dependencyTrail != null )
395 {
396 enableGetDependencyTrail();
397 }
398 }
399
400 void enableGetDependencyTrail()
401 {
402 expect( artifact.getDependencyTrail() ).andReturn( dependencyTrail ).anyTimes();
403 }
404
405 void enableGetDependencyConflictId()
406 {
407 expect( artifact.getDependencyConflictId() ).andReturn( groupId + ":" + artifactId + ":jar" ).anyTimes();
408 }
409
410 void enableGetGroupIdArtifactIdAndId()
411 {
412 expect( artifact.getGroupId() ).andReturn( groupId ).anyTimes();
413
414 expect( artifact.getArtifactId() ).andReturn( artifactId ).anyTimes();
415
416 expect( artifact.getId() ).andReturn( groupId + ":" + artifactId + ":version:null:jar" ).anyTimes();
417 }
418 }
419
420 }