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.util.Arrays;
025import java.util.Collections;
026import java.util.List;
027
028import org.eclipse.aether.DefaultRepositorySystemSession;
029import org.eclipse.aether.RepositorySystemSession;
030import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
031import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
032import org.eclipse.aether.internal.test.util.TestLoggerFactory;
033import org.eclipse.aether.internal.test.util.TestUtils;
034import org.eclipse.aether.repository.MirrorSelector;
035import org.eclipse.aether.repository.Proxy;
036import org.eclipse.aether.repository.ProxySelector;
037import org.eclipse.aether.repository.RemoteRepository;
038import org.eclipse.aether.repository.RepositoryPolicy;
039import org.eclipse.aether.util.repository.AuthenticationBuilder;
040import org.junit.After;
041import org.junit.Before;
042import org.junit.Test;
043
044/**
045 * 
046 */
047public class DefaultRemoteRepositoryManagerTest
048{
049
050    private DefaultRepositorySystemSession session;
051
052    private DefaultRemoteRepositoryManager manager;
053
054    @Before
055    public void setup()
056        throws Exception
057    {
058        session = TestUtils.newSession();
059        session.setChecksumPolicy( null );
060        session.setUpdatePolicy( null );
061        manager = new DefaultRemoteRepositoryManager();
062        manager.setUpdatePolicyAnalyzer( new StubUpdatePolicyAnalyzer() );
063        manager.setChecksumPolicyProvider( new DefaultChecksumPolicyProvider() );
064        manager.setLoggerFactory( new TestLoggerFactory() );
065    }
066
067    @After
068    public void teardown()
069        throws Exception
070    {
071        manager = null;
072        session = null;
073    }
074
075    private RemoteRepository.Builder newRepo( String id, String url, boolean enabled, String updates, String checksums )
076    {
077        RepositoryPolicy policy = new RepositoryPolicy( enabled, updates, checksums );
078        return new RemoteRepository.Builder( id, "test", url ).setPolicy( policy );
079    }
080
081    private void assertEqual( RemoteRepository expected, RemoteRepository actual )
082    {
083        assertEquals( "id", expected.getId(), actual.getId() );
084        assertEquals( "url", expected.getUrl(), actual.getUrl() );
085        assertEquals( "type", expected.getContentType(), actual.getContentType() );
086        assertEqual( expected.getPolicy( false ), actual.getPolicy( false ) );
087        assertEqual( expected.getPolicy( true ), actual.getPolicy( true ) );
088    }
089
090    private void assertEqual( RepositoryPolicy expected, RepositoryPolicy actual )
091    {
092        assertEquals( "enabled", expected.isEnabled(), actual.isEnabled() );
093        assertEquals( "checksums", expected.getChecksumPolicy(), actual.getChecksumPolicy() );
094        assertEquals( "updates", expected.getUpdatePolicy(), actual.getUpdatePolicy() );
095    }
096
097    @Test
098    public void testGetPolicy()
099    {
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}