View Javadoc
1   package org.apache.maven.shared.dependency.tree;
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.DefaultArtifact;
24  import org.apache.maven.artifact.handler.DefaultArtifactHandler;
25  import org.apache.maven.artifact.versioning.VersionRange;
26  import org.apache.maven.plugin.testing.SilentLog;
27  
28  /**
29   * Tests <code>DependencyTreeResolutionListener</code>.
30   * 
31   * @author Edwin Punzalan
32   * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
33   * @version $Id: DependencyTreeResolutionListenerTest.java 1595642 2014-05-18 17:32:08Z jvanzyl $
34   * @see DependencyTreeResolutionListener
35   */
36  public class DependencyTreeResolutionListenerTest
37      extends AbstractDependencyNodeTest
38  {
39      // fields -----------------------------------------------------------------
40  
41      private DependencyTreeResolutionListener listener;
42  
43      // TestCase methods -------------------------------------------------------
44  
45      /**
46       * {@inheritDoc}
47       */
48      protected void setUp()
49          throws Exception
50      {
51          super.setUp();
52  
53          listener = new DependencyTreeResolutionListener( new SilentLog() );
54      }
55  
56      // tests ------------------------------------------------------------------
57  
58      public void testSimpleDependencyTree()
59      {
60          Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
61          listener.includeArtifact( projectArtifact );
62  
63          listener.startProcessChildren( projectArtifact );
64  
65          Artifact depArtifact01 = createArtifact( "test-dep", "dependency-one", "1.0" );
66          listener.includeArtifact( depArtifact01 );
67  
68          Artifact depArtifact02 = createArtifact( "test-dep", "dependency-two", "1.0" );
69          listener.includeArtifact( depArtifact02 );
70  
71          Artifact depArtifact03 = createArtifact( "test-dep", "dependency-three", "1.0" );
72          listener.includeArtifact( depArtifact03 );
73  
74          listener.endProcessChildren( projectArtifact );
75  
76          DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
77          projectArtifactNode.addChild( new DependencyNode( depArtifact01 ) );
78          projectArtifactNode.addChild( new DependencyNode( depArtifact02 ) );
79          projectArtifactNode.addChild( new DependencyNode( depArtifact03 ) );
80  
81          assertEquals( projectArtifactNode, listener.getRootNode() );
82      }
83  
84      public void testSimpleDepTreeWithTransitiveDeps()
85      {
86          Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
87          listener.includeArtifact( projectArtifact );
88  
89          listener.startProcessChildren( projectArtifact );
90  
91          Artifact depArtifact1 = createArtifact( "test-dep", "dependency-one", "1.0" );
92          listener.includeArtifact( depArtifact1 );
93  
94          listener.startProcessChildren( depArtifact1 );
95  
96          Artifact depArtifact01 = createArtifact( "test-dep", "dependency-zero-one", "1.0" );
97          listener.includeArtifact( depArtifact01 );
98  
99          Artifact depArtifact02 = createArtifact( "test-dep", "dependency-zero-two", "1.0" );
100         listener.includeArtifact( depArtifact02 );
101 
102         listener.endProcessChildren( depArtifact1 );
103 
104         Artifact depArtifact2 = createArtifact( "test-dep", "dependency-two", "1.0" );
105         listener.includeArtifact( depArtifact2 );
106 
107         Artifact depArtifact3 = createArtifact( "test-dep", "dependency-three", "1.0" );
108         listener.includeArtifact( depArtifact3 );
109 
110         listener.endProcessChildren( projectArtifact );
111 
112         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
113         DependencyNode depArtifact1Node = new DependencyNode( depArtifact1 );
114         projectArtifactNode.addChild( depArtifact1Node );
115         depArtifact1Node.addChild( new DependencyNode( depArtifact01 ) );
116         depArtifact1Node.addChild( new DependencyNode( depArtifact02 ) );
117         projectArtifactNode.addChild( new DependencyNode( depArtifact2 ) );
118         projectArtifactNode.addChild( new DependencyNode( depArtifact3 ) );
119 
120         assertEquals( projectArtifactNode, listener.getRootNode() );
121     }
122 
123     public void testComplexDependencyTree()
124     {
125         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
126         listener.includeArtifact( projectArtifact );
127 
128         listener.startProcessChildren( projectArtifact );
129 
130         Artifact depArtifact1 = createArtifact( "test-dep", "dependency-one", "jar", "1.0", Artifact.SCOPE_COMPILE );
131         listener.includeArtifact( depArtifact1 );
132 
133         listener.startProcessChildren( depArtifact1 );
134 
135         Artifact depArtifact11 = createArtifact( "test-dep", "dependency-zero-one", "1.0" );
136         listener.includeArtifact( depArtifact11 );
137 
138         Artifact depArtifact12 = createArtifact( "test-dep", "dependency-zero-two", "1.0" );
139         listener.includeArtifact( depArtifact12 );
140 
141         listener.startProcessChildren( depArtifact12 );
142 
143         Artifact depArtifact121 = createArtifact( "test-dep", "dep-zero-two-1", "1.0" );
144         listener.includeArtifact( depArtifact121 );
145 
146         listener.endProcessChildren( depArtifact12 );
147 
148         listener.endProcessChildren( depArtifact1 );
149 
150         Artifact depArtifact2 = createArtifact( "test-dep", "dependency-two", "jar", "1.0", Artifact.SCOPE_TEST );
151         listener.includeArtifact( depArtifact2 );
152 
153         listener.startProcessChildren( depArtifact2 );
154 
155         Artifact depArtifact21 = createArtifact( "test-dep", "dep-zero-two-1", "1.0" );
156         listener.omitForNearer( depArtifact121, depArtifact21 );
157         listener.includeArtifact( depArtifact21 );
158 
159         listener.endProcessChildren( depArtifact2 );
160 
161         Artifact depArtifact3 = createArtifact( "test-dep", "dependency-three", "jar", "1.0", Artifact.SCOPE_COMPILE );
162         listener.includeArtifact( depArtifact3 );
163 
164         listener.endProcessChildren( projectArtifact );
165 
166         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
167         DependencyNode depArtifact1Node = new DependencyNode( depArtifact1 );
168         projectArtifactNode.addChild( depArtifact1Node );
169         depArtifact1Node.addChild( new DependencyNode( depArtifact11 ) );
170         DependencyNode depArtifact12Node = new DependencyNode( depArtifact12 );
171         depArtifact1Node.addChild( depArtifact12Node );
172         depArtifact12Node.addChild( new DependencyNode( depArtifact121, DependencyNode.OMITTED_FOR_DUPLICATE,
173                                                         depArtifact21 ) );
174         DependencyNode depArtifact2Node = new DependencyNode( depArtifact2 );
175         projectArtifactNode.addChild( depArtifact2Node );
176         depArtifact2Node.addChild( new DependencyNode( depArtifact21 ) );
177         projectArtifactNode.addChild( new DependencyNode( depArtifact3 ) );
178 
179         assertEquals( projectArtifactNode, listener.getRootNode() );
180     }
181 
182     public void testIncludeArtifactDuplicate()
183     {
184         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
185         listener.includeArtifact( projectArtifact );
186 
187         listener.startProcessChildren( projectArtifact );
188 
189         Artifact depArtifact1 = createArtifact( "test-dep", "dependency", "1.0" );
190         listener.includeArtifact( depArtifact1 );
191 
192         Artifact depArtifact2 = createArtifact( "test-dep", "dependency", "1.0" );
193         listener.omitForNearer( depArtifact1, depArtifact2 );
194         listener.includeArtifact( depArtifact2 );
195 
196         listener.endProcessChildren( projectArtifact );
197 
198         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
199         projectArtifactNode.addChild( new DependencyNode( depArtifact1, DependencyNode.OMITTED_FOR_DUPLICATE,
200                                                           depArtifact2 ) );
201         projectArtifactNode.addChild( new DependencyNode( depArtifact2 ) );
202 
203         assertEquals( projectArtifactNode, listener.getRootNode() );
204     }
205 
206     public void testIncludeArtifactDuplicateWithChildren()
207     {
208         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
209         listener.includeArtifact( projectArtifact );
210 
211         listener.startProcessChildren( projectArtifact );
212 
213         Artifact depArtifact1 = createArtifact( "test-dep", "dependency", "1.0" );
214         listener.includeArtifact( depArtifact1 );
215 
216         listener.startProcessChildren( depArtifact1 );
217 
218         Artifact depArtifact11 = createArtifact( "test-dep", "child", "1.0" );
219         listener.includeArtifact( depArtifact11 );
220 
221         listener.endProcessChildren( depArtifact1 );
222 
223         Artifact depArtifact2 = createArtifact( "test-dep", "dependency", "1.0" );
224         listener.omitForNearer( depArtifact1, depArtifact2 );
225         listener.includeArtifact( depArtifact2 );
226 
227         listener.startProcessChildren( depArtifact2 );
228 
229         Artifact depArtifact21 = createArtifact( "test-dep", "child", "1.0" );
230         listener.includeArtifact( depArtifact21 );
231 
232         listener.endProcessChildren( depArtifact2 );
233 
234         listener.endProcessChildren( projectArtifact );
235 
236         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
237         DependencyNode depArtifact1Node =
238             new DependencyNode( depArtifact1, DependencyNode.OMITTED_FOR_DUPLICATE, depArtifact2 );
239         projectArtifactNode.addChild( depArtifact1Node );
240         DependencyNode depArtifact2Node = new DependencyNode( depArtifact2 );
241         projectArtifactNode.addChild( depArtifact2Node );
242         depArtifact2Node.addChild( new DependencyNode( depArtifact21 ) );
243 
244         assertEquals( projectArtifactNode, listener.getRootNode() );
245     }
246 
247     public void testOmitForConflictKept()
248     {
249         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
250         listener.includeArtifact( projectArtifact );
251 
252         listener.startProcessChildren( projectArtifact );
253 
254         Artifact depArtifact1 = createArtifact( "test-dep", "dependency", "1.0" );
255         listener.includeArtifact( depArtifact1 );
256 
257         Artifact depArtifact2 = createArtifact( "test-dep", "dependency", "2.0" );
258         listener.omitForNearer( depArtifact1, depArtifact2 );
259         listener.includeArtifact( depArtifact2 );
260 
261         listener.endProcessChildren( projectArtifact );
262 
263         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
264         projectArtifactNode.addChild( new DependencyNode( depArtifact1, DependencyNode.OMITTED_FOR_CONFLICT,
265                                                           depArtifact2 ) );
266         projectArtifactNode.addChild( new DependencyNode( depArtifact2 ) );
267 
268         assertEquals( projectArtifactNode, listener.getRootNode() );
269     }
270 
271     public void testOmitForConflictKeptWithChildren()
272     {
273         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
274         listener.includeArtifact( projectArtifact );
275 
276         listener.startProcessChildren( projectArtifact );
277 
278         Artifact depArtifact1 = createArtifact( "test-dep", "dependency", "1.0" );
279         listener.includeArtifact( depArtifact1 );
280 
281         listener.startProcessChildren( depArtifact1 );
282 
283         Artifact depArtifact11 = createArtifact( "test-dep", "child", "1.0" );
284         listener.includeArtifact( depArtifact11 );
285 
286         listener.endProcessChildren( depArtifact1 );
287 
288         Artifact depArtifact2 = createArtifact( "test-dep", "dependency", "2.0" );
289         listener.omitForNearer( depArtifact1, depArtifact2 );
290         listener.includeArtifact( depArtifact2 );
291 
292         listener.startProcessChildren( depArtifact2 );
293 
294         Artifact depArtifact21 = createArtifact( "test-dep", "child", "2.0" );
295         listener.includeArtifact( depArtifact21 );
296 
297         listener.endProcessChildren( depArtifact2 );
298 
299         listener.endProcessChildren( projectArtifact );
300 
301         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
302         projectArtifactNode.addChild( new DependencyNode( depArtifact1, DependencyNode.OMITTED_FOR_CONFLICT,
303                                                           depArtifact2 ) );
304         DependencyNode depArtifact2Node = new DependencyNode( depArtifact2 );
305         projectArtifactNode.addChild( depArtifact2Node );
306         depArtifact2Node.addChild( new DependencyNode( depArtifact21 ) );
307 
308         assertEquals( projectArtifactNode, listener.getRootNode() );
309     }
310 
311     public void testOmitForConflictOmitted()
312     {
313         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
314         listener.includeArtifact( projectArtifact );
315 
316         listener.startProcessChildren( projectArtifact );
317 
318         Artifact depArtifact2 = createArtifact( "test-dep", "dependency", "2.0" );
319         listener.includeArtifact( depArtifact2 );
320 
321         Artifact depArtifact1 = createArtifact( "test-dep", "dependency", "1.0" );
322         listener.omitForNearer( depArtifact1, depArtifact2 );
323 
324         listener.endProcessChildren( projectArtifact );
325 
326         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
327         projectArtifactNode.addChild( new DependencyNode( depArtifact2 ) );
328         projectArtifactNode.addChild( new DependencyNode( depArtifact1, DependencyNode.OMITTED_FOR_CONFLICT,
329                                                           depArtifact2 ) );
330 
331         assertEquals( projectArtifactNode, listener.getRootNode() );
332     }
333 
334     public void testOmitForConflictOmittedWithChildren()
335     {
336         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
337         listener.includeArtifact( projectArtifact );
338 
339         listener.startProcessChildren( projectArtifact );
340 
341         Artifact depArtifact2 = createArtifact( "test-dep", "dependency", "2.0" );
342         listener.includeArtifact( depArtifact2 );
343 
344         listener.startProcessChildren( depArtifact2 );
345 
346         Artifact depArtifact21 = createArtifact( "test-dep", "child", "2.0" );
347         listener.includeArtifact( depArtifact21 );
348 
349         listener.endProcessChildren( depArtifact2 );
350 
351         Artifact depArtifact1 = createArtifact( "test-dep", "dependency", "1.0" );
352         listener.omitForNearer( depArtifact1, depArtifact2 );
353 
354         listener.startProcessChildren( depArtifact1 );
355 
356         Artifact depArtifact11 = createArtifact( "test-dep", "child", "1.0" );
357         listener.includeArtifact( depArtifact11 );
358 
359         listener.endProcessChildren( depArtifact1 );
360 
361         listener.endProcessChildren( projectArtifact );
362 
363         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
364         DependencyNode depArtifact2Node = new DependencyNode( depArtifact2 );
365         projectArtifactNode.addChild( depArtifact2Node );
366         depArtifact2Node.addChild( new DependencyNode( depArtifact21 ) );
367         projectArtifactNode.addChild( new DependencyNode( depArtifact1, DependencyNode.OMITTED_FOR_CONFLICT,
368                                                           depArtifact2 ) );
369 
370         assertEquals( projectArtifactNode, listener.getRootNode() );
371     }
372 
373     public void testOmitForCycle()
374     {
375         Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
376         listener.includeArtifact( projectArtifact );
377 
378         listener.startProcessChildren( projectArtifact );
379 
380         listener.omitForCycle( projectArtifact );
381 
382         listener.endProcessChildren( projectArtifact );
383 
384         DependencyNode projectArtifactNode = new DependencyNode( projectArtifact );
385         projectArtifactNode.addChild( new DependencyNode( projectArtifact, DependencyNode.OMITTED_FOR_CYCLE ) );
386 
387         assertEquals( projectArtifactNode, listener.getRootNode() );
388     }
389 
390     public void testAddNode()
391     {
392         Artifact a1 = createArtifact( "test-project", "project-artifact", "1.0" );
393         listener.addNode( a1 );
394         listener.startProcessChildren( a1 );
395         Artifact a2 = createArtifact( "test-project", "project-artifact", "1.1" );
396         listener.addNode( a2 );
397         assertEquals( 1, listener.getRootNode().getChildren().size() );
398     }
399 
400     // protected methods ------------------------------------------------------
401 
402     /**
403      * {@inheritDoc}
404      */
405     protected Artifact createArtifact( String groupId, String artifactId, String type, String version, String scope )
406     {
407         // TODO: use super.createArtifact when possible
408 
409         VersionRange versionRange = VersionRange.createFromVersion( version );
410 
411         return new DefaultArtifact( groupId, artifactId, versionRange, scope, "jar", null,
412                                     new DefaultArtifactHandler(), false );
413     }
414 }