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