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.util.Arrays;
25  import java.util.Collections;
26  import java.util.List;
27  
28  import org.eclipse.aether.DefaultRepositorySystemSession;
29  import org.eclipse.aether.RepositorySystemSession;
30  import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
31  import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
32  import org.eclipse.aether.internal.test.util.TestLoggerFactory;
33  import org.eclipse.aether.internal.test.util.TestUtils;
34  import org.eclipse.aether.repository.MirrorSelector;
35  import org.eclipse.aether.repository.Proxy;
36  import org.eclipse.aether.repository.ProxySelector;
37  import org.eclipse.aether.repository.RemoteRepository;
38  import org.eclipse.aether.repository.RepositoryPolicy;
39  import org.eclipse.aether.util.repository.AuthenticationBuilder;
40  import org.junit.After;
41  import org.junit.Before;
42  import org.junit.Test;
43  
44  /**
45   * 
46   */
47  public class DefaultRemoteRepositoryManagerTest
48  {
49  
50      private DefaultRepositorySystemSession session;
51  
52      private DefaultRemoteRepositoryManager manager;
53  
54      @Before
55      public void setup()
56          throws Exception
57      {
58          session = TestUtils.newSession();
59          session.setChecksumPolicy( null );
60          session.setUpdatePolicy( null );
61          manager = new DefaultRemoteRepositoryManager();
62          manager.setUpdatePolicyAnalyzer( new StubUpdatePolicyAnalyzer() );
63          manager.setChecksumPolicyProvider( new DefaultChecksumPolicyProvider() );
64          manager.setLoggerFactory( new TestLoggerFactory() );
65      }
66  
67      @After
68      public void teardown()
69          throws Exception
70      {
71          manager = null;
72          session = null;
73      }
74  
75      private RemoteRepository.Builder newRepo( String id, String url, boolean enabled, String updates, String checksums )
76      {
77          RepositoryPolicy policy = new RepositoryPolicy( enabled, updates, checksums );
78          return new RemoteRepository.Builder( id, "test", url ).setPolicy( policy );
79      }
80  
81      private void assertEqual( RemoteRepository expected, RemoteRepository actual )
82      {
83          assertEquals( "id", expected.getId(), actual.getId() );
84          assertEquals( "url", expected.getUrl(), actual.getUrl() );
85          assertEquals( "type", expected.getContentType(), actual.getContentType() );
86          assertEqual( expected.getPolicy( false ), actual.getPolicy( false ) );
87          assertEqual( expected.getPolicy( true ), actual.getPolicy( true ) );
88      }
89  
90      private void assertEqual( RepositoryPolicy expected, RepositoryPolicy actual )
91      {
92          assertEquals( "enabled", expected.isEnabled(), actual.isEnabled() );
93          assertEquals( "checksums", expected.getChecksumPolicy(), actual.getChecksumPolicy() );
94          assertEquals( "updates", expected.getUpdatePolicy(), actual.getUpdatePolicy() );
95      }
96  
97      @Test
98      public void testGetPolicy()
99      {
100         RepositoryPolicy snapshotPolicy =
101             new RepositoryPolicy( true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_IGNORE );
102         RepositoryPolicy releasePolicy =
103             new RepositoryPolicy( true, RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_FAIL );
104 
105         RemoteRepository repo = new RemoteRepository.Builder( "id", "type", "http://localhost" ) //
106         .setSnapshotPolicy( snapshotPolicy ).setReleasePolicy( releasePolicy ).build();
107 
108         RepositoryPolicy effectivePolicy = manager.getPolicy( session, repo, true, true );
109         assertEquals( true, effectivePolicy.isEnabled() );
110         assertEquals( RepositoryPolicy.CHECKSUM_POLICY_IGNORE, effectivePolicy.getChecksumPolicy() );
111         assertEquals( RepositoryPolicy.UPDATE_POLICY_ALWAYS, effectivePolicy.getUpdatePolicy() );
112     }
113 
114     @Test
115     public void testAggregateSimpleRepos()
116     {
117         RemoteRepository dominant1 = newRepo( "a", "file://", false, "", "" ).build();
118 
119         RemoteRepository recessive1 = newRepo( "a", "http://", true, "", "" ).build();
120         RemoteRepository recessive2 = newRepo( "b", "file://", true, "", "" ).build();
121 
122         List<RemoteRepository> result =
123             manager.aggregateRepositories( session, Arrays.asList( dominant1 ),
124                                            Arrays.asList( recessive1, recessive2 ), false );
125 
126         assertEquals( 2, result.size() );
127         assertEqual( dominant1, result.get( 0 ) );
128         assertEqual( recessive2, result.get( 1 ) );
129     }
130 
131     @Test
132     public void testAggregateSimpleRepos_MustKeepDisabledRecessiveRepo()
133     {
134         RemoteRepository dominant = newRepo( "a", "file://", true, "", "" ).build();
135 
136         RemoteRepository recessive1 = newRepo( "b", "http://", false, "", "" ).build();
137 
138         List<RemoteRepository> result =
139             manager.aggregateRepositories( session, Arrays.asList( dominant ), Arrays.asList( recessive1 ), false );
140 
141         RemoteRepository recessive2 = newRepo( recessive1.getId(), "http://", true, "", "" ).build();
142 
143         result = manager.aggregateRepositories( session, result, Arrays.asList( recessive2 ), false );
144 
145         assertEquals( 2, result.size() );
146         assertEqual( dominant, result.get( 0 ) );
147         assertEqual( recessive1, result.get( 1 ) );
148     }
149 
150     @Test
151     public void testAggregateMirrorRepos_DominantMirrorComplete()
152     {
153         RemoteRepository dominant1 = newRepo( "a", "http://", false, "", "" ).build();
154         RemoteRepository dominantMirror1 =
155             newRepo( "x", "file://", false, "", "" ).addMirroredRepository( dominant1 ).build();
156 
157         RemoteRepository recessive1 = newRepo( "a", "https://", true, "", "" ).build();
158         RemoteRepository recessiveMirror1 =
159             newRepo( "x", "http://", true, "", "" ).addMirroredRepository( recessive1 ).build();
160 
161         List<RemoteRepository> result =
162             manager.aggregateRepositories( session, Arrays.asList( dominantMirror1 ),
163                                            Arrays.asList( recessiveMirror1 ), false );
164 
165         assertEquals( 1, result.size() );
166         assertEqual( dominantMirror1, result.get( 0 ) );
167         assertEquals( 1, result.get( 0 ).getMirroredRepositories().size() );
168         assertEquals( dominant1, result.get( 0 ).getMirroredRepositories().get( 0 ) );
169     }
170 
171     @Test
172     public void testAggregateMirrorRepos_DominantMirrorIncomplete()
173     {
174         RemoteRepository dominant1 = newRepo( "a", "http://", false, "", "" ).build();
175         RemoteRepository dominantMirror1 =
176             newRepo( "x", "file://", false, "", "" ).addMirroredRepository( dominant1 ).build();
177 
178         RemoteRepository recessive1 = newRepo( "a", "https://", true, "", "" ).build();
179         RemoteRepository recessive2 = newRepo( "b", "https://", true, "", "" ).build();
180         RemoteRepository recessiveMirror1 =
181             newRepo( "x", "http://", true, "", "" ).setMirroredRepositories( Arrays.asList( recessive1, recessive2 ) ).build();
182 
183         List<RemoteRepository> result =
184             manager.aggregateRepositories( session, Arrays.asList( dominantMirror1 ),
185                                            Arrays.asList( recessiveMirror1 ), false );
186 
187         assertEquals( 1, result.size() );
188         assertEqual( newRepo( "x", "file://", true, "", "" ).build(), result.get( 0 ) );
189         assertEquals( 2, result.get( 0 ).getMirroredRepositories().size() );
190         assertEquals( dominant1, result.get( 0 ).getMirroredRepositories().get( 0 ) );
191         assertEquals( recessive2, result.get( 0 ).getMirroredRepositories().get( 1 ) );
192     }
193 
194     @Test
195     public void testMirrorAuthentication()
196     {
197         final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
198         final RemoteRepository mirror =
199             newRepo( "a", "http://", true, "", "" ).setAuthentication( new AuthenticationBuilder().addUsername( "test" ).build() ).build();
200         session.setMirrorSelector( new MirrorSelector()
201         {
202             public RemoteRepository getMirror( RemoteRepository repository )
203             {
204                 return mirror;
205             }
206         } );
207 
208         List<RemoteRepository> result =
209             manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
210                                            true );
211 
212         assertEquals( 1, result.size() );
213         assertSame( mirror.getAuthentication(), result.get( 0 ).getAuthentication() );
214     }
215 
216     @Test
217     public void testMirrorProxy()
218     {
219         final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
220         final RemoteRepository mirror =
221             newRepo( "a", "http://", true, "", "" ).setProxy( new Proxy( "http", "host", 2011, null ) ).build();
222         session.setMirrorSelector( new MirrorSelector()
223         {
224             public RemoteRepository getMirror( RemoteRepository repository )
225             {
226                 return mirror;
227             }
228         } );
229 
230         List<RemoteRepository> result =
231             manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
232                                            true );
233 
234         assertEquals( 1, result.size() );
235         assertEquals( "http", result.get( 0 ).getProxy().getType() );
236         assertEquals( "host", result.get( 0 ).getProxy().getHost() );
237         assertEquals( 2011, result.get( 0 ).getProxy().getPort() );
238     }
239 
240     @Test
241     public void testProxySelector()
242     {
243         final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
244         final Proxy proxy = new Proxy( "http", "host", 2011, null );
245         session.setProxySelector( new ProxySelector()
246         {
247             public Proxy getProxy( RemoteRepository repository )
248             {
249                 return proxy;
250             }
251         } );
252         session.setMirrorSelector( new MirrorSelector()
253         {
254             public RemoteRepository getMirror( RemoteRepository repository )
255             {
256                 return null;
257             }
258         } );
259 
260         List<RemoteRepository> result =
261             manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
262                                            true );
263 
264         assertEquals( 1, result.size() );
265         assertEquals( "http", result.get( 0 ).getProxy().getType() );
266         assertEquals( "host", result.get( 0 ).getProxy().getHost() );
267         assertEquals( 2011, result.get( 0 ).getProxy().getPort() );
268     }
269 
270     private static class StubUpdatePolicyAnalyzer
271         implements UpdatePolicyAnalyzer
272     {
273 
274         public String getEffectiveUpdatePolicy( RepositorySystemSession session, String policy1, String policy2 )
275         {
276             return ordinalOfUpdatePolicy( policy1 ) < ordinalOfUpdatePolicy( policy2 ) ? policy1 : policy2;
277         }
278 
279         private int ordinalOfUpdatePolicy( String policy )
280         {
281             if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) )
282             {
283                 return 1440;
284             }
285             else if ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) )
286             {
287                 return 0;
288             }
289             else if ( policy != null && policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
290             {
291                 String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );
292                 return Integer.valueOf( s );
293             }
294             else
295             {
296                 // assume "never"
297                 return Integer.MAX_VALUE;
298             }
299         }
300 
301         public boolean isUpdatedRequired( RepositorySystemSession session, long lastModified, String policy )
302         {
303             return false;
304         }
305 
306     }
307 
308 }