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.test.util.TestUtils;
032import org.eclipse.aether.repository.MirrorSelector;
033import org.eclipse.aether.repository.Proxy;
034import org.eclipse.aether.repository.ProxySelector;
035import org.eclipse.aether.repository.RemoteRepository;
036import org.eclipse.aether.repository.RepositoryPolicy;
037import org.eclipse.aether.util.repository.AuthenticationBuilder;
038import org.junit.After;
039import org.junit.Before;
040import org.junit.Test;
041
042/**
043 * 
044 */
045public class DefaultRemoteRepositoryManagerTest
046{
047
048    private DefaultRepositorySystemSession session;
049
050    private DefaultRemoteRepositoryManager manager;
051
052    @Before
053    public void setup()
054        throws Exception
055    {
056        session = TestUtils.newSession();
057        session.setChecksumPolicy( null );
058        session.setUpdatePolicy( null );
059        manager = new DefaultRemoteRepositoryManager();
060        manager.setUpdatePolicyAnalyzer( new StubUpdatePolicyAnalyzer() );
061        manager.setChecksumPolicyProvider( new DefaultChecksumPolicyProvider() );
062    }
063
064    @After
065    public void teardown()
066        throws Exception
067    {
068        manager = null;
069        session = null;
070    }
071
072    private RemoteRepository.Builder newRepo( String id, String url, boolean enabled, String updates, String checksums )
073    {
074        RepositoryPolicy policy = new RepositoryPolicy( enabled, updates, checksums );
075        return new RemoteRepository.Builder( id, "test", url ).setPolicy( policy );
076    }
077
078    private void assertEqual( RemoteRepository expected, RemoteRepository actual )
079    {
080        assertEquals( "id", expected.getId(), actual.getId() );
081        assertEquals( "url", expected.getUrl(), actual.getUrl() );
082        assertEquals( "type", expected.getContentType(), actual.getContentType() );
083        assertEqual( expected.getPolicy( false ), actual.getPolicy( false ) );
084        assertEqual( expected.getPolicy( true ), actual.getPolicy( true ) );
085    }
086
087    private void assertEqual( RepositoryPolicy expected, RepositoryPolicy actual )
088    {
089        assertEquals( "enabled", expected.isEnabled(), actual.isEnabled() );
090        assertEquals( "checksums", expected.getChecksumPolicy(), actual.getChecksumPolicy() );
091        assertEquals( "updates", expected.getUpdatePolicy(), actual.getUpdatePolicy() );
092    }
093
094    @Test
095    public void testGetPolicy()
096    {
097        RepositoryPolicy snapshotPolicy =
098            new RepositoryPolicy( true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_IGNORE );
099        RepositoryPolicy releasePolicy =
100            new RepositoryPolicy( true, RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_FAIL );
101
102        RemoteRepository repo = new RemoteRepository.Builder( "id", "type", "http://localhost" ) //
103        .setSnapshotPolicy( snapshotPolicy ).setReleasePolicy( releasePolicy ).build();
104
105        RepositoryPolicy effectivePolicy = manager.getPolicy( session, repo, true, true );
106        assertEquals( true, effectivePolicy.isEnabled() );
107        assertEquals( RepositoryPolicy.CHECKSUM_POLICY_IGNORE, effectivePolicy.getChecksumPolicy() );
108        assertEquals( RepositoryPolicy.UPDATE_POLICY_ALWAYS, effectivePolicy.getUpdatePolicy() );
109    }
110
111    @Test
112    public void testAggregateSimpleRepos()
113    {
114        RemoteRepository dominant1 = newRepo( "a", "file://", false, "", "" ).build();
115
116        RemoteRepository recessive1 = newRepo( "a", "http://", true, "", "" ).build();
117        RemoteRepository recessive2 = newRepo( "b", "file://", true, "", "" ).build();
118
119        List<RemoteRepository> result =
120            manager.aggregateRepositories( session, Arrays.asList( dominant1 ),
121                                           Arrays.asList( recessive1, recessive2 ), false );
122
123        assertEquals( 2, result.size() );
124        assertEqual( dominant1, result.get( 0 ) );
125        assertEqual( recessive2, result.get( 1 ) );
126    }
127
128    @Test
129    public void testAggregateSimpleRepos_MustKeepDisabledRecessiveRepo()
130    {
131        RemoteRepository dominant = newRepo( "a", "file://", true, "", "" ).build();
132
133        RemoteRepository recessive1 = newRepo( "b", "http://", false, "", "" ).build();
134
135        List<RemoteRepository> result =
136            manager.aggregateRepositories( session, Arrays.asList( dominant ), Arrays.asList( recessive1 ), false );
137
138        RemoteRepository recessive2 = newRepo( recessive1.getId(), "http://", true, "", "" ).build();
139
140        result = manager.aggregateRepositories( session, result, Arrays.asList( recessive2 ), false );
141
142        assertEquals( 2, result.size() );
143        assertEqual( dominant, result.get( 0 ) );
144        assertEqual( recessive1, result.get( 1 ) );
145    }
146
147    @Test
148    public void testAggregateMirrorRepos_DominantMirrorComplete()
149    {
150        RemoteRepository dominant1 = newRepo( "a", "http://", false, "", "" ).build();
151        RemoteRepository dominantMirror1 =
152            newRepo( "x", "file://", false, "", "" ).addMirroredRepository( dominant1 ).build();
153
154        RemoteRepository recessive1 = newRepo( "a", "https://", true, "", "" ).build();
155        RemoteRepository recessiveMirror1 =
156            newRepo( "x", "http://", true, "", "" ).addMirroredRepository( recessive1 ).build();
157
158        List<RemoteRepository> result =
159            manager.aggregateRepositories( session, Arrays.asList( dominantMirror1 ),
160                                           Arrays.asList( recessiveMirror1 ), false );
161
162        assertEquals( 1, result.size() );
163        assertEqual( dominantMirror1, result.get( 0 ) );
164        assertEquals( 1, result.get( 0 ).getMirroredRepositories().size() );
165        assertEquals( dominant1, result.get( 0 ).getMirroredRepositories().get( 0 ) );
166    }
167
168    @Test
169    public void testAggregateMirrorRepos_DominantMirrorIncomplete()
170    {
171        RemoteRepository dominant1 = newRepo( "a", "http://", false, "", "" ).build();
172        RemoteRepository dominantMirror1 =
173            newRepo( "x", "file://", false, "", "" ).addMirroredRepository( dominant1 ).build();
174
175        RemoteRepository recessive1 = newRepo( "a", "https://", true, "", "" ).build();
176        RemoteRepository recessive2 = newRepo( "b", "https://", true, "", "" ).build();
177        RemoteRepository recessiveMirror1 =
178            newRepo( "x", "http://", true, "", "" ).setMirroredRepositories( Arrays.asList( recessive1, recessive2 ) ).build();
179
180        List<RemoteRepository> result =
181            manager.aggregateRepositories( session, Arrays.asList( dominantMirror1 ),
182                                           Arrays.asList( recessiveMirror1 ), false );
183
184        assertEquals( 1, result.size() );
185        assertEqual( newRepo( "x", "file://", true, "", "" ).build(), result.get( 0 ) );
186        assertEquals( 2, result.get( 0 ).getMirroredRepositories().size() );
187        assertEquals( dominant1, result.get( 0 ).getMirroredRepositories().get( 0 ) );
188        assertEquals( recessive2, result.get( 0 ).getMirroredRepositories().get( 1 ) );
189    }
190
191    @Test
192    public void testMirrorAuthentication()
193    {
194        final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
195        final RemoteRepository mirror =
196            newRepo( "a", "http://", true, "", "" ).setAuthentication( new AuthenticationBuilder().addUsername( "test" ).build() ).build();
197        session.setMirrorSelector( new MirrorSelector()
198        {
199            public RemoteRepository getMirror( RemoteRepository repository )
200            {
201                return mirror;
202            }
203        } );
204
205        List<RemoteRepository> result =
206            manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
207                                           true );
208
209        assertEquals( 1, result.size() );
210        assertSame( mirror.getAuthentication(), result.get( 0 ).getAuthentication() );
211    }
212
213    @Test
214    public void testMirrorProxy()
215    {
216        final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
217        final RemoteRepository mirror =
218            newRepo( "a", "http://", true, "", "" ).setProxy( new Proxy( "http", "host", 2011, null ) ).build();
219        session.setMirrorSelector( new MirrorSelector()
220        {
221            public RemoteRepository getMirror( RemoteRepository repository )
222            {
223                return mirror;
224            }
225        } );
226
227        List<RemoteRepository> result =
228            manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
229                                           true );
230
231        assertEquals( 1, result.size() );
232        assertEquals( "http", result.get( 0 ).getProxy().getType() );
233        assertEquals( "host", result.get( 0 ).getProxy().getHost() );
234        assertEquals( 2011, result.get( 0 ).getProxy().getPort() );
235    }
236
237    @Test
238    public void testProxySelector()
239    {
240        final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
241        final Proxy proxy = new Proxy( "http", "host", 2011, null );
242        session.setProxySelector( new ProxySelector()
243        {
244            public Proxy getProxy( RemoteRepository repository )
245            {
246                return proxy;
247            }
248        } );
249        session.setMirrorSelector( new MirrorSelector()
250        {
251            public RemoteRepository getMirror( RemoteRepository repository )
252            {
253                return null;
254            }
255        } );
256
257        List<RemoteRepository> result =
258            manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
259                                           true );
260
261        assertEquals( 1, result.size() );
262        assertEquals( "http", result.get( 0 ).getProxy().getType() );
263        assertEquals( "host", result.get( 0 ).getProxy().getHost() );
264        assertEquals( 2011, result.get( 0 ).getProxy().getPort() );
265    }
266
267    private static class StubUpdatePolicyAnalyzer
268        implements UpdatePolicyAnalyzer
269    {
270
271        public String getEffectiveUpdatePolicy( RepositorySystemSession session, String policy1, String policy2 )
272        {
273            return ordinalOfUpdatePolicy( policy1 ) < ordinalOfUpdatePolicy( policy2 ) ? policy1 : policy2;
274        }
275
276        private int ordinalOfUpdatePolicy( String policy )
277        {
278            if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) )
279            {
280                return 1440;
281            }
282            else if ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) )
283            {
284                return 0;
285            }
286            else if ( policy != null && policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
287            {
288                String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );
289                return Integer.valueOf( s );
290            }
291            else
292            {
293                // assume "never"
294                return Integer.MAX_VALUE;
295            }
296        }
297
298        public boolean isUpdatedRequired( RepositorySystemSession session, long lastModified, String policy )
299        {
300            return false;
301        }
302
303    }
304
305}