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.Collections;
27  
28  import org.eclipse.aether.DefaultRepositorySystemSession;
29  import org.eclipse.aether.artifact.Artifact;
30  import org.eclipse.aether.artifact.DefaultArtifact;
31  import org.eclipse.aether.internal.test.util.TestFileUtils;
32  import org.eclipse.aether.internal.test.util.TestUtils;
33  import org.eclipse.aether.metadata.DefaultMetadata;
34  import org.eclipse.aether.metadata.Metadata;
35  import org.eclipse.aether.metadata.Metadata.Nature;
36  import org.eclipse.aether.repository.LocalArtifactRegistration;
37  import org.eclipse.aether.repository.LocalArtifactRequest;
38  import org.eclipse.aether.repository.LocalArtifactResult;
39  import org.eclipse.aether.repository.LocalMetadataRequest;
40  import org.eclipse.aether.repository.LocalMetadataResult;
41  import org.eclipse.aether.repository.RemoteRepository;
42  import org.junit.jupiter.api.AfterEach;
43  import org.junit.jupiter.api.BeforeEach;
44  import org.junit.jupiter.api.Test;
45  
46  import static org.junit.jupiter.api.Assertions.*;
47  
48  public class EnhancedLocalRepositoryManagerTest {
49  
50      private Artifact artifact;
51  
52      private Artifact snapshot;
53  
54      protected File basedir;
55  
56      protected EnhancedLocalRepositoryManager manager;
57  
58      private File artifactFile;
59  
60      private RemoteRepository repository;
61  
62      private final String testContext = "project/compile";
63  
64      protected TrackingFileManager trackingFileManager;
65  
66      protected DefaultRepositorySystemSession session;
67  
68      private Metadata metadata;
69  
70      private Metadata noVerMetadata;
71  
72      @BeforeEach
73      void setup() throws Exception {
74          String url = TestFileUtils.createTempDir("enhanced-remote-repo")
75                  .toURI()
76                  .toURL()
77                  .toString();
78          repository = new RemoteRepository.Builder("enhanced-remote-repo", "default", url)
79                  .setRepositoryManager(true)
80                  .build();
81  
82          artifact = new DefaultArtifact(
83                  "gid", "aid", "", "jar", "1-test", Collections.emptyMap(), TestFileUtils.createTempFile("artifact"));
84  
85          snapshot = new DefaultArtifact(
86                  "gid",
87                  "aid",
88                  "",
89                  "jar",
90                  "1.0-20120710.231549-9",
91                  Collections.emptyMap(),
92                  TestFileUtils.createTempFile("artifact"));
93  
94          metadata = new DefaultMetadata(
95                  "gid", "aid", "1-test", "maven-metadata.xml", Nature.RELEASE, TestFileUtils.createTempFile("metadata"));
96  
97          noVerMetadata = new DefaultMetadata(
98                  "gid", "aid", null, "maven-metadata.xml", Nature.RELEASE, TestFileUtils.createTempFile("metadata"));
99  
100         basedir = TestFileUtils.createTempDir("enhanced-repo");
101         session = TestUtils.newSession();
102         trackingFileManager = new DefaultTrackingFileManager();
103         manager = getManager();
104 
105         artifactFile = new File(basedir, manager.getPathForLocalArtifact(artifact));
106     }
107 
108     protected EnhancedLocalRepositoryManager getManager() {
109         return new EnhancedLocalRepositoryManager(
110                 basedir,
111                 new DefaultLocalPathComposer(),
112                 "_remote.repositories",
113                 trackingFileManager,
114                 new DefaultLocalPathPrefixComposerFactory().createComposer(session));
115     }
116 
117     @AfterEach
118     void tearDown() throws Exception {
119         TestFileUtils.deleteFile(basedir);
120         TestFileUtils.deleteFile(new File(new URI(repository.getUrl())));
121 
122         session = null;
123         manager = null;
124         repository = null;
125         artifact = null;
126     }
127 
128     private long addLocalArtifact(Artifact artifact) throws IOException {
129         manager.add(session, new LocalArtifactRegistration(artifact));
130         String path = manager.getPathForLocalArtifact(artifact);
131 
132         return copy(artifact, path);
133     }
134 
135     private long addRemoteArtifact(Artifact artifact) throws IOException {
136         Collection<String> contexts = Arrays.asList(testContext);
137         manager.add(session, new LocalArtifactRegistration(artifact, repository, contexts));
138         String path = manager.getPathForRemoteArtifact(artifact, repository, testContext);
139         return copy(artifact, path);
140     }
141 
142     private long copy(Metadata metadata, String path) throws IOException {
143         if (metadata.getFile() == null) {
144             return -1L;
145         }
146         return TestFileUtils.copyFile(metadata.getFile(), new File(basedir, path));
147     }
148 
149     private long copy(Artifact artifact, String path) throws IOException {
150         if (artifact.getFile() == null) {
151             return -1L;
152         }
153         File artifactFile = new File(basedir, path);
154         return TestFileUtils.copyFile(artifact.getFile(), artifactFile);
155     }
156 
157     @Test
158     void testGetPathForLocalArtifact() {
159         Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT");
160         assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion());
161         assertEquals("g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar", manager.getPathForLocalArtifact(artifact));
162 
163         artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-20110329.221805-4");
164         assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion());
165         assertEquals("g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar", manager.getPathForLocalArtifact(artifact));
166     }
167 
168     @Test
169     void testGetPathForRemoteArtifact() {
170         RemoteRepository remoteRepo = new RemoteRepository.Builder("repo", "default", "ram:/void").build();
171 
172         Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT");
173         assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion());
174         assertEquals(
175                 "g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar",
176                 manager.getPathForRemoteArtifact(artifact, remoteRepo, ""));
177 
178         artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-20110329.221805-4");
179         assertEquals("1.0-SNAPSHOT", artifact.getBaseVersion());
180         assertEquals(
181                 "g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-20110329.221805-4.jar",
182                 manager.getPathForRemoteArtifact(artifact, remoteRepo, ""));
183     }
184 
185     @Test
186     void testFindLocalArtifact() throws Exception {
187         addLocalArtifact(artifact);
188 
189         LocalArtifactRequest request = new LocalArtifactRequest(artifact, null, null);
190         LocalArtifactResult result = manager.find(session, request);
191         assertTrue(result.isAvailable());
192         assertNull(result.getRepository());
193 
194         snapshot = snapshot.setVersion(snapshot.getBaseVersion());
195         addLocalArtifact(snapshot);
196 
197         request = new LocalArtifactRequest(snapshot, null, null);
198         result = manager.find(session, request);
199         assertTrue(result.isAvailable());
200         assertNull(result.getRepository());
201     }
202 
203     @Test
204     void testFindRemoteArtifact() throws Exception {
205         addRemoteArtifact(artifact);
206 
207         LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext);
208         LocalArtifactResult result = manager.find(session, request);
209         assertTrue(result.isAvailable());
210         assertEquals(repository, result.getRepository());
211 
212         addRemoteArtifact(snapshot);
213 
214         request = new LocalArtifactRequest(snapshot, Arrays.asList(repository), testContext);
215         result = manager.find(session, request);
216         assertTrue(result.isAvailable());
217         assertEquals(repository, result.getRepository());
218     }
219 
220     @Test
221     void testDoNotFindDifferentContext() throws Exception {
222         addRemoteArtifact(artifact);
223 
224         LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), "different");
225         LocalArtifactResult result = manager.find(session, request);
226         assertFalse(result.isAvailable());
227     }
228 
229     @Test
230     void testDoNotFindNullFile() throws Exception {
231         artifact = artifact.setFile(null);
232         addLocalArtifact(artifact);
233 
234         LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext);
235         LocalArtifactResult result = manager.find(session, request);
236         assertFalse(result.isAvailable());
237     }
238 
239     @Test
240     void testDoNotFindDeletedFile() throws Exception {
241         addLocalArtifact(artifact);
242         assertTrue(artifactFile.delete(), "could not delete artifact file");
243 
244         LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext);
245         LocalArtifactResult result = manager.find(session, request);
246         assertFalse(result.isAvailable());
247     }
248 
249     @Test
250     void testFindUntrackedFile() throws Exception {
251         copy(artifact, manager.getPathForLocalArtifact(artifact));
252 
253         LocalArtifactRequest request = new LocalArtifactRequest(artifact, Arrays.asList(repository), testContext);
254         LocalArtifactResult result = manager.find(session, request);
255         assertTrue(result.isAvailable());
256     }
257 
258     private long addMetadata(Metadata metadata, RemoteRepository repo) throws IOException {
259         String path;
260         if (repo == null) {
261             path = manager.getPathForLocalMetadata(metadata);
262         } else {
263             path = manager.getPathForRemoteMetadata(metadata, repo, testContext);
264         }
265         System.err.println(path);
266 
267         return copy(metadata, path);
268     }
269 
270     @Test
271     void testFindLocalMetadata() throws Exception {
272         addMetadata(metadata, null);
273 
274         LocalMetadataRequest request = new LocalMetadataRequest(metadata, null, testContext);
275         LocalMetadataResult result = manager.find(session, request);
276 
277         assertNotNull(result.getFile());
278     }
279 
280     @Test
281     void testFindLocalMetadataNoVersion() throws Exception {
282         addMetadata(noVerMetadata, null);
283 
284         LocalMetadataRequest request = new LocalMetadataRequest(noVerMetadata, null, testContext);
285         LocalMetadataResult result = manager.find(session, request);
286 
287         assertNotNull(result.getFile());
288     }
289 
290     @Test
291     void testDoNotFindRemoteMetadataDifferentContext() throws Exception {
292         addMetadata(noVerMetadata, repository);
293         addMetadata(metadata, repository);
294 
295         LocalMetadataRequest request = new LocalMetadataRequest(noVerMetadata, repository, "different");
296         LocalMetadataResult result = manager.find(session, request);
297         assertNull(result.getFile());
298 
299         request = new LocalMetadataRequest(metadata, repository, "different");
300         result = manager.find(session, request);
301         assertNull(result.getFile());
302     }
303 
304     @Test
305     void testFindArtifactUsesTimestampedVersion() throws Exception {
306         Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT");
307         File file = new File(basedir, manager.getPathForLocalArtifact(artifact));
308         TestFileUtils.writeString(file, "test");
309         addLocalArtifact(artifact);
310 
311         artifact = artifact.setVersion("1.0-20110329.221805-4");
312         LocalArtifactRequest request = new LocalArtifactRequest();
313         request.setArtifact(artifact);
314         LocalArtifactResult result = manager.find(session, request);
315         assertNull(result.getFile(), result.toString());
316         assertFalse(result.isAvailable(), result.toString());
317     }
318 }