1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }