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.internal.impl;
20  
21  import java.util.Arrays;
22  import java.util.Collections;
23  import java.util.List;
24  
25  import org.eclipse.aether.DefaultRepositorySystemSession;
26  import org.eclipse.aether.RepositorySystemSession;
27  import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
28  import org.eclipse.aether.internal.test.util.TestUtils;
29  import org.eclipse.aether.repository.MirrorSelector;
30  import org.eclipse.aether.repository.Proxy;
31  import org.eclipse.aether.repository.ProxySelector;
32  import org.eclipse.aether.repository.RemoteRepository;
33  import org.eclipse.aether.repository.RepositoryPolicy;
34  import org.eclipse.aether.util.repository.AuthenticationBuilder;
35  import org.junit.After;
36  import org.junit.Before;
37  import org.junit.Test;
38  
39  import static java.util.Objects.requireNonNull;
40  import static org.junit.Assert.*;
41  
42  /**
43   *
44   */
45  public class DefaultRemoteRepositoryManagerTest {
46  
47      private DefaultRepositorySystemSession session;
48  
49      private DefaultRemoteRepositoryManager manager;
50  
51      @Before
52      public void setup() {
53          session = TestUtils.newSession();
54          session.setChecksumPolicy(null);
55          session.setUpdatePolicy(null);
56          manager = new DefaultRemoteRepositoryManager();
57          manager.setUpdatePolicyAnalyzer(new StubUpdatePolicyAnalyzer());
58          manager.setChecksumPolicyProvider(new DefaultChecksumPolicyProvider());
59      }
60  
61      @After
62      public void teardown() {
63          manager = null;
64          session = null;
65      }
66  
67      private RemoteRepository.Builder newRepo(String id, String url, boolean enabled, String updates, String checksums) {
68          RepositoryPolicy policy = new RepositoryPolicy(enabled, updates, checksums);
69          return new RemoteRepository.Builder(id, "test", url).setPolicy(policy);
70      }
71  
72      private void assertEqual(RemoteRepository expected, RemoteRepository actual) {
73          assertEquals("id", expected.getId(), actual.getId());
74          assertEquals("url", expected.getUrl(), actual.getUrl());
75          assertEquals("type", expected.getContentType(), actual.getContentType());
76          assertEqual(expected.getPolicy(false), actual.getPolicy(false));
77          assertEqual(expected.getPolicy(true), actual.getPolicy(true));
78      }
79  
80      private void assertEqual(RepositoryPolicy expected, RepositoryPolicy actual) {
81          assertEquals("enabled", expected.isEnabled(), actual.isEnabled());
82          assertEquals("checksums", expected.getChecksumPolicy(), actual.getChecksumPolicy());
83          assertEquals("updates", expected.getUpdatePolicy(), actual.getUpdatePolicy());
84      }
85  
86      @Test
87      public void testGetPolicy() {
88          RepositoryPolicy snapshotPolicy = new RepositoryPolicy(
89                  true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_IGNORE);
90          RepositoryPolicy releasePolicy =
91                  new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_FAIL);
92  
93          RemoteRepository repo = new RemoteRepository.Builder("id", "type", "http://localhost") //
94                  .setSnapshotPolicy(snapshotPolicy)
95                  .setReleasePolicy(releasePolicy)
96                  .build();
97  
98          RepositoryPolicy effectivePolicy = manager.getPolicy(session, repo, true, true);
99          assertTrue(effectivePolicy.isEnabled());
100         assertEquals(RepositoryPolicy.CHECKSUM_POLICY_IGNORE, effectivePolicy.getChecksumPolicy());
101         assertEquals(RepositoryPolicy.UPDATE_POLICY_ALWAYS, effectivePolicy.getUpdatePolicy());
102     }
103 
104     @Test
105     public void testAggregateSimpleRepos() {
106         RemoteRepository dominant1 = newRepo("a", "file://", false, "", "").build();
107 
108         RemoteRepository recessive1 = newRepo("a", "http://", true, "", "").build();
109         RemoteRepository recessive2 = newRepo("b", "file://", true, "", "").build();
110 
111         List<RemoteRepository> result = manager.aggregateRepositories(
112                 session, Arrays.asList(dominant1), Arrays.asList(recessive1, recessive2), false);
113 
114         assertEquals(2, result.size());
115         assertEqual(dominant1, result.get(0));
116         assertEqual(recessive2, result.get(1));
117     }
118 
119     @Test
120     public void testAggregateSimpleRepos_MustKeepDisabledRecessiveRepo() {
121         RemoteRepository dominant = newRepo("a", "file://", true, "", "").build();
122 
123         RemoteRepository recessive1 = newRepo("b", "http://", false, "", "").build();
124 
125         List<RemoteRepository> result =
126                 manager.aggregateRepositories(session, Arrays.asList(dominant), Arrays.asList(recessive1), false);
127 
128         RemoteRepository recessive2 =
129                 newRepo(recessive1.getId(), "http://", true, "", "").build();
130 
131         result = manager.aggregateRepositories(session, result, Arrays.asList(recessive2), false);
132 
133         assertEquals(2, result.size());
134         assertEqual(dominant, result.get(0));
135         assertEqual(recessive1, result.get(1));
136     }
137 
138     @Test
139     public void testAggregateMirrorRepos_DominantMirrorComplete() {
140         RemoteRepository dominant1 = newRepo("a", "http://", false, "", "").build();
141         RemoteRepository dominantMirror1 = newRepo("x", "file://", false, "", "")
142                 .addMirroredRepository(dominant1)
143                 .build();
144 
145         RemoteRepository recessive1 = newRepo("a", "https://", true, "", "").build();
146         RemoteRepository recessiveMirror1 = newRepo("x", "http://", true, "", "")
147                 .addMirroredRepository(recessive1)
148                 .build();
149 
150         List<RemoteRepository> result = manager.aggregateRepositories(
151                 session, Arrays.asList(dominantMirror1), Arrays.asList(recessiveMirror1), false);
152 
153         assertEquals(1, result.size());
154         assertEqual(dominantMirror1, result.get(0));
155         assertEquals(1, result.get(0).getMirroredRepositories().size());
156         assertEquals(dominant1, result.get(0).getMirroredRepositories().get(0));
157     }
158 
159     @Test
160     public void testAggregateMirrorRepos_DominantMirrorIncomplete() {
161         RemoteRepository dominant1 = newRepo("a", "http://", false, "", "").build();
162         RemoteRepository dominantMirror1 = newRepo("x", "file://", false, "", "")
163                 .addMirroredRepository(dominant1)
164                 .build();
165 
166         RemoteRepository recessive1 = newRepo("a", "https://", true, "", "").build();
167         RemoteRepository recessive2 = newRepo("b", "https://", true, "", "").build();
168         RemoteRepository recessiveMirror1 = newRepo("x", "http://", true, "", "")
169                 .setMirroredRepositories(Arrays.asList(recessive1, recessive2))
170                 .build();
171 
172         List<RemoteRepository> result = manager.aggregateRepositories(
173                 session, Arrays.asList(dominantMirror1), Arrays.asList(recessiveMirror1), false);
174 
175         assertEquals(1, result.size());
176         assertEqual(newRepo("x", "file://", true, "", "").build(), result.get(0));
177         assertEquals(2, result.get(0).getMirroredRepositories().size());
178         assertEquals(dominant1, result.get(0).getMirroredRepositories().get(0));
179         assertEquals(recessive2, result.get(0).getMirroredRepositories().get(1));
180     }
181 
182     @Test
183     public void testMirrorAuthentication() {
184         final RemoteRepository repo = newRepo("a", "http://", true, "", "").build();
185         final RemoteRepository mirror = newRepo("a", "http://", true, "", "")
186                 .setAuthentication(
187                         new AuthenticationBuilder().addUsername("test").build())
188                 .build();
189         session.setMirrorSelector(new MirrorSelector() {
190             public RemoteRepository getMirror(RemoteRepository repository) {
191                 return mirror;
192             }
193         });
194 
195         List<RemoteRepository> result = manager.aggregateRepositories(
196                 session, Collections.<RemoteRepository>emptyList(), Arrays.asList(repo), true);
197 
198         assertEquals(1, result.size());
199         assertSame(mirror.getAuthentication(), result.get(0).getAuthentication());
200     }
201 
202     @Test
203     public void testMirrorProxy() {
204         final RemoteRepository repo = newRepo("a", "http://", true, "", "").build();
205         final RemoteRepository mirror = newRepo("a", "http://", true, "", "")
206                 .setProxy(new Proxy("http", "host", 2011, null))
207                 .build();
208         session.setMirrorSelector(new MirrorSelector() {
209             public RemoteRepository getMirror(RemoteRepository repository) {
210                 return mirror;
211             }
212         });
213 
214         List<RemoteRepository> result = manager.aggregateRepositories(
215                 session, Collections.<RemoteRepository>emptyList(), Arrays.asList(repo), true);
216 
217         assertEquals(1, result.size());
218         assertEquals("http", result.get(0).getProxy().getType());
219         assertEquals("host", result.get(0).getProxy().getHost());
220         assertEquals(2011, result.get(0).getProxy().getPort());
221     }
222 
223     @Test
224     public void testProxySelector() {
225         final RemoteRepository repo = newRepo("a", "http://", true, "", "").build();
226         final Proxy proxy = new Proxy("http", "host", 2011, null);
227         session.setProxySelector(new ProxySelector() {
228             public Proxy getProxy(RemoteRepository repository) {
229                 return proxy;
230             }
231         });
232         session.setMirrorSelector(new MirrorSelector() {
233             public RemoteRepository getMirror(RemoteRepository repository) {
234                 return null;
235             }
236         });
237 
238         List<RemoteRepository> result = manager.aggregateRepositories(
239                 session, Collections.<RemoteRepository>emptyList(), Arrays.asList(repo), true);
240 
241         assertEquals(1, result.size());
242         assertEquals("http", result.get(0).getProxy().getType());
243         assertEquals("host", result.get(0).getProxy().getHost());
244         assertEquals(2011, result.get(0).getProxy().getPort());
245     }
246 
247     private static class StubUpdatePolicyAnalyzer implements UpdatePolicyAnalyzer {
248 
249         public String getEffectiveUpdatePolicy(RepositorySystemSession session, String policy1, String policy2) {
250             requireNonNull(session, "session cannot be null");
251             return ordinalOfUpdatePolicy(policy1) < ordinalOfUpdatePolicy(policy2) ? policy1 : policy2;
252         }
253 
254         private int ordinalOfUpdatePolicy(String policy) {
255             if (RepositoryPolicy.UPDATE_POLICY_DAILY.equals(policy)) {
256                 return 1440;
257             } else if (RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals(policy)) {
258                 return 0;
259             } else if (policy != null && policy.startsWith(RepositoryPolicy.UPDATE_POLICY_INTERVAL)) {
260                 String s = policy.substring(RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1);
261                 return Integer.parseInt(s);
262             } else {
263                 // assume "never"
264                 return Integer.MAX_VALUE;
265             }
266         }
267 
268         public boolean isUpdatedRequired(RepositorySystemSession session, long lastModified, String policy) {
269             requireNonNull(session, "session cannot be null");
270             return false;
271         }
272     }
273 }