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