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.manager;
20  
21  import java.util.Arrays;
22  import java.util.Collections;
23  
24  import org.eclipse.aether.RepositorySystemSession;
25  import org.eclipse.aether.artifact.Artifact;
26  import org.eclipse.aether.artifact.DefaultArtifact;
27  import org.eclipse.aether.collection.DependencyCollectionContext;
28  import org.eclipse.aether.collection.DependencyManagement;
29  import org.eclipse.aether.collection.DependencyManager;
30  import org.eclipse.aether.graph.Dependency;
31  import org.eclipse.aether.graph.Exclusion;
32  import org.eclipse.aether.internal.test.util.TestUtils;
33  import org.junit.jupiter.api.BeforeEach;
34  import org.junit.jupiter.api.Test;
35  
36  import static org.junit.jupiter.api.Assertions.*;
37  
38  /**
39   * UT for {@link DependencyManager} implementations.
40   */
41  public class DependencyManagerTest {
42  
43      private final Artifact A1 = new DefaultArtifact("test", "a", "", "1");
44  
45      private final Artifact A2 = new DefaultArtifact("test", "a", "", "2");
46  
47      private final Artifact B = new DefaultArtifact("test", "b", "", "");
48  
49      private final Artifact B1 = new DefaultArtifact("test", "b", "", "1");
50  
51      private final Artifact B2 = new DefaultArtifact("test", "b", "", "2");
52  
53      private final Artifact C1 = new DefaultArtifact("test", "c", "", "1");
54  
55      private final Artifact D1 = new DefaultArtifact("test", "d", "", "1");
56  
57      private final Artifact E1 = new DefaultArtifact("test", "e", "", "1");
58  
59      private final Artifact E2 = new DefaultArtifact("test", "e", "", "2");
60  
61      private final Exclusion EXCLUSION = new Exclusion("test", "excluded", null, null);
62  
63      private RepositorySystemSession session;
64  
65      private DependencyCollectionContext newContext(Dependency... managedDependencies) {
66          return TestUtils.newCollectionContext(session, null, Arrays.asList(managedDependencies));
67      }
68  
69      @BeforeEach
70      void setUp() {
71          session = TestUtils.newSession();
72      }
73  
74      @Test
75      void testClassic() {
76          DependencyManager manager = new ClassicDependencyManager();
77          DependencyManagement mngt;
78  
79          // depth=1: only exclusion applied, nothing more
80          manager = manager.deriveChildManager(newContext(
81                  new Dependency(A2, null, null),
82                  new Dependency(B, null, true),
83                  new Dependency(C1, "newscope", null),
84                  new Dependency(D1, null, null, Collections.singleton(EXCLUSION))));
85          mngt = manager.manageDependency(new Dependency(A1, null));
86          assertNull(mngt);
87          mngt = manager.manageDependency(new Dependency(B1, null));
88          assertNull(mngt);
89          mngt = manager.manageDependency(new Dependency(C1, null));
90          assertNull(mngt);
91          mngt = manager.manageDependency(new Dependency(D1, null));
92          assertNotNull(mngt);
93          assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
94          mngt = manager.manageDependency(new Dependency(E1, null));
95          assertNull(mngt);
96  
97          // depth=2: all applied (new ones ignored)
98          manager = manager.deriveChildManager(newContext(new Dependency(B2, null, null)));
99          mngt = manager.manageDependency(new Dependency(A1, null));
100         assertNotNull(mngt);
101         assertEquals(mngt.getVersion(), A2.getVersion());
102         mngt = manager.manageDependency(new Dependency(B1, null));
103         assertNotNull(mngt);
104         assertEquals(Boolean.TRUE, mngt.getOptional());
105         assertNull(mngt.getVersion());
106         mngt = manager.manageDependency(new Dependency(C1, null));
107         assertNotNull(mngt);
108         assertEquals(mngt.getScope(), "newscope");
109         mngt = manager.manageDependency(new Dependency(D1, null));
110         assertNotNull(mngt);
111         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
112         mngt = manager.manageDependency(new Dependency(E1, null));
113         assertNull(mngt);
114 
115         // depth=3: all existing applied, new depMgt ignored, carried on only what we have so far
116         manager = manager.deriveChildManager(newContext(new Dependency(E2, null, null)));
117         mngt = manager.manageDependency(new Dependency(A1, null));
118         assertNotNull(mngt);
119         assertEquals(mngt.getVersion(), A2.getVersion());
120         mngt = manager.manageDependency(new Dependency(B1, null));
121         assertNotNull(mngt);
122         assertEquals(Boolean.TRUE, mngt.getOptional());
123         mngt = manager.manageDependency(new Dependency(C1, null));
124         assertNotNull(mngt);
125         assertEquals(mngt.getScope(), "newscope");
126         mngt = manager.manageDependency(new Dependency(D1, null));
127         assertNotNull(mngt);
128         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
129         mngt = manager.manageDependency(new Dependency(E1, null));
130         assertNull(mngt);
131     }
132 
133     @Test
134     void testClassicTransitive() {
135         DependencyManager manager = new ClassicDependencyManager(true);
136         DependencyManagement mngt;
137 
138         // depth=1: only exclusion applied, nothing more
139         manager = manager.deriveChildManager(newContext(
140                 new Dependency(A2, null, null),
141                 new Dependency(B, null, true),
142                 new Dependency(C1, "newscope", null),
143                 new Dependency(D1, null, null, Collections.singleton(EXCLUSION))));
144         mngt = manager.manageDependency(new Dependency(A1, null));
145         assertNull(mngt);
146         mngt = manager.manageDependency(new Dependency(B1, null));
147         assertNull(mngt);
148         mngt = manager.manageDependency(new Dependency(C1, null));
149         assertNull(mngt);
150         mngt = manager.manageDependency(new Dependency(D1, null));
151         assertNotNull(mngt);
152         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
153         mngt = manager.manageDependency(new Dependency(E1, null));
154         assertNull(mngt);
155 
156         // depth=2: all applied (new ones ignored)
157         manager = manager.deriveChildManager(newContext(new Dependency(B2, null, null)));
158         mngt = manager.manageDependency(new Dependency(A1, null));
159         assertNotNull(mngt);
160         assertEquals(mngt.getVersion(), A2.getVersion());
161         mngt = manager.manageDependency(new Dependency(B1, null));
162         assertNotNull(mngt);
163         assertEquals(Boolean.TRUE, mngt.getOptional());
164         assertNull(mngt.getVersion());
165         mngt = manager.manageDependency(new Dependency(C1, null));
166         assertNotNull(mngt);
167         assertEquals(mngt.getScope(), "newscope");
168         mngt = manager.manageDependency(new Dependency(D1, null));
169         assertNotNull(mngt);
170         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
171         mngt = manager.manageDependency(new Dependency(E1, null));
172         assertNull(mngt);
173 
174         // depth=3: all existing applied, new depMgt processed, carried on
175         manager = manager.deriveChildManager(newContext(new Dependency(E2, null, null)));
176         mngt = manager.manageDependency(new Dependency(A1, null));
177         assertNotNull(mngt);
178         assertEquals(mngt.getVersion(), A2.getVersion());
179         mngt = manager.manageDependency(new Dependency(B1, null));
180         assertNotNull(mngt);
181         assertEquals(Boolean.TRUE, mngt.getOptional());
182         mngt = manager.manageDependency(new Dependency(C1, null));
183         assertNotNull(mngt);
184         assertEquals(mngt.getScope(), "newscope");
185         mngt = manager.manageDependency(new Dependency(D1, null));
186         assertNotNull(mngt);
187         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
188         mngt = manager.manageDependency(new Dependency(E1, null));
189         assertNotNull(mngt);
190         assertEquals(mngt.getVersion(), E2.getVersion());
191     }
192 
193     @Test
194     void testTransitive() {
195         DependencyManager manager = new TransitiveDependencyManager();
196         DependencyManagement mngt;
197 
198         // depth=1: only exclusion applied, nothing more
199         manager = manager.deriveChildManager(newContext(
200                 new Dependency(A2, null, null),
201                 new Dependency(B, null, true),
202                 new Dependency(C1, "newscope", null),
203                 new Dependency(D1, null, null, Collections.singleton(EXCLUSION))));
204         mngt = manager.manageDependency(new Dependency(A1, null));
205         assertNull(mngt);
206         mngt = manager.manageDependency(new Dependency(B1, null));
207         assertNull(mngt);
208         mngt = manager.manageDependency(new Dependency(C1, null));
209         assertNull(mngt);
210         mngt = manager.manageDependency(new Dependency(D1, null));
211         assertNotNull(mngt);
212         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
213         mngt = manager.manageDependency(new Dependency(E1, null));
214         assertNull(mngt);
215 
216         // depth=2: all applied
217         manager = manager.deriveChildManager(newContext(new Dependency(B2, null, null)));
218         mngt = manager.manageDependency(new Dependency(A1, null));
219         assertNotNull(mngt);
220         assertEquals(mngt.getVersion(), A2.getVersion());
221         mngt = manager.manageDependency(new Dependency(B1, null));
222         assertNotNull(mngt);
223         assertEquals(Boolean.TRUE, mngt.getOptional());
224         assertEquals(B2.getVersion(), mngt.getVersion());
225         mngt = manager.manageDependency(new Dependency(C1, null));
226         assertNotNull(mngt);
227         assertEquals(mngt.getScope(), "newscope");
228         mngt = manager.manageDependency(new Dependency(D1, null));
229         assertNotNull(mngt);
230         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
231         mngt = manager.manageDependency(new Dependency(E1, null));
232         assertNull(mngt);
233 
234         // depth=3: all existing applied, new depMgt processed, carried on
235         manager = manager.deriveChildManager(newContext(new Dependency(E2, null, null)));
236         mngt = manager.manageDependency(new Dependency(A1, null));
237         assertNotNull(mngt);
238         assertEquals(mngt.getVersion(), A2.getVersion());
239         mngt = manager.manageDependency(new Dependency(B1, null));
240         assertNotNull(mngt);
241         assertEquals(Boolean.TRUE, mngt.getOptional());
242         mngt = manager.manageDependency(new Dependency(C1, null));
243         assertNotNull(mngt);
244         assertEquals(mngt.getScope(), "newscope");
245         mngt = manager.manageDependency(new Dependency(D1, null));
246         assertNotNull(mngt);
247         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
248         mngt = manager.manageDependency(new Dependency(E1, null));
249         assertNotNull(mngt);
250         assertEquals(mngt.getVersion(), E2.getVersion());
251     }
252 
253     @Test
254     void testDefault() {
255         DependencyManager manager = new DefaultDependencyManager();
256         DependencyManagement mngt;
257 
258         // depth=1: all applied
259         manager = manager.deriveChildManager(newContext(
260                 new Dependency(A2, null, null),
261                 new Dependency(B, null, true),
262                 new Dependency(C1, "newscope", null),
263                 new Dependency(D1, null, null, Collections.singleton(EXCLUSION))));
264         mngt = manager.manageDependency(new Dependency(A1, null));
265         assertNotNull(mngt);
266         assertEquals(mngt.getVersion(), A2.getVersion());
267         mngt = manager.manageDependency(new Dependency(B1, null));
268         assertNotNull(mngt);
269         assertEquals(Boolean.TRUE, mngt.getOptional());
270         assertNull(mngt.getVersion());
271         mngt = manager.manageDependency(new Dependency(C1, null));
272         assertNotNull(mngt);
273         assertEquals(mngt.getScope(), "newscope");
274         mngt = manager.manageDependency(new Dependency(D1, null));
275         assertNotNull(mngt);
276         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
277         mngt = manager.manageDependency(new Dependency(E1, null));
278         assertNull(mngt);
279 
280         // depth=2: all applied
281         manager = manager.deriveChildManager(newContext(new Dependency(B2, null, null)));
282         mngt = manager.manageDependency(new Dependency(A1, null));
283         assertNotNull(mngt);
284         assertEquals(mngt.getVersion(), A2.getVersion());
285         mngt = manager.manageDependency(new Dependency(B1, null));
286         assertNotNull(mngt);
287         assertEquals(Boolean.TRUE, mngt.getOptional());
288         assertEquals(B2.getVersion(), mngt.getVersion());
289         mngt = manager.manageDependency(new Dependency(C1, null));
290         assertNotNull(mngt);
291         assertEquals(mngt.getScope(), "newscope");
292         mngt = manager.manageDependency(new Dependency(D1, null));
293         assertNotNull(mngt);
294         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
295         mngt = manager.manageDependency(new Dependency(E1, null));
296         assertNull(mngt);
297 
298         // depth=3: all existing applied, new depMgt processed, carried on
299         manager = manager.deriveChildManager(newContext(new Dependency(E2, null, null)));
300         mngt = manager.manageDependency(new Dependency(A1, null));
301         assertNotNull(mngt);
302         assertEquals(mngt.getVersion(), A2.getVersion());
303         mngt = manager.manageDependency(new Dependency(B1, null));
304         assertNotNull(mngt);
305         assertEquals(Boolean.TRUE, mngt.getOptional());
306         mngt = manager.manageDependency(new Dependency(C1, null));
307         assertNotNull(mngt);
308         assertEquals(mngt.getScope(), "newscope");
309         mngt = manager.manageDependency(new Dependency(D1, null));
310         assertNotNull(mngt);
311         assertEquals(mngt.getExclusions(), Collections.singleton(EXCLUSION));
312         mngt = manager.manageDependency(new Dependency(E1, null));
313         assertNotNull(mngt);
314         assertEquals(mngt.getVersion(), E2.getVersion());
315     }
316 }