]> source.dussan.org Git - archiva.git/blob
bd51f350d65b2ed3235f81c04fc64079ac39def6
[archiva.git] /
1 package org.apache.archiva.proxy;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import net.sf.ehcache.CacheManager;
23 import org.apache.archiva.admin.model.beans.ManagedRepository;
24 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
25 import org.apache.archiva.admin.repository.managed.DefaultManagedRepositoryAdmin;
26 import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
27 import org.apache.archiva.configuration.ArchivaConfiguration;
28 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
29 import org.apache.archiva.configuration.ProxyConnectorConfiguration;
30 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
31 import org.apache.archiva.policies.CachedFailuresPolicy;
32 import org.apache.archiva.policies.ChecksumPolicy;
33 import org.apache.archiva.policies.PropagateErrorsDownloadPolicy;
34 import org.apache.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy;
35 import org.apache.archiva.policies.ReleasesPolicy;
36 import org.apache.archiva.policies.SnapshotsPolicy;
37 import org.apache.archiva.repository.ManagedRepositoryContent;
38 import org.apache.commons.lang.ArrayUtils;
39 import org.apache.maven.index.NexusIndexer;
40 import org.apache.maven.index.context.IndexingContext;
41 import org.apache.maven.wagon.Wagon;
42 import org.codehaus.plexus.util.FileUtils;
43 import org.easymock.ArgumentsMatcher;
44 import org.easymock.MockControl;
45 import org.junit.After;
46 import org.junit.Before;
47 import org.junit.runner.RunWith;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50 import org.springframework.context.ApplicationContext;
51 import org.springframework.test.context.ContextConfiguration;
52 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
53
54 import javax.inject.Inject;
55 import java.io.BufferedReader;
56 import java.io.File;
57 import java.io.FileReader;
58 import java.io.IOException;
59 import java.text.ParseException;
60 import java.text.SimpleDateFormat;
61 import java.util.ArrayList;
62 import java.util.Calendar;
63 import java.util.Collection;
64 import java.util.Date;
65 import java.util.Locale;
66
67 import static org.junit.Assert.*;
68
69 /**
70  * AbstractProxyTestCase
71  *
72  * @version $Id$
73  */
74 @RunWith( SpringJUnit4ClassRunner.class )
75 @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
76 public abstract class AbstractProxyTestCase
77 {
78     @Inject
79     protected ApplicationContext applicationContext;
80
81     protected static final String ID_LEGACY_PROXIED = "legacy-proxied";
82
83     protected static final String ID_PROXIED1 = "proxied1";
84
85     protected static final String ID_PROXIED1_TARGET = "proxied1-target";
86
87     protected static final String ID_PROXIED2 = "proxied2";
88
89     protected static final String ID_PROXIED2_TARGET = "proxied2-target";
90
91     protected static final String ID_DEFAULT_MANAGED = "default-managed-repository";
92
93     protected static final String ID_LEGACY_MANAGED = "legacy-managed-repository";
94
95     protected static final String REPOPATH_PROXIED_LEGACY = "src/test/repositories/legacy-proxied";
96
97     protected static final String REPOPATH_PROXIED1 = "src/test/repositories/proxied1";
98
99     protected static final String REPOPATH_PROXIED1_TARGET = "target/test-repository/proxied1";
100
101     protected static final String REPOPATH_PROXIED2 = "src/test/repositories/proxied2";
102
103     protected static final String REPOPATH_PROXIED2_TARGET = "target/test-repository/proxied2";
104
105     protected static final String REPOPATH_DEFAULT_MANAGED = "src/test/repositories/managed";
106
107     // protected static final String REPOPATH_DEFAULT_MANAGED_TARGET = "target/test-repository/managed";
108
109     protected static final String REPOPATH_LEGACY_MANAGED = "src/test/repositories/legacy-managed";
110
111     protected static final String REPOPATH_LEGACY_MANAGED_TARGET = "target/test-repository/legacy-managed";
112
113     protected MockControl wagonMockControl;
114
115     protected Wagon wagonMock;
116
117
118     protected RepositoryProxyConnectors proxyHandler;
119
120     protected ManagedRepositoryContent managedDefaultRepository;
121
122     protected File managedDefaultDir;
123
124     protected ManagedRepositoryContent managedLegacyRepository;
125
126     protected File managedLegacyDir;
127
128     protected MockConfiguration config;
129
130     protected Logger log = LoggerFactory.getLogger( getClass() );
131
132     WagonDelegate delegate;
133
134     @Inject
135     protected ManagedRepositoryAdmin managedRepositoryAdmin;
136
137     @Inject
138     PlexusSisuBridge plexusSisuBridge;
139
140     @Before
141     public void setUp()
142         throws Exception
143     {
144         config =
145             (MockConfiguration) applicationContext.getBean( "archivaConfiguration#mock", ArchivaConfiguration.class );
146
147         config.getConfiguration().setManagedRepositories( new ArrayList<ManagedRepositoryConfiguration>() );
148         config.getConfiguration().setRemoteRepositories( new ArrayList<RemoteRepositoryConfiguration>() );
149         config.getConfiguration().setProxyConnectors( new ArrayList<ProxyConnectorConfiguration>() );
150
151         // Setup source repository (using default layout)
152         String name = getClass().getSimpleName();
153         String repoPath = "target/test-repository/managed/" + name;
154         File repoLocation = new File( repoPath );
155
156         managedDefaultRepository =
157             createRepository( ID_DEFAULT_MANAGED, "Default Managed Repository", repoPath, "default" );
158
159         managedDefaultDir = new File( managedDefaultRepository.getRepoRoot() );
160
161         ManagedRepository repoConfig = managedDefaultRepository.getRepository();
162
163         ( (DefaultManagedRepositoryAdmin) applicationContext.getBean(
164             ManagedRepositoryAdmin.class ) ).setArchivaConfiguration( config );
165
166         applicationContext.getBean( ManagedRepositoryAdmin.class ).addManagedRepository( repoConfig, false, null );
167         //config.getConfiguration().addManagedRepository( repoConfig );
168
169         // Setup source repository (using legacy layout)
170         repoLocation = new File( REPOPATH_LEGACY_MANAGED_TARGET );
171         if ( repoLocation.exists() )
172         {
173             FileUtils.deleteDirectory( repoLocation );
174         }
175         copyDirectoryStructure( new File( REPOPATH_LEGACY_MANAGED ), repoLocation );
176
177         managedLegacyRepository =
178             createRepository( ID_LEGACY_MANAGED, "Legacy Managed Repository", REPOPATH_LEGACY_MANAGED_TARGET,
179                               "legacy" );
180
181         managedLegacyDir = new File( managedLegacyRepository.getRepoRoot() );
182
183         repoConfig = managedLegacyRepository.getRepository();
184
185         //config.getConfiguration().addManagedRepository( repoConfig );
186         applicationContext.getBean( ManagedRepositoryAdmin.class ).addManagedRepository( repoConfig, false, null );
187
188         // Setup target (proxied to) repository.
189         saveRemoteRepositoryConfig( ID_PROXIED1, "Proxied Repository 1",
190                                     new File( REPOPATH_PROXIED1 ).toURL().toExternalForm(), "default" );
191
192         // Setup target (proxied to) repository.
193         saveRemoteRepositoryConfig( ID_PROXIED2, "Proxied Repository 2",
194                                     new File( REPOPATH_PROXIED2 ).toURL().toExternalForm(), "default" );
195
196         // Setup target (proxied to) repository using legacy layout.
197         saveRemoteRepositoryConfig( ID_LEGACY_PROXIED, "Proxied Legacy Repository",
198                                     new File( REPOPATH_PROXIED_LEGACY ).toURL().toExternalForm(), "legacy" );
199
200         // Setup the proxy handler.
201         //proxyHandler = applicationContext.getBean (RepositoryProxyConnectors) lookup( RepositoryProxyConnectors.class.getName() );
202
203         proxyHandler = applicationContext.getBean( "repositoryProxyConnectors#test", RepositoryProxyConnectors.class );
204
205         // Setup the wagon mock.
206         wagonMockControl = MockControl.createNiceControl( Wagon.class );
207         wagonMock = (Wagon) wagonMockControl.getMock();
208
209         delegate = (WagonDelegate) plexusSisuBridge.lookup( Wagon.class, "test" );
210
211         delegate.setDelegate( wagonMock );
212
213         CacheManager.getInstance().clearAll();
214
215         log.info( "\n.\\ " + name + "() \\._________________________________________\n" );
216     }
217
218     @After
219     public void shutdown()
220         throws Exception
221     {
222         NexusIndexer nexusIndexer = plexusSisuBridge.lookup( NexusIndexer.class );
223
224         for ( IndexingContext indexingContext : nexusIndexer.getIndexingContexts().values() )
225         {
226             nexusIndexer.removeIndexingContext( indexingContext, false );
227         }
228     }
229
230
231     protected static final ArgumentsMatcher customWagonGetIfNewerMatcher = new ArgumentsMatcher()
232     {
233
234         public boolean matches( Object[] expected, Object[] actual )
235         {
236             if ( expected.length < 1 || actual.length < 1 )
237             {
238                 return false;
239             }
240             return MockControl.ARRAY_MATCHER.matches( ArrayUtils.remove( expected, 1 ),
241                                                       ArrayUtils.remove( actual, 1 ) );
242         }
243
244         public String toString( Object[] arguments )
245         {
246             return ArrayUtils.toString( arguments );
247         }
248     };
249
250     protected static final ArgumentsMatcher customWagonGetMatcher = new ArgumentsMatcher()
251     {
252
253         public boolean matches( Object[] expected, Object[] actual )
254         {
255             if ( expected.length == 2 && actual.length == 2 )
256             {
257                 if ( expected[0] == null && actual[0] == null )
258                 {
259                     return true;
260                 }
261
262                 if ( expected[0] == null )
263                 {
264                     return actual[0] == null;
265                 }
266
267                 if ( actual[0] == null )
268                 {
269                     return expected[0] == null;
270                 }
271
272                 return expected[0].equals( actual[0] );
273             }
274             return false;
275         }
276
277         public String toString( Object[] arguments )
278         {
279             return ArrayUtils.toString( arguments );
280         }
281     };
282
283
284     protected void assertChecksums( File expectedFile, String expectedSha1Contents, String expectedMd5Contents )
285         throws Exception
286     {
287         File sha1File = new File( expectedFile.getAbsolutePath() + ".sha1" );
288         File md5File = new File( expectedFile.getAbsolutePath() + ".md5" );
289
290         if ( expectedSha1Contents == null )
291         {
292             assertFalse( "SHA1 File should NOT exist: " + sha1File.getPath(), sha1File.exists() );
293         }
294         else
295         {
296             assertTrue( "SHA1 File should exist: " + sha1File.getPath(), sha1File.exists() );
297             String actualSha1Contents = readChecksumFile( sha1File );
298             assertEquals( "SHA1 File contents: " + sha1File.getPath(), expectedSha1Contents, actualSha1Contents );
299         }
300
301         if ( expectedMd5Contents == null )
302         {
303             assertFalse( "MD5 File should NOT exist: " + md5File.getPath(), md5File.exists() );
304         }
305         else
306         {
307             assertTrue( "MD5 File should exist: " + md5File.getPath(), md5File.exists() );
308             String actualMd5Contents = readChecksumFile( md5File );
309             assertEquals( "MD5 File contents: " + md5File.getPath(), expectedMd5Contents, actualMd5Contents );
310         }
311     }
312
313     protected void assertFileEquals( File expectedFile, File actualFile, File sourceFile )
314         throws Exception
315     {
316         assertNotNull( "Expected File should not be null.", expectedFile );
317         assertNotNull( "Actual File should not be null.", actualFile );
318
319         assertTrue( "Check actual file exists.", actualFile.exists() );
320         assertEquals( "Check filename path is appropriate.", expectedFile.getCanonicalPath(),
321                       actualFile.getCanonicalPath() );
322         assertEquals( "Check file path matches.", expectedFile.getAbsolutePath(), actualFile.getAbsolutePath() );
323
324         String expectedContents = org.apache.commons.io.FileUtils.readFileToString( sourceFile, null );
325         String actualContents = org.apache.commons.io.FileUtils.readFileToString( actualFile, null );
326         assertEquals( "Check file contents.", expectedContents, actualContents );
327     }
328
329     protected void assertNotDownloaded( File downloadedFile )
330     {
331         assertNull( "Found file: " + downloadedFile + "; but was expecting a failure", downloadedFile );
332     }
333
334     @SuppressWarnings( "unchecked" )
335     protected void assertNoTempFiles( File expectedFile )
336     {
337         File workingDir = expectedFile.getParentFile();
338         if ( ( workingDir == null ) || !workingDir.isDirectory() )
339         {
340             return;
341         }
342
343         Collection<File> tmpFiles =
344             org.apache.commons.io.FileUtils.listFiles( workingDir, new String[]{ "tmp" }, false );
345         if ( !tmpFiles.isEmpty() )
346         {
347             StringBuffer emsg = new StringBuffer();
348             emsg.append( "Found Temp Files in dir: " ).append( workingDir.getPath() );
349             for ( File tfile : tmpFiles )
350             {
351                 emsg.append( "\n   " ).append( tfile.getName() );
352             }
353             fail( emsg.toString() );
354         }
355     }
356
357     /**
358      * A faster recursive copy that omits .svn directories.
359      *
360      * @param sourceDirectory the source directory to copy
361      * @param destDirectory   the target location
362      * @throws java.io.IOException if there is a copying problem
363      * @todo get back into plexus-utils, share with converter module
364      */
365     protected void copyDirectoryStructure( File sourceDirectory, File destDirectory )
366         throws IOException
367     {
368         if ( !sourceDirectory.exists() )
369         {
370             throw new IOException( "Source directory doesn't exists (" + sourceDirectory.getAbsolutePath() + ")." );
371         }
372
373         File[] files = sourceDirectory.listFiles();
374
375         String sourcePath = sourceDirectory.getAbsolutePath();
376
377         for ( int i = 0; i < files.length; i++ )
378         {
379             File file = files[i];
380
381             String dest = file.getAbsolutePath();
382
383             dest = dest.substring( sourcePath.length() + 1 );
384
385             File destination = new File( destDirectory, dest );
386
387             if ( file.isFile() )
388             {
389                 destination = destination.getParentFile();
390
391                 org.apache.commons.io.FileUtils.copyFile( file, new File( destination, file.getName() ), false );
392                 // TODO: Change when there is a FileUtils.copyFileToDirectory(file, destination, boolean) option
393                 //FileUtils.copyFileToDirectory( file, destination );
394             }
395             else if ( file.isDirectory() )
396             {
397                 if ( !".svn".equals( file.getName() ) )
398                 {
399                     if ( !destination.exists() && !destination.mkdirs() )
400                     {
401                         throw new IOException(
402                             "Could not create destination directory '" + destination.getAbsolutePath() + "'." );
403                     }
404
405                     copyDirectoryStructure( file, destination );
406                 }
407             }
408             else
409             {
410                 throw new IOException( "Unknown file type: " + file.getAbsolutePath() );
411             }
412         }
413     }
414
415     protected ManagedRepositoryContent createManagedLegacyRepository()
416         throws Exception
417     {
418         return createRepository( "testManagedLegacyRepo", "Test Managed (Legacy) Repository",
419                                  "src/test/repositories/legacy-managed", "legacy" );
420     }
421
422     protected ManagedRepositoryContent createProxiedLegacyRepository()
423         throws Exception
424     {
425         return createRepository( "testProxiedLegacyRepo", "Test Proxied (Legacy) Repository",
426                                  "src/test/repositories/legacy-proxied", "legacy" );
427     }
428
429     protected ManagedRepositoryContent createRepository( String id, String name, String path, String layout )
430         throws Exception
431     {
432         ManagedRepository repo = new ManagedRepository();
433         repo.setId( id );
434         repo.setName( name );
435         repo.setLocation( path );
436         repo.setLayout( layout );
437
438         ManagedRepositoryContent repoContent =
439             applicationContext.getBean( "managedRepositoryContent#" + layout, ManagedRepositoryContent.class );
440         repoContent.setRepository( repo );
441         return repoContent;
442     }
443
444     /**
445      * Read the first line from the checksum file, and return it (trimmed).
446      */
447     protected String readChecksumFile( File checksumFile )
448         throws Exception
449     {
450         FileReader freader = null;
451         BufferedReader buf = null;
452
453         try
454         {
455             freader = new FileReader( checksumFile );
456             buf = new BufferedReader( freader );
457             return buf.readLine();
458         }
459         finally
460         {
461             if ( buf != null )
462             {
463                 buf.close();
464             }
465
466             if ( freader != null )
467             {
468                 freader.close();
469             }
470         }
471     }
472
473     protected void saveConnector( String sourceRepoId, String targetRepoId, boolean disabled )
474     {
475         saveConnector( sourceRepoId, targetRepoId, ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS, SnapshotsPolicy.ALWAYS,
476                        CachedFailuresPolicy.NO, disabled );
477     }
478
479     protected void saveConnector( String sourceRepoId, String targetRepoId, String checksumPolicy, String releasePolicy,
480                                   String snapshotPolicy, String cacheFailuresPolicy, boolean disabled )
481     {
482         saveConnector( sourceRepoId, targetRepoId, checksumPolicy, releasePolicy, snapshotPolicy, cacheFailuresPolicy,
483                        PropagateErrorsDownloadPolicy.QUEUE, disabled );
484     }
485
486     protected void saveConnector( String sourceRepoId, String targetRepoId, String checksumPolicy, String releasePolicy,
487                                   String snapshotPolicy, String cacheFailuresPolicy, String errorPolicy,
488                                   boolean disabled )
489     {
490         saveConnector( sourceRepoId, targetRepoId, checksumPolicy, releasePolicy, snapshotPolicy, cacheFailuresPolicy,
491                        errorPolicy, PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT, disabled );
492     }
493
494     protected void saveConnector( String sourceRepoId, String targetRepoId, String checksumPolicy, String releasePolicy,
495                                   String snapshotPolicy, String cacheFailuresPolicy, String errorPolicy,
496                                   String errorOnUpdatePolicy, boolean disabled )
497     {
498         ProxyConnectorConfiguration connectorConfig = new ProxyConnectorConfiguration();
499         connectorConfig.setSourceRepoId( sourceRepoId );
500         connectorConfig.setTargetRepoId( targetRepoId );
501         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, checksumPolicy );
502         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, releasePolicy );
503         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, snapshotPolicy );
504         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CACHE_FAILURES, cacheFailuresPolicy );
505         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS, errorPolicy );
506         connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS_ON_UPDATE, errorOnUpdatePolicy );
507         connectorConfig.setDisabled( disabled );
508
509         int count = config.getConfiguration().getProxyConnectors().size();
510         config.getConfiguration().addProxyConnector( connectorConfig );
511
512         // Proper Triggering ...
513         String prefix = "proxyConnectors.proxyConnector(" + count + ")";
514         config.triggerChange( prefix + ".sourceRepoId", connectorConfig.getSourceRepoId() );
515         config.triggerChange( prefix + ".targetRepoId", connectorConfig.getTargetRepoId() );
516         config.triggerChange( prefix + ".proxyId", connectorConfig.getProxyId() );
517         config.triggerChange( prefix + ".policies.releases", connectorConfig.getPolicy( "releases", "" ) );
518         config.triggerChange( prefix + ".policies.checksum", connectorConfig.getPolicy( "checksum", "" ) );
519         config.triggerChange( prefix + ".policies.snapshots", connectorConfig.getPolicy( "snapshots", "" ) );
520         config.triggerChange( prefix + ".policies.cache-failures", connectorConfig.getPolicy( "cache-failures", "" ) );
521         config.triggerChange( prefix + ".policies.propagate-errors",
522                               connectorConfig.getPolicy( "propagate-errors", "" ) );
523         config.triggerChange( prefix + ".policies.propagate-errors-on-update",
524                               connectorConfig.getPolicy( "propagate-errors-on-update", "" ) );
525     }
526
527     protected void saveManagedRepositoryConfig( String id, String name, String path, String layout )
528     {
529         ManagedRepositoryConfiguration repoConfig = new ManagedRepositoryConfiguration();
530
531         repoConfig.setId( id );
532         repoConfig.setName( name );
533         repoConfig.setLayout( layout );
534
535         repoConfig.setLocation( path );
536
537         int count = config.getConfiguration().getManagedRepositories().size();
538         config.getConfiguration().addManagedRepository( repoConfig );
539
540         String prefix = "managedRepositories.managedRepository(" + count + ")";
541         config.triggerChange( prefix + ".id", repoConfig.getId() );
542         config.triggerChange( prefix + ".name", repoConfig.getName() );
543         config.triggerChange( prefix + ".location", repoConfig.getLocation() );
544         config.triggerChange( prefix + ".layout", repoConfig.getLayout() );
545     }
546
547     protected void saveRemoteRepositoryConfig( String id, String name, String url, String layout )
548     {
549         RemoteRepositoryConfiguration repoConfig = new RemoteRepositoryConfiguration();
550
551         repoConfig.setId( id );
552         repoConfig.setName( name );
553         repoConfig.setLayout( layout );
554         repoConfig.setUrl( url );
555
556         int count = config.getConfiguration().getRemoteRepositories().size();
557         config.getConfiguration().addRemoteRepository( repoConfig );
558
559         String prefix = "remoteRepositories.remoteRepository(" + count + ")";
560         config.triggerChange( prefix + ".id", repoConfig.getId() );
561         config.triggerChange( prefix + ".name", repoConfig.getName() );
562         config.triggerChange( prefix + ".url", repoConfig.getUrl() );
563         config.triggerChange( prefix + ".layout", repoConfig.getLayout() );
564     }
565
566     protected File saveTargetedRepositoryConfig( String id, String originalPath, String targetPath, String layout )
567         throws IOException
568     {
569         File repoLocation = new File( targetPath );
570         FileUtils.deleteDirectory( repoLocation );
571         copyDirectoryStructure( new File( originalPath ), repoLocation );
572
573         saveRemoteRepositoryConfig( id, "Target Repo-" + id, targetPath, layout );
574
575         return repoLocation;
576     }
577
578
579     /**
580      * Copy the specified resource directory from the src/test/repository/managed/ to
581      * the testable directory under target/test-repository/managed/${testName}/
582      *
583      * @param resourcePath
584      * @throws IOException
585      */
586     protected void setupTestableManagedRepository( String resourcePath )
587         throws IOException
588     {
589         String resourceDir = resourcePath;
590
591         if ( !resourcePath.endsWith( "/" ) )
592         {
593             int idx = resourcePath.lastIndexOf( '/' );
594             resourceDir = resourcePath.substring( 0, idx );
595         }
596
597         File sourceRepoDir = new File( REPOPATH_DEFAULT_MANAGED );
598         File sourceDir = new File( sourceRepoDir, resourceDir );
599
600         File destRepoDir = managedDefaultDir;
601         File destDir = new File( destRepoDir, resourceDir );
602
603         // Cleanout destination dirs.
604         if ( destDir.exists() )
605         {
606             FileUtils.deleteDirectory( destDir );
607         }
608
609         // Make the destination dir.
610         destDir.mkdirs();
611
612         // Test the source dir.
613         if ( !sourceDir.exists() )
614         {
615             // This is just a warning.
616             System.err.println(
617                 "[WARN] Skipping setup of testable managed repository, source dir does not exist: " + sourceDir );
618         }
619         else
620         {
621
622             // Test that the source is a dir.
623             if ( !sourceDir.isDirectory() )
624             {
625                 fail( "Unable to setup testable managed repository, source is not a directory: " + sourceDir );
626             }
627
628             // Copy directory structure.
629             copyDirectoryStructure( sourceDir, destDir );
630         }
631     }
632
633     protected void setManagedNewerThanRemote( File managedFile, File remoteFile )
634     {
635         setManagedNewerThanRemote( managedFile, remoteFile, 55000 );
636     }
637
638     protected void setManagedNewerThanRemote( File managedFile, File remoteFile, long time )
639     {
640         assertTrue( "Managed File should exist: ", managedFile.exists() );
641         assertTrue( "Remote File should exist: ", remoteFile.exists() );
642
643         managedFile.setLastModified( remoteFile.lastModified() + time );
644
645         assertTrue( managedFile.lastModified() > remoteFile.lastModified() );
646     }
647
648     protected void setManagedOlderThanRemote( File managedFile, File remoteFile )
649     {
650         setManagedOlderThanRemote( managedFile, remoteFile, 55000 );
651     }
652
653     protected void setManagedOlderThanRemote( File managedFile, File remoteFile, long time )
654     {
655         assertTrue( "Managed File should exist: ", managedFile.exists() );
656         assertTrue( "Remote File should exist: ", remoteFile.exists() );
657
658         managedFile.setLastModified( remoteFile.lastModified() - time );
659
660         assertTrue( managedFile.lastModified() < remoteFile.lastModified() );
661
662     }
663
664     protected void assertNotModified( File file, long expectedModificationTime )
665     {
666         assertEquals( "File <" + file.getAbsolutePath() + "> not have been modified.", expectedModificationTime,
667                       file.lastModified() );
668     }
669
670     protected void assertNotExistsInManagedLegacyRepo( File file )
671         throws Exception
672     {
673         String managedLegacyPath = managedLegacyDir.getCanonicalPath();
674         String testFile = file.getCanonicalPath();
675
676         assertTrue(
677             "Unit Test Failure: File <" + testFile + "> should be have been defined within the legacy managed path of <"
678                 + managedLegacyPath + ">", testFile.startsWith( managedLegacyPath ) );
679
680         assertFalse( "File < " + testFile + "> should not exist in managed legacy repository.", file.exists() );
681     }
682
683     protected void assertNotExistsInManagedDefaultRepo( File file )
684         throws Exception
685     {
686         String managedDefaultPath = managedDefaultDir.getCanonicalPath();
687         String testFile = file.getCanonicalPath();
688
689         assertTrue( "Unit Test Failure: File <" + testFile
690                         + "> should be have been defined within the managed default path of <" + managedDefaultPath
691                         + ">", testFile.startsWith( managedDefaultPath ) );
692
693         assertFalse( "File < " + testFile + "> should not exist in managed default repository.", file.exists() );
694     }
695
696     protected static Date getFutureDate()
697         throws ParseException
698     {
699         Calendar cal = Calendar.getInstance();
700         cal.add( Calendar.YEAR, 1 );
701         return cal.getTime();
702     }
703
704     protected static Date getPastDate()
705         throws ParseException
706     {
707         return new SimpleDateFormat( "yyyy-MM-dd", Locale.US ).parse( "2000-01-01" );
708     }
709 }