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.io.File; 025import java.net.URI; 026import java.util.Calendar; 027import java.util.Date; 028import java.util.TimeZone; 029 030import org.eclipse.aether.DefaultRepositorySystemSession; 031import org.eclipse.aether.RepositorySystemSession; 032import org.eclipse.aether.artifact.Artifact; 033import org.eclipse.aether.artifact.DefaultArtifact; 034import org.eclipse.aether.impl.UpdateCheck; 035import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager; 036import org.eclipse.aether.internal.test.util.TestFileUtils; 037import org.eclipse.aether.internal.test.util.TestUtils; 038import org.eclipse.aether.metadata.DefaultMetadata; 039import org.eclipse.aether.metadata.Metadata; 040import org.eclipse.aether.repository.RemoteRepository; 041import org.eclipse.aether.repository.RepositoryPolicy; 042import org.eclipse.aether.transfer.ArtifactNotFoundException; 043import org.eclipse.aether.transfer.ArtifactTransferException; 044import org.eclipse.aether.transfer.MetadataNotFoundException; 045import org.eclipse.aether.transfer.MetadataTransferException; 046import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy; 047import org.junit.After; 048import org.junit.Before; 049import org.junit.Test; 050 051/** 052 */ 053public class DefaultUpdateCheckManagerTest 054{ 055 056 private static final long HOUR = 60L * 60L * 1000L; 057 058 private DefaultUpdateCheckManager manager; 059 060 private DefaultRepositorySystemSession session; 061 062 private Metadata metadata; 063 064 private RemoteRepository repository; 065 066 private Artifact artifact; 067 068 @Before 069 public void setup() 070 throws Exception 071 { 072 File dir = TestFileUtils.createTempFile( "" ); 073 TestFileUtils.deleteFile( dir ); 074 075 File metadataFile = new File( dir, "metadata.txt" ); 076 TestFileUtils.writeString( metadataFile, "metadata" ); 077 File artifactFile = new File( dir, "artifact.txt" ); 078 TestFileUtils.writeString( artifactFile, "artifact" ); 079 080 session = TestUtils.newSession(); 081 repository = 082 new RemoteRepository.Builder( "id", "default", TestFileUtils.createTempDir().toURI().toURL().toString() ).build(); 083 manager = new DefaultUpdateCheckManager() 084 .setUpdatePolicyAnalyzer( new DefaultUpdatePolicyAnalyzer() ) 085 .setTrackingFileManager( new DefaultTrackingFileManager() ); 086 metadata = 087 new DefaultMetadata( "gid", "aid", "ver", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT, 088 metadataFile ); 089 artifact = new DefaultArtifact( "gid", "aid", "", "ext", "ver" ).setFile( artifactFile ); 090 } 091 092 @After 093 public void teardown() 094 throws Exception 095 { 096 new File( metadata.getFile().getParent(), "resolver-status.properties" ).delete(); 097 new File( artifact.getFile().getPath() + ".lastUpdated" ).delete(); 098 metadata.getFile().delete(); 099 artifact.getFile().delete(); 100 TestFileUtils.deleteFile( new File( new URI( repository.getUrl() ) ) ); 101 } 102 103 static void resetSessionData( RepositorySystemSession session ) 104 { 105 session.getData().set( "updateCheckManager.checks", null ); 106 } 107 108 private UpdateCheck<Metadata, MetadataTransferException> newMetadataCheck() 109 { 110 UpdateCheck<Metadata, MetadataTransferException> check = new UpdateCheck<>(); 111 check.setItem( metadata ); 112 check.setFile( metadata.getFile() ); 113 check.setRepository( repository ); 114 check.setAuthoritativeRepository( repository ); 115 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_INTERVAL + ":10" ); 116 return check; 117 } 118 119 private UpdateCheck<Artifact, ArtifactTransferException> newArtifactCheck() 120 { 121 UpdateCheck<Artifact, ArtifactTransferException> check = new UpdateCheck<>(); 122 check.setItem( artifact ); 123 check.setFile( artifact.getFile() ); 124 check.setRepository( repository ); 125 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_INTERVAL + ":10" ); 126 return check; 127 } 128 129 @Test( expected = Exception.class ) 130 public void testCheckMetadataFailOnNoFile() 131 { 132 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 133 check.setItem( metadata.setFile( null ) ); 134 check.setFile( null ); 135 136 manager.checkMetadata( session, check ); 137 } 138 139 @Test 140 public void testCheckMetadataUpdatePolicyRequired() 141 { 142 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 143 144 Calendar cal = Calendar.getInstance(); 145 cal.add( Calendar.DATE, -1 ); 146 check.setLocalLastUpdated( cal.getTimeInMillis() ); 147 148 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 149 manager.checkMetadata( session, check ); 150 assertNull( check.getException() ); 151 assertTrue( check.isRequired() ); 152 153 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 154 manager.checkMetadata( session, check ); 155 assertNull( check.getException() ); 156 assertTrue( check.isRequired() ); 157 158 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_INTERVAL + ":60" ); 159 manager.checkMetadata( session, check ); 160 assertNull( check.getException() ); 161 assertTrue( check.isRequired() ); 162 } 163 164 @Test 165 public void testCheckMetadataUpdatePolicyNotRequired() 166 { 167 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 168 169 check.setLocalLastUpdated( System.currentTimeMillis() ); 170 171 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 172 manager.checkMetadata( session, check ); 173 assertFalse( check.isRequired() ); 174 175 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 176 manager.checkMetadata( session, check ); 177 assertFalse( check.isRequired() ); 178 179 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_INTERVAL + ":61" ); 180 manager.checkMetadata( session, check ); 181 assertFalse( check.isRequired() ); 182 183 check.setPolicy( "no particular policy" ); 184 manager.checkMetadata( session, check ); 185 assertFalse( check.isRequired() ); 186 } 187 188 @Test 189 public void testCheckMetadata() 190 { 191 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 192 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 193 194 // existing file, never checked before 195 manager.checkMetadata( session, check ); 196 assertTrue( check.isRequired() ); 197 198 // just checked 199 manager.touchMetadata( session, check ); 200 resetSessionData( session ); 201 202 check = newMetadataCheck(); 203 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_INTERVAL + ":60" ); 204 205 manager.checkMetadata( session, check ); 206 assertFalse( check.isRequired() ); 207 208 // no local file 209 check.getFile().delete(); 210 manager.checkMetadata( session, check ); 211 assertTrue( check.isRequired() ); 212 // (! file.exists && ! repoKey) -> no timestamp 213 } 214 215 @Test 216 public void testCheckMetadataNoLocalFile() 217 { 218 metadata.getFile().delete(); 219 220 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 221 222 long lastUpdate = new Date().getTime() - HOUR; 223 check.setLocalLastUpdated( lastUpdate ); 224 225 // ! file.exists && updateRequired -> check in remote repo 226 check.setLocalLastUpdated( lastUpdate ); 227 manager.checkMetadata( session, check ); 228 assertTrue( check.isRequired() ); 229 } 230 231 @Test 232 public void testCheckMetadataNotFoundInRepoCachingEnabled() 233 { 234 metadata.getFile().delete(); 235 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 236 237 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 238 239 check.setException( new MetadataNotFoundException( metadata, repository, "" ) ); 240 manager.touchMetadata( session, check ); 241 resetSessionData( session ); 242 243 // ! file.exists && ! updateRequired -> artifact not found in remote repo 244 check = newMetadataCheck().setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 245 manager.checkMetadata( session, check ); 246 assertFalse( check.isRequired() ); 247 assertTrue( check.getException() instanceof MetadataNotFoundException ); 248 assertTrue( check.getException().isFromCache() ); 249 } 250 251 @Test 252 public void testCheckMetadataNotFoundInRepoCachingDisabled() 253 { 254 metadata.getFile().delete(); 255 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( false, false ) ); 256 257 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 258 259 check.setException( new MetadataNotFoundException( metadata, repository, "" ) ); 260 manager.touchMetadata( session, check ); 261 resetSessionData( session ); 262 263 // ! file.exists && updateRequired -> check in remote repo 264 check = newMetadataCheck().setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 265 manager.checkMetadata( session, check ); 266 assertTrue( check.isRequired() ); 267 assertNull( check.getException() ); 268 } 269 270 @Test 271 public void testCheckMetadataErrorFromRepoCachingEnabled() 272 { 273 metadata.getFile().delete(); 274 275 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 276 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 277 278 check.setException( new MetadataTransferException( metadata, repository, "some error" ) ); 279 manager.touchMetadata( session, check ); 280 resetSessionData( session ); 281 282 // ! file.exists && ! updateRequired && previousError -> depends on transfer error caching 283 check = newMetadataCheck(); 284 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( false, true ) ); 285 manager.checkMetadata( session, check ); 286 assertFalse( check.isRequired() ); 287 assertTrue( check.getException() instanceof MetadataTransferException ); 288 assertTrue( String.valueOf( check.getException() ), check.getException().getMessage().contains( "some error" ) ); 289 assertTrue( check.getException().isFromCache() ); 290 } 291 292 @Test 293 public void testCheckMetadataErrorFromRepoCachingDisabled() 294 { 295 metadata.getFile().delete(); 296 297 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 298 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 299 300 check.setException( new MetadataTransferException( metadata, repository, "some error" ) ); 301 manager.touchMetadata( session, check ); 302 resetSessionData( session ); 303 304 // ! file.exists && ! updateRequired && previousError -> depends on transfer error caching 305 check = newMetadataCheck(); 306 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( false, false ) ); 307 manager.checkMetadata( session, check ); 308 assertTrue( check.isRequired() ); 309 assertNull( check.getException() ); 310 } 311 312 @Test 313 public void testCheckMetadataAtMostOnceDuringSessionEvenIfUpdatePolicyAlways() 314 { 315 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 316 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 317 318 // first check 319 manager.checkMetadata( session, check ); 320 assertTrue( check.isRequired() ); 321 322 manager.touchMetadata( session, check ); 323 324 // second check in same session 325 manager.checkMetadata( session, check ); 326 assertFalse( check.isRequired() ); 327 } 328 329 @Test 330 public void testCheckMetadataSessionStateModes() 331 { 332 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 333 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 334 manager.touchMetadata( session, check ); 335 336 session.setConfigProperty( DefaultUpdateCheckManager.CONFIG_PROP_SESSION_STATE, "bypass" ); 337 manager.checkMetadata( session, check ); 338 assertTrue( check.isRequired() ); 339 340 resetSessionData( session ); 341 manager.touchMetadata( session, check ); 342 343 // TODO This will be changed to 'enabled' in a future version 344 session.setConfigProperty( DefaultUpdateCheckManager.CONFIG_PROP_SESSION_STATE, "true" ); 345 manager.checkMetadata( session, check ); 346 assertFalse( check.isRequired() ); 347 348 // TODO This will be changed to 'disabled' in a future version 349 session.setConfigProperty( DefaultUpdateCheckManager.CONFIG_PROP_SESSION_STATE, "false" ); 350 manager.checkMetadata( session, check ); 351 assertTrue( check.isRequired() ); 352 } 353 354 @Test 355 public void testCheckMetadataAtMostOnceDuringSessionEvenIfUpdatePolicyAlways_InvalidFile() 356 { 357 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 358 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 359 check.setFileValid( false ); 360 361 // first check 362 manager.checkMetadata( session, check ); 363 assertTrue( check.isRequired() ); 364 365 // first touch, without exception 366 manager.touchMetadata( session, check ); 367 368 // another check in same session 369 manager.checkMetadata( session, check ); 370 assertTrue( check.isRequired() ); 371 372 // another touch, with exception 373 check.setException( new MetadataNotFoundException( check.getItem(), check.getRepository() ) ); 374 manager.touchMetadata( session, check ); 375 376 // another check in same session 377 manager.checkMetadata( session, check ); 378 assertFalse( check.isRequired() ); 379 } 380 381 @Test 382 public void testCheckMetadataAtMostOnceDuringSessionEvenIfUpdatePolicyAlways_DifferentRepoIdSameUrl() 383 { 384 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 385 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 386 check.setFileValid( false ); 387 388 // first check 389 manager.checkMetadata( session, check ); 390 assertTrue( check.isRequired() ); 391 392 manager.touchMetadata( session, check ); 393 394 // second check in same session but for repo with different id 395 check.setRepository( new RemoteRepository.Builder( check.getRepository() ).setId( "check" ).build() ); 396 manager.checkMetadata( session, check ); 397 assertTrue( check.isRequired() ); 398 } 399 400 @Test 401 public void testCheckMetadataWhenLocallyMissingEvenIfUpdatePolicyIsNever() 402 { 403 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 404 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 405 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 406 407 check.getFile().delete(); 408 assertFalse( check.getFile().getAbsolutePath(), check.getFile().exists() ); 409 410 manager.checkMetadata( session, check ); 411 assertTrue( check.isRequired() ); 412 } 413 414 @Test 415 public void testCheckMetadataWhenLocallyPresentButInvalidEvenIfUpdatePolicyIsNever() 416 { 417 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 418 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 419 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 420 421 manager.touchMetadata( session, check ); 422 resetSessionData( session ); 423 424 check.setFileValid( false ); 425 426 manager.checkMetadata( session, check ); 427 assertTrue( check.isRequired() ); 428 } 429 430 @Test 431 public void testCheckMetadataWhenLocallyDeletedEvenIfTimestampUpToDate() 432 { 433 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 434 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 435 436 manager.touchMetadata( session, check ); 437 resetSessionData( session ); 438 439 check.getFile().delete(); 440 assertFalse( check.getFile().getAbsolutePath(), check.getFile().exists() ); 441 442 manager.checkMetadata( session, check ); 443 assertTrue( check.isRequired() ); 444 } 445 446 @Test 447 public void testCheckMetadataNotWhenUpdatePolicyIsNeverAndTimestampIsUnavailable() 448 { 449 UpdateCheck<Metadata, MetadataTransferException> check = newMetadataCheck(); 450 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 451 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 452 453 manager.checkMetadata( session, check ); 454 assertFalse( check.isRequired() ); 455 } 456 457 @Test( expected = NullPointerException.class ) 458 public void testCheckArtifactFailOnNoFile() 459 { 460 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 461 check.setItem( artifact.setFile( null ) ); 462 check.setFile( null ); 463 464 manager.checkArtifact( session, check ); 465 assertNotNull( check.getException() ); 466 } 467 468 @Test 469 public void testCheckArtifactUpdatePolicyRequired() 470 { 471 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 472 check.setItem( artifact ); 473 check.setFile( artifact.getFile() ); 474 475 Calendar cal = Calendar.getInstance( TimeZone.getTimeZone( "UTC" ) ); 476 cal.add( Calendar.DATE, -1 ); 477 long lastUpdate = cal.getTimeInMillis(); 478 artifact.getFile().setLastModified( lastUpdate ); 479 check.setLocalLastUpdated( lastUpdate ); 480 481 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 482 manager.checkArtifact( session, check ); 483 assertNull( check.getException() ); 484 assertTrue( check.isRequired() ); 485 486 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 487 manager.checkArtifact( session, check ); 488 assertNull( check.getException() ); 489 assertTrue( check.isRequired() ); 490 491 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_INTERVAL + ":60" ); 492 manager.checkArtifact( session, check ); 493 assertNull( check.getException() ); 494 assertTrue( check.isRequired() ); 495 } 496 497 @Test 498 public void testCheckArtifactUpdatePolicyNotRequired() 499 { 500 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 501 check.setItem( artifact ); 502 check.setFile( artifact.getFile() ); 503 504 Calendar cal = Calendar.getInstance( TimeZone.getTimeZone( "UTC" ) ); 505 cal.add( Calendar.HOUR_OF_DAY, -1 ); 506 check.setLocalLastUpdated( cal.getTimeInMillis() ); 507 508 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 509 manager.checkArtifact( session, check ); 510 assertFalse( check.isRequired() ); 511 512 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 513 manager.checkArtifact( session, check ); 514 assertFalse( check.isRequired() ); 515 516 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_INTERVAL + ":61" ); 517 manager.checkArtifact( session, check ); 518 assertFalse( check.isRequired() ); 519 520 check.setPolicy( "no particular policy" ); 521 manager.checkArtifact( session, check ); 522 assertFalse( check.isRequired() ); 523 } 524 525 @Test 526 public void testCheckArtifact() 527 { 528 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 529 long fifteenMinutes = new Date().getTime() - ( 15L * 60L * 1000L ); 530 check.getFile().setLastModified( fifteenMinutes ); 531 // time is truncated on setLastModfied 532 fifteenMinutes = check.getFile().lastModified(); 533 534 // never checked before 535 manager.checkArtifact( session, check ); 536 assertTrue( check.isRequired() ); 537 538 // just checked 539 check.setLocalLastUpdated( 0L ); 540 long lastUpdate = new Date().getTime(); 541 check.getFile().setLastModified( lastUpdate ); 542 lastUpdate = check.getFile().lastModified(); 543 544 manager.checkArtifact( session, check ); 545 assertFalse( check.isRequired() ); 546 547 // no local file, no repo timestamp 548 check.setLocalLastUpdated( 0L ); 549 check.getFile().delete(); 550 manager.checkArtifact( session, check ); 551 assertTrue( check.isRequired() ); 552 } 553 554 @Test 555 public void testCheckArtifactNoLocalFile() 556 { 557 artifact.getFile().delete(); 558 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 559 560 long lastUpdate = new Date().getTime() - HOUR; 561 562 // ! file.exists && updateRequired -> check in remote repo 563 check.setLocalLastUpdated( lastUpdate ); 564 manager.checkArtifact( session, check ); 565 assertTrue( check.isRequired() ); 566 } 567 568 @Test 569 public void testCheckArtifactNotFoundInRepoCachingEnabled() 570 { 571 artifact.getFile().delete(); 572 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 573 574 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 575 check.setException( new ArtifactNotFoundException( artifact, repository ) ); 576 manager.touchArtifact( session, check ); 577 resetSessionData( session ); 578 579 // ! file.exists && ! updateRequired -> artifact not found in remote repo 580 check = newArtifactCheck().setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 581 manager.checkArtifact( session, check ); 582 assertFalse( check.isRequired() ); 583 assertTrue( check.getException() instanceof ArtifactNotFoundException ); 584 assertTrue( check.getException().isFromCache() ); 585 } 586 587 @Test 588 public void testCheckArtifactNotFoundInRepoCachingDisabled() 589 { 590 artifact.getFile().delete(); 591 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( false, false ) ); 592 593 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 594 check.setException( new ArtifactNotFoundException( artifact, repository ) ); 595 manager.touchArtifact( session, check ); 596 resetSessionData( session ); 597 598 // ! file.exists && updateRequired -> check in remote repo 599 check = newArtifactCheck().setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 600 manager.checkArtifact( session, check ); 601 assertTrue( check.isRequired() ); 602 assertNull( check.getException() ); 603 } 604 605 @Test 606 public void testCheckArtifactErrorFromRepoCachingEnabled() 607 { 608 artifact.getFile().delete(); 609 610 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 611 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 612 check.setException( new ArtifactTransferException( artifact, repository, "some error" ) ); 613 manager.touchArtifact( session, check ); 614 resetSessionData( session ); 615 616 // ! file.exists && ! updateRequired && previousError -> depends on transfer error caching 617 check = newArtifactCheck(); 618 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( false, true ) ); 619 manager.checkArtifact( session, check ); 620 assertFalse( check.isRequired() ); 621 assertTrue( check.getException() instanceof ArtifactTransferException ); 622 assertTrue( check.getException().isFromCache() ); 623 } 624 625 @Test 626 public void testCheckArtifactErrorFromRepoCachingDisabled() 627 { 628 artifact.getFile().delete(); 629 630 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 631 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_DAILY ); 632 check.setException( new ArtifactTransferException( artifact, repository, "some error" ) ); 633 manager.touchArtifact( session, check ); 634 resetSessionData( session ); 635 636 // ! file.exists && ! updateRequired && previousError -> depends on transfer error caching 637 check = newArtifactCheck(); 638 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( false, false ) ); 639 manager.checkArtifact( session, check ); 640 assertTrue( check.isRequired() ); 641 assertNull( check.getException() ); 642 } 643 644 @Test 645 public void testCheckArtifactAtMostOnceDuringSessionEvenIfUpdatePolicyAlways() 646 { 647 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 648 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 649 650 // first check 651 manager.checkArtifact( session, check ); 652 assertTrue( check.isRequired() ); 653 654 manager.touchArtifact( session, check ); 655 656 // second check in same session 657 manager.checkArtifact( session, check ); 658 assertFalse( check.isRequired() ); 659 } 660 661 @Test 662 public void testCheckArtifactSessionStateModes() 663 { 664 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 665 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 666 manager.touchArtifact( session, check ); 667 668 session.setConfigProperty( DefaultUpdateCheckManager.CONFIG_PROP_SESSION_STATE, "bypass" ); 669 manager.checkArtifact( session, check ); 670 assertTrue( check.isRequired() ); 671 672 resetSessionData( session ); 673 manager.touchArtifact( session, check ); 674 675 session.setConfigProperty( DefaultUpdateCheckManager.CONFIG_PROP_SESSION_STATE, "true" ); 676 manager.checkArtifact( session, check ); 677 assertFalse( check.isRequired() ); 678 679 session.setConfigProperty( DefaultUpdateCheckManager.CONFIG_PROP_SESSION_STATE, "false" ); 680 manager.checkArtifact( session, check ); 681 assertTrue( check.isRequired() ); 682 } 683 684 @Test 685 public void testCheckArtifactAtMostOnceDuringSessionEvenIfUpdatePolicyAlways_InvalidFile() 686 { 687 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 688 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 689 check.setFileValid( false ); 690 691 // first check 692 manager.checkArtifact( session, check ); 693 assertTrue( check.isRequired() ); 694 695 // first touch, without exception 696 manager.touchArtifact( session, check ); 697 698 // another check in same session 699 manager.checkArtifact( session, check ); 700 assertTrue( check.isRequired() ); 701 702 // another touch, with exception 703 check.setException( new ArtifactNotFoundException( check.getItem(), check.getRepository() ) ); 704 manager.touchArtifact( session, check ); 705 706 // another check in same session 707 manager.checkArtifact( session, check ); 708 assertFalse( check.isRequired() ); 709 } 710 711 @Test 712 public void testCheckArtifactAtMostOnceDuringSessionEvenIfUpdatePolicyAlways_DifferentRepoIdSameUrl() 713 { 714 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 715 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS ); 716 717 // first check 718 manager.checkArtifact( session, check ); 719 assertTrue( check.isRequired() ); 720 721 manager.touchArtifact( session, check ); 722 723 // second check in same session but for repo with different id 724 check.setRepository( new RemoteRepository.Builder( check.getRepository() ).setId( "check" ).build() ); 725 manager.checkArtifact( session, check ); 726 assertTrue( check.isRequired() ); 727 } 728 729 @Test 730 public void testCheckArtifactWhenLocallyMissingEvenIfUpdatePolicyIsNever() 731 { 732 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 733 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 734 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 735 736 check.getFile().delete(); 737 assertFalse( check.getFile().getAbsolutePath(), check.getFile().exists() ); 738 739 manager.checkArtifact( session, check ); 740 assertTrue( check.isRequired() ); 741 } 742 743 @Test 744 public void testCheckArtifactWhenLocallyPresentButInvalidEvenIfUpdatePolicyIsNever() 745 { 746 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 747 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 748 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 749 750 manager.touchArtifact( session, check ); 751 resetSessionData( session ); 752 753 check.setFileValid( false ); 754 755 manager.checkArtifact( session, check ); 756 assertTrue( check.isRequired() ); 757 } 758 759 @Test 760 public void testCheckArtifactWhenLocallyDeletedEvenIfTimestampUpToDate() 761 { 762 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 763 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 764 765 manager.touchArtifact( session, check ); 766 resetSessionData( session ); 767 768 check.getFile().delete(); 769 assertFalse( check.getFile().getAbsolutePath(), check.getFile().exists() ); 770 771 manager.checkArtifact( session, check ); 772 assertTrue( check.isRequired() ); 773 } 774 775 @Test 776 public void testCheckArtifactNotWhenUpdatePolicyIsNeverAndTimestampIsUnavailable() 777 { 778 UpdateCheck<Artifact, ArtifactTransferException> check = newArtifactCheck(); 779 check.setPolicy( RepositoryPolicy.UPDATE_POLICY_NEVER ); 780 session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) ); 781 782 manager.checkArtifact( session, check ); 783 assertFalse( check.isRequired() ); 784 } 785 786}