1 package org.eclipse.aether.util.graph.transformer;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 }