View Javadoc
1   package org.eclipse.aether.internal.impl;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   * 
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   * 
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import static org.junit.Assert.*;
23  
24  import java.io.File;
25  import java.io.IOException;
26  import java.net.URI;
27  import java.util.Arrays;
28  import java.util.Collection;
29  import java.util.List;
30  import java.util.Set;
31  
32  import org.eclipse.aether.DefaultRepositorySystemSession;
33  import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
34  import org.eclipse.aether.internal.test.util.TestFileUtils;
35  import org.eclipse.aether.internal.test.util.TestLocalRepositoryManager;
36  import org.eclipse.aether.internal.test.util.TestUtils;
37  import org.eclipse.aether.metadata.DefaultMetadata;
38  import org.eclipse.aether.metadata.Metadata;
39  import org.eclipse.aether.repository.LocalMetadataRegistration;
40  import org.eclipse.aether.repository.RemoteRepository;
41  import org.eclipse.aether.resolution.MetadataRequest;
42  import org.eclipse.aether.resolution.MetadataResult;
43  import org.eclipse.aether.spi.connector.ArtifactDownload;
44  import org.eclipse.aether.spi.connector.MetadataDownload;
45  import org.eclipse.aether.transfer.MetadataNotFoundException;
46  import org.junit.After;
47  import org.junit.Before;
48  import org.junit.Test;
49  
50  /**
51   */
52  public class DefaultMetadataResolverTest
53  {
54  
55      private DefaultMetadataResolver resolver;
56  
57      private StubRepositoryConnectorProvider connectorProvider;
58  
59      private RemoteRepository repository;
60  
61      private DefaultRepositorySystemSession session;
62  
63      private Metadata metadata;
64  
65      private RecordingRepositoryConnector connector;
66  
67      private TestLocalRepositoryManager lrm;
68  
69      @Before
70      public void setup()
71          throws Exception
72      {
73          session = TestUtils.newSession();
74          lrm = (TestLocalRepositoryManager) session.getLocalRepositoryManager();
75          connectorProvider = new StubRepositoryConnectorProvider();
76          resolver = new DefaultMetadataResolver();
77          resolver.setUpdateCheckManager( new StaticUpdateCheckManager( true ) );
78          resolver.setRepositoryEventDispatcher( new StubRepositoryEventDispatcher() );
79          resolver.setRepositoryConnectorProvider( connectorProvider );
80          resolver.setRemoteRepositoryManager( new StubRemoteRepositoryManager() );
81          resolver.setSyncContextFactory( new StubSyncContextFactory() );
82          resolver.setOfflineController( new DefaultOfflineController() );
83          repository =
84              new RemoteRepository.Builder( "test-DMRT", "default",
85                                            TestFileUtils.createTempDir().toURI().toURL().toString() ).build();
86          metadata = new DefaultMetadata( "gid", "aid", "ver", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT );
87          connector = new RecordingRepositoryConnector();
88          connectorProvider.setConnector( connector );
89      }
90  
91      @After
92      public void teardown()
93          throws Exception
94      {
95          TestFileUtils.deleteFile( new File( new URI( repository.getUrl() ) ) );
96          TestFileUtils.deleteFile( session.getLocalRepository().getBasedir() );
97      }
98  
99      @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 }