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