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