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.io.File;
025import java.io.IOException;
026import java.net.URI;
027import java.util.Arrays;
028import java.util.Collection;
029import java.util.Collections;
030
031import org.eclipse.aether.DefaultRepositorySystemSession;
032import org.eclipse.aether.artifact.Artifact;
033import org.eclipse.aether.artifact.DefaultArtifact;
034import org.eclipse.aether.internal.test.util.TestFileUtils;
035import org.eclipse.aether.internal.test.util.TestUtils;
036import org.eclipse.aether.metadata.DefaultMetadata;
037import org.eclipse.aether.metadata.Metadata;
038import org.eclipse.aether.metadata.Metadata.Nature;
039import org.eclipse.aether.repository.LocalArtifactRegistration;
040import org.eclipse.aether.repository.LocalArtifactRequest;
041import org.eclipse.aether.repository.LocalArtifactResult;
042import org.eclipse.aether.repository.LocalMetadataRequest;
043import org.eclipse.aether.repository.LocalMetadataResult;
044import org.eclipse.aether.repository.RemoteRepository;
045import org.junit.After;
046import org.junit.Before;
047import org.junit.Test;
048
049public class EnhancedLocalRepositoryManagerTest
050{
051
052    private Artifact artifact;
053
054    private Artifact snapshot;
055
056    protected File basedir;
057
058    protected EnhancedLocalRepositoryManager manager;
059
060    private File artifactFile;
061
062    private RemoteRepository repository;
063
064    private String testContext = "project/compile";
065
066    protected TrackingFileManager trackingFileManager;
067
068    protected DefaultRepositorySystemSession session;
069
070    private Metadata metadata;
071
072    private Metadata noVerMetadata;
073
074    @Before
075    public void setup()
076        throws Exception
077    {
078        String url = TestFileUtils.createTempDir( "enhanced-remote-repo" ).toURI().toURL().toString();
079        repository =
080            new RemoteRepository.Builder( "enhanced-remote-repo", "default", url ).setRepositoryManager( true ).build();
081
082        artifact =
083            new DefaultArtifact( "gid", "aid", "", "jar", "1-test", Collections.<String, String> emptyMap(),
084                                 TestFileUtils.createTempFile( "artifact" ) );
085
086        snapshot =
087            new DefaultArtifact( "gid", "aid", "", "jar", "1.0-20120710.231549-9",
088                                 Collections.<String, String> emptyMap(), TestFileUtils.createTempFile( "artifact" ) );
089
090        metadata =
091            new DefaultMetadata( "gid", "aid", "1-test", "maven-metadata.xml", Nature.RELEASE,
092                                 TestFileUtils.createTempFile( "metadata" ) );
093
094        noVerMetadata =
095            new DefaultMetadata( "gid", "aid", null, "maven-metadata.xml", Nature.RELEASE,
096                                 TestFileUtils.createTempFile( "metadata" ) );
097
098        basedir = TestFileUtils.createTempDir( "enhanced-repo" );
099        session = TestUtils.newSession();
100        trackingFileManager = new DefaultTrackingFileManager();
101        manager = getManager();
102
103        artifactFile = new File( basedir, manager.getPathForLocalArtifact( artifact ) );
104    }
105
106    protected EnhancedLocalRepositoryManager getManager()
107    {
108        return new EnhancedLocalRepositoryManager(
109                basedir,
110                new DefaultLocalPathComposer(),
111                "_remote.repositories",
112                trackingFileManager,
113                new DefaultLocalPathPrefixComposerFactory().createComposer( session )
114        );
115    }
116
117    @After
118    public void tearDown()
119        throws Exception
120    {
121        TestFileUtils.deleteFile( basedir );
122        TestFileUtils.deleteFile( new File( new URI( repository.getUrl() ) ) );
123
124        session = null;
125        manager = null;
126        repository = null;
127        artifact = null;
128    }
129
130    private long addLocalArtifact( Artifact artifact )
131        throws IOException
132    {
133        manager.add( session, new LocalArtifactRegistration( artifact ) );
134        String path = manager.getPathForLocalArtifact( artifact );
135
136        return copy( artifact, path );
137    }
138
139    private long addRemoteArtifact( Artifact artifact )
140        throws IOException
141    {
142        Collection<String> contexts = Arrays.asList( testContext );
143        manager.add( session, new LocalArtifactRegistration( artifact, repository, contexts ) );
144        String path = manager.getPathForRemoteArtifact( artifact, repository, testContext );
145        return copy( artifact, path );
146    }
147
148    private long copy( Metadata metadata, String path )
149        throws IOException
150    {
151        if ( metadata.getFile() == null )
152        {
153            return -1L;
154        }
155        return TestFileUtils.copyFile( metadata.getFile(), new File( basedir, path ) );
156    }
157
158    private long copy( Artifact artifact, String path )
159        throws IOException
160    {
161        if ( artifact.getFile() == null )
162        {
163            return -1L;
164        }
165        File artifactFile = new File( basedir, path );
166        return TestFileUtils.copyFile( artifact.getFile(), artifactFile );
167    }
168
169    @Test
170    public void testGetPathForLocalArtifact()
171    {
172        Artifact artifact = new DefaultArtifact( "g.i.d:a.i.d:1.0-SNAPSHOT" );
173        assertEquals( "1.0-SNAPSHOT", artifact.getBaseVersion() );
174        assertEquals( "g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar", manager.getPathForLocalArtifact( artifact ) );
175
176        artifact = new DefaultArtifact( "g.i.d:a.i.d:1.0-20110329.221805-4" );
177        assertEquals( "1.0-SNAPSHOT", artifact.getBaseVersion() );
178        assertEquals( "g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar", manager.getPathForLocalArtifact( artifact ) );
179    }
180
181    @Test
182    public void testGetPathForRemoteArtifact()
183    {
184        RemoteRepository remoteRepo = new RemoteRepository.Builder( "repo", "default", "ram:/void" ).build();
185
186        Artifact artifact = new DefaultArtifact( "g.i.d:a.i.d:1.0-SNAPSHOT" );
187        assertEquals( "1.0-SNAPSHOT", artifact.getBaseVersion() );
188        assertEquals( "g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-SNAPSHOT.jar",
189                      manager.getPathForRemoteArtifact( artifact, remoteRepo, "" ) );
190
191        artifact = new DefaultArtifact( "g.i.d:a.i.d:1.0-20110329.221805-4" );
192        assertEquals( "1.0-SNAPSHOT", artifact.getBaseVersion() );
193        assertEquals( "g/i/d/a.i.d/1.0-SNAPSHOT/a.i.d-1.0-20110329.221805-4.jar",
194                      manager.getPathForRemoteArtifact( artifact, remoteRepo, "" ) );
195    }
196
197    @Test
198    public void testFindLocalArtifact()
199        throws Exception
200    {
201        addLocalArtifact( artifact );
202
203        LocalArtifactRequest request = new LocalArtifactRequest( artifact, null, null );
204        LocalArtifactResult result = manager.find( session, request );
205        assertTrue( result.isAvailable() );
206        assertNull( result.getRepository() );
207
208        snapshot = snapshot.setVersion( snapshot.getBaseVersion() );
209        addLocalArtifact( snapshot );
210
211        request = new LocalArtifactRequest( snapshot, null, null );
212        result = manager.find( session, request );
213        assertTrue( result.isAvailable() );
214        assertNull( result.getRepository() );
215    }
216
217    @Test
218    public void testFindRemoteArtifact()
219        throws Exception
220    {
221        addRemoteArtifact( artifact );
222
223        LocalArtifactRequest request = new LocalArtifactRequest( artifact, Arrays.asList( repository ), testContext );
224        LocalArtifactResult result = manager.find( session, request );
225        assertTrue( result.isAvailable() );
226        assertEquals( repository, result.getRepository() );
227
228        addRemoteArtifact( snapshot );
229
230        request = new LocalArtifactRequest( snapshot, Arrays.asList( repository ), testContext );
231        result = manager.find( session, request );
232        assertTrue( result.isAvailable() );
233        assertEquals( repository, result.getRepository() );
234    }
235
236    @Test
237    public void testDoNotFindDifferentContext()
238        throws Exception
239    {
240        addRemoteArtifact( artifact );
241
242        LocalArtifactRequest request = new LocalArtifactRequest( artifact, Arrays.asList( repository ), "different" );
243        LocalArtifactResult result = manager.find( session, request );
244        assertFalse( result.isAvailable() );
245    }
246
247    @Test
248    public void testDoNotFindNullFile()
249        throws Exception
250    {
251        artifact = artifact.setFile( null );
252        addLocalArtifact( artifact );
253
254        LocalArtifactRequest request = new LocalArtifactRequest( artifact, Arrays.asList( repository ), testContext );
255        LocalArtifactResult result = manager.find( session, request );
256        assertFalse( result.isAvailable() );
257    }
258
259    @Test
260    public void testDoNotFindDeletedFile()
261        throws Exception
262    {
263        addLocalArtifact( artifact );
264        assertTrue( "could not delete artifact file", artifactFile.delete() );
265
266        LocalArtifactRequest request = new LocalArtifactRequest( artifact, Arrays.asList( repository ), testContext );
267        LocalArtifactResult result = manager.find( session, request );
268        assertFalse( result.isAvailable() );
269    }
270
271    @Test
272    public void testFindUntrackedFile()
273        throws Exception
274    {
275        copy( artifact, manager.getPathForLocalArtifact( artifact ) );
276
277        LocalArtifactRequest request = new LocalArtifactRequest( artifact, Arrays.asList( repository ), testContext );
278        LocalArtifactResult result = manager.find( session, request );
279        assertTrue( result.isAvailable() );
280    }
281
282    private long addMetadata( Metadata metadata, RemoteRepository repo )
283        throws IOException
284    {
285        String path;
286        if ( repo == null )
287        {
288            path = manager.getPathForLocalMetadata( metadata );
289        }
290        else
291        {
292            path = manager.getPathForRemoteMetadata( metadata, repo, testContext );
293        }
294        System.err.println( path );
295
296        return copy( metadata, path );
297    }
298
299    @Test
300    public void testFindLocalMetadata()
301        throws Exception
302    {
303        addMetadata( metadata, null );
304
305        LocalMetadataRequest request = new LocalMetadataRequest( metadata, null, testContext );
306        LocalMetadataResult result = manager.find( session, request );
307
308        assertNotNull( result.getFile() );
309    }
310
311    @Test
312    public void testFindLocalMetadataNoVersion()
313        throws Exception
314    {
315        addMetadata( noVerMetadata, null );
316
317        LocalMetadataRequest request = new LocalMetadataRequest( noVerMetadata, null, testContext );
318        LocalMetadataResult result = manager.find( session, request );
319
320        assertNotNull( result.getFile() );
321    }
322
323    @Test
324    public void testDoNotFindRemoteMetadataDifferentContext()
325        throws Exception
326    {
327        addMetadata( noVerMetadata, repository );
328        addMetadata( metadata, repository );
329
330        LocalMetadataRequest request = new LocalMetadataRequest( noVerMetadata, repository, "different" );
331        LocalMetadataResult result = manager.find( session, request );
332        assertNull( result.getFile() );
333
334        request = new LocalMetadataRequest( metadata, repository, "different" );
335        result = manager.find( session, request );
336        assertNull( result.getFile() );
337    }
338
339    @Test
340    public void testFindArtifactUsesTimestampedVersion()
341        throws Exception
342    {
343        Artifact artifact = new DefaultArtifact( "g.i.d:a.i.d:1.0-SNAPSHOT" );
344        File file = new File( basedir, manager.getPathForLocalArtifact( artifact ) );
345        TestFileUtils.writeString( file, "test" );
346        addLocalArtifact( artifact );
347
348        artifact = artifact.setVersion( "1.0-20110329.221805-4" );
349        LocalArtifactRequest request = new LocalArtifactRequest();
350        request.setArtifact( artifact );
351        LocalArtifactResult result = manager.find( session, request );
352        assertNull( result.toString(), result.getFile() );
353        assertFalse( result.toString(), result.isAvailable() );
354    }
355
356}