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.Locale;
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.layout.RepositoryLayout;
036import org.eclipse.aether.spi.connector.layout.RepositoryLayout.Checksum;
037import org.eclipse.aether.transfer.NoRepositoryLayoutException;
038import org.junit.Before;
039import org.junit.Test;
040
041public class Maven2RepositoryLayoutFactoryTest
042{
043
044    private DefaultRepositorySystemSession session;
045
046    private Maven2RepositoryLayoutFactory factory;
047
048    private RepositoryLayout layout;
049
050    private RemoteRepository newRepo( String type )
051    {
052        return new RemoteRepository.Builder( "test", type, "classpath:/nil" ).build();
053    }
054
055    private void assertChecksum( Checksum actual, String expectedUri, String expectedAlgo )
056    {
057        assertEquals( expectedUri, actual.getLocation().toString() );
058        assertEquals( expectedAlgo, actual.getAlgorithm() );
059    }
060
061    private void assertChecksums( List<Checksum> actual, String baseUri, String... algos )
062    {
063        assertEquals( algos.length, actual.size() );
064        for ( int i = 0; i < algos.length; i++ )
065        {
066            String uri = baseUri + '.' + algos[i].replace( "-", "" ).toLowerCase( Locale.ENGLISH );
067            assertChecksum( actual.get( i ), uri, algos[i] );
068        }
069    }
070
071    @Before
072    public void setUp()
073        throws Exception
074    {
075        session = TestUtils.newSession();
076        factory = new Maven2RepositoryLayoutFactory();
077        layout = factory.newInstance( session, newRepo( "default" ) );
078    }
079
080    @Test( expected = NoRepositoryLayoutException.class )
081    public void testBadLayout()
082        throws Exception
083    {
084        factory.newInstance( session, newRepo( "DEFAULT" ) );
085    }
086
087    @Test
088    public void testArtifactLocation_Release()
089    {
090        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
091        URI uri = layout.getLocation( artifact, false );
092        assertEquals( "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString() );
093        uri = layout.getLocation( artifact, true );
094        assertEquals( "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext", uri.toString() );
095    }
096
097    @Test
098    public void testArtifactLocation_Snapshot()
099    {
100        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0-20110329.221805-4" );
101        URI uri = layout.getLocation( artifact, false );
102        assertEquals( "g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString() );
103        uri = layout.getLocation( artifact, true );
104        assertEquals( "g/i/d/a-i.d/1.0-SNAPSHOT/a-i.d-1.0-20110329.221805-4-cls.ext", uri.toString() );
105    }
106
107    @Test
108    public void testMetadataLocation_RootLevel()
109    {
110        DefaultMetadata metadata = new DefaultMetadata( "archetype-catalog.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT );
111        URI uri = layout.getLocation( metadata, false );
112        assertEquals( "archetype-catalog.xml", uri.toString() );
113        uri = layout.getLocation( metadata, true );
114        assertEquals( "archetype-catalog.xml", uri.toString() );
115    }
116
117    @Test
118    public void testMetadataLocation_GroupLevel()
119    {
120        DefaultMetadata metadata =
121            new DefaultMetadata( "org.apache.maven.plugins", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT );
122        URI uri = layout.getLocation( metadata, false );
123        assertEquals( "org/apache/maven/plugins/maven-metadata.xml", uri.toString() );
124        uri = layout.getLocation( metadata, true );
125        assertEquals( "org/apache/maven/plugins/maven-metadata.xml", uri.toString() );
126    }
127
128    @Test
129    public void testMetadataLocation_ArtifactLevel()
130    {
131        DefaultMetadata metadata =
132            new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "maven-metadata.xml",
133                                 Metadata.Nature.RELEASE_OR_SNAPSHOT );
134        URI uri = layout.getLocation( metadata, false );
135        assertEquals( "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml", uri.toString() );
136        uri = layout.getLocation( metadata, true );
137        assertEquals( "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml", uri.toString() );
138    }
139
140    @Test
141    public void testMetadataLocation_VersionLevel()
142    {
143        DefaultMetadata metadata =
144            new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "1.0-SNAPSHOT", "maven-metadata.xml",
145                                 Metadata.Nature.RELEASE_OR_SNAPSHOT );
146        URI uri = layout.getLocation( metadata, false );
147        assertEquals( "org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString() );
148        uri = layout.getLocation( metadata, true );
149        assertEquals( "org/apache/maven/plugins/maven-jar-plugin/1.0-SNAPSHOT/maven-metadata.xml", uri.toString() );
150    }
151
152    @Test
153    public void testArtifactChecksums_Download()
154    {
155        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
156        URI uri = layout.getLocation( artifact, false );
157        List<Checksum> checksums = layout.getChecksums( artifact, false, uri );
158        assertEquals( 2, checksums.size() );
159        assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", "SHA-1" );
160        assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", "MD5" );
161    }
162
163    @Test
164    public void testArtifactChecksums_DownloadWithCustomAlgorithms() throws NoRepositoryLayoutException
165    {
166        session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-256,SHA-1");
167        layout = factory.newInstance( session, newRepo( "default" ) );
168        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
169        URI uri = layout.getLocation( artifact, false );
170        List<Checksum> checksums = layout.getChecksums( artifact, false, uri );
171        assertEquals( 2, checksums.size() );
172        assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha256", "SHA-256" );
173        assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", "SHA-1" );
174    }
175
176    @Test
177    public void testArtifactChecksums_Upload()
178    {
179        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
180        URI uri = layout.getLocation( artifact, true );
181        List<Checksum> checksums = layout.getChecksums( artifact, true, uri );
182        assertEquals( 2, checksums.size() );
183        assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha1", "SHA-1" );
184        assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", "MD5" );
185    }
186
187    @Test
188    public void testArtifactChecksums_UploadWithCustomAlgorithms() throws NoRepositoryLayoutException
189    {
190        session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_CHECKSUMS_ALGORITHMS, "SHA-512,MD5" );
191        layout = factory.newInstance( session, newRepo( "default" ) );
192        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "ext", "1.0" );
193        URI uri = layout.getLocation( artifact, true );
194        List<Checksum> checksums = layout.getChecksums( artifact, true, uri );
195        assertEquals( 2, checksums.size() );
196        assertChecksum( checksums.get( 0 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.sha512", "SHA-512" );
197        assertChecksum( checksums.get( 1 ), "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.ext.md5", "MD5" );
198    }
199
200    @Test
201    public void testMetadataChecksums_Download()
202    {
203        DefaultMetadata metadata =
204            new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "maven-metadata.xml",
205                                 Metadata.Nature.RELEASE_OR_SNAPSHOT );
206        URI uri = layout.getLocation( metadata, false );
207        List<Checksum> checksums = layout.getChecksums( metadata, false, uri );
208        assertEquals( 2, checksums.size() );
209        assertChecksum( checksums.get( 0 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1",
210                        "SHA-1" );
211        assertChecksum( checksums.get( 1 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", "MD5" );
212    }
213
214    @Test
215    public void testMetadataChecksums_Upload()
216    {
217        DefaultMetadata metadata =
218            new DefaultMetadata( "org.apache.maven.plugins", "maven-jar-plugin", "maven-metadata.xml",
219                                 Metadata.Nature.RELEASE_OR_SNAPSHOT );
220        URI uri = layout.getLocation( metadata, true );
221        List<Checksum> checksums = layout.getChecksums( metadata, true, uri );
222        assertEquals( 2, checksums.size() );
223        assertChecksum( checksums.get( 0 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.sha1",
224                        "SHA-1" );
225        assertChecksum( checksums.get( 1 ), "org/apache/maven/plugins/maven-jar-plugin/maven-metadata.xml.md5", "MD5" );
226    }
227
228    @Test
229    public void testSignatureChecksums_Download()
230    {
231        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "asc", "1.0" );
232        URI uri = layout.getLocation( artifact, false );
233        List<Checksum> checksums = layout.getChecksums( artifact, false, uri );
234        assertChecksums( checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", "SHA-1", "MD5" );
235
236        artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.asc", "1.0" );
237        uri = layout.getLocation( artifact, false );
238        checksums = layout.getChecksums( artifact, false, uri );
239        assertEquals( 0, checksums.size() );
240    }
241
242    @Test
243    public void testSignatureChecksums_Upload()
244    {
245        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "asc", "1.0" );
246        URI uri = layout.getLocation( artifact, true );
247        List<Checksum> checksums = layout.getChecksums( artifact, true, uri );
248        assertChecksums( checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.asc", "SHA-1", "MD5" );
249
250        artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.asc", "1.0" );
251        uri = layout.getLocation( artifact, true );
252        checksums = layout.getChecksums( artifact, true, uri );
253        assertEquals( 0, checksums.size() );
254    }
255
256    @Test
257    public void testSignatureChecksums_Force()
258        throws Exception
259    {
260        session.setConfigProperty( Maven2RepositoryLayoutFactory.CONFIG_PROP_SIGNATURE_CHECKSUMS, "true" );
261        layout = factory.newInstance( session, newRepo( "default" ) );
262        DefaultArtifact artifact = new DefaultArtifact( "g.i.d", "a-i.d", "cls", "jar.asc", "1.0" );
263        URI uri = layout.getLocation( artifact, true );
264        List<Checksum> checksums = layout.getChecksums( artifact, true, uri );
265        assertChecksums( checksums, "g/i/d/a-i.d/1.0/a-i.d-1.0-cls.jar.asc", "SHA-1", "MD5" );
266    }
267
268}