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.io.File;
22 import java.io.IOException;
23 import java.net.URI;
24 import java.util.Arrays;
25 import java.util.Collection;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.Set;
29
30 import org.eclipse.aether.DefaultRepositorySystemSession;
31 import org.eclipse.aether.RepositoryEvent;
32 import org.eclipse.aether.RepositoryEvent.EventType;
33 import org.eclipse.aether.internal.impl.filter.DefaultRemoteRepositoryFilterManager;
34 import org.eclipse.aether.internal.impl.filter.Filters;
35 import org.eclipse.aether.internal.test.util.TestFileUtils;
36 import org.eclipse.aether.internal.test.util.TestLocalRepositoryManager;
37 import org.eclipse.aether.internal.test.util.TestUtils;
38 import org.eclipse.aether.metadata.DefaultMetadata;
39 import org.eclipse.aether.metadata.Metadata;
40 import org.eclipse.aether.repository.LocalMetadataRegistration;
41 import org.eclipse.aether.repository.RemoteRepository;
42 import org.eclipse.aether.resolution.MetadataRequest;
43 import org.eclipse.aether.resolution.MetadataResult;
44 import org.eclipse.aether.spi.connector.ArtifactDownload;
45 import org.eclipse.aether.spi.connector.MetadataDownload;
46 import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilterSource;
47 import org.eclipse.aether.transfer.MetadataNotFoundException;
48 import org.junit.jupiter.api.AfterEach;
49 import org.junit.jupiter.api.BeforeEach;
50 import org.junit.jupiter.api.Test;
51
52 import static org.junit.jupiter.api.Assertions.*;
53
54
55
56 public class DefaultMetadataResolverTest {
57
58 private DefaultMetadataResolver resolver;
59
60 private StubRepositoryConnectorProvider connectorProvider;
61
62 private RemoteRepository repository;
63
64 private DefaultRepositorySystemSession session;
65
66 private Metadata metadata;
67
68 private RecordingRepositoryConnector connector;
69
70 private TestLocalRepositoryManager lrm;
71
72 private HashMap<String, RemoteRepositoryFilterSource> remoteRepositoryFilterSources;
73
74 private DefaultRemoteRepositoryFilterManager remoteRepositoryFilterManager;
75
76 private RecordingRepositoryListener listener;
77
78 @BeforeEach
79 void setup() throws Exception {
80 remoteRepositoryFilterSources = new HashMap<>();
81 remoteRepositoryFilterManager = new DefaultRemoteRepositoryFilterManager(remoteRepositoryFilterSources);
82
83 session = TestUtils.newSession();
84 lrm = (TestLocalRepositoryManager) session.getLocalRepositoryManager();
85 connectorProvider = new StubRepositoryConnectorProvider();
86 resolver = new DefaultMetadataResolver(
87 new StubRepositoryEventDispatcher(),
88 new StaticUpdateCheckManager(true),
89 connectorProvider,
90 new StubRemoteRepositoryManager(),
91 new StubSyncContextFactory(),
92 new DefaultOfflineController(),
93 remoteRepositoryFilterManager,
94 new DefaultPathProcessor());
95 repository = new RemoteRepository.Builder(
96 "test-DMRT",
97 "default",
98 TestFileUtils.createTempDir().toURI().toURL().toString())
99 .build();
100 metadata = new DefaultMetadata("gid", "aid", "ver", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT);
101 connector = new RecordingRepositoryConnector();
102 connectorProvider.setConnector(connector);
103
104 listener = new RecordingRepositoryListener();
105 session.setRepositoryListener(listener);
106 }
107
108 @AfterEach
109 void teardown() throws Exception {
110 TestFileUtils.deleteFile(new File(new URI(repository.getUrl())));
111 TestFileUtils.deleteFile(session.getLocalRepository().getBasedir());
112 }
113
114 @Test
115 void testNoRepositoryFailing() {
116 MetadataRequest request = new MetadataRequest(metadata, null, "");
117 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
118
119 assertEquals(1, results.size());
120
121 MetadataResult result = results.get(0);
122 assertSame(request, result.getRequest());
123 assertNotNull(
124 result.getException(),
125 "" + (result.getMetadata() != null ? result.getMetadata().getFile() : result.getMetadata()));
126 assertEquals(MetadataNotFoundException.class, result.getException().getClass());
127
128 assertNull(result.getMetadata());
129 }
130
131 @Test
132 void testResolve() throws IOException {
133 connector.setExpectGet(metadata);
134
135
136 File file = new File(
137 session.getLocalRepository().getBasedir(),
138 session.getLocalRepositoryManager().getPathForRemoteMetadata(metadata, repository, ""));
139
140 TestFileUtils.writeString(file, file.getAbsolutePath());
141
142 MetadataRequest request = new MetadataRequest(metadata, repository, "");
143 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
144
145 assertEquals(1, results.size());
146
147 MetadataResult result = results.get(0);
148 assertSame(request, result.getRequest());
149 assertNull(result.getException());
150 assertNotNull(result.getMetadata());
151 assertNotNull(result.getMetadata().getFile());
152
153 assertEquals(file, result.getMetadata().getFile());
154 assertEquals(metadata, result.getMetadata().setFile(null));
155
156 connector.assertSeenExpected();
157 Set<Metadata> metadataRegistration =
158 ((TestLocalRepositoryManager) session.getLocalRepositoryManager()).getMetadataRegistration();
159 assertTrue(metadataRegistration.contains(metadata));
160 assertEquals(1, metadataRegistration.size());
161
162 List<RepositoryEvent> events =
163 listener.getEvents(EventType.METADATA_DOWNLOADING, EventType.METADATA_DOWNLOADED);
164 assertEquals(2, events.size());
165 assertSame(events.get(0).getTrace(), events.get(1).getTrace());
166
167 RepositoryEvent event = events.get(0);
168 assertEquals(EventType.METADATA_DOWNLOADING, event.getType());
169 assertEquals(metadata, event.getMetadata());
170
171 event = events.get(1);
172 assertEquals(EventType.METADATA_DOWNLOADED, event.getType());
173 assertEquals(metadata, event.getMetadata());
174 assertNull(event.getException());
175 assertNotNull(event.getFile());
176 }
177
178 @Test
179 void testRemoveMetadataIfMissing() throws IOException {
180 connector = new RecordingRepositoryConnector() {
181
182 @Override
183 public void get(
184 Collection<? extends ArtifactDownload> artifactDownloads,
185 Collection<? extends MetadataDownload> metadataDownloads) {
186 super.get(artifactDownloads, metadataDownloads);
187 for (MetadataDownload d : metadataDownloads) {
188 d.setException(new MetadataNotFoundException(metadata, repository));
189 }
190 }
191 };
192 connectorProvider.setConnector(connector);
193
194 File file = new File(
195 session.getLocalRepository().getBasedir(),
196 session.getLocalRepositoryManager().getPathForRemoteMetadata(metadata, repository, ""));
197 TestFileUtils.writeString(file, file.getAbsolutePath());
198 metadata.setFile(file);
199
200 MetadataRequest request = new MetadataRequest(metadata, repository, "");
201 request.setDeleteLocalCopyIfMissing(true);
202
203 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
204 assertEquals(1, results.size());
205 MetadataResult result = results.get(0);
206
207 assertNotNull(result.getException());
208 assertFalse(file.exists());
209 }
210
211 @Test
212 void testOfflineSessionResolveMetadataMissing() {
213 session.setOffline(true);
214 MetadataRequest request = new MetadataRequest(metadata, repository, "");
215 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
216
217 assertEquals(1, results.size());
218
219 MetadataResult result = results.get(0);
220 assertSame(request, result.getRequest());
221 assertNotNull(result.getException());
222 assertNull(result.getMetadata());
223
224 connector.assertSeenExpected();
225 }
226
227 @Test
228 void testOfflineSessionResolveMetadata() throws IOException {
229 session.setOffline(true);
230
231 String path = session.getLocalRepositoryManager().getPathForRemoteMetadata(metadata, repository, "");
232 File file = new File(session.getLocalRepository().getBasedir(), path);
233 TestFileUtils.writeString(file, file.getAbsolutePath());
234
235
236 metadata = metadata.setFile(file);
237
238 MetadataRequest request = new MetadataRequest(metadata, repository, "");
239 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
240
241 assertEquals(1, results.size());
242 MetadataResult result = results.get(0);
243 assertSame(request, result.getRequest());
244 assertNull(result.getException(), String.valueOf(result.getException()));
245 assertNotNull(result.getMetadata());
246 assertNotNull(result.getMetadata().getFile());
247
248 assertEquals(file, result.getMetadata().getFile());
249 assertEquals(metadata.setFile(null), result.getMetadata().setFile(null));
250
251 connector.assertSeenExpected();
252 }
253
254 @Test
255 void testFavorLocal() throws IOException {
256 lrm.add(session, new LocalMetadataRegistration(metadata));
257 String path = session.getLocalRepositoryManager().getPathForLocalMetadata(metadata);
258 File file = new File(session.getLocalRepository().getBasedir(), path);
259 TestFileUtils.writeString(file, file.getAbsolutePath());
260
261 MetadataRequest request = new MetadataRequest(metadata, repository, "");
262 request.setFavorLocalRepository(true);
263
264 resolver = new DefaultMetadataResolver(
265 new StubRepositoryEventDispatcher(),
266 new StaticUpdateCheckManager(true, true),
267 connectorProvider,
268 new StubRemoteRepositoryManager(),
269 new StubSyncContextFactory(),
270 new DefaultOfflineController(),
271 remoteRepositoryFilterManager,
272 new DefaultPathProcessor());
273
274 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
275
276 assertEquals(1, results.size());
277 MetadataResult result = results.get(0);
278 assertSame(request, result.getRequest());
279 assertNull(result.getException(), String.valueOf(result.getException()));
280
281 connector.assertSeenExpected();
282 }
283
284 @Test
285 void testResolveAlwaysAcceptFilter() throws IOException {
286 remoteRepositoryFilterSources.put("filter1", Filters.neverAcceptFrom("invalid repo id"));
287 remoteRepositoryFilterSources.put("filter2", Filters.alwaysAccept());
288 connector.setExpectGet(metadata);
289
290
291 File file = new File(
292 session.getLocalRepository().getBasedir(),
293 session.getLocalRepositoryManager().getPathForRemoteMetadata(metadata, repository, ""));
294
295 TestFileUtils.writeString(file, file.getAbsolutePath());
296
297 MetadataRequest request = new MetadataRequest(metadata, repository, "");
298 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
299
300 assertEquals(1, results.size());
301
302 MetadataResult result = results.get(0);
303 assertSame(request, result.getRequest());
304 assertNull(result.getException());
305 assertNotNull(result.getMetadata());
306 assertNotNull(result.getMetadata().getFile());
307
308 assertEquals(file, result.getMetadata().getFile());
309 assertEquals(metadata, result.getMetadata().setFile(null));
310
311 connector.assertSeenExpected();
312 Set<Metadata> metadataRegistration =
313 ((TestLocalRepositoryManager) session.getLocalRepositoryManager()).getMetadataRegistration();
314 assertTrue(metadataRegistration.contains(metadata));
315 assertEquals(1, metadataRegistration.size());
316 }
317
318 @Test
319 void testResolveNeverAcceptFilter() throws IOException {
320 remoteRepositoryFilterSources.put("filter1", Filters.neverAcceptFrom("invalid repo id"));
321 remoteRepositoryFilterSources.put("filter2", Filters.neverAccept());
322
323
324
325 File file = new File(
326 session.getLocalRepository().getBasedir(),
327 session.getLocalRepositoryManager().getPathForRemoteMetadata(metadata, repository, ""));
328
329 TestFileUtils.writeString(file, file.getAbsolutePath());
330
331 MetadataRequest request = new MetadataRequest(metadata, repository, "");
332 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
333
334 assertEquals(1, results.size());
335
336 MetadataResult result = results.get(0);
337 assertSame(request, result.getRequest());
338 assertNotNull(result.getException());
339 assertTrue(result.getException() instanceof MetadataNotFoundException);
340 assertEquals("never-accept", result.getException().getMessage());
341 assertNull(result.getMetadata());
342
343 connector.assertSeenExpected();
344 }
345
346 @Test
347 void testResolveAlwaysAcceptFromRepoFilter() throws IOException {
348 remoteRepositoryFilterSources.put("filter1", Filters.alwaysAcceptFrom(repository.getId()));
349 connector.setExpectGet(metadata);
350
351
352 File file = new File(
353 session.getLocalRepository().getBasedir(),
354 session.getLocalRepositoryManager().getPathForRemoteMetadata(metadata, repository, ""));
355
356 TestFileUtils.writeString(file, file.getAbsolutePath());
357
358 MetadataRequest request = new MetadataRequest(metadata, repository, "");
359 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
360
361 assertEquals(1, results.size());
362
363 MetadataResult result = results.get(0);
364 assertSame(request, result.getRequest());
365 assertNull(result.getException());
366 assertNotNull(result.getMetadata());
367 assertNotNull(result.getMetadata().getFile());
368
369 assertEquals(file, result.getMetadata().getFile());
370 assertEquals(metadata, result.getMetadata().setFile(null));
371
372 connector.assertSeenExpected();
373 Set<Metadata> metadataRegistration =
374 ((TestLocalRepositoryManager) session.getLocalRepositoryManager()).getMetadataRegistration();
375 assertTrue(metadataRegistration.contains(metadata));
376 assertEquals(1, metadataRegistration.size());
377 }
378
379 @Test
380 void testResolveNeverAcceptFromRepoFilter() throws IOException {
381 remoteRepositoryFilterSources.put("filter1", Filters.neverAcceptFrom(repository.getId()));
382
383
384
385 File file = new File(
386 session.getLocalRepository().getBasedir(),
387 session.getLocalRepositoryManager().getPathForRemoteMetadata(metadata, repository, ""));
388
389 TestFileUtils.writeString(file, file.getAbsolutePath());
390
391 MetadataRequest request = new MetadataRequest(metadata, repository, "");
392 List<MetadataResult> results = resolver.resolveMetadata(session, Arrays.asList(request));
393
394 assertEquals(1, results.size());
395
396 MetadataResult result = results.get(0);
397 assertSame(request, result.getRequest());
398 assertNotNull(result.getException());
399 assertTrue(result.getException() instanceof MetadataNotFoundException);
400 assertEquals("never-accept-" + repository.getId(), result.getException().getMessage());
401 assertNull(result.getMetadata());
402
403 connector.assertSeenExpected();
404 }
405 }