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.net.URI;
22  import java.util.Arrays;
23  import java.util.List;
24  import java.util.stream.Collectors;
25  
26  import org.eclipse.aether.DefaultRepositorySystemSession;
27  import org.eclipse.aether.artifact.DefaultArtifact;
28  import org.eclipse.aether.internal.test.util.TestUtils;
29  import org.eclipse.aether.metadata.DefaultMetadata;
30  import org.eclipse.aether.metadata.Metadata;
31  import org.eclipse.aether.repository.RemoteRepository;
32  import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithm;
33  import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
34  import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySupport;
35  import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
36  import org.eclipse.aether.spi.connector.layout.RepositoryLayout.ChecksumLocation;
37  import org.eclipse.aether.transfer.NoRepositoryLayoutException;
38  import org.junit.jupiter.api.BeforeEach;
39  import org.junit.jupiter.api.Test;
40  
41  import static org.eclipse.aether.internal.impl.checksum.Checksums.checksumsSelector;
42  import static org.junit.jupiter.api.Assertions.*;
43  
44  public class Maven2RepositoryLayoutFactoryTest {
45      private final ChecksumAlgorithmFactory SHA512 = new ChecksumAlgorithmFactorySupport("SHA-512", "sha512") {
46          @Override
47          public ChecksumAlgorithm getAlgorithm() {
48              throw new RuntimeException("this should not happen");
49          }
50      };
51  
52      private final ChecksumAlgorithmFactory SHA256 = new ChecksumAlgorithmFactorySupport("SHA-256", "sha256") {
53          @Override
54          public ChecksumAlgorithm getAlgorithm() {
55              throw new RuntimeException("this should not happen");
56          }
57      };
58  
59      private final ChecksumAlgorithmFactory SHA1 = new ChecksumAlgorithmFactorySupport("SHA-1", "sha1") {
60          @Override
61          public ChecksumAlgorithm getAlgorithm() {
62              throw new RuntimeException("this should not happen");
63          }
64      };
65  
66      private final ChecksumAlgorithmFactory MD5 = new ChecksumAlgorithmFactorySupport("MD5", "md5") {
67          @Override
68          public ChecksumAlgorithm getAlgorithm() {
69              throw new RuntimeException("this should not happen");
70          }
71      };
72  
73      private DefaultRepositorySystemSession session;
74  
75      private Maven2RepositoryLayoutFactory factory;
76  
77      private RepositoryLayout layout;
78  
79      private RemoteRepository newRepo(String type) {
80          return new RemoteRepository.Builder("test", type, "classpath:/nil").build();
81      }
82  
83      private void assertChecksum(ChecksumLocation actual, String expectedUri, String expectedAlgo) {
84          assertEquals(expectedUri, actual.getLocation().toString());
85          assertEquals(expectedAlgo, actual.getChecksumAlgorithmFactory().getName());
86      }
87  
88      private void assertChecksum(
89              ChecksumLocation actual, String expectedUri, ChecksumAlgorithmFactory expectedAlgorithmFactory) {
90          assertChecksum(actual, expectedUri, expectedAlgorithmFactory.getName());
91      }
92  
93      private void assertChecksums(List<ChecksumLocation> actual, String baseUri, ChecksumAlgorithmFactory... algos) {
94          assertEquals(algos.length, actual.size());
95          for (int i = 0; i < algos.length; i++) {
96              String uri = baseUri + '.' + algos[i].getFileExtension();
97              assertChecksum(actual.get(i), uri, algos[i]);
98          }
99      }
100 
101     @BeforeEach
102     void setUp() throws Exception {
103         session = TestUtils.newSession();
104         factory = new Maven2RepositoryLayoutFactory(
105                 checksumsSelector(), new DefaultArtifactPredicateFactory(checksumsSelector()));
106         layout = factory.newInstance(session, newRepo("default"));
107     }
108 
109     @Test
110     void testBadLayout() {
111         assertThrows(NoRepositoryLayoutException.class, () -> factory.newInstance(session, newRepo("DEFAULT")));
112     }
113 
114     @Test
115     void testChecksumAlgorithmNames() {
116         assertEquals(
117                 Arrays.asList("SHA-1", "MD5"),
118                 layout.getChecksumAlgorithmFactories().stream()
119                         .map(ChecksumAlgorithmFactory::getName)
120                         .collect(Collectors.toList()));
121     }
122 
123     @Test
124     void testArtifactLocation_Release() {
125         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
126         URI uri = layout.getLocation(artifact, false);
127         assertEquals("g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString());
128         uri = layout.getLocation(artifact, true);
129         assertEquals("g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString());
130     }
131 
132     @Test
133     void testArtifactLocation_Snapshot() {
134         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0-20110329.221805-4");
135         URI uri = layout.getLocation(artifact, false);
136         assertEquals("g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString());
137         uri = layout.getLocation(artifact, true);
138         assertEquals("g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString());
139     }
140 
141     @Test
142     void testMetadataLocation_RootLevel() {
143         DefaultMetadata metadata = new DefaultMetadata("archetype-catalog.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT);
144         URI uri = layout.getLocation(metadata, false);
145         assertEquals("archetype-catalog.xml", uri.toString());
146         uri = layout.getLocation(metadata, true);
147         assertEquals("archetype-catalog.xml", uri.toString());
148     }
149 
150     @Test
151     void testMetadataLocation_GroupLevel() {
152         DefaultMetadata metadata = new DefaultMetadata(
153                 "org.apache.maven.plugins", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT);
154         URI uri = layout.getLocation(metadata, false);
155         assertEquals("org/apache/maven/plugins/maven-metadata.xml", uri.toString());
156         uri = layout.getLocation(metadata, true);
157         assertEquals("org/apache/maven/plugins/maven-metadata.xml", uri.toString());
158     }
159 
160     @Test
161     void testMetadataLocation_ArtifactLevel() {
162         DefaultMetadata metadata = new DefaultMetadata(
163                 "org.apache.maven.plugins",
164                 "maven-jar-plugin",
165                 "maven-metadata.xml",
166                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
167         URI uri = layout.getLocation(metadata, false);
168         assertEquals("org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml", uri.toString());
169         uri = layout.getLocation(metadata, true);
170         assertEquals("org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml", uri.toString());
171     }
172 
173     @Test
174     void testMetadataLocation_VersionLevel() {
175         DefaultMetadata metadata = new DefaultMetadata(
176                 "org.apache.maven.plugins",
177                 "maven-jar-plugin",
178                 "1.0-SNAPSHOT",
179                 "maven-metadata.xml",
180                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
181         URI uri = layout.getLocation(metadata, false);
182         assertEquals("org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString());
183         uri = layout.getLocation(metadata, true);
184         assertEquals("org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString());
185     }
186 
187     @Test
188     void testArtifactChecksums_Download() {
189         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
190         URI uri = layout.getLocation(artifact, false);
191         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, false, uri);
192         assertEquals(2, checksums.size());
193         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1);
194         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5);
195     }
196 
197     @Test
198     void testArtifactChecksums_DownloadWithCustomAlgorithms() throws NoRepositoryLayoutException {
199         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-256,SHA-1");
200         layout = factory.newInstance(session, newRepo("default"));
201         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
202         URI uri = layout.getLocation(artifact, false);
203         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, false, uri);
204         assertEquals(2, checksums.size());
205         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha256", SHA256);
206         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1);
207     }
208 
209     @Test
210     void testArtifactChecksums_DownloadWithUnsupportedAlgorithms() throws NoRepositoryLayoutException {
211         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "FOO,SHA-1");
212         assertThrows(IllegalArgumentException.class, () -> factory.newInstance(session, newRepo("default")));
213     }
214 
215     @Test
216     void testArtifactChecksums_Upload() {
217         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
218         URI uri = layout.getLocation(artifact, true);
219         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
220         assertEquals(2, checksums.size());
221         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1);
222         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5);
223     }
224 
225     @Test
226     void testArtifactChecksums_UploadWithCustomAlgorithms() throws NoRepositoryLayoutException {
227         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-512,MD5");
228         layout = factory.newInstance(session, newRepo("default"));
229         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
230         URI uri = layout.getLocation(artifact, true);
231         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
232         assertEquals(2, checksums.size());
233         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha512", SHA512);
234         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5);
235     }
236 
237     @Test
238     void testMetadataChecksums_Download() {
239         DefaultMetadata metadata = new DefaultMetadata(
240                 "org.apache.maven.plugins",
241                 "maven-jar-plugin",
242                 "maven-metadata.xml",
243                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
244         URI uri = layout.getLocation(metadata, false);
245         List<ChecksumLocation> checksums = layout.getChecksumLocations(metadata, false, uri);
246         assertEquals(2, checksums.size());
247         assertChecksum(checksums.get(0), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1", SHA1);
248         assertChecksum(checksums.get(1), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", MD5);
249     }
250 
251     @Test
252     void testMetadataChecksums_Upload() {
253         DefaultMetadata metadata = new DefaultMetadata(
254                 "org.apache.maven.plugins",
255                 "maven-jar-plugin",
256                 "maven-metadata.xml",
257                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
258         URI uri = layout.getLocation(metadata, true);
259         List<ChecksumLocation> checksums = layout.getChecksumLocations(metadata, true, uri);
260         assertEquals(2, checksums.size());
261         assertChecksum(checksums.get(0), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1", SHA1);
262         assertChecksum(checksums.get(1), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", MD5);
263     }
264 
265     @Test
266     void testSignatureChecksums_Download() {
267         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "asc", "1.0");
268         URI uri = layout.getLocation(artifact, false);
269         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, false, uri);
270         assertChecksums(checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", SHA1, MD5);
271 
272         artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.asc", "1.0");
273         uri = layout.getLocation(artifact, false);
274         checksums = layout.getChecksumLocations(artifact, false, uri);
275         assertEquals(0, checksums.size());
276     }
277 
278     @Test
279     void testSignatureChecksums_Upload() {
280         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "asc", "1.0");
281         URI uri = layout.getLocation(artifact, true);
282         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
283         assertChecksums(checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", SHA1, MD5);
284 
285         artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.asc", "1.0");
286         uri = layout.getLocation(artifact, true);
287         checksums = layout.getChecksumLocations(artifact, true, uri);
288         assertEquals(0, checksums.size());
289     }
290 
291     @Test
292     void testSignatureChecksums_Force() throws Exception {
293         session.setConfigProperty(DefaultArtifactPredicateFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, "");
294         layout = factory.newInstance(session, newRepo("default"));
295         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.asc", "1.0");
296         URI uri = layout.getLocation(artifact, true);
297         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
298         assertChecksums(checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.jar.asc", SHA1, MD5);
299     }
300 
301     @Test
302     void testCustomChecksumsIgnored() throws Exception {
303         session.setConfigProperty(
304                 DefaultArtifactPredicateFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, ".asc,.foo");
305         layout = factory.newInstance(session, newRepo("default"));
306         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.foo", "1.0");
307         URI uri = layout.getLocation(artifact, true);
308         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
309         assertEquals(0, checksums.size());
310     }
311 
312     @Test
313     void testNotConfiguredButSupportedChecksumsHandledAsChecksums() throws Exception {
314         layout = factory.newInstance(session, newRepo("default"));
315         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.sha512", "1.0");
316         URI uri = layout.getLocation(artifact, true);
317         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
318         assertEquals(0, checksums.size());
319     }
320 
321     @Test
322     void testCustomChecksumsIgnored_IllegalInout() throws Exception {
323         session.setConfigProperty(
324                 DefaultArtifactPredicateFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, ".asc,foo");
325         try {
326             layout = factory.newInstance(session, newRepo("default"));
327             fail("Should not get here");
328         } catch (IllegalArgumentException e) {
329             String message = e.getMessage();
330             assertTrue(
331                     message.contains(DefaultArtifactPredicateFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS),
332                     message);
333         }
334     }
335 }