001package org.eclipse.aether.internal.impl; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import static org.junit.Assert.*; 023 024import java.net.URI; 025import java.util.Arrays; 026import java.util.List; 027import java.util.stream.Collectors; 028 029import org.eclipse.aether.DefaultRepositorySystemSession; 030import org.eclipse.aether.artifact.DefaultArtifact; 031import org.eclipse.aether.internal.test.util.TestUtils; 032import org.eclipse.aether.metadata.DefaultMetadata; 033import org.eclipse.aether.metadata.Metadata; 034import org.eclipse.aether.repository.RemoteRepository; 035import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithm; 036import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory; 037import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySupport; 038import org.eclipse.aether.spi.connector.layout.RepositoryLayout; 039import org.eclipse.aether.spi.connector.layout.RepositoryLayout.ChecksumLocation; 040import org.eclipse.aether.transfer.NoRepositoryLayoutException; 041import org.junit.Before; 042import org.junit.Test; 043 044public class Maven2RepositoryLayoutFactoryTest 045{ 046 private final ChecksumAlgorithmFactory SHA512 = new ChecksumAlgorithmFactorySupport("SHA-512", "sha512") { 047 @Override 048 public ChecksumAlgorithm getAlgorithm() { 049 throw new RuntimeException("this should not happen"); 050 } 051 }; 052 053 private final ChecksumAlgorithmFactory SHA256 = new ChecksumAlgorithmFactorySupport("SHA-256", "sha256") { 054 @Override 055 public ChecksumAlgorithm getAlgorithm() { 056 throw new RuntimeException("this should not happen"); 057 } 058 }; 059 060 private final ChecksumAlgorithmFactory SHA1 = new ChecksumAlgorithmFactorySupport("SHA-1", "sha1") { 061 @Override 062 public ChecksumAlgorithm getAlgorithm() { 063 throw new RuntimeException("this should not happen"); 064 } 065 }; 066 067 private final ChecksumAlgorithmFactory MD5 = new ChecksumAlgorithmFactorySupport("MD5", "md5") { 068 @Override 069 public ChecksumAlgorithm getAlgorithm() { 070 throw new RuntimeException("this should not happen"); 071 } 072 }; 073 074 private DefaultRepositorySystemSession session; 075 076 private Maven2RepositoryLayoutFactory factory; 077 078 private RepositoryLayout layout; 079 080 private RemoteRepository newRepo( String type ) 081 { 082 return new RemoteRepository.Builder( "test", type, "classpath:/nil" ).build(); 083 } 084 085 private void assertChecksum( ChecksumLocation actual, String expectedUri, String expectedAlgo ) 086 { 087 assertEquals( expectedUri, actual.getLocation().toString() ); 088 assertEquals( expectedAlgo, actual.getChecksumAlgorithmFactory().getName() ); 089 } 090 091 private void assertChecksum( ChecksumLocation actual, String expectedUri, ChecksumAlgorithmFactory expectedAlgorithmFactory ) 092 { 093 assertChecksum( actual, expectedUri, expectedAlgorithmFactory.getName() ); 094 } 095 096 private void assertChecksums( List<ChecksumLocation> actual, String baseUri, ChecksumAlgorithmFactory... algos ) 097 { 098 assertEquals( algos.length, actual.size() ); 099 for ( int i = 0; i < algos.length; i++ ) 100 { 101 String uri = baseUri + '.' + algos[i].getFileExtension(); 102 assertChecksum( actual.get( i ), uri, algos[i] ); 103 } 104 } 105 106 @Before 107 public void setUp() 108 throws Exception 109 { 110 session = TestUtils.newSession(); 111 factory = new Maven2RepositoryLayoutFactory(); 112 layout = factory.newInstance( session, newRepo( "default" ) ); 113 } 114 115 @Test( expected = NoRepositoryLayoutException.class ) 116 public void testBadLayout() 117 throws Exception 118 { 119 factory.newInstance( session, newRepo( "DEFAULT" ) ); 120 } 121 122 @Test 123 public void testChecksumAlgorithmNames() 124 { 125 assertEquals( Arrays.asList( "SHA-1", "MD5" ), 126 layout.getChecksumAlgorithmFactories().stream() 127 .map( ChecksumAlgorithmFactory::getName ) 128 .collect( Collectors.toList() ) 129 ); 130 } 131 132 @Test 133 public void testArtifactLocation_Release() 134 { 135 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" ); 136 URI uri = layout.getLocation( artifact, false ); 137 assertEquals( "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString() ); 138 uri = layout.getLocation( artifact, true ); 139 assertEquals( "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString() ); 140 } 141 142 @Test 143 public void testArtifactLocation_Snapshot() 144 { 145 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0-20110329.221805-4" ); 146 URI uri = layout.getLocation( artifact, false ); 147 assertEquals( "g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString() ); 148 uri = layout.getLocation( artifact, true ); 149 assertEquals( "g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString() ); 150 } 151 152 @Test 153 public void testMetadataLocation_RootLevel() 154 { 155 DefaultMetadata metadata = new DefaultMetadata( "archetype-catalog.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT ); 156 URI uri = layout.getLocation( metadata, false ); 157 assertEquals( "archetype-catalog.xml", uri.toString() ); 158 uri = layout.getLocation( metadata, true ); 159 assertEquals( "archetype-catalog.xml", uri.toString() ); 160 } 161 162 @Test 163 public void testMetadataLocation_GroupLevel() 164 { 165 DefaultMetadata metadata = 166 new DefaultMetadata( "org.apache.maven.plugins", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT ); 167 URI uri = layout.getLocation( metadata, false ); 168 assertEquals( "org/apache/maven/plugins/maven-metadata.xml", uri.toString() ); 169 uri = layout.getLocation( metadata, true ); 170 assertEquals( "org/apache/maven/plugins/maven-metadata.xml", uri.toString() ); 171 } 172 173 @Test 174 public void testMetadataLocation_ArtifactLevel() 175 { 176 DefaultMetadata metadata = 177 new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "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/maven-metadata.xml", uri.toString() ); 181 uri = layout.getLocation( metadata, true ); 182 assertEquals( "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml", uri.toString() ); 183 } 184 185 @Test 186 public void testMetadataLocation_VersionLevel() 187 { 188 DefaultMetadata metadata = 189 new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "1.0-SNAPSHOT", "maven-metadata.xml", 190 Metadata.Nature.RELEASE_OR_SNAPSHOT ); 191 URI uri = layout.getLocation( metadata, false ); 192 assertEquals( "org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString() ); 193 uri = layout.getLocation( metadata, true ); 194 assertEquals( "org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString() ); 195 } 196 197 @Test 198 public void testArtifactChecksums_Download() 199 { 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.sha1", SHA1 ); 205 assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5 ); 206 } 207 208 @Test 209 public void testArtifactChecksums_DownloadWithCustomAlgorithms() throws NoRepositoryLayoutException 210 { 211 session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-256,SHA-1"); 212 layout = factory.newInstance( session, newRepo( "default" ) ); 213 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" ); 214 URI uri = layout.getLocation( artifact, false ); 215 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, false, uri ); 216 assertEquals( 2, checksums.size() ); 217 assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha256", SHA256 ); 218 assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1 ); 219 } 220 221 @Test( expected = IllegalArgumentException.class ) 222 public void testArtifactChecksums_DownloadWithUnsupportedAlgorithms() throws NoRepositoryLayoutException 223 { 224 session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "FOO,SHA-1"); 225 layout = factory.newInstance( session, newRepo( "default" ) ); 226 } 227 228 @Test 229 public void testArtifactChecksums_Upload() 230 { 231 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" ); 232 URI uri = layout.getLocation( artifact, true ); 233 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, true, uri ); 234 assertEquals( 2, checksums.size() ); 235 assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", SHA1 ); 236 assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5 ); 237 } 238 239 @Test 240 public void testArtifactChecksums_UploadWithCustomAlgorithms() throws NoRepositoryLayoutException 241 { 242 session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-512,MD5" ); 243 layout = factory.newInstance( session, newRepo( "default" ) ); 244 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" ); 245 URI uri = layout.getLocation( artifact, true ); 246 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, true, uri ); 247 assertEquals( 2, checksums.size() ); 248 assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha512", SHA512 ); 249 assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", MD5 ); 250 } 251 252 @Test 253 public void testMetadataChecksums_Download() 254 { 255 DefaultMetadata metadata = 256 new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "maven-metadata.xml", 257 Metadata.Nature.RELEASE_OR_SNAPSHOT ); 258 URI uri = layout.getLocation( metadata, false ); 259 List<ChecksumLocation> checksums = layout.getChecksumLocations( metadata, false, uri ); 260 assertEquals( 2, checksums.size() ); 261 assertChecksum( checksums.get( 0 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1", 262 SHA1 ); 263 assertChecksum( checksums.get( 1 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", 264 MD5 ); 265 } 266 267 @Test 268 public void testMetadataChecksums_Upload() 269 { 270 DefaultMetadata metadata = 271 new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "maven-metadata.xml", 272 Metadata.Nature.RELEASE_OR_SNAPSHOT ); 273 URI uri = layout.getLocation( metadata, true ); 274 List<ChecksumLocation> checksums = layout.getChecksumLocations( metadata, true, uri ); 275 assertEquals( 2, checksums.size() ); 276 assertChecksum( checksums.get( 0 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1", 277 SHA1 ); 278 assertChecksum( checksums.get( 1 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", 279 MD5 ); 280 } 281 282 @Test 283 public void testSignatureChecksums_Download() 284 { 285 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "asc", "1.0" ); 286 URI uri = layout.getLocation( artifact, false ); 287 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, false, uri ); 288 assertChecksums( checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", SHA1, MD5 ); 289 290 artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.asc", "1.0" ); 291 uri = layout.getLocation( artifact, false ); 292 checksums = layout.getChecksumLocations( artifact, false, uri ); 293 assertEquals( 0, checksums.size() ); 294 } 295 296 @Test 297 public void testSignatureChecksums_Upload() 298 { 299 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "asc", "1.0" ); 300 URI uri = layout.getLocation( artifact, true ); 301 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, true, uri ); 302 assertChecksums( checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", SHA1, MD5 ); 303 304 artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.asc", "1.0" ); 305 uri = layout.getLocation( artifact, true ); 306 checksums = layout.getChecksumLocations( artifact, true, uri ); 307 assertEquals( 0, checksums.size() ); 308 } 309 310 @Test 311 public void testSignatureChecksums_Force() 312 throws Exception 313 { 314 session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, "" ); 315 layout = factory.newInstance( session, newRepo( "default" ) ); 316 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.asc", "1.0" ); 317 URI uri = layout.getLocation( artifact, true ); 318 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, true, uri ); 319 assertChecksums( checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.jar.asc", SHA1, MD5 ); 320 } 321 322 @Test 323 public void testCustomChecksumsIgnored() 324 throws Exception 325 { 326 session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, ".asc,.foo" ); 327 layout = factory.newInstance( session, newRepo( "default" ) ); 328 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.foo", "1.0" ); 329 URI uri = layout.getLocation( artifact, true ); 330 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, true, uri ); 331 assertEquals( 0, checksums.size() ); 332 } 333 334 @Test 335 public void testNotConfiguredButSupportedChecksumsHandledAsChecksums() 336 throws Exception 337 { 338 layout = factory.newInstance( session, newRepo( "default" ) ); 339 DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.sha512", "1.0" ); 340 URI uri = layout.getLocation( artifact, true ); 341 List<ChecksumLocation> checksums = layout.getChecksumLocations( artifact, true, uri ); 342 assertEquals( 0, checksums.size() ); 343 } 344 345 @Test 346 public void testCustomChecksumsIgnored_IllegalInout() 347 throws Exception 348 { 349 session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS, ".asc,foo" ); 350 try 351 { 352 layout = factory.newInstance( session, newRepo( "default" ) ); 353 fail( "Should not get here" ); 354 } 355 catch ( IllegalArgumentException e ) 356 { 357 String message = e.getMessage(); 358 assertTrue( message, message.contains( Maven2RepositoryLayoutFactory.CONFIG_PROP_OMIT_CHECKSUMS_FOR_EXTENSIONS ) ); 359 } 360 } 361 362}