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