View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.util.graph.transformer;
20  
21  import java.util.List;
22  
23  import org.eclipse.aether.collection.UnsolvableVersionConflictException;
24  import org.eclipse.aether.graph.DependencyNode;
25  import org.eclipse.aether.internal.test.util.DependencyGraphParser;
26  import org.junit.Test;
27  
28  import static org.junit.Assert.*;
29  
30  /**
31   */
32  public class NearestVersionSelectorTest extends AbstractDependencyGraphTransformerTest {
33  
34      @Override
35      protected ConflictResolver newTransformer() {
36          return new ConflictResolver(
37                  new NearestVersionSelector(), new JavaScopeSelector(),
38                  new SimpleOptionalitySelector(), new JavaScopeDeriver());
39      }
40  
41      @Override
42      protected DependencyGraphParser newParser() {
43          return new DependencyGraphParser("transformer/version-resolver/");
44      }
45  
46      @Test
47      public void testSelectHighestVersionFromMultipleVersionsAtSameLevel() throws Exception {
48          DependencyNode root = parseResource("sibling-versions.txt");
49          assertSame(root, transform(root));
50  
51          assertEquals(1, root.getChildren().size());
52          assertEquals("3", root.getChildren().get(0).getArtifact().getVersion());
53      }
54  
55      @Test
56      public void testSelectedVersionAtDeeperLevelThanOriginallySeen() throws Exception {
57          DependencyNode root = parseResource("nearest-underneath-loser-a.txt");
58  
59          assertSame(root, transform(root));
60  
61          List<DependencyNode> trail = find(root, "j");
62          assertEquals(5, trail.size());
63      }
64  
65      @Test
66      public void testNearestDirtyVersionUnderneathRemovedNode() throws Exception {
67          DependencyNode root = parseResource("nearest-underneath-loser-b.txt");
68  
69          assertSame(root, transform(root));
70  
71          List<DependencyNode> trail = find(root, "j");
72          assertEquals(5, trail.size());
73      }
74  
75      @Test
76      public void testViolationOfHardConstraintFallsBackToNearestSeenNotFirstSeen() throws Exception {
77          DependencyNode root = parseResource("range-backtracking.txt");
78  
79          assertSame(root, transform(root));
80  
81          List<DependencyNode> trail = find(root, "x");
82          assertEquals(3, trail.size());
83          assertEquals("2", trail.get(0).getArtifact().getVersion());
84      }
85  
86      @Test
87      public void testCyclicConflictIdGraph() throws Exception {
88          DependencyNode root = parseResource("conflict-id-cycle.txt");
89  
90          assertSame(root, transform(root));
91  
92          assertEquals(2, root.getChildren().size());
93          assertEquals("a", root.getChildren().get(0).getArtifact().getArtifactId());
94          assertEquals("b", root.getChildren().get(1).getArtifact().getArtifactId());
95          assertTrue(root.getChildren().get(0).getChildren().isEmpty());
96          assertTrue(root.getChildren().get(1).getChildren().isEmpty());
97      }
98  
99      @Test(expected = UnsolvableVersionConflictException.class)
100     public void testUnsolvableRangeConflictBetweenHardConstraints() throws Exception {
101         DependencyNode root = parseResource("unsolvable.txt");
102 
103         assertSame(root, transform(root));
104     }
105 
106     @Test(expected = UnsolvableVersionConflictException.class)
107     public void testUnsolvableRangeConflictWithUnrelatedCycle() throws Exception {
108         DependencyNode root = parseResource("unsolvable-with-cycle.txt");
109 
110         transform(root);
111     }
112 
113     @Test
114     public void testSolvableConflictBetweenHardConstraints() throws Exception {
115         DependencyNode root = parseResource("ranges.txt");
116 
117         assertSame(root, transform(root));
118     }
119 
120     @Test
121     public void testConflictGroupCompletelyDroppedFromResolvedTree() throws Exception {
122         DependencyNode root = parseResource("dead-conflict-group.txt");
123 
124         assertSame(root, transform(root));
125 
126         assertEquals(2, root.getChildren().size());
127         assertEquals("a", root.getChildren().get(0).getArtifact().getArtifactId());
128         assertEquals("b", root.getChildren().get(1).getArtifact().getArtifactId());
129         assertTrue(root.getChildren().get(0).getChildren().isEmpty());
130         assertTrue(root.getChildren().get(1).getChildren().isEmpty());
131     }
132 
133     @Test
134     public void testNearestSoftVersionPrunedByFartherRange() throws Exception {
135         DependencyNode root = parseResource("soft-vs-range.txt");
136 
137         assertSame(root, transform(root));
138 
139         assertEquals(2, root.getChildren().size());
140         assertEquals("a", root.getChildren().get(0).getArtifact().getArtifactId());
141         assertEquals(0, root.getChildren().get(0).getChildren().size());
142         assertEquals("b", root.getChildren().get(1).getArtifact().getArtifactId());
143         assertEquals(1, root.getChildren().get(1).getChildren().size());
144     }
145 
146     @Test
147     public void testCyclicGraph() throws Exception {
148         DependencyNode root = parseResource("cycle.txt");
149 
150         assertSame(root, transform(root));
151 
152         assertEquals(2, root.getChildren().size());
153         assertEquals(1, root.getChildren().get(0).getChildren().size());
154         assertEquals(
155                 0, root.getChildren().get(0).getChildren().get(0).getChildren().size());
156         assertEquals(0, root.getChildren().get(1).getChildren().size());
157     }
158 
159     @Test
160     public void testLoop() throws Exception {
161         DependencyNode root = parseResource("loop.txt");
162 
163         assertSame(root, transform(root));
164 
165         assertEquals(0, root.getChildren().size());
166     }
167 
168     @Test
169     public void testOverlappingCycles() throws Exception {
170         DependencyNode root = parseResource("overlapping-cycles.txt");
171 
172         assertSame(root, transform(root));
173 
174         assertEquals(2, root.getChildren().size());
175     }
176 
177     @Test
178     public void testScopeDerivationAndConflictResolutionCantHappenForAllNodesBeforeVersionSelection() throws Exception {
179         DependencyNode root = parseResource("scope-vs-version.txt");
180 
181         assertSame(root, transform(root));
182 
183         DependencyNode[] nodes = find(root, "y").toArray(new DependencyNode[0]);
184         assertEquals(3, nodes.length);
185         assertEquals("test", nodes[1].getDependency().getScope());
186         assertEquals("test", nodes[0].getDependency().getScope());
187     }
188 
189     @Test
190     public void testVerboseMode() throws Exception {
191         DependencyNode root = parseResource("verbose.txt");
192 
193         session.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, Boolean.TRUE);
194         assertSame(root, transform(root));
195 
196         assertEquals(2, root.getChildren().size());
197         assertEquals(1, root.getChildren().get(0).getChildren().size());
198         DependencyNode winner = root.getChildren().get(0).getChildren().get(0);
199         assertEquals("test", winner.getDependency().getScope());
200         assertEquals("compile", winner.getData().get(ConflictResolver.NODE_DATA_ORIGINAL_SCOPE));
201         assertEquals(false, winner.getData().get(ConflictResolver.NODE_DATA_ORIGINAL_OPTIONALITY));
202         assertEquals(1, root.getChildren().get(1).getChildren().size());
203         DependencyNode loser = root.getChildren().get(1).getChildren().get(0);
204         assertEquals("test", loser.getDependency().getScope());
205         assertEquals(0, loser.getChildren().size());
206         assertSame(winner, loser.getData().get(ConflictResolver.NODE_DATA_WINNER));
207         assertEquals("compile", loser.getData().get(ConflictResolver.NODE_DATA_ORIGINAL_SCOPE));
208         assertEquals(false, loser.getData().get(ConflictResolver.NODE_DATA_ORIGINAL_OPTIONALITY));
209     }
210 }