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