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.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         // prepare "download"
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         // set file to use in TestLRM find()
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         // prepare "download"
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         // connector.setExpectGet( metadata ); // should not see it
323 
324         // prepare "download"
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         // prepare "download"
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         // connector.setExpectGet( metadata ); // should not see it
383 
384         // prepare "download"
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 }