View Javadoc

1   package org.apache.maven.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 org.apache.commons.lang.StringUtils;
23  import org.apache.maven.archiva.common.utils.VersionUtil;
24  import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
25  import org.apache.maven.archiva.model.Plugin;
26  import org.apache.maven.archiva.model.ProjectReference;
27  import org.apache.maven.archiva.model.SnapshotVersion;
28  import org.apache.maven.archiva.model.VersionedReference;
29  import org.apache.maven.archiva.policies.CachedFailuresPolicy;
30  import org.apache.maven.archiva.policies.ChecksumPolicy;
31  import org.apache.maven.archiva.policies.ReleasesPolicy;
32  import org.apache.maven.archiva.policies.SnapshotsPolicy;
33  import org.apache.maven.archiva.repository.metadata.MetadataTools;
34  import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException;
35  import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader;
36  import org.apache.maven.archiva.repository.metadata.RepositoryMetadataWriter;
37  import org.apache.maven.wagon.TransferFailedException;
38  import org.custommonkey.xmlunit.DetailedDiff;
39  import org.custommonkey.xmlunit.Diff;
40  
41  import java.io.File;
42  import java.io.StringWriter;
43  import java.util.Arrays;
44  
45  /**
46   * MetadataTransferTest - Tests the various fetching / merging concepts surrounding the maven-metadata.xml files
47   * present in the repository.
48   *
49   * Test Case Naming is as follows.
50   *
51   * <code>
52   * public void testGet[Release|Snapshot|Project]Metadata[Not]Proxied[Not|On]Local[Not|On|Multiple]Remote
53   * </code>
54   *
55   * <pre>
56   * Which should leave the following matrix of test cases.
57   *
58   *   Metadata  | Proxied  | Local | Remote
59   *   ----------+----------+-------+---------
60   *   Release   | Not      | Not   | n/a (1)
61   *   Release   | Not      | On    | n/a (1)
62   *   Release   |          | Not   | Not
63   *   Release   |          | Not   | On
64   *   Release   |          | Not   | Multiple
65   *   Release   |          | On    | Not
66   *   Release   |          | On    | On
67   *   Release   |          | On    | Multiple
68   *   Snapshot  | Not      | Not   | n/a (1)
69   *   Snapshot  | Not      | On    | n/a (1)
70   *   Snapshot  |          | Not   | Not
71   *   Snapshot  |          | Not   | On
72   *   Snapshot  |          | Not   | Multiple
73   *   Snapshot  |          | On    | Not
74   *   Snapshot  |          | On    | On
75   *   Snapshot  |          | On    | Multiple
76   *   Project   | Not      | Not   | n/a (1)
77   *   Project   | Not      | On    | n/a (1)
78   *   Project   |          | Not   | Not
79   *   Project   |          | Not   | On
80   *   Project   |          | Not   | Multiple
81   *   Project   |          | On    | Not
82   *   Project   |          | On    | On
83   *   Project   |          | On    | Multiple
84   *
85   * (1) If it isn't proxied, no point in having a remote.
86   * </pre>
87   *
88   * @version $Id: MetadataTransferTest.java 743630 2009-02-12 06:47:36Z jdumay $
89   */
90  public class MetadataTransferTest
91      extends AbstractProxyTestCase
92  {
93      /**
94       * @plexus.requirement
95       */
96      private MetadataTools metadataTools;
97      
98      public void testGetProjectMetadataProxiedNotLocalOnRemoteConnectoDisabled()
99          throws Exception
100     {
101         // New project metadata that does not exist locally but exists on remote.
102         String requestedResource = "org/apache/maven/test/get-found-in-proxy/maven-metadata.xml";
103         setupTestableManagedRepository( requestedResource );
104 
105         // Configure Connector (usually done within archiva.xml configuration)
106         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
107                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, true);
108 
109         assertResourceNotFound( requestedResource );
110         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
111 
112         File expectedFile = new File( managedDefaultDir, requestedResource );
113 
114         ProjectReference metadata = createProjectReference( requestedResource );
115 
116         File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository, managedDefaultRepository.toMetadataPath(metadata) );
117 
118         assertNull( "Should not have downloaded a file.", downloadedFile );
119         assertNoTempFiles( expectedFile );
120     }
121 
122     // TODO: same test for other fetch* methods
123     public void testFetchFromTwoProxiesWhenFirstConnectionFails()
124         throws Exception
125     {
126         // Project metadata that does not exist locally, but has multiple versions in remote repos
127         String requestedResource = "org/apache/maven/test/get-default-layout/maven-metadata.xml";
128         setupTestableManagedRepository( requestedResource );
129 
130         saveRemoteRepositoryConfig( "badproxied1", "Bad Proxied 1", "test://bad.machine.com/repo/", "default" );
131 
132         // Configure Connector (usually done within archiva.xml configuration)
133         saveConnector( ID_DEFAULT_MANAGED, "badproxied1", ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
134                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
135         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
136                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
137 
138         assertResourceNotFound( requestedResource );
139         assertNoRepoMetadata( "badproxied1", requestedResource );
140         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
141 
142         // ensure that a hard failure in the first proxy connector is skipped and the second repository checked
143         File expectedFile = new File( managedDefaultDir.getAbsoluteFile(),
144                                       metadataTools.getRepositorySpecificName( "badproxied1", requestedResource ) );
145         wagonMock.get( requestedResource, new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ) );
146         
147         wagonMockControl.setMatcher(customWagonGetMatcher);
148         
149         wagonMockControl.setThrowable( new TransferFailedException( "can't connect" ) );
150 
151         wagonMockControl.replay();
152 
153         assertFetchProjectOrGroup( requestedResource );
154 
155         wagonMockControl.verify();
156 
157         assertProjectMetadataContents( requestedResource, new String[] { "1.0.1" }, "1.0.1", "1.0.1" );
158         assertNoRepoMetadata( "badproxied1", requestedResource );
159         assertRepoProjectMetadata( ID_PROXIED2, requestedResource, new String[] { "1.0.1" } );
160     }
161 
162     /**
163      * Attempt to get the project metadata for non-existant artifact.
164      *
165      * Expected result: the maven-metadata.xml file is not created on the managed repository, nor returned
166      *                  to the requesting client.
167      */
168     public void testGetProjectMetadataNotProxiedNotLocal()
169         throws Exception
170     {
171         // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
172         String requestedResource = "org/apache/maven/test/get-default-metadata-nonexistant/maven-metadata.xml";
173         setupTestableManagedRepository( requestedResource );
174 
175         assertResourceNotFound( requestedResource );
176 
177         // No proxy setup, nothing fetched, failure expected.
178         assertFetchProjectOrGroupFailed( requestedResource );
179 
180         // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
181         assertResourceNotFound( requestedResource );
182     }
183 
184     public void testGetProjectMetadataNotProxiedOnLocal()
185         throws Exception
186     {
187         // Project metadata that exists and has multiple versions
188         String requestedResource = "org/apache/maven/test/get-project-metadata/maven-metadata.xml";
189         setupTestableManagedRepository( requestedResource );
190 
191         assertResourceExists( requestedResource );
192 
193         // No proxy setup, nothing fetched from remote, but local exists.
194         assertFetchProjectOrGroup( requestedResource );
195 
196         // Nothing fetched.  Should only contain contents of what is in the repository.
197         // A metadata update is not performed in this use case.  Local metadata content is only
198         // updated via the metadata updater consumer.
199         assertProjectMetadataContents( requestedResource, new String[] { "1.0" }, null, null );
200     }
201 
202     public void testGetProjectMetadataProxiedNotLocalMultipleRemotes()
203         throws Exception
204     {
205         // Project metadata that does not exist locally, but has multiple versions in remote repos
206         String requestedResource = "org/apache/maven/test/get-default-layout/maven-metadata.xml";
207         setupTestableManagedRepository( requestedResource );
208 
209         // Configure Connector (usually done within archiva.xml configuration)
210         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
211                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
212         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
213                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
214 
215         assertResourceNotFound( requestedResource );
216         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
217         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
218 
219         // Two proxies setup, metadata fetched from both remotes.
220         assertFetchProjectOrGroup( requestedResource );
221 
222         // Nothing fetched.  Should only contain contents of what is in the repository.
223         assertProjectMetadataContents( requestedResource, new String[] { "1.0", "1.0.1" }, "1.0.1", "1.0.1" );
224         assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[] { "1.0" } );
225         assertRepoProjectMetadata( ID_PROXIED2, requestedResource, new String[] { "1.0.1" } );
226     }
227 
228     public void testGetProjectMetadataProxiedNotLocalNotRemote()
229         throws Exception
230     {
231         // Non-existant project metadata that does not exist locally and doesn't exist on remotes.
232         String requestedResource = "org/apache/maven/test/get-bogus-artifact/maven-metadata.xml";
233         setupTestableManagedRepository( requestedResource );
234 
235         // Configure Connector (usually done within archiva.xml configuration)
236         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
237                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
238         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
239                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
240 
241         assertResourceNotFound( requestedResource );
242         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
243         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
244 
245         // Two proxies setup, nothing fetched from remotes, local does not exist.
246         assertFetchProjectOrGroupFailed( requestedResource );
247 
248         // Nothing fetched.  Nothing should exist.
249         assertResourceNotFound( requestedResource );
250         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
251         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
252     }
253 
254     public void testGetProjectMetadataProxiedNotLocalOnRemote()
255         throws Exception
256     {
257         // New project metadata that does not exist locally but exists on remote.
258         String requestedResource = "org/apache/maven/test/get-found-in-proxy/maven-metadata.xml";
259         setupTestableManagedRepository( requestedResource );
260 
261         // Configure Connector (usually done within archiva.xml configuration)
262         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
263                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
264 
265         assertResourceNotFound( requestedResource );
266         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
267 
268         // One proxy setup, metadata fetched from remote, local does not exist.
269         assertFetchProjectOrGroup( requestedResource );
270 
271         // Remote fetched.  Local created/updated.
272         assertProjectMetadataContents( requestedResource, new String[] { "1.0.5" }, "1.0.5", "1.0.5" );
273         assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[] { "1.0.5" } );
274     }
275 
276     public void testGetProjectMetadataProxiedOnLocalMultipleRemote()
277         throws Exception
278     {
279         // Project metadata that exist locally, and has multiple versions in remote repos
280         String requestedResource = "org/apache/maven/test/get-on-multiple-repos/maven-metadata.xml";
281         setupTestableManagedRepository( requestedResource );
282 
283         // Configure Connector (usually done within archiva.xml configuration)
284         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
285                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
286         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
287                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
288 
289         assertProjectMetadataContents( requestedResource, new String[] { "1.0" }, null, null );
290         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
291         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
292 
293         // Two proxies setup, metadata fetched from both remotes.
294         assertFetchProjectOrGroup( requestedResource );
295 
296         // metadata fetched from both repos, and merged with local version.
297         assertProjectMetadataContents( requestedResource, new String[] { "1.0", "1.0.1", "2.0" }, "2.0", "2.0" );
298         assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[] { "1.0", "2.0" } );
299         assertRepoProjectMetadata( ID_PROXIED2, requestedResource, new String[] { "1.0", "1.0.1" } );
300     }
301 
302     public void testGetProjectMetadataProxiedOnLocalNotRemote()
303         throws Exception
304     {
305         // Project metadata that exist locally, and does not exist in remote repos.
306         String requestedResource = "org/apache/maven/test/get-not-on-remotes/maven-metadata.xml";
307         setupTestableManagedRepository( requestedResource );
308 
309         // Configure Connector (usually done within archiva.xml configuration)
310         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
311                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
312         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
313                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
314 
315         assertProjectMetadataContents( requestedResource, new String[] { "1.0-beta-2" }, null, null );
316         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
317         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
318 
319         // Two proxies setup, metadata fetch from remotes fail (because they dont exist).
320         assertFetchProjectOrGroup( requestedResource );
321 
322         // metadata not fetched from both repos, and local version exists.
323         // Since there was no updated metadata content from a remote/proxy, a metadata update on
324         // the local file never ran.  Local only updates are performed via the metadata updater consumer.
325         assertProjectMetadataContents( requestedResource, new String[] { "1.0-beta-2" }, null, null );
326         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
327         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
328     }
329 
330     public void testGetProjectMetadataProxiedOnLocalOnRemote()
331         throws Exception
332     {
333         // Project metadata that exist locally and exists on remote.
334         String requestedResource = "org/apache/maven/test/get-on-local-on-remote/maven-metadata.xml";
335         setupTestableManagedRepository( requestedResource );
336 
337         // Configure Connector (usually done within archiva.xml configuration)
338         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
339                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
340 
341         assertProjectMetadataContents( requestedResource, new String[] { "1.0.8", "1.0.22" }, null, null );
342         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
343 
344         // One proxy setup, metadata fetched from remote, local exists.
345         assertFetchProjectOrGroup( requestedResource );
346 
347         // Remote fetched.  Local updated.
348         assertProjectMetadataContents( requestedResource, new String[] { "1.0.8", "1.0.22", "2.0" }, "2.0", "2.0" );
349         assertRepoProjectMetadata( ID_PROXIED1, requestedResource, new String[] { "1.0.22", "2.0" } );
350     }
351 
352     /**
353      * A request for a release maven-metadata.xml file that does not exist locally, and the managed
354      * repository has no proxied repositories set up.
355      *
356      * Expected result: the maven-metadata.xml file is not created on the managed repository, nor returned
357      *                  to the requesting client.
358      */
359     public void testGetReleaseMetadataNotProxiedNotLocal()
360         throws Exception
361     {
362         // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
363         String requestedResource = "org/apache/maven/test/get-default-metadata-nonexistant/1.0/maven-metadata.xml";
364         setupTestableManagedRepository( requestedResource );
365 
366         assertNoMetadata( requestedResource );
367 
368         // No proxy setup, nothing fetched, failure expected.
369         assertFetchVersionedFailed( requestedResource );
370 
371         // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
372         assertNoMetadata( requestedResource );
373     }
374 
375     /**
376      * A request for a maven-metadata.xml file that does exist locally, and the managed
377      * repository has no proxied repositories set up.
378      *
379      * Expected result: the maven-metadata.xml file is updated locally, based off of the managed repository
380      *                  information, and then returned to the client.
381      */
382     public void testGetReleaseMetadataNotProxiedOnLocal()
383         throws Exception
384     {
385         String requestedResource = "org/apache/maven/test/get-default-metadata/1.0/maven-metadata.xml";
386         setupTestableManagedRepository( requestedResource );
387 
388         assertResourceExists( requestedResource );
389 
390         assertFetchVersioned( requestedResource );
391 
392         assertReleaseMetadataContents( requestedResource );
393     }
394 
395     /**
396      * A request for a release maven-metadata.xml file that does not exist on the managed repository, but
397      * exists on multiple remote repositories.
398      *
399      * Expected result: the maven-metadata.xml file is downloaded from the remote into the repository specific
400      *                  file location on the managed repository, a merge of the contents to the requested
401      *                  maven-metadata.xml is performed, and then the merged maven-metadata.xml file is
402      *                  returned to the client.
403      */
404     public void testGetReleaseMetadataProxiedNotLocalMultipleRemotes()
405         throws Exception
406     {
407         String requestedResource = "org/apache/maven/test/get-default-layout/1.0/maven-metadata.xml";
408         setupTestableManagedRepository( requestedResource );
409 
410         // Configure Connector (usually done within archiva.xml configuration)
411         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
412                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
413         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
414                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
415 
416         assertResourceNotFound( requestedResource );
417         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
418         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
419 
420         assertFetchVersioned( requestedResource );
421 
422         assertReleaseMetadataContents( requestedResource );
423         assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
424         assertRepoReleaseMetadataContents( ID_PROXIED2, requestedResource );
425     }
426 
427     /**
428      * A request for a maven-metadata.xml file that does not exist locally, nor does it exist in a remote
429      * proxied repository.
430      *
431      * Expected result: the maven-metadata.xml file is created locally, based off of managed repository
432      *                  information, and then return to the client.
433      */
434     public void testGetReleaseMetadataProxiedNotLocalNotRemote()
435         throws Exception
436     {
437         String requestedResource = "org/apache/maven/test/get-bad-metadata/1.0/maven-metadata.xml";
438         setupTestableManagedRepository( requestedResource );
439 
440         // Configure Connector (usually done within archiva.xml configuration)
441         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
442                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
443 
444         assertResourceNotFound( requestedResource );
445 
446         assertFetchProjectOrGroupFailed( requestedResource );
447 
448         assertResourceNotFound( requestedResource );
449         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
450     }
451 
452     /**
453      * A request for a maven-metadata.xml file that does not exist on the managed repository, but
454      * exists on 1 remote repository.
455      *
456      * Expected result: the maven-metadata.xml file is downloaded from the remote into the repository specific
457      *                  file location on the managed repository, a merge of the contents to the requested
458      *                  maven-metadata.xml is performed, and then the merged maven-metadata.xml file is
459      *                  returned to the client.
460      */
461     public void testGetReleaseMetadataProxiedNotLocalOnRemote()
462         throws Exception
463     {
464         String requestedResource = "org/apache/maven/test/get-default-layout/1.0/maven-metadata.xml";
465         setupTestableManagedRepository( requestedResource );
466 
467         // Configure Connector (usually done within archiva.xml configuration)
468         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
469                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
470 
471         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
472 
473         assertFetchVersioned( requestedResource );
474 
475         assertReleaseMetadataContents( requestedResource );
476         assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
477     }
478 
479     /**
480      * A request for a maven-metadata.xml file that exists in the managed repository, but
481      * not on any remote repository.
482      *
483      * Expected result: the maven-metadata.xml file does not exist on the remote proxied repository and
484      *                  is not downloaded.  There is no repository specific metadata file on the managed
485      *                  repository.  The managed repository maven-metadata.xml is returned to the
486      *                  client as-is.
487      */
488     public void testGetReleaseMetadataProxiedOnLocalNotRemote()
489         throws Exception
490     {
491         String requestedResource = "org/apache/maven/test/get-not-on-remotes/1.0-beta-2/maven-metadata.xml";
492         setupTestableManagedRepository( requestedResource );
493 
494         // Configure Connector (usually done within archiva.xml configuration)
495         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
496                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
497 
498         assertReleaseMetadataContents( requestedResource );
499 
500         assertFetchVersioned( requestedResource );
501 
502         assertReleaseMetadataContents( requestedResource );
503         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
504     }
505 
506     /**
507      * A request for a maven-metadata.xml file that exists in the managed repository, and on multiple
508      * remote repositories.
509      *
510      * Expected result: the maven-metadata.xml file on the remote proxied repository is downloaded
511      *                  and merged into the contents of the existing managed repository copy of
512      *                  the maven-metadata.xml file.
513      */
514     public void testGetReleaseMetadataProxiedOnLocalMultipleRemote()
515         throws Exception
516     {
517         String requestedResource = "org/apache/maven/test/get-on-multiple-repos/1.0/maven-metadata.xml";
518         setupTestableManagedRepository( requestedResource );
519 
520         // Configure Connector (usually done within archiva.xml configuration)
521         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
522                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
523         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
524                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
525 
526         assertReleaseMetadataContents( requestedResource );
527         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
528         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
529 
530         assertFetchVersioned( requestedResource );
531 
532         assertReleaseMetadataContents( requestedResource );
533         assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
534         assertRepoReleaseMetadataContents( ID_PROXIED2, requestedResource );
535     }
536 
537     /**
538      * A request for a maven-metadata.xml file that exists in the managed repository, and on one
539      * remote repository.
540      *
541      * Expected result: the maven-metadata.xml file on the remote proxied repository is downloaded
542      *                  and merged into the contents of the existing managed repository copy of
543      *                  the maven-metadata.xml file.
544      */
545     public void testGetReleaseMetadataProxiedOnLocalOnRemote()
546         throws Exception
547     {
548         String requestedResource = "org/apache/maven/test/get-on-local-on-remote/1.0.22/maven-metadata.xml";
549         setupTestableManagedRepository( requestedResource );
550 
551         // Configure Connector (usually done within archiva.xml configuration)
552         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
553                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
554 
555         assertReleaseMetadataContents( requestedResource );
556         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
557 
558         assertFetchVersioned( requestedResource );
559 
560         assertReleaseMetadataContents( requestedResource );
561         assertRepoReleaseMetadataContents( ID_PROXIED1, requestedResource );
562     }
563 
564     public void testGetSnapshotMetadataNotProxiedNotLocal()
565         throws Exception
566     {
567         // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
568         String requestedResource = "org/apache/maven/test/get-default-metadata-nonexistant/1.0-SNAPSHOT/maven-metadata.xml";
569         setupTestableManagedRepository( requestedResource );
570 
571         assertNoMetadata( requestedResource );
572 
573         // No proxy setup, nothing fetched, no local file, failure expected.
574         assertFetchVersionedFailed( requestedResource );
575 
576         // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
577         assertNoMetadata( requestedResource );
578     }
579 
580     public void testGetSnapshotMetadataNotProxiedOnLocal()
581         throws Exception
582     {
583         // The artifactId exists locally (but not on a remote repo)
584         String requestedResource = "org/apache/maven/test/get-snapshot-on-local-not-remote/2.0-alpha-2-SNAPSHOT/maven-metadata.xml";
585         setupTestableManagedRepository( requestedResource );
586 
587         assertResourceExists( requestedResource );
588 
589         // No proxy setup, nothing fetched from remote, local file exists, fetch should succeed.
590         assertFetchVersioned( requestedResource );
591 
592         // Local metadata exists, should be updated to reflect the latest release.
593         assertSnapshotMetadataContents( requestedResource, "20070821", "220304", 2 );
594     }
595 
596     public void testGetSnapshotMetadataProxiedNotLocalMultipleRemotes()
597         throws Exception
598     {
599         String requestedResource = "org/apache/maven/test/get-timestamped-snapshot-in-both/1.0-SNAPSHOT/maven-metadata.xml";
600         setupTestableManagedRepository( requestedResource );
601 
602         // Configure Connector (usually done within archiva.xml configuration)
603         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
604                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
605         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
606                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
607 
608         assertResourceNotFound( requestedResource );
609         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
610         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
611 
612         // Proxying 2 repos, both have content, local file updated.
613         assertFetchVersioned( requestedResource );
614 
615         assertSnapshotMetadataContents( requestedResource, "20070101", "000103", 2 );
616         assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20061227", "112101", 2 );
617         assertRepoSnapshotMetadataContents( ID_PROXIED2, requestedResource, "20070101", "000103", 2 );
618     }
619 
620     public void testGetSnapshotMetadataProxiedNotLocalNotRemote()
621         throws Exception
622     {
623         // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
624         String requestedResource = "org/apache/maven/test/get-default-metadata-nonexistant/1.0-SNAPSHOT/maven-metadata.xml";
625         setupTestableManagedRepository( requestedResource );
626 
627         // Configure Connector (usually done within archiva.xml configuration)
628         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
629                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
630 
631         assertNoMetadata( requestedResource );
632 
633         // One proxy setup, nothing fetched, no local file, failure expected.
634         assertFetchVersionedFailed( requestedResource );
635 
636         // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
637         assertNoMetadata( requestedResource );
638         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
639     }
640 
641     public void testGetSnapshotMetadataProxiedNotLocalOnRemote()
642         throws Exception
643     {
644         // Artifact exists only in the proxied1 location.
645         String requestedResource = "org/apache/maven/test/get-metadata-snapshot/1.0-SNAPSHOT/maven-metadata.xml";
646         setupTestableManagedRepository( requestedResource );
647 
648         // Configure Connector (usually done within archiva.xml configuration)
649         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
650                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
651 
652         assertResourceNotFound( requestedResource );
653 
654         // One proxy setup, one metadata fetched, local file created/updated.
655         assertFetchVersioned( requestedResource );
656 
657         // Local artifact Id should contain latest (which in this case is from proxied download)
658         assertSnapshotMetadataContents( requestedResource, "20050831", "101112", 1 );
659         assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20050831", "101112", 1 );
660     }
661 
662     public void testGetSnapshotMetadataProxiedOnLocalMultipleRemote()
663         throws Exception
664     {
665         String requestedResource = "org/apache/maven/test/get-snapshot-popular/2.0-SNAPSHOT/maven-metadata.xml";
666         setupTestableManagedRepository( requestedResource );
667 
668         // Configure Connector (usually done within archiva.xml configuration)
669         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
670                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
671         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
672                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
673 
674         assertSnapshotMetadataContents( requestedResource, "20070822", "021008", 3 );
675         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
676         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
677 
678         // Proxying 2 repos, both have content, local file updated.
679         assertFetchVersioned( requestedResource );
680 
681         assertSnapshotMetadataContents( requestedResource, "20070823", "212711", 6 );
682         assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20070822", "145534", 9 );
683         assertRepoSnapshotMetadataContents( ID_PROXIED2, requestedResource, "20070823", "212711", 6 );
684     }
685 
686     public void testGetSnapshotMetadataProxiedOnLocalNotRemote()
687         throws Exception
688     {
689         // The artifactId exists locally (but not on a remote repo)
690         String requestedResource = "org/apache/maven/test/get-snapshot-on-local-not-remote/2.0-alpha-2-SNAPSHOT/maven-metadata.xml";
691         setupTestableManagedRepository( requestedResource );
692 
693         // Configure Connector (usually done within archiva.xml configuration)
694         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
695                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
696         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
697                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
698 
699         assertResourceExists( requestedResource );
700         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
701         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
702 
703         // two proxies setup, nothing fetched from either remote, local file exists, fetch should succeed.
704         assertFetchVersioned( requestedResource );
705 
706         // Local metadata exists, repo metadatas should not exist, local file updated.
707         assertSnapshotMetadataContents( requestedResource, "20070821", "220304", 2 );
708         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
709         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
710     }
711 
712     public void testGetSnapshotMetadataProxiedOnLocalOnRemote()
713         throws Exception
714     {
715         // The artifactId exists locally (but not on a remote repo)
716         String requestedResource = "org/apache/maven/test/get-present-metadata-snapshot/1.0-SNAPSHOT/maven-metadata.xml";
717         setupTestableManagedRepository( requestedResource );
718 
719         // Configure Connector (usually done within archiva.xml configuration)
720         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
721                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
722 
723         assertSnapshotMetadataContents( requestedResource, "20050831", "101112", 1 );
724         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
725 
726         // two proxies setup, nothing fetched from either remote, local file exists, fetch should succeed.
727         assertFetchVersioned( requestedResource );
728 
729         // Local metadata exists, repo metadata exists, local file updated.
730         assertSnapshotMetadataContents( requestedResource, "20050831", "101112", 1 );
731         assertRepoSnapshotMetadataContents( ID_PROXIED1, requestedResource, "20050831", "101112", 1 );
732     }
733 
734     public void testGetGroupMetadataNotProxiedNotLocal()
735         throws Exception
736     {
737         // The artifactId "get-default-metadata-nonexistant" does not exist (intentionally).
738         String requestedResource = "org/apache/maven/test/groups/get-default-metadata-nonexistant/maven-metadata.xml";
739         setupTestableManagedRepository( requestedResource );
740 
741         assertResourceNotFound( requestedResource );
742 
743         // No proxy setup, nothing fetched, failure expected.
744         assertFetchProjectOrGroupFailed( requestedResource );
745 
746         // No local artifactId, and no fetch, should equal no metadata file downloaded / created / updated.
747         assertResourceNotFound( requestedResource );
748     }
749 
750     public void testGetGroupMetadataNotProxiedOnLocal()
751         throws Exception
752     {
753         // Project metadata that exists and has multiple versions
754         String requestedResource = "org/apache/maven/test/groups/get-project-metadata/maven-metadata.xml";
755         setupTestableManagedRepository( requestedResource );
756 
757         assertResourceExists( requestedResource );
758 
759         // No proxy setup, nothing fetched from remote, but local exists.
760         assertFetchProjectOrGroup( requestedResource );
761 
762         // Nothing fetched.  Should only contain contents of what is in the repository.
763         // A metadata update is not performed in this use case.  Local metadata content is only
764         // updated via the metadata updater consumer.
765         assertGroupMetadataContents( requestedResource, new String[] { "plugin1" } );
766     }
767 
768     public void testGetGroupMetadataProxiedNotLocalMultipleRemotes()
769         throws Exception
770     {
771         // Project metadata that does not exist locally, but has multiple versions in remote repos
772         String requestedResource = "org/apache/maven/test/groups/get-default-layout/maven-metadata.xml";
773         setupTestableManagedRepository( requestedResource );
774 
775         // Configure Connector (usually done within archiva.xml configuration)
776         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
777                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
778         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
779                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
780 
781         assertResourceNotFound( requestedResource );
782         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
783         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
784 
785         // Two proxies setup, metadata fetched from both remotes.
786         assertFetchProjectOrGroup( requestedResource );
787 
788         // Nothing fetched.  Should only contain contents of what is in the repository.
789         assertGroupMetadataContents( requestedResource, new String[] { "plugin2", "plugin1" } );
790         assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[] { "plugin1" } );
791         assertRepoGroupMetadataContents( ID_PROXIED2, requestedResource, new String[] { "plugin2" } );
792     }
793 
794     public void testGetGroupsMetadataProxiedNotLocalNotRemote()
795         throws Exception
796     {
797         // Non-existant project metadata that does not exist locally and doesn't exist on remotes.
798         String requestedResource = "org/apache/maven/test/groups/get-bogus-artifact/maven-metadata.xml";
799         setupTestableManagedRepository( requestedResource );
800 
801         // Configure Connector (usually done within archiva.xml configuration)
802         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
803                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false);
804         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
805                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
806 
807         assertResourceNotFound( requestedResource );
808         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
809         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
810 
811         // Two proxies setup, nothing fetched from remotes, local does not exist.
812         assertFetchProjectOrGroupFailed( requestedResource );
813 
814         // Nothing fetched.  Nothing should exist.
815         assertResourceNotFound( requestedResource );
816         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
817         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
818     }
819 
820     public void testGetGroupMetadataProxiedNotLocalOnRemote()
821         throws Exception
822     {
823         // New project metadata that does not exist locally but exists on remote.
824         String requestedResource = "org/apache/maven/test/groups/get-found-in-proxy/maven-metadata.xml";
825         setupTestableManagedRepository( requestedResource );
826 
827         // Configure Connector (usually done within archiva.xml configuration)
828         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
829                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
830 
831         assertResourceNotFound( requestedResource );
832         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
833 
834         // One proxy setup, metadata fetched from remote, local does not exist.
835         assertFetchProjectOrGroup( requestedResource );
836 
837         // Remote fetched.  Local created/updated.
838         assertGroupMetadataContents( requestedResource, new String[] { "plugin3" } );
839         assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[] { "plugin3" } );
840     }
841 
842     public void testGetGroupMetadataProxiedOnLocalMultipleRemote()
843         throws Exception
844     {
845         // Project metadata that exist locally, and has multiple versions in remote repos
846         String requestedResource = "org/apache/maven/test/groups/get-on-multiple-repos/maven-metadata.xml";
847         setupTestableManagedRepository( requestedResource );
848 
849         // Configure Connector (usually done within archiva.xml configuration)
850         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
851                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
852         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
853                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
854 
855         assertGroupMetadataContents( requestedResource, new String[] { "plugin1" } );
856         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
857         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
858 
859         // Two proxies setup, metadata fetched from both remotes.
860         assertFetchProjectOrGroup( requestedResource );
861 
862         // metadata fetched from both repos, and merged with local version.
863         assertGroupMetadataContents( requestedResource, new String[] { "plugin1", "plugin2", "plugin4" } );
864         assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[] { "plugin1", "plugin4" } );
865         assertRepoGroupMetadataContents( ID_PROXIED2, requestedResource, new String[] { "plugin1", "plugin2" } );
866     }
867 
868     public void testGetGroupMetadataProxiedOnLocalNotRemote()
869         throws Exception
870     {
871         // Project metadata that exist locally, and does not exist in remote repos.
872         String requestedResource = "org/apache/maven/test/groups/get-not-on-remotes/maven-metadata.xml";
873         setupTestableManagedRepository( requestedResource );
874 
875         // Configure Connector (usually done within archiva.xml configuration)
876         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
877                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
878         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
879                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
880 
881         assertGroupMetadataContents( requestedResource, new String[] { "plugin5" } );
882         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
883         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
884 
885         // Two proxies setup, metadata fetch from remotes fail (because they dont exist).
886         assertFetchProjectOrGroup( requestedResource );
887 
888         // metadata not fetched from both repos, and local version exists.
889         // Since there was no updated metadata content from a remote/proxy, a metadata update on
890         // the local file never ran.  Local only updates are performed via the metadata updater consumer.
891         assertGroupMetadataContents( requestedResource, new String[] { "plugin5" } );
892         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
893         assertNoRepoMetadata( ID_PROXIED2, requestedResource );
894     }
895 
896     public void testGetGroupMetadataProxiedOnLocalOnRemote()
897         throws Exception
898     {
899         // Project metadata that exist locally and exists on remote.
900         String requestedResource = "org/apache/maven/test/groups/get-on-local-on-remote/maven-metadata.xml";
901         setupTestableManagedRepository( requestedResource );
902 
903         // Configure Connector (usually done within archiva.xml configuration)
904         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
905                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
906 
907         assertGroupMetadataContents( requestedResource, new String[] { "plugin6", "plugin7" } );
908         assertNoRepoMetadata( ID_PROXIED1, requestedResource );
909 
910         // One proxy setup, metadata fetched from remote, local exists.
911         assertFetchProjectOrGroup( requestedResource );
912 
913         // Remote fetched.  Local updated.
914         assertGroupMetadataContents( requestedResource, new String[] { "plugin6", "plugin7", "plugin4" } );
915         assertRepoGroupMetadataContents( ID_PROXIED1, requestedResource, new String[] { "plugin7", "plugin4" } );
916     }
917 
918     /**
919      * Transfer the metadata file.
920      *
921      * @param requestedResource the requested resource
922      * @throws Exception
923      */
924     private void assertFetchProjectOrGroup( String requestedResource )
925         throws Exception
926     {
927         File expectedFile = new File( managedDefaultDir, requestedResource );
928 
929         ProjectReference metadata = createProjectReference( requestedResource );
930 
931         File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository, managedDefaultRepository.toMetadataPath(metadata) );
932 
933         assertNotNull( "Should have downloaded a file.", downloadedFile );
934         assertNoTempFiles( expectedFile );
935     }
936 
937     private ProjectReference createProjectReference( String path )
938         throws RepositoryMetadataException
939     {
940         return metadataTools.toProjectReference( path );
941     }
942 
943     /**
944      * Transfer the metadata file, not expected to succeed.
945      *
946      * @param requestedResource the requested resource
947      * @throws Exception
948      */
949     private void assertFetchProjectOrGroupFailed( String requestedResource )
950         throws Exception
951     {
952         File expectedFile = new File( managedDefaultDir, requestedResource );
953         ProjectReference metadata = createProjectReference( requestedResource );
954 
955         File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository, managedDefaultRepository.toMetadataPath(metadata) );
956 
957         assertNull( downloadedFile );
958         assertNoTempFiles( expectedFile );
959     }
960 
961     /**
962      * Transfer the metadata file.
963      *
964      * @param requestedResource the requested resource
965      * @throws Exception
966      */
967     private void assertFetchVersioned( String requestedResource )
968         throws Exception
969     {
970         File expectedFile = new File( managedDefaultDir, requestedResource );
971 
972         VersionedReference metadata = createVersionedReference( requestedResource );
973 
974         File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository, managedDefaultRepository.toMetadataPath(metadata) );
975 
976         assertNotNull( "Should have downloaded a file.", downloadedFile );
977         assertNoTempFiles( expectedFile );
978     }
979 
980     private VersionedReference createVersionedReference( String path )
981         throws RepositoryMetadataException
982     {
983         return metadataTools.toVersionedReference( path );
984     }
985 
986     /**
987      * Transfer the metadata file, not expected to succeed.
988      *
989      * @param requestedResource the requested resource
990      * @throws Exception
991      */
992     private void assertFetchVersionedFailed( String requestedResource )
993         throws Exception
994     {
995         File expectedFile = new File( managedDefaultDir, requestedResource );
996         VersionedReference metadata = createVersionedReference( requestedResource );
997 
998         File downloadedFile = proxyHandler.fetchMetatadaFromProxies( managedDefaultRepository, managedDefaultRepository.toMetadataPath(metadata) );
999 
1000         assertNull( downloadedFile );
1001         assertNoTempFiles( expectedFile );
1002     }
1003 
1004     /**
1005      * Test for the existance of the requestedResource in the default managed repository.
1006      *
1007      * @param requestedResource the requested resource
1008      * @throws Exception
1009      */
1010     private void assertResourceExists( String requestedResource )
1011         throws Exception
1012     {
1013         File actualFile = new File( managedDefaultDir, requestedResource );
1014         assertTrue( "Resource should exist: " + requestedResource, actualFile.exists() );
1015     }
1016 
1017     private void assertMetadataEquals( String expectedMetadataXml, File actualFile )
1018         throws Exception
1019     {
1020         assertNotNull( "Actual File should not be null.", actualFile );
1021 
1022         assertTrue( "Actual file exists.", actualFile.exists() );
1023 
1024         StringWriter actualContents = new StringWriter();
1025         ArchivaRepositoryMetadata metadata = RepositoryMetadataReader.read( actualFile );
1026         RepositoryMetadataWriter.write( metadata, actualContents );
1027 
1028         DetailedDiff detailedDiff = new DetailedDiff( new Diff( expectedMetadataXml, actualContents.toString() ) );
1029         if ( !detailedDiff.similar() )
1030         {
1031             assertEquals( expectedMetadataXml, actualContents );
1032         }
1033 
1034         // assertEquals( "Check file contents.", expectedMetadataXml, actualContents );
1035     }
1036 
1037     /**
1038      * Ensures that the requested resource is not present in the managed repository.
1039      *
1040      * @param requestedResource the requested resource
1041      * @throws Exception
1042      */
1043     private void assertNoMetadata( String requestedResource )
1044         throws Exception
1045     {
1046         File expectedFile = new File( managedDefaultDir, requestedResource );
1047         assertFalse( "metadata should not exist: " + expectedFile, expectedFile.exists() );
1048     }
1049 
1050     /**
1051      * Ensures that the proxied repository specific maven metadata file does NOT exist in the
1052      * managed repository.
1053      * @param proxiedRepoId the proxied repository id to validate with.
1054      * @param requestedResource the resource requested.
1055      */
1056     private void assertNoRepoMetadata( String proxiedRepoId, String requestedResource )
1057     {
1058         String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
1059 
1060         File actualFile = new File( managedDefaultDir, proxiedFile );
1061         assertFalse( "Repo specific metadata should not exist: " + actualFile, actualFile.exists() );
1062     }
1063 
1064     private void assertGroupMetadataContents( String requestedResource, String expectedPlugins[] )
1065         throws Exception
1066     {
1067         File actualFile = new File( managedDefaultDir, requestedResource );
1068         assertTrue( "Snapshot Metadata should exist: " + requestedResource, actualFile.exists() );
1069 
1070         ProjectReference actualMetadata = createGroupReference( requestedResource );
1071 
1072         assertGroupMetadata( actualFile, actualMetadata, expectedPlugins );
1073     }
1074 
1075     private ProjectReference createGroupReference( String requestedResource )
1076         throws RepositoryMetadataException
1077     {
1078         ProjectReference projectReference = createProjectReference( requestedResource );
1079         projectReference.setGroupId( projectReference.getGroupId() + "." + projectReference.getArtifactId() );
1080         projectReference.setArtifactId( null );
1081         return projectReference;
1082     }
1083 
1084     private void assertRepoGroupMetadataContents( String proxiedRepoId, String requestedResource,
1085                                                   String expectedPlugins[] )
1086         throws Exception
1087     {
1088         String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
1089 
1090         File actualFile = new File( managedDefaultDir, proxiedFile );
1091         assertTrue( "Repo Specific Group Metadata should exist: " + requestedResource, actualFile.exists() );
1092 
1093         ProjectReference actualMetadata = createGroupReference( requestedResource );
1094 
1095         assertGroupMetadata( actualFile, actualMetadata, expectedPlugins );
1096     }
1097 
1098     private void assertGroupMetadata( File actualFile, ProjectReference actualMetadata, String expectedPlugins[] )
1099         throws Exception
1100     {
1101         // Build expected metadata XML
1102         StringWriter expectedMetadataXml = new StringWriter();
1103         ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
1104         m.setGroupId( actualMetadata.getGroupId() );
1105 
1106         for ( String pluginId : expectedPlugins )
1107         {
1108             Plugin p = new Plugin();
1109             p.setPrefix( pluginId );
1110             p.setArtifactId( pluginId + "-maven-plugin" );
1111             p.setName( "The " + pluginId + " Plugin" );
1112             m.getPlugins().add( p );
1113         }
1114 
1115         RepositoryMetadataWriter.write( m, expectedMetadataXml );
1116 
1117         // Compare the file to the actual contents.
1118         assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
1119     }
1120 
1121     /**
1122      * Test for the existance of the requestedResource in the default managed repository, and if it exists,
1123      * does it contain the specified list of expected versions?
1124      *
1125      * @param requestedResource the requested resource
1126      * @throws Exception
1127      */
1128     private void assertProjectMetadataContents( String requestedResource, String expectedVersions[],
1129                                                 String latestVersion, String releaseVersion )
1130         throws Exception
1131     {
1132         File actualFile = new File( managedDefaultDir, requestedResource );
1133         assertTrue( actualFile.exists() );
1134 
1135         ProjectReference metadata = createProjectReference( requestedResource );
1136 
1137         // Build expected metadata XML
1138         StringWriter expectedMetadataXml = new StringWriter();
1139         ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
1140         m.setGroupId( metadata.getGroupId() );
1141         m.setArtifactId( metadata.getArtifactId() );
1142         m.setLatestVersion( latestVersion );
1143         m.setReleasedVersion( releaseVersion );
1144 
1145         if ( expectedVersions != null )
1146         {
1147             m.getAvailableVersions().addAll( Arrays.asList( expectedVersions ) );
1148         }
1149 
1150         RepositoryMetadataWriter.write( m, expectedMetadataXml );
1151 
1152         // Compare the file to the actual contents.
1153         assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
1154     }
1155 
1156     /**
1157      * Test for the existance of the requestedResource in the default managed repository, and if it exists,
1158      * does it contain the expected release maven-metadata.xml contents?
1159      *
1160      * @param requestedResource the requested resource
1161      * @throws Exception
1162      */
1163     private void assertReleaseMetadataContents( String requestedResource )
1164         throws Exception
1165     {
1166         File actualFile = new File( managedDefaultDir, requestedResource );
1167         assertTrue( "Release Metadata should exist: " + requestedResource, actualFile.exists() );
1168 
1169         VersionedReference metadata = createVersionedReference( requestedResource );
1170 
1171         // Build expected metadata XML
1172         StringWriter expectedMetadataXml = new StringWriter();
1173         ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
1174         m.setGroupId( metadata.getGroupId() );
1175         m.setArtifactId( metadata.getArtifactId() );
1176         m.setVersion( metadata.getVersion() );
1177         RepositoryMetadataWriter.write( m, expectedMetadataXml );
1178 
1179         // Compare the file to the actual contents.
1180         assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
1181     }
1182 
1183     /**
1184      * Test for the existance of the snapshot metadata in the default managed repository, and if it exists,
1185      * does it contain the expected release maven-metadata.xml contents?
1186      *
1187      * @param requestedResource the requested resource
1188      * @param expectedDate the date in "yyyyMMdd" format
1189      * @param expectedTime the time in "hhmmss" format
1190      * @param expectedBuildnumber the build number
1191      *
1192      * @throws Exception
1193      */
1194     private void assertSnapshotMetadataContents( String requestedResource, String expectedDate, String expectedTime,
1195                                                  int expectedBuildnumber )
1196         throws Exception
1197     {
1198         File actualFile = new File( managedDefaultDir, requestedResource );
1199         assertTrue( "Snapshot Metadata should exist: " + requestedResource, actualFile.exists() );
1200 
1201         VersionedReference actualMetadata = createVersionedReference( requestedResource );
1202 
1203         assertSnapshotMetadata( actualFile, actualMetadata, expectedDate, expectedTime, expectedBuildnumber );
1204     }
1205 
1206     /**
1207      * Test for the existance of the proxied repository specific snapshot metadata in the default managed
1208      * repository, and if it exists, does it contain the expected release maven-metadata.xml contents?
1209      *
1210      * @param proxiedRepoId the repository id of the proxied repository.
1211      * @param requestedResource the requested resource
1212      * @param expectedDate the date in "yyyyMMdd" format
1213      * @param expectedTime the time in "hhmmss" format
1214      * @param expectedBuildnumber the build number
1215      *
1216      * @throws Exception
1217      */
1218     private void assertRepoSnapshotMetadataContents( String proxiedRepoId, String requestedResource,
1219                                                      String expectedDate, String expectedTime, int expectedBuildnumber )
1220         throws Exception
1221     {
1222         String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
1223 
1224         File actualFile = new File( managedDefaultDir, proxiedFile );
1225         assertTrue( "Repo Specific Snapshot Metadata should exist: " + requestedResource, actualFile.exists() );
1226 
1227         VersionedReference actualMetadata = createVersionedReference( requestedResource );
1228 
1229         assertSnapshotMetadata( actualFile, actualMetadata, expectedDate, expectedTime, expectedBuildnumber );
1230     }
1231 
1232     private void assertSnapshotMetadata( File actualFile, VersionedReference actualMetadata, String expectedDate,
1233                                          String expectedTime, int expectedBuildnumber )
1234         throws RepositoryMetadataException, Exception
1235     {
1236         // Build expected metadata XML
1237         StringWriter expectedMetadataXml = new StringWriter();
1238         ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
1239         m.setGroupId( actualMetadata.getGroupId() );
1240         m.setArtifactId( actualMetadata.getArtifactId() );
1241         m.setVersion( VersionUtil.getBaseVersion( actualMetadata.getVersion() ) );
1242 
1243         m.setSnapshotVersion( new SnapshotVersion() );
1244 
1245         if ( StringUtils.isNotBlank( expectedDate ) && StringUtils.isNotBlank( expectedTime ) )
1246         {
1247             m.getSnapshotVersion().setTimestamp( expectedDate + "." + expectedTime );
1248         }
1249 
1250         m.getSnapshotVersion().setBuildNumber( expectedBuildnumber );
1251 
1252         m.setLastUpdated( expectedDate + expectedTime );
1253 
1254         RepositoryMetadataWriter.write( m, expectedMetadataXml );
1255 
1256         // Compare the file to the actual contents.
1257         assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
1258     }
1259 
1260     /**
1261      * Ensures that the repository specific maven metadata file exists, and contains the appropriate
1262      * list of expected versions within.
1263      * @param proxiedRepoId
1264      * @param requestedResource
1265      * @param expectedProxyVersions
1266      */
1267     private void assertRepoProjectMetadata( String proxiedRepoId, String requestedResource,
1268                                             String[] expectedProxyVersions )
1269         throws Exception
1270     {
1271         String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
1272 
1273         File actualFile = new File( managedDefaultDir, proxiedFile );
1274         assertTrue( actualFile.exists() );
1275 
1276         ProjectReference metadata = createProjectReference( requestedResource );
1277 
1278         // Build expected metadata XML
1279         StringWriter expectedMetadataXml = new StringWriter();
1280         ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
1281         m.setGroupId( metadata.getGroupId() );
1282         m.setArtifactId( metadata.getArtifactId() );
1283 
1284         if ( expectedProxyVersions != null )
1285         {
1286             m.getAvailableVersions().addAll( Arrays.asList( expectedProxyVersions ) );
1287         }
1288 
1289         RepositoryMetadataWriter.write( m, expectedMetadataXml );
1290 
1291         // Compare the file to the actual contents.
1292         assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
1293     }
1294 
1295     /**
1296      * Ensures that the repository specific maven metadata file exists, and contains the appropriate
1297      * list of expected versions within.
1298      *
1299      * @param proxiedRepoId
1300      * @param requestedResource
1301      */
1302     private void assertRepoReleaseMetadataContents( String proxiedRepoId, String requestedResource )
1303         throws Exception
1304     {
1305         String proxiedFile = metadataTools.getRepositorySpecificName( proxiedRepoId, requestedResource );
1306 
1307         File actualFile = new File( managedDefaultDir, proxiedFile );
1308         assertTrue( "Release metadata for repo should exist: " + actualFile, actualFile.exists() );
1309 
1310         VersionedReference metadata = createVersionedReference( requestedResource );
1311 
1312         // Build expected metadata XML
1313         StringWriter expectedMetadataXml = new StringWriter();
1314         ArchivaRepositoryMetadata m = new ArchivaRepositoryMetadata();
1315         m.setGroupId( metadata.getGroupId() );
1316         m.setArtifactId( metadata.getArtifactId() );
1317         m.setVersion( metadata.getVersion() );
1318         RepositoryMetadataWriter.write( m, expectedMetadataXml );
1319 
1320         // Compare the file to the actual contents.
1321         assertMetadataEquals( expectedMetadataXml.toString(), actualFile );
1322     }
1323 
1324     /**
1325      * Test for the non-existance of the requestedResource in the default managed repository.
1326      *
1327      * @param requestedResource the requested resource
1328      * @throws Exception
1329      */
1330     private void assertResourceNotFound( String requestedResource )
1331         throws Exception
1332     {
1333         File actualFile = new File( managedDefaultDir, requestedResource );
1334         assertFalse( "Resource should not exist: " + requestedResource, actualFile.exists() );
1335     }
1336 
1337     protected void setUp()
1338         throws Exception
1339     {
1340         super.setUp();
1341 
1342         metadataTools = (MetadataTools) lookup( MetadataTools.class );
1343     }
1344 
1345 }