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.List;
030import java.util.Set;
031
032import org.eclipse.aether.DefaultRepositorySystemSession;
033import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
034import org.eclipse.aether.internal.test.util.TestFileUtils;
035import org.eclipse.aether.internal.test.util.TestLocalRepositoryManager;
036import org.eclipse.aether.internal.test.util.TestUtils;
037import org.eclipse.aether.metadata.DefaultMetadata;
038import org.eclipse.aether.metadata.Metadata;
039import org.eclipse.aether.repository.LocalMetadataRegistration;
040import org.eclipse.aether.repository.RemoteRepository;
041import org.eclipse.aether.resolution.MetadataRequest;
042import org.eclipse.aether.resolution.MetadataResult;
043import org.eclipse.aether.spi.connector.ArtifactDownload;
044import org.eclipse.aether.spi.connector.MetadataDownload;
045import org.eclipse.aether.transfer.MetadataNotFoundException;
046import org.junit.After;
047import org.junit.Before;
048import org.junit.Test;
049
050/**
051 */
052public class DefaultMetadataResolverTest
053{
054
055    private DefaultMetadataResolver resolver;
056
057    private StubRepositoryConnectorProvider connectorProvider;
058
059    private RemoteRepository repository;
060
061    private DefaultRepositorySystemSession session;
062
063    private Metadata metadata;
064
065    private RecordingRepositoryConnector connector;
066
067    private TestLocalRepositoryManager lrm;
068
069    @Before
070    public void setup()
071        throws Exception
072    {
073        session = TestUtils.newSession();
074        lrm = (TestLocalRepositoryManager) session.getLocalRepositoryManager();
075        connectorProvider = new StubRepositoryConnectorProvider();
076        resolver = new DefaultMetadataResolver();
077        resolver.setUpdateCheckManager( new StaticUpdateCheckManager( true ) );
078        resolver.setRepositoryEventDispatcher( new StubRepositoryEventDispatcher() );
079        resolver.setRepositoryConnectorProvider( connectorProvider );
080        resolver.setRemoteRepositoryManager( new StubRemoteRepositoryManager() );
081        resolver.setSyncContextFactory( new StubSyncContextFactory() );
082        resolver.setOfflineController( new DefaultOfflineController() );
083        repository =
084            new RemoteRepository.Builder( "test-DMRT", "default",
085                                          TestFileUtils.createTempDir().toURI().toURL().toString() ).build();
086        metadata = new DefaultMetadata( "gid", "aid", "ver", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT );
087        connector = new RecordingRepositoryConnector();
088        connectorProvider.setConnector( connector );
089    }
090
091    @After
092    public void teardown()
093        throws Exception
094    {
095        TestFileUtils.deleteFile( new File( new URI( repository.getUrl() ) ) );
096        TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
097    }
098
099    @Test
100    public void testNoRepositoryFailing()
101    {
102        MetadataRequest request = new MetadataRequest( metadata, null, "" );
103        List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) );
104
105        assertEquals( 1, results.size() );
106
107        MetadataResult result = results.get( 0 );
108        assertSame( request, result.getRequest() );
109        assertNotNull( "" + ( result.getMetadata() != null ? result.getMetadata().getFile() : result.getMetadata() ),
110                       result.getException() );
111        assertEquals( MetadataNotFoundException.class, result.getException().getClass() );
112
113        assertNull( result.getMetadata() );
114    }
115
116    @Test
117    public void testResolve()
118        throws IOException
119    {
120        connector.setExpectGet( metadata );
121
122        // prepare "download"
123        File file =
124            new File( session.getLocalRepository().getBasedir(),
125                      session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository, "" ) );
126
127        TestFileUtils.writeString( file, file.getAbsolutePath() );
128
129        MetadataRequest request = new MetadataRequest( metadata, repository, "" );
130        List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) );
131
132        assertEquals( 1, results.size() );
133
134        MetadataResult result = results.get( 0 );
135        assertSame( request, result.getRequest() );
136        assertNull( result.getException() );
137        assertNotNull( result.getMetadata() );
138        assertNotNull( result.getMetadata().getFile() );
139
140        assertEquals( file, result.getMetadata().getFile() );
141        assertEquals( metadata, result.getMetadata().setFile( null ) );
142
143        connector.assertSeenExpected();
144        Set<Metadata> metadataRegistration =
145            ( (TestLocalRepositoryManager) session.getLocalRepositoryManager() ).getMetadataRegistration();
146        assertTrue( metadataRegistration.contains( metadata ) );
147        assertEquals( 1, metadataRegistration.size() );
148    }
149
150    @Test
151    public void testRemoveMetadataIfMissing()
152        throws IOException
153    {
154        connector = new RecordingRepositoryConnector()
155        {
156
157            @Override
158            public void get( Collection<? extends ArtifactDownload> artifactDownloads,
159                             Collection<? extends MetadataDownload> metadataDownloads )
160            {
161                super.get( artifactDownloads, metadataDownloads );
162                for ( MetadataDownload d : metadataDownloads )
163                {
164                    d.setException( new MetadataNotFoundException( metadata, repository ) );
165                }
166            }
167
168        };
169        connectorProvider.setConnector( connector );
170
171        File file =
172            new File( session.getLocalRepository().getBasedir(),
173                      session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository, "" ) );
174        TestFileUtils.writeString( file, file.getAbsolutePath() );
175        metadata.setFile( file );
176
177        MetadataRequest request = new MetadataRequest( metadata, repository, "" );
178        request.setDeleteLocalCopyIfMissing( true );
179
180        List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) );
181        assertEquals( 1, results.size() );
182        MetadataResult result = results.get( 0 );
183
184        assertNotNull( result.getException() );
185        assertFalse( file.exists() );
186    }
187
188    @Test
189    public void testOfflineSessionResolveMetadataMissing()
190    {
191        session.setOffline( true );
192        MetadataRequest request = new MetadataRequest( metadata, repository, "" );
193        List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) );
194
195        assertEquals( 1, results.size() );
196
197        MetadataResult result = results.get( 0 );
198        assertSame( request, result.getRequest() );
199        assertNotNull( result.getException() );
200        assertNull( result.getMetadata() );
201
202        connector.assertSeenExpected();
203    }
204
205    @Test
206    public void testOfflineSessionResolveMetadata()
207        throws IOException
208    {
209        session.setOffline( true );
210
211        String path = session.getLocalRepositoryManager().getPathForRemoteMetadata( metadata, repository, "" );
212        File file = new File( session.getLocalRepository().getBasedir(), path );
213        TestFileUtils.writeString( file, file.getAbsolutePath() );
214
215        // set file to use in TestLRM find()
216        metadata = metadata.setFile( file );
217
218        MetadataRequest request = new MetadataRequest( metadata, repository, "" );
219        List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) );
220
221        assertEquals( 1, results.size() );
222        MetadataResult result = results.get( 0 );
223        assertSame( request, result.getRequest() );
224        assertNull( String.valueOf( result.getException() ), result.getException() );
225        assertNotNull( result.getMetadata() );
226        assertNotNull( result.getMetadata().getFile() );
227
228        assertEquals( file, result.getMetadata().getFile() );
229        assertEquals( metadata.setFile( null ), result.getMetadata().setFile( null ) );
230
231        connector.assertSeenExpected();
232    }
233
234    @Test
235    public void testFavorLocal()
236        throws IOException
237    {
238        lrm.add( session, new LocalMetadataRegistration( metadata ) );
239        String path = session.getLocalRepositoryManager().getPathForLocalMetadata( metadata );
240        File file = new File( session.getLocalRepository().getBasedir(), path );
241        TestFileUtils.writeString( file, file.getAbsolutePath() );
242
243        MetadataRequest request = new MetadataRequest( metadata, repository, "" );
244        request.setFavorLocalRepository( true );
245        resolver.setUpdateCheckManager( new StaticUpdateCheckManager( true, true ) );
246
247        List<MetadataResult> results = resolver.resolveMetadata( session, Arrays.asList( request ) );
248
249        assertEquals( 1, results.size() );
250        MetadataResult result = results.get( 0 );
251        assertSame( request, result.getRequest() );
252        assertNull( String.valueOf( result.getException() ), result.getException() );
253
254        connector.assertSeenExpected();
255    }
256}