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