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