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