View Javadoc
1   package org.apache.maven.plugins.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.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             // expected.
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             // just make sure this trips, to meet the mock's expectations.
276             mac.artifact.getDependencyConflictId();
277 
278             assertTrue( artifacts.isEmpty() );
279         }
280 
281         mockManager.verifyAll();
282 
283         // get ready for multiple calls per test.
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         // make sure the mock is satisfied...you can't disable this expectation.
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         // get ready for multiple calls per test.
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             // this is always enabled, for verification purposes.
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 }