View Javadoc

1   package org.apache.maven.plugin.assembly.utils;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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             // expected.
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             // just make sure this trips, to meet the mock's expectations.
269             mac.artifact.getDependencyConflictId();
270 
271             assertTrue( artifacts.isEmpty() );
272         }
273 
274         mockManager.verifyAll();
275 
276         // get ready for multiple calls per test.
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         // make sure the mock is satisfied...you can't disable this expectation.
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         // get ready for multiple calls per test.
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             // this is always enabled, for verification purposes.
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 }