View Javadoc
1   package org.eclipse.aether.util.graph.transformer;
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 static org.junit.Assert.*;
23  
24  import java.util.List;
25  
26  import org.eclipse.aether.collection.UnsolvableVersionConflictException;
27  import org.eclipse.aether.graph.DependencyNode;
28  import org.eclipse.aether.internal.test.util.DependencyGraphParser;
29  import org.junit.Test;
30  
31  /**
32   */
33  public class NearestVersionSelectorTest
34      extends AbstractDependencyGraphTransformerTest
35  {
36  
37      @Override
38      protected ConflictResolver newTransformer()
39      {
40          return new ConflictResolver( new NearestVersionSelector(), new JavaScopeSelector(),
41                                       new SimpleOptionalitySelector(), new JavaScopeDeriver() );
42      }
43  
44      @Override
45      protected DependencyGraphParser newParser()
46      {
47          return new DependencyGraphParser( "transformer/version-resolver/" );
48      }
49  
50      @Test
51      public void testSelectHighestVersionFromMultipleVersionsAtSameLevel()
52          throws Exception
53      {
54          DependencyNode root = parseResource( "sibling-versions.txt" );
55          assertSame( root, transform( root ) );
56  
57          assertEquals( 1, root.getChildren().size() );
58          assertEquals( "3", root.getChildren().get( 0 ).getArtifact().getVersion() );
59      }
60  
61      @Test
62      public void testSelectedVersionAtDeeperLevelThanOriginallySeen()
63          throws Exception
64      {
65          DependencyNode root = parseResource( "nearest-underneath-loser-a.txt" );
66  
67          assertSame( root, transform( root ) );
68  
69          List<DependencyNode> trail = find( root, "j" );
70          assertEquals( 5, trail.size() );
71      }
72  
73      @Test
74      public void testNearestDirtyVersionUnderneathRemovedNode()
75          throws Exception
76      {
77          DependencyNode root = parseResource( "nearest-underneath-loser-b.txt" );
78  
79          assertSame( root, transform( root ) );
80  
81          List<DependencyNode> trail = find( root, "j" );
82          assertEquals( 5, trail.size() );
83      }
84  
85      @Test
86      public void testViolationOfHardConstraintFallsBackToNearestSeenNotFirstSeen()
87          throws Exception
88      {
89          DependencyNode root = parseResource( "range-backtracking.txt" );
90  
91          assertSame( root, transform( root ) );
92  
93          List<DependencyNode> trail = find( root, "x" );
94          assertEquals( 3, trail.size() );
95          assertEquals( "2", trail.get( 0 ).getArtifact().getVersion() );
96      }
97  
98      @Test
99      public void testCyclicConflictIdGraph()
100         throws Exception
101     {
102         DependencyNode root = parseResource( "conflict-id-cycle.txt" );
103 
104         assertSame( root, transform( root ) );
105 
106         assertEquals( 2, root.getChildren().size() );
107         assertEquals( "a", root.getChildren().get( 0 ).getArtifact().getArtifactId() );
108         assertEquals( "b", root.getChildren().get( 1 ).getArtifact().getArtifactId() );
109         assertTrue( root.getChildren().get( 0 ).getChildren().isEmpty() );
110         assertTrue( root.getChildren().get( 1 ).getChildren().isEmpty() );
111     }
112 
113     @Test( expected = UnsolvableVersionConflictException.class )
114     public void testUnsolvableRangeConflictBetweenHardConstraints()
115         throws Exception
116     {
117         DependencyNode root = parseResource( "unsolvable.txt" );
118 
119         assertSame( root, transform( root ) );
120     }
121 
122     @Test( expected = UnsolvableVersionConflictException.class )
123     public void testUnsolvableRangeConflictWithUnrelatedCycle()
124         throws Exception
125     {
126         DependencyNode root = parseResource( "unsolvable-with-cycle.txt" );
127 
128         transform( root );
129     }
130 
131     @Test
132     public void testSolvableConflictBetweenHardConstraints()
133         throws Exception
134     {
135         DependencyNode root = parseResource( "ranges.txt" );
136 
137         assertSame( root, transform( root ) );
138     }
139 
140     @Test
141     public void testConflictGroupCompletelyDroppedFromResolvedTree()
142         throws Exception
143     {
144         DependencyNode root = parseResource( "dead-conflict-group.txt" );
145 
146         assertSame( root, transform( root ) );
147 
148         assertEquals( 2, root.getChildren().size() );
149         assertEquals( "a", root.getChildren().get( 0 ).getArtifact().getArtifactId() );
150         assertEquals( "b", root.getChildren().get( 1 ).getArtifact().getArtifactId() );
151         assertTrue( root.getChildren().get( 0 ).getChildren().isEmpty() );
152         assertTrue( root.getChildren().get( 1 ).getChildren().isEmpty() );
153     }
154 
155     @Test
156     public void testNearestSoftVersionPrunedByFartherRange()
157         throws Exception
158     {
159         DependencyNode root = parseResource( "soft-vs-range.txt" );
160 
161         assertSame( root, transform( root ) );
162 
163         assertEquals( 2, root.getChildren().size() );
164         assertEquals( "a", root.getChildren().get( 0 ).getArtifact().getArtifactId() );
165         assertEquals( 0, root.getChildren().get( 0 ).getChildren().size() );
166         assertEquals( "b", root.getChildren().get( 1 ).getArtifact().getArtifactId() );
167         assertEquals( 1, root.getChildren().get( 1 ).getChildren().size() );
168     }
169 
170     @Test
171     public void testCyclicGraph()
172         throws Exception
173     {
174         DependencyNode root = parseResource( "cycle.txt" );
175 
176         assertSame( root, transform( root ) );
177 
178         assertEquals( 2, root.getChildren().size() );
179         assertEquals( 1, root.getChildren().get( 0 ).getChildren().size() );
180         assertEquals( 0, root.getChildren().get( 0 ).getChildren().get( 0 ).getChildren().size() );
181         assertEquals( 0, root.getChildren().get( 1 ).getChildren().size() );
182     }
183 
184     @Test
185     public void testLoop()
186         throws Exception
187     {
188         DependencyNode root = parseResource( "loop.txt" );
189 
190         assertSame( root, transform( root ) );
191 
192         assertEquals( 0, root.getChildren().size() );
193     }
194 
195     @Test
196     public void testOverlappingCycles()
197         throws Exception
198     {
199         DependencyNode root = parseResource( "overlapping-cycles.txt" );
200 
201         assertSame( root, transform( root ) );
202 
203         assertEquals( 2, root.getChildren().size() );
204     }
205 
206     @Test
207     public void testScopeDerivationAndConflictResolutionCantHappenForAllNodesBeforeVersionSelection()
208         throws Exception
209     {
210         DependencyNode root = parseResource( "scope-vs-version.txt" );
211 
212         assertSame( root, transform( root ) );
213 
214         DependencyNode[] nodes = find( root, "y" ).toArray( new DependencyNode[0] );
215         assertEquals( 3, nodes.length );
216         assertEquals( "test", nodes[1].getDependency().getScope() );
217         assertEquals( "test", nodes[0].getDependency().getScope() );
218     }
219 
220     @Test
221     public void testVerboseMode()
222         throws Exception
223     {
224         DependencyNode root = parseResource( "verbose.txt" );
225 
226         session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, Boolean.TRUE );
227         assertSame( root, transform( root ) );
228 
229         assertEquals( 2, root.getChildren().size() );
230         assertEquals( 1, root.getChildren().get( 0 ).getChildren().size() );
231         DependencyNode winner = root.getChildren().get( 0 ).getChildren().get( 0 );
232         assertEquals( "test", winner.getDependency().getScope() );
233         assertEquals( "compile", winner.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_SCOPE ) );
234         assertEquals( false, winner.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_OPTIONALITY) );
235         assertEquals( 1, root.getChildren().get( 1 ).getChildren().size() );
236         DependencyNode loser = root.getChildren().get( 1 ).getChildren().get( 0 );
237         assertEquals( "test", loser.getDependency().getScope() );
238         assertEquals( 0, loser.getChildren().size() );
239         assertSame( winner, loser.getData().get( ConflictResolver.NODE_DATA_WINNER ) );
240         assertEquals( "compile", loser.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_SCOPE ) );
241         assertEquals( false, loser.getData().get( ConflictResolver.NODE_DATA_ORIGINAL_OPTIONALITY ) );
242     }
243 
244 }