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}