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