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.util.Arrays;
027import java.util.Collection;
028import java.util.Collections;
029import java.util.HashMap;
030import java.util.List;
031import java.util.Map;
032
033import org.eclipse.aether.DefaultRepositorySystemSession;
034import org.eclipse.aether.RepositoryEvent;
035import org.eclipse.aether.RepositorySystemSession;
036import org.eclipse.aether.RepositoryEvent.EventType;
037import org.eclipse.aether.artifact.Artifact;
038import org.eclipse.aether.artifact.ArtifactProperties;
039import org.eclipse.aether.artifact.DefaultArtifact;
040import org.eclipse.aether.impl.UpdateCheckManager;
041import org.eclipse.aether.impl.VersionResolver;
042import org.eclipse.aether.internal.impl.filter.DefaultRemoteRepositoryFilterManager;
043import org.eclipse.aether.internal.impl.filter.Filters;
044import org.eclipse.aether.internal.test.util.TestFileProcessor;
045import org.eclipse.aether.internal.test.util.TestFileUtils;
046import org.eclipse.aether.internal.test.util.TestLocalRepositoryManager;
047import org.eclipse.aether.internal.test.util.TestUtils;
048import org.eclipse.aether.metadata.Metadata;
049import org.eclipse.aether.repository.LocalArtifactRegistration;
050import org.eclipse.aether.repository.LocalArtifactRequest;
051import org.eclipse.aether.repository.LocalArtifactResult;
052import org.eclipse.aether.repository.LocalMetadataRegistration;
053import org.eclipse.aether.repository.LocalMetadataRequest;
054import org.eclipse.aether.repository.LocalMetadataResult;
055import org.eclipse.aether.repository.LocalRepository;
056import org.eclipse.aether.repository.LocalRepositoryManager;
057import org.eclipse.aether.repository.RemoteRepository;
058import org.eclipse.aether.repository.RepositoryPolicy;
059import org.eclipse.aether.repository.WorkspaceReader;
060import org.eclipse.aether.repository.WorkspaceRepository;
061import org.eclipse.aether.resolution.ArtifactRequest;
062import org.eclipse.aether.resolution.ArtifactResolutionException;
063import org.eclipse.aether.resolution.ArtifactResult;
064import org.eclipse.aether.resolution.VersionRequest;
065import org.eclipse.aether.resolution.VersionResolutionException;
066import org.eclipse.aether.resolution.VersionResult;
067import org.eclipse.aether.spi.connector.ArtifactDownload;
068import org.eclipse.aether.spi.connector.MetadataDownload;
069import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilterSource;
070import org.eclipse.aether.transfer.ArtifactNotFoundException;
071import org.eclipse.aether.transfer.ArtifactTransferException;
072import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy;
073import org.junit.After;
074import org.junit.Before;
075import org.junit.Test;
076
077/**
078 */
079public class DefaultArtifactResolverTest
080{
081    private DefaultArtifactResolver resolver;
082
083    private DefaultRepositorySystemSession session;
084
085    private TestLocalRepositoryManager lrm;
086
087    private StubRepositoryConnectorProvider repositoryConnectorProvider;
088
089    private Artifact artifact;
090
091    private RecordingRepositoryConnector connector;
092
093    private HashMap<String, RemoteRepositoryFilterSource> remoteRepositoryFilterSources;
094
095    private DefaultRemoteRepositoryFilterManager remoteRepositoryFilterManager;
096
097    @Before
098    public void setup()
099    {
100        remoteRepositoryFilterSources = new HashMap<>();
101        remoteRepositoryFilterManager = new DefaultRemoteRepositoryFilterManager( remoteRepositoryFilterSources );
102
103        UpdateCheckManager updateCheckManager = new StaticUpdateCheckManager( true );
104        repositoryConnectorProvider = new StubRepositoryConnectorProvider();
105        VersionResolver versionResolver = new StubVersionResolver();
106        session = TestUtils.newSession();
107        lrm = (TestLocalRepositoryManager) session.getLocalRepositoryManager();
108        resolver = new DefaultArtifactResolver();
109        resolver.setFileProcessor( new TestFileProcessor() );
110        resolver.setRepositoryEventDispatcher( new StubRepositoryEventDispatcher() );
111        resolver.setVersionResolver( versionResolver );
112        resolver.setUpdateCheckManager( updateCheckManager );
113        resolver.setRepositoryConnectorProvider( repositoryConnectorProvider );
114        resolver.setRemoteRepositoryManager( new StubRemoteRepositoryManager() );
115        resolver.setSyncContextFactory( new StubSyncContextFactory() );
116        resolver.setOfflineController( new DefaultOfflineController() );
117        resolver.setArtifactResolverPostProcessors( Collections.emptyMap() );
118        resolver.setRemoteRepositoryFilterManager( remoteRepositoryFilterManager );
119
120        artifact = new DefaultArtifact( "gid", "aid", "", "ext", "ver" );
121
122        connector = new RecordingRepositoryConnector();
123        repositoryConnectorProvider.setConnector( connector );
124    }
125
126    @After
127    public void teardown()
128        throws Exception
129    {
130        if ( session.getLocalRepository() != null )
131        {
132            TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
133        }
134    }
135
136    @Test
137    public void testResolveLocalArtifactSuccessful()
138        throws IOException, ArtifactResolutionException
139    {
140        File tmpFile = TestFileUtils.createTempFile( "tmp" );
141        Map<String, String> properties = new HashMap<>();
142        properties.put( ArtifactProperties.LOCAL_PATH, tmpFile.getAbsolutePath() );
143        artifact = artifact.setProperties( properties );
144
145        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
146        ArtifactResult result = resolver.resolveArtifact( session, request );
147
148        assertTrue( result.getExceptions().isEmpty() );
149
150        Artifact resolved = result.getArtifact();
151        assertNotNull( resolved.getFile() );
152        resolved = resolved.setFile( null );
153
154        assertEquals( artifact, resolved );
155    }
156
157    @Test
158    public void testResolveLocalArtifactUnsuccessful()
159        throws IOException
160    {
161        File tmpFile = TestFileUtils.createTempFile( "tmp" );
162        Map<String, String> properties = new HashMap<>();
163        properties.put( ArtifactProperties.LOCAL_PATH, tmpFile.getAbsolutePath() );
164        artifact = artifact.setProperties( properties );
165
166        tmpFile.delete();
167
168        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
169
170        try
171        {
172            resolver.resolveArtifact( session, request );
173            fail( "expected exception" );
174        }
175        catch ( ArtifactResolutionException e )
176        {
177            assertNotNull( e.getResults() );
178            assertEquals( 1, e.getResults().size() );
179
180            ArtifactResult result = e.getResults().get( 0 );
181
182            assertSame( request, result.getRequest() );
183
184            assertFalse( result.getExceptions().isEmpty() );
185            assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactNotFoundException );
186
187            Artifact resolved = result.getArtifact();
188            assertNull( resolved );
189        }
190
191    }
192
193    @Test
194    public void testResolveRemoteArtifact()
195        throws ArtifactResolutionException
196    {
197        connector.setExpectGet( artifact );
198
199        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
200        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
201
202        ArtifactResult result = resolver.resolveArtifact( session, request );
203
204        assertTrue( result.getExceptions().isEmpty() );
205
206        Artifact resolved = result.getArtifact();
207        assertNotNull( resolved.getFile() );
208
209        resolved = resolved.setFile( null );
210        assertEquals( artifact, resolved );
211
212        connector.assertSeenExpected();
213    }
214
215    @Test
216    public void testResolveRemoteArtifactUnsuccessful()
217    {
218        RecordingRepositoryConnector connector = new RecordingRepositoryConnector()
219        {
220
221            @Override
222            public void get( Collection<? extends ArtifactDownload> artifactDownloads,
223                             Collection<? extends MetadataDownload> metadataDownloads )
224            {
225                super.get( artifactDownloads, metadataDownloads );
226                ArtifactDownload download = artifactDownloads.iterator().next();
227                ArtifactTransferException exception =
228                    new ArtifactNotFoundException( download.getArtifact(), null, "not found" );
229                download.setException( exception );
230            }
231
232        };
233
234        connector.setExpectGet( artifact );
235        repositoryConnectorProvider.setConnector( connector );
236
237        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
238        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
239
240        try
241        {
242            resolver.resolveArtifact( session, request );
243            fail( "expected exception" );
244        }
245        catch ( ArtifactResolutionException e )
246        {
247            connector.assertSeenExpected();
248            assertNotNull( e.getResults() );
249            assertEquals( 1, e.getResults().size() );
250
251            ArtifactResult result = e.getResults().get( 0 );
252
253            assertSame( request, result.getRequest() );
254
255            assertFalse( result.getExceptions().isEmpty() );
256            assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactNotFoundException );
257
258            Artifact resolved = result.getArtifact();
259            assertNull( resolved );
260        }
261
262    }
263
264    @Test
265    public void testResolveRemoteArtifactAlwaysAcceptFilter()
266            throws ArtifactResolutionException
267    {
268        remoteRepositoryFilterSources.put( "filter1", Filters.neverAcceptFrom("invalid repo id") );
269        remoteRepositoryFilterSources.put( "filter2", Filters.alwaysAccept() );
270        connector.setExpectGet( artifact );
271
272        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
273        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
274
275        ArtifactResult result = resolver.resolveArtifact( session, request );
276
277        assertTrue( result.getExceptions().isEmpty() );
278
279        Artifact resolved = result.getArtifact();
280        assertNotNull( resolved.getFile() );
281
282        resolved = resolved.setFile( null );
283        assertEquals( artifact, resolved );
284
285        connector.assertSeenExpected();
286    }
287
288    @Test
289    public void testResolveRemoteArtifactNeverAcceptFilter()
290    {
291        remoteRepositoryFilterSources.put( "filter1", Filters.neverAcceptFrom("invalid repo id") );
292        remoteRepositoryFilterSources.put( "filter2", Filters.neverAccept() );
293        //connector.setExpectGet( artifact ); // should not see it
294
295        ArtifactRequest request = new ArtifactRequest( artifact, null, "project" );
296        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
297
298        try
299        {
300            resolver.resolveArtifact( session, request );
301            fail( "expected exception" );
302        }
303        catch ( ArtifactResolutionException e )
304        {
305            connector.assertSeenExpected();
306            assertNotNull( e.getResults() );
307            assertEquals( 1, e.getResults().size() );
308
309            ArtifactResult result = e.getResults().get( 0 );
310
311            assertSame( request, result.getRequest() );
312
313            assertFalse( result.getExceptions().isEmpty() );
314            assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactNotFoundException );
315            assertEquals( "never-accept", result.getExceptions().get( 0 ).getMessage() );
316
317            Artifact resolved = result.getArtifact();
318            assertNull( resolved );
319        }
320    }
321
322
323    @Test
324    public void testResolveRemoteArtifactAlwaysAcceptFromRepoFilter()
325            throws ArtifactResolutionException
326    {
327        remoteRepositoryFilterSources.put( "filter1", Filters.alwaysAcceptFrom( "id" ) );
328        connector.setExpectGet( artifact );
329
330        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
331        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
332
333        ArtifactResult result = resolver.resolveArtifact( session, request );
334
335        assertTrue( result.getExceptions().isEmpty() );
336
337        Artifact resolved = result.getArtifact();
338        assertNotNull( resolved.getFile() );
339
340        resolved = resolved.setFile( null );
341        assertEquals( artifact, resolved );
342
343        connector.assertSeenExpected();
344    }
345
346    @Test
347    public void testResolveRemoteArtifactNeverAcceptFilterFromRepo()
348    {
349        remoteRepositoryFilterSources.put( "filter1", Filters.neverAcceptFrom( "id" ) );
350        //connector.setExpectGet( artifact ); // should not see it
351
352        ArtifactRequest request = new ArtifactRequest( artifact, null, "project" );
353        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
354
355        try
356        {
357            resolver.resolveArtifact( session, request );
358            fail( "expected exception" );
359        }
360        catch ( ArtifactResolutionException e )
361        {
362            connector.assertSeenExpected();
363            assertNotNull( e.getResults() );
364            assertEquals( 1, e.getResults().size() );
365
366            ArtifactResult result = e.getResults().get( 0 );
367
368            assertSame( request, result.getRequest() );
369
370            assertFalse( result.getExceptions().isEmpty() );
371            assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactNotFoundException );
372            assertEquals( "never-accept-id", result.getExceptions().get( 0 ).getMessage() );
373
374            Artifact resolved = result.getArtifact();
375            assertNull( resolved );
376        }
377    }
378
379    @Test
380    public void testArtifactNotFoundCache()
381        throws Exception
382    {
383        RecordingRepositoryConnector connector = new RecordingRepositoryConnector()
384        {
385            @Override
386            public void get( Collection<? extends ArtifactDownload> artifactDownloads,
387                             Collection<? extends MetadataDownload> metadataDownloads )
388            {
389                super.get( artifactDownloads, metadataDownloads );
390                for ( ArtifactDownload download : artifactDownloads )
391                {
392                    download.getFile().delete();
393                    ArtifactTransferException exception =
394                        new ArtifactNotFoundException( download.getArtifact(), null, "not found" );
395                    download.setException( exception );
396                }
397            }
398        };
399
400        repositoryConnectorProvider.setConnector( connector );
401        resolver.setUpdateCheckManager( new DefaultUpdateCheckManager()
402            .setUpdatePolicyAnalyzer( new DefaultUpdatePolicyAnalyzer() )
403            .setTrackingFileManager( new DefaultTrackingFileManager() )
404        );
405
406        session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) );
407        session.setUpdatePolicy( RepositoryPolicy.UPDATE_POLICY_NEVER );
408
409        RemoteRepository remoteRepo = new RemoteRepository.Builder( "id", "default", "file:///" ).build();
410
411        Artifact artifact1 = artifact;
412        Artifact artifact2 = artifact.setVersion( "ver2" );
413
414        ArtifactRequest request1 = new ArtifactRequest( artifact1, Arrays.asList( remoteRepo ), "" );
415        ArtifactRequest request2 = new ArtifactRequest( artifact2, Arrays.asList( remoteRepo ), "" );
416
417        connector.setExpectGet( artifact1, artifact2 );
418        try
419        {
420            resolver.resolveArtifacts( session, Arrays.asList( request1, request2 ) );
421            fail( "expected exception" );
422        }
423        catch ( ArtifactResolutionException e )
424        {
425            connector.assertSeenExpected();
426        }
427
428        TestFileUtils.writeString( new File( lrm.getRepository().getBasedir(), lrm.getPathForLocalArtifact( artifact2 ) ),
429                             "artifact" );
430        lrm.setArtifactAvailability( artifact2, false );
431
432        DefaultUpdateCheckManagerTest.resetSessionData( session );
433        connector.resetActual();
434        connector.setExpectGet( new Artifact[0] );
435        try
436        {
437            resolver.resolveArtifacts( session, Arrays.asList( request1, request2 ) );
438            fail( "expected exception" );
439        }
440        catch ( ArtifactResolutionException e )
441        {
442            connector.assertSeenExpected();
443            for ( ArtifactResult result : e.getResults() )
444            {
445                Throwable t = result.getExceptions().get( 0 );
446                assertTrue( t.toString(), t instanceof ArtifactNotFoundException );
447                assertTrue( t.toString(), t.getMessage().contains( "cached" ) );
448            }
449        }
450    }
451
452    @Test
453    public void testResolveFromWorkspace()
454        throws IOException, ArtifactResolutionException
455    {
456        WorkspaceReader workspace = new WorkspaceReader()
457        {
458
459            public WorkspaceRepository getRepository()
460            {
461                return new WorkspaceRepository( "default" );
462            }
463
464            public List<String> findVersions( Artifact artifact )
465            {
466                return Arrays.asList( artifact.getVersion() );
467            }
468
469            public File findArtifact( Artifact artifact )
470            {
471                try
472                {
473                    return TestFileUtils.createTempFile( artifact.toString() );
474                }
475                catch ( IOException e )
476                {
477                    throw new RuntimeException( e.getMessage(), e );
478                }
479            }
480        };
481        session.setWorkspaceReader( workspace );
482
483        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
484        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
485
486        ArtifactResult result = resolver.resolveArtifact( session, request );
487
488        assertTrue( result.getExceptions().isEmpty() );
489
490        Artifact resolved = result.getArtifact();
491        assertNotNull( resolved.getFile() );
492
493        assertEquals( resolved.toString(), TestFileUtils.readString( resolved.getFile() ) );
494
495        resolved = resolved.setFile( null );
496        assertEquals( artifact, resolved );
497
498        connector.assertSeenExpected();
499    }
500
501    @Test
502    public void testResolveFromWorkspaceFallbackToRepository()
503        throws ArtifactResolutionException
504    {
505        WorkspaceReader workspace = new WorkspaceReader()
506        {
507
508            public WorkspaceRepository getRepository()
509            {
510                return new WorkspaceRepository( "default" );
511            }
512
513            public List<String> findVersions( Artifact artifact )
514            {
515                return Arrays.asList( artifact.getVersion() );
516            }
517
518            public File findArtifact( Artifact artifact )
519            {
520                return null;
521            }
522        };
523        session.setWorkspaceReader( workspace );
524
525        connector.setExpectGet( artifact );
526        repositoryConnectorProvider.setConnector( connector );
527
528        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
529        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
530
531        ArtifactResult result = resolver.resolveArtifact( session, request );
532
533        assertTrue( "exception on resolveArtifact", result.getExceptions().isEmpty() );
534
535        Artifact resolved = result.getArtifact();
536        assertNotNull( resolved.getFile() );
537
538        resolved = resolved.setFile( null );
539        assertEquals( artifact, resolved );
540
541        connector.assertSeenExpected();
542    }
543
544    @Test
545    public void testRepositoryEventsSuccessfulLocal()
546        throws ArtifactResolutionException, IOException
547    {
548        RecordingRepositoryListener listener = new RecordingRepositoryListener();
549        session.setRepositoryListener( listener );
550
551        File tmpFile = TestFileUtils.createTempFile( "tmp" );
552        Map<String, String> properties = new HashMap<>();
553        properties.put( ArtifactProperties.LOCAL_PATH, tmpFile.getAbsolutePath() );
554        artifact = artifact.setProperties( properties );
555
556        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
557        resolver.resolveArtifact( session, request );
558
559        List<RepositoryEvent> events = listener.getEvents();
560        assertEquals( 2, events.size() );
561        RepositoryEvent event = events.get( 0 );
562        assertEquals( EventType.ARTIFACT_RESOLVING, event.getType() );
563        assertNull( event.getException() );
564        assertEquals( artifact, event.getArtifact() );
565
566        event = events.get( 1 );
567        assertEquals( EventType.ARTIFACT_RESOLVED, event.getType() );
568        assertNull( event.getException() );
569        assertEquals( artifact, event.getArtifact().setFile( null ) );
570    }
571
572    @Test
573    public void testRepositoryEventsUnsuccessfulLocal()
574    {
575        RecordingRepositoryListener listener = new RecordingRepositoryListener();
576        session.setRepositoryListener( listener );
577
578        Map<String, String> properties = new HashMap<>();
579        properties.put( ArtifactProperties.LOCAL_PATH, "doesnotexist" );
580        artifact = artifact.setProperties( properties );
581
582        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
583        try
584        {
585            resolver.resolveArtifact( session, request );
586            fail( "expected exception" );
587        }
588        catch ( ArtifactResolutionException ignored )
589        {
590        }
591
592        List<RepositoryEvent> events = listener.getEvents();
593        assertEquals( 2, events.size() );
594
595        RepositoryEvent event = events.get( 0 );
596        assertEquals( artifact, event.getArtifact() );
597        assertEquals( EventType.ARTIFACT_RESOLVING, event.getType() );
598
599        event = events.get( 1 );
600        assertEquals( artifact, event.getArtifact() );
601        assertEquals( EventType.ARTIFACT_RESOLVED, event.getType() );
602        assertNotNull( event.getException() );
603        assertEquals( 1, event.getExceptions().size() );
604
605    }
606
607    @Test
608    public void testRepositoryEventsSuccessfulRemote()
609        throws ArtifactResolutionException
610    {
611        RecordingRepositoryListener listener = new RecordingRepositoryListener();
612        session.setRepositoryListener( listener );
613
614        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
615        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
616
617        resolver.resolveArtifact( session, request );
618
619        List<RepositoryEvent> events = listener.getEvents();
620        assertEquals( events.toString(), 4, events.size() );
621        RepositoryEvent event = events.get( 0 );
622        assertEquals( EventType.ARTIFACT_RESOLVING, event.getType() );
623        assertNull( event.getException() );
624        assertEquals( artifact, event.getArtifact() );
625
626        event = events.get( 1 );
627        assertEquals( EventType.ARTIFACT_DOWNLOADING, event.getType() );
628        assertNull( event.getException() );
629        assertEquals( artifact, event.getArtifact().setFile( null ) );
630
631        event = events.get( 2 );
632        assertEquals( EventType.ARTIFACT_DOWNLOADED, event.getType() );
633        assertNull( event.getException() );
634        assertEquals( artifact, event.getArtifact().setFile( null ) );
635
636        event = events.get( 3 );
637        assertEquals( EventType.ARTIFACT_RESOLVED, event.getType() );
638        assertNull( event.getException() );
639        assertEquals( artifact, event.getArtifact().setFile( null ) );
640    }
641
642    @Test
643    public void testRepositoryEventsUnsuccessfulRemote()
644    {
645        RecordingRepositoryConnector connector = new RecordingRepositoryConnector()
646        {
647
648            @Override
649            public void get( Collection<? extends ArtifactDownload> artifactDownloads,
650                             Collection<? extends MetadataDownload> metadataDownloads )
651            {
652                super.get( artifactDownloads, metadataDownloads );
653                ArtifactDownload download = artifactDownloads.iterator().next();
654                ArtifactTransferException exception =
655                    new ArtifactNotFoundException( download.getArtifact(), null, "not found" );
656                download.setException( exception );
657            }
658
659        };
660        repositoryConnectorProvider.setConnector( connector );
661
662        RecordingRepositoryListener listener = new RecordingRepositoryListener();
663        session.setRepositoryListener( listener );
664
665        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
666        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
667
668        try
669        {
670            resolver.resolveArtifact( session, request );
671            fail( "expected exception" );
672        }
673        catch ( ArtifactResolutionException ignored )
674        {
675        }
676
677        List<RepositoryEvent> events = listener.getEvents();
678        assertEquals( events.toString(), 4, events.size() );
679
680        RepositoryEvent event = events.get( 0 );
681        assertEquals( artifact, event.getArtifact() );
682        assertEquals( EventType.ARTIFACT_RESOLVING, event.getType() );
683
684        event = events.get( 1 );
685        assertEquals( artifact, event.getArtifact() );
686        assertEquals( EventType.ARTIFACT_DOWNLOADING, event.getType() );
687
688        event = events.get( 2 );
689        assertEquals( artifact, event.getArtifact() );
690        assertEquals( EventType.ARTIFACT_DOWNLOADED, event.getType() );
691        assertNotNull( event.getException() );
692        assertEquals( 1, event.getExceptions().size() );
693
694        event = events.get( 3 );
695        assertEquals( artifact, event.getArtifact() );
696        assertEquals( EventType.ARTIFACT_RESOLVED, event.getType() );
697        assertNotNull( event.getException() );
698        assertEquals( 1, event.getExceptions().size() );
699    }
700
701    @Test
702    public void testVersionResolverFails()
703    {
704        resolver.setVersionResolver( new VersionResolver()
705        {
706
707            public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
708                throws VersionResolutionException
709            {
710                throw new VersionResolutionException( new VersionResult( request ) );
711            }
712        } );
713
714        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
715        try
716        {
717            resolver.resolveArtifact( session, request );
718            fail( "expected exception" );
719        }
720        catch ( ArtifactResolutionException e )
721        {
722            connector.assertSeenExpected();
723            assertNotNull( e.getResults() );
724            assertEquals( 1, e.getResults().size() );
725
726            ArtifactResult result = e.getResults().get( 0 );
727
728            assertSame( request, result.getRequest() );
729
730            assertFalse( result.getExceptions().isEmpty() );
731            assertTrue( result.getExceptions().get( 0 ) instanceof VersionResolutionException );
732
733            Artifact resolved = result.getArtifact();
734            assertNull( resolved );
735        }
736    }
737
738    @Test
739    public void testRepositoryEventsOnVersionResolverFail()
740    {
741        resolver.setVersionResolver( new VersionResolver()
742        {
743
744            public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
745                throws VersionResolutionException
746            {
747                throw new VersionResolutionException( new VersionResult( request ) );
748            }
749        } );
750
751        RecordingRepositoryListener listener = new RecordingRepositoryListener();
752        session.setRepositoryListener( listener );
753
754        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
755        try
756        {
757            resolver.resolveArtifact( session, request );
758            fail( "expected exception" );
759        }
760        catch ( ArtifactResolutionException ignored )
761        {
762        }
763
764        List<RepositoryEvent> events = listener.getEvents();
765        assertEquals( 2, events.size() );
766
767        RepositoryEvent event = events.get( 0 );
768        assertEquals( artifact, event.getArtifact() );
769        assertEquals( EventType.ARTIFACT_RESOLVING, event.getType() );
770
771        event = events.get( 1 );
772        assertEquals( artifact, event.getArtifact() );
773        assertEquals( EventType.ARTIFACT_RESOLVED, event.getType() );
774        assertNotNull( event.getException() );
775        assertEquals( 1, event.getExceptions().size() );
776    }
777
778    @Test
779    public void testLocalArtifactAvailable()
780        throws ArtifactResolutionException
781    {
782        session.setLocalRepositoryManager( new LocalRepositoryManager()
783        {
784
785            public LocalRepository getRepository()
786            {
787                return null;
788            }
789
790            public String getPathForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context )
791            {
792                return null;
793            }
794
795            public String getPathForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
796            {
797                return null;
798            }
799
800            public String getPathForLocalMetadata( Metadata metadata )
801            {
802                return null;
803            }
804
805            public String getPathForLocalArtifact( Artifact artifact )
806            {
807                return null;
808            }
809
810            public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
811            {
812
813                LocalArtifactResult result = new LocalArtifactResult( request );
814                result.setAvailable( true );
815                try
816                {
817                    result.setFile( TestFileUtils.createTempFile( "" ) );
818                }
819                catch ( IOException e )
820                {
821                    e.printStackTrace();
822                }
823                return result;
824            }
825
826            public void add( RepositorySystemSession session, LocalArtifactRegistration request )
827            {
828            }
829
830            public LocalMetadataResult find( RepositorySystemSession session, LocalMetadataRequest request )
831            {
832                LocalMetadataResult result = new LocalMetadataResult( request );
833                try
834                {
835                    result.setFile( TestFileUtils.createTempFile( "" ) );
836                }
837                catch ( IOException e )
838                {
839                    e.printStackTrace();
840                }
841                return result;
842            }
843
844            public void add( RepositorySystemSession session, LocalMetadataRegistration request )
845            {
846            }
847        } );
848
849        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
850        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
851
852        ArtifactResult result = resolver.resolveArtifact( session, request );
853
854        assertTrue( result.getExceptions().isEmpty() );
855
856        Artifact resolved = result.getArtifact();
857        assertNotNull( resolved.getFile() );
858
859        resolved = resolved.setFile( null );
860        assertEquals( artifact, resolved );
861
862    }
863
864    @Test
865    public void testFindInLocalRepositoryWhenVersionWasFoundInLocalRepository()
866        throws ArtifactResolutionException
867    {
868        session.setLocalRepositoryManager( new LocalRepositoryManager()
869        {
870
871            public LocalRepository getRepository()
872            {
873                return new LocalRepository( new File("") );
874            }
875
876            public String getPathForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context )
877            {
878                return null;
879            }
880
881            public String getPathForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
882            {
883                return null;
884            }
885
886            public String getPathForLocalMetadata( Metadata metadata )
887            {
888                return null;
889            }
890
891            public String getPathForLocalArtifact( Artifact artifact )
892            {
893                return null;
894            }
895
896            public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
897            {
898
899                LocalArtifactResult result = new LocalArtifactResult( request );
900                result.setAvailable( false );
901                try
902                {
903                    result.setFile( TestFileUtils.createTempFile( "" ) );
904                }
905                catch ( IOException e )
906                {
907                    e.printStackTrace();
908                }
909                return result;
910            }
911
912            public void add( RepositorySystemSession session, LocalArtifactRegistration request )
913            {
914            }
915
916            public LocalMetadataResult find( RepositorySystemSession session, LocalMetadataRequest request )
917            {
918                return new LocalMetadataResult( request );
919            }
920
921            public void add( RepositorySystemSession session, LocalMetadataRegistration request )
922            {
923            }
924        } );
925        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
926        request.addRepository( new RemoteRepository.Builder( "id", "default", "file:///" ).build() );
927
928        resolver.setVersionResolver( new VersionResolver()
929        {
930
931            public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
932            {
933                return new VersionResult( request ).setRepository( new LocalRepository( "id" ) ).setVersion( request.getArtifact().getVersion() );
934            }
935        } );
936        ArtifactResult result = resolver.resolveArtifact( session, request );
937
938        assertTrue( result.getExceptions().isEmpty() );
939
940        Artifact resolved = result.getArtifact();
941        assertNotNull( resolved.getFile() );
942
943        resolved = resolved.setFile( null );
944        assertEquals( artifact, resolved );
945    }
946
947    @Test
948    public void testFindInLocalRepositoryWhenVersionRangeWasResolvedFromLocalRepository()
949        throws ArtifactResolutionException
950    {
951        session.setLocalRepositoryManager( new LocalRepositoryManager()
952        {
953
954            public LocalRepository getRepository()
955            {
956                return new LocalRepository( new File( "" ) );
957            }
958
959            public String getPathForRemoteMetadata( Metadata metadata, RemoteRepository repository, String context )
960            {
961                return null;
962            }
963
964            public String getPathForRemoteArtifact( Artifact artifact, RemoteRepository repository, String context )
965            {
966                return null;
967            }
968
969            public String getPathForLocalMetadata( Metadata metadata )
970            {
971                return null;
972            }
973
974            public String getPathForLocalArtifact( Artifact artifact )
975            {
976                return null;
977            }
978
979            public LocalArtifactResult find( RepositorySystemSession session, LocalArtifactRequest request )
980            {
981
982                LocalArtifactResult result = new LocalArtifactResult( request );
983                result.setAvailable( false );
984                try
985                {
986                    result.setFile( TestFileUtils.createTempFile( "" ) );
987                }
988                catch ( IOException e )
989                {
990                    e.printStackTrace();
991                }
992                return result;
993            }
994
995            public void add( RepositorySystemSession session, LocalArtifactRegistration request )
996            {
997            }
998
999            public LocalMetadataResult find( RepositorySystemSession session, LocalMetadataRequest request )
1000            {
1001                return new LocalMetadataResult( request );
1002            }
1003
1004            public void add( RepositorySystemSession session, LocalMetadataRegistration request )
1005            {
1006            }
1007
1008        } );
1009        ArtifactRequest request = new ArtifactRequest( artifact, null, "" );
1010
1011        resolver.setVersionResolver( new VersionResolver()
1012        {
1013
1014            public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
1015            {
1016                return new VersionResult( request ).setVersion( request.getArtifact().getVersion() );
1017            }
1018        } );
1019        ArtifactResult result = resolver.resolveArtifact( session, request );
1020
1021        assertTrue( result.getExceptions().isEmpty() );
1022
1023        Artifact resolved = result.getArtifact();
1024        assertNotNull( resolved.getFile() );
1025
1026        resolved = resolved.setFile( null );
1027        assertEquals( artifact, resolved );
1028    }
1029
1030}