1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }