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.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 }