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(checksumsSelector());
105         layout = factory.newInstance(session, newRepo("default"));
106     }
107 
108     @Test
109     void testBadLayout() {
110         assertThrows(NoRepositoryLayoutException.class, () -> factory.newInstance(session, newRepo("DEFAULT")));
111     }
112 
113     @Test
114     void testChecksumAlgorithmNames() {
115         assertEquals(
116                 Arrays.asList("SHA-1", "MD5"),
117                 layout.getChecksumAlgorithmFactories().stream()
118                         .map(ChecksumAlgorithmFactory::getName)
119                         .collect(Collectors.toList()));
120     }
121 
122     @Test
123     void testArtifactLocation_Release() {
124         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
125         URI uri = layout.getLocation(artifact, false);
126         assertEquals("g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString());
127         uri = layout.getLocation(artifact, true);
128         assertEquals("g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString());
129     }
130 
131     @Test
132     void testArtifactLocation_Snapshot() {
133         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0-20110329.221805-4");
134         URI uri = layout.getLocation(artifact, false);
135         assertEquals("g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString());
136         uri = layout.getLocation(artifact, true);
137         assertEquals("g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString());
138     }
139 
140     @Test
141     void testMetadataLocation_RootLevel() {
142         DefaultMetadata metadata = new DefaultMetadata("archetype-catalog.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT);
143         URI uri = layout.getLocation(metadata, false);
144         assertEquals("archetype-catalog.xml", uri.toString());
145         uri = layout.getLocation(metadata, true);
146         assertEquals("archetype-catalog.xml", uri.toString());
147     }
148 
149     @Test
150     void testMetadataLocation_GroupLevel() {
151         DefaultMetadata metadata = new DefaultMetadata(
152                 "org.apache.maven.plugins", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT);
153         URI uri = layout.getLocation(metadata, false);
154         assertEquals("org/apache/maven/plugins/maven-metadata.xml", uri.toString());
155         uri = layout.getLocation(metadata, true);
156         assertEquals("org/apache/maven/plugins/maven-metadata.xml", uri.toString());
157     }
158 
159     @Test
160     void testMetadataLocation_ArtifactLevel() {
161         DefaultMetadata metadata = new DefaultMetadata(
162                 "org.apache.maven.plugins",
163                 "maven-jar-plugin",
164                 "maven-metadata.xml",
165                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
166         URI uri = layout.getLocation(metadata, false);
167         assertEquals("org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml", uri.toString());
168         uri = layout.getLocation(metadata, true);
169         assertEquals("org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml", uri.toString());
170     }
171 
172     @Test
173     void testMetadataLocation_VersionLevel() {
174         DefaultMetadata metadata = new DefaultMetadata(
175                 "org.apache.maven.plugins",
176                 "maven-jar-plugin",
177                 "1.0-SNAPSHOT",
178                 "maven-metadata.xml",
179                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
180         URI uri = layout.getLocation(metadata, false);
181         assertEquals("org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString());
182         uri = layout.getLocation(metadata, true);
183         assertEquals("org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString());
184     }
185 
186     @Test
187     void testArtifactChecksums_Download() {
188         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
189         URI uri = layout.getLocation(artifact, false);
190         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, false, uri);
191         assertEquals(2, checksums.size());
192         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1);
193         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5);
194     }
195 
196     @Test
197     void testArtifactChecksums_DownloadWithCustomAlgorithms() throws NoRepositoryLayoutException {
198         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-256,SHA-1");
199         layout = factory.newInstance(session, newRepo("default"));
200         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
201         URI uri = layout.getLocation(artifact, false);
202         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, false, uri);
203         assertEquals(2, checksums.size());
204         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha256", SHA256);
205         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1);
206     }
207 
208     @Test
209     void testArtifactChecksums_DownloadWithUnsupportedAlgorithms() throws NoRepositoryLayoutException {
210         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "FOO,SHA-1");
211         assertThrows(IllegalArgumentException.class, () -> factory.newInstance(session, newRepo("default")));
212     }
213 
214     @Test
215     void testArtifactChecksums_Upload() {
216         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
217         URI uri = layout.getLocation(artifact, true);
218         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
219         assertEquals(2, checksums.size());
220         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1);
221         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5);
222     }
223 
224     @Test
225     void testArtifactChecksums_UploadWithCustomAlgorithms() throws NoRepositoryLayoutException {
226         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-512,MD5");
227         layout = factory.newInstance(session, newRepo("default"));
228         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "ext", "1.0");
229         URI uri = layout.getLocation(artifact, true);
230         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
231         assertEquals(2, checksums.size());
232         assertChecksum(checksums.get(0), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha512", SHA512);
233         assertChecksum(checksums.get(1), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5);
234     }
235 
236     @Test
237     void testMetadataChecksums_Download() {
238         DefaultMetadata metadata = new DefaultMetadata(
239                 "org.apache.maven.plugins",
240                 "maven-jar-plugin",
241                 "maven-metadata.xml",
242                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
243         URI uri = layout.getLocation(metadata, false);
244         List<ChecksumLocation> checksums = layout.getChecksumLocations(metadata, false, uri);
245         assertEquals(2, checksums.size());
246         assertChecksum(checksums.get(0), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1", SHA1);
247         assertChecksum(checksums.get(1), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", MD5);
248     }
249 
250     @Test
251     void testMetadataChecksums_Upload() {
252         DefaultMetadata metadata = new DefaultMetadata(
253                 "org.apache.maven.plugins",
254                 "maven-jar-plugin",
255                 "maven-metadata.xml",
256                 Metadata.Nature.RELEASE_OR_SNAPSHOT);
257         URI uri = layout.getLocation(metadata, true);
258         List<ChecksumLocation> checksums = layout.getChecksumLocations(metadata, true, uri);
259         assertEquals(2, checksums.size());
260         assertChecksum(checksums.get(0), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1", SHA1);
261         assertChecksum(checksums.get(1), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", MD5);
262     }
263 
264     @Test
265     void testSignatureChecksums_Download() {
266         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "asc", "1.0");
267         URI uri = layout.getLocation(artifact, false);
268         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, false, uri);
269         assertChecksums(checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", SHA1, MD5);
270 
271         artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.asc", "1.0");
272         uri = layout.getLocation(artifact, false);
273         checksums = layout.getChecksumLocations(artifact, false, uri);
274         assertEquals(0, checksums.size());
275     }
276 
277     @Test
278     void testSignatureChecksums_Upload() {
279         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "asc", "1.0");
280         URI uri = layout.getLocation(artifact, true);
281         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
282         assertChecksums(checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", SHA1, MD5);
283 
284         artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.asc", "1.0");
285         uri = layout.getLocation(artifact, true);
286         checksums = layout.getChecksumLocations(artifact, true, uri);
287         assertEquals(0, checksums.size());
288     }
289 
290     @Test
291     void testSignatureChecksums_Force() throws Exception {
292         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, "");
293         layout = factory.newInstance(session, newRepo("default"));
294         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.asc", "1.0");
295         URI uri = layout.getLocation(artifact, true);
296         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
297         assertChecksums(checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.jar.asc", SHA1, MD5);
298     }
299 
300     @Test
301     void testCustomChecksumsIgnored() throws Exception {
302         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, ".asc,.foo");
303         layout = factory.newInstance(session, newRepo("default"));
304         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.foo", "1.0");
305         URI uri = layout.getLocation(artifact, true);
306         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
307         assertEquals(0, checksums.size());
308     }
309 
310     @Test
311     void testNotConfiguredButSupportedChecksumsHandledAsChecksums() throws Exception {
312         layout = factory.newInstance(session, newRepo("default"));
313         DefaultArtifact artifact = new DefaultArtifact("g.i.d", "a-i.d", "cls", "jar.sha512", "1.0");
314         URI uri = layout.getLocation(artifact, true);
315         List<ChecksumLocation> checksums = layout.getChecksumLocations(artifact, true, uri);
316         assertEquals(0, checksums.size());
317     }
318 
319     @Test
320     void testCustomChecksumsIgnored_IllegalInout() throws Exception {
321         session.setConfigProperty(Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, ".asc,foo");
322         try {
323             layout = factory.newInstance(session, newRepo("default"));
324             fail("Should not get here");
325         } catch (IllegalArgumentException e) {
326             String message = e.getMessage();
327             assertTrue(
328                     message.contains(Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS), message);
329         }
330     }
331 }