blob: b654f9bd7f4d1308beb7f3fde47f3a4583f1fb4f [file] [log] [blame]
package org.eclipse.aether.internal.impl;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
import org.eclipse.aether.internal.test.util.TestUtils;
import org.eclipse.aether.repository.MirrorSelector;
import org.eclipse.aether.repository.Proxy;
import org.eclipse.aether.repository.ProxySelector;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.util.repository.AuthenticationBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
*
*/
public class DefaultRemoteRepositoryManagerTest
{
private DefaultRepositorySystemSession session;
private DefaultRemoteRepositoryManager manager;
@Before
public void setup()
{
session = TestUtils.newSession();
session.setChecksumPolicy( null );
session.setUpdatePolicy( null );
manager = new DefaultRemoteRepositoryManager();
manager.setUpdatePolicyAnalyzer( new StubUpdatePolicyAnalyzer() );
manager.setChecksumPolicyProvider( new DefaultChecksumPolicyProvider() );
}
@After
public void teardown()
{
manager = null;
session = null;
}
private RemoteRepository.Builder newRepo( String id, String url, boolean enabled, String updates, String checksums )
{
RepositoryPolicy policy = new RepositoryPolicy( enabled, updates, checksums );
return new RemoteRepository.Builder( id, "test", url ).setPolicy( policy );
}
private void assertEqual( RemoteRepository expected, RemoteRepository actual )
{
assertEquals( "id", expected.getId(), actual.getId() );
assertEquals( "url", expected.getUrl(), actual.getUrl() );
assertEquals( "type", expected.getContentType(), actual.getContentType() );
assertEqual( expected.getPolicy( false ), actual.getPolicy( false ) );
assertEqual( expected.getPolicy( true ), actual.getPolicy( true ) );
}
private void assertEqual( RepositoryPolicy expected, RepositoryPolicy actual )
{
assertEquals( "enabled", expected.isEnabled(), actual.isEnabled() );
assertEquals( "checksums", expected.getChecksumPolicy(), actual.getChecksumPolicy() );
assertEquals( "updates", expected.getUpdatePolicy(), actual.getUpdatePolicy() );
}
@Test
public void testGetPolicy()
{
RepositoryPolicy snapshotPolicy =
new RepositoryPolicy( true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, RepositoryPolicy.CHECKSUM_POLICY_IGNORE );
RepositoryPolicy releasePolicy =
new RepositoryPolicy( true, RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_FAIL );
RemoteRepository repo = new RemoteRepository.Builder( "id", "type", "http://localhost" ) //
.setSnapshotPolicy( snapshotPolicy ).setReleasePolicy( releasePolicy ).build();
RepositoryPolicy effectivePolicy = manager.getPolicy( session, repo, true, true );
assertEquals( true, effectivePolicy.isEnabled() );
assertEquals( RepositoryPolicy.CHECKSUM_POLICY_IGNORE, effectivePolicy.getChecksumPolicy() );
assertEquals( RepositoryPolicy.UPDATE_POLICY_ALWAYS, effectivePolicy.getUpdatePolicy() );
}
@Test
public void testAggregateSimpleRepos()
{
RemoteRepository dominant1 = newRepo( "a", "file://", false, "", "" ).build();
RemoteRepository recessive1 = newRepo( "a", "http://", true, "", "" ).build();
RemoteRepository recessive2 = newRepo( "b", "file://", true, "", "" ).build();
List<RemoteRepository> result =
manager.aggregateRepositories( session, Arrays.asList( dominant1 ),
Arrays.asList( recessive1, recessive2 ), false );
assertEquals( 2, result.size() );
assertEqual( dominant1, result.get( 0 ) );
assertEqual( recessive2, result.get( 1 ) );
}
@Test
public void testAggregateSimpleRepos_MustKeepDisabledRecessiveRepo()
{
RemoteRepository dominant = newRepo( "a", "file://", true, "", "" ).build();
RemoteRepository recessive1 = newRepo( "b", "http://", false, "", "" ).build();
List<RemoteRepository> result =
manager.aggregateRepositories( session, Arrays.asList( dominant ), Arrays.asList( recessive1 ), false );
RemoteRepository recessive2 = newRepo( recessive1.getId(), "http://", true, "", "" ).build();
result = manager.aggregateRepositories( session, result, Arrays.asList( recessive2 ), false );
assertEquals( 2, result.size() );
assertEqual( dominant, result.get( 0 ) );
assertEqual( recessive1, result.get( 1 ) );
}
@Test
public void testAggregateMirrorRepos_DominantMirrorComplete()
{
RemoteRepository dominant1 = newRepo( "a", "http://", false, "", "" ).build();
RemoteRepository dominantMirror1 =
newRepo( "x", "file://", false, "", "" ).addMirroredRepository( dominant1 ).build();
RemoteRepository recessive1 = newRepo( "a", "https://", true, "", "" ).build();
RemoteRepository recessiveMirror1 =
newRepo( "x", "http://", true, "", "" ).addMirroredRepository( recessive1 ).build();
List<RemoteRepository> result =
manager.aggregateRepositories( session, Arrays.asList( dominantMirror1 ),
Arrays.asList( recessiveMirror1 ), false );
assertEquals( 1, result.size() );
assertEqual( dominantMirror1, result.get( 0 ) );
assertEquals( 1, result.get( 0 ).getMirroredRepositories().size() );
assertEquals( dominant1, result.get( 0 ).getMirroredRepositories().get( 0 ) );
}
@Test
public void testAggregateMirrorRepos_DominantMirrorIncomplete()
{
RemoteRepository dominant1 = newRepo( "a", "http://", false, "", "" ).build();
RemoteRepository dominantMirror1 =
newRepo( "x", "file://", false, "", "" ).addMirroredRepository( dominant1 ).build();
RemoteRepository recessive1 = newRepo( "a", "https://", true, "", "" ).build();
RemoteRepository recessive2 = newRepo( "b", "https://", true, "", "" ).build();
RemoteRepository recessiveMirror1 =
newRepo( "x", "http://", true, "", "" ).setMirroredRepositories( Arrays.asList( recessive1, recessive2 ) ).build();
List<RemoteRepository> result =
manager.aggregateRepositories( session, Arrays.asList( dominantMirror1 ),
Arrays.asList( recessiveMirror1 ), false );
assertEquals( 1, result.size() );
assertEqual( newRepo( "x", "file://", true, "", "" ).build(), result.get( 0 ) );
assertEquals( 2, result.get( 0 ).getMirroredRepositories().size() );
assertEquals( dominant1, result.get( 0 ).getMirroredRepositories().get( 0 ) );
assertEquals( recessive2, result.get( 0 ).getMirroredRepositories().get( 1 ) );
}
@Test
public void testMirrorAuthentication()
{
final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
final RemoteRepository mirror =
newRepo( "a", "http://", true, "", "" ).setAuthentication( new AuthenticationBuilder().addUsername( "test" ).build() ).build();
session.setMirrorSelector( new MirrorSelector()
{
public RemoteRepository getMirror( RemoteRepository repository )
{
return mirror;
}
} );
List<RemoteRepository> result =
manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
true );
assertEquals( 1, result.size() );
assertSame( mirror.getAuthentication(), result.get( 0 ).getAuthentication() );
}
@Test
public void testMirrorProxy()
{
final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
final RemoteRepository mirror =
newRepo( "a", "http://", true, "", "" ).setProxy( new Proxy( "http", "host", 2011, null ) ).build();
session.setMirrorSelector( new MirrorSelector()
{
public RemoteRepository getMirror( RemoteRepository repository )
{
return mirror;
}
} );
List<RemoteRepository> result =
manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
true );
assertEquals( 1, result.size() );
assertEquals( "http", result.get( 0 ).getProxy().getType() );
assertEquals( "host", result.get( 0 ).getProxy().getHost() );
assertEquals( 2011, result.get( 0 ).getProxy().getPort() );
}
@Test
public void testProxySelector()
{
final RemoteRepository repo = newRepo( "a", "http://", true, "", "" ).build();
final Proxy proxy = new Proxy( "http", "host", 2011, null );
session.setProxySelector( new ProxySelector()
{
public Proxy getProxy( RemoteRepository repository )
{
return proxy;
}
} );
session.setMirrorSelector( new MirrorSelector()
{
public RemoteRepository getMirror( RemoteRepository repository )
{
return null;
}
} );
List<RemoteRepository> result =
manager.aggregateRepositories( session, Collections.<RemoteRepository> emptyList(), Arrays.asList( repo ),
true );
assertEquals( 1, result.size() );
assertEquals( "http", result.get( 0 ).getProxy().getType() );
assertEquals( "host", result.get( 0 ).getProxy().getHost() );
assertEquals( 2011, result.get( 0 ).getProxy().getPort() );
}
private static class StubUpdatePolicyAnalyzer
implements UpdatePolicyAnalyzer
{
public String getEffectiveUpdatePolicy( RepositorySystemSession session, String policy1, String policy2 )
{
return ordinalOfUpdatePolicy( policy1 ) < ordinalOfUpdatePolicy( policy2 ) ? policy1 : policy2;
}
private int ordinalOfUpdatePolicy( String policy )
{
if ( RepositoryPolicy.UPDATE_POLICY_DAILY.equals( policy ) )
{
return 1440;
}
else if ( RepositoryPolicy.UPDATE_POLICY_ALWAYS.equals( policy ) )
{
return 0;
}
else if ( policy != null && policy.startsWith( RepositoryPolicy.UPDATE_POLICY_INTERVAL ) )
{
String s = policy.substring( RepositoryPolicy.UPDATE_POLICY_INTERVAL.length() + 1 );
return Integer.valueOf( s );
}
else
{
// assume "never"
return Integer.MAX_VALUE;
}
}
public boolean isUpdatedRequired( RepositorySystemSession session, long lastModified, String policy )
{
return false;
}
}
}