]> source.dussan.org Git - archiva.git/blob
01759437413e1002b49a49537ee94c702d9eecac
[archiva.git] /
1 package org.apache.archiva.proxy;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.archiva.model.ArtifactReference;
23 import org.apache.archiva.policies.CachedFailuresPolicy;
24 import org.apache.archiva.policies.ChecksumPolicy;
25 import org.apache.archiva.policies.ReleasesPolicy;
26 import org.apache.archiva.policies.SnapshotsPolicy;
27 import org.apache.commons.io.FileUtils;
28 import org.apache.commons.lang.StringUtils;
29 import org.apache.maven.wagon.ResourceDoesNotExistException;
30 import org.easymock.EasyMock;
31 import org.junit.Test;
32
33 import java.io.File;
34 import java.nio.charset.Charset;
35 import java.nio.file.Files;
36 import java.nio.file.Path;
37 import java.nio.file.Paths;
38 import java.nio.file.attribute.FileTime;
39 import java.util.concurrent.TimeUnit;
40
41 import static org.junit.Assert.*;
42
43 /**
44  * ManagedDefaultTransferTest
45  */
46 public class ManagedDefaultTransferTest
47     extends AbstractProxyTestCase
48 {
49     @Test
50     public void testGetDefaultLayoutNotPresentConnectorOffline()
51         throws Exception
52     {
53         String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
54         setupTestableManagedRepository( path );
55
56         Path expectedFile = managedDefaultDir.resolve(path);
57         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
58
59         // Ensure file isn't present first.
60         assertNotExistsInManagedDefaultRepo( expectedFile );
61
62         // Configure Connector (usually done within archiva.xml configuration)
63         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE,
64                        CachedFailuresPolicy.NO, true );
65
66         // Attempt the proxy fetch.
67         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
68         assertNull( "File should not have been downloaded", downloadedFile );
69     }
70
71     @Test
72     public void testGetDefaultLayoutNotPresent()
73         throws Exception
74     {
75         String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar";
76         setupTestableManagedRepository( path );
77
78         Path expectedFile = managedDefaultDir.resolve(path);
79         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
80
81         // Ensure file isn't present first.
82         assertNotExistsInManagedDefaultRepo( expectedFile );
83
84         // Configure Connector (usually done within archiva.xml configuration)
85         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE,
86                        CachedFailuresPolicy.NO, false );
87
88         // Attempt the proxy fetch.
89         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
90
91         Path sourceFile = Paths.get(REPOPATH_PROXIED1, path);
92         assertFileEquals( expectedFile, downloadedFile, sourceFile );
93         assertNoTempFiles( expectedFile );
94     }
95
96     @Test
97     public void testGetDefaultLayoutNotPresentPassthrough()
98         throws Exception
99     {
100         String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar.asc";
101         setupTestableManagedRepository( path );
102
103         Path expectedFile = managedDefaultDir.resolve(path);
104
105         // Ensure file isn't present first.
106         assertNotExistsInManagedDefaultRepo( expectedFile );
107
108         // Configure Connector (usually done within archiva.xml configuration)
109         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE,
110                        CachedFailuresPolicy.NO, false );
111
112         // Attempt the proxy fetch.
113         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path );
114
115         Path sourceFile = Paths.get(REPOPATH_PROXIED1, path);
116         assertFileEquals( expectedFile, downloadedFile, sourceFile );
117         assertFalse( Files.exists( downloadedFile.getParent().resolve(downloadedFile.getFileName() + ".sha1" )) );
118         assertFalse( Files.exists(downloadedFile.getParent().resolve(downloadedFile.getFileName() + ".md5" ) ));
119         assertFalse( Files.exists( downloadedFile.getParent().resolve(downloadedFile.getFileName() + ".asc" ) ));
120         assertNoTempFiles( expectedFile );
121     }
122
123     /**
124      * The attempt here should result in no file being transferred.
125      * <p/>
126      * The file exists locally, and the policy is ONCE.
127      *
128      * @throws Exception
129      */
130     @Test
131     public void testGetDefaultLayoutAlreadyPresentPolicyOnce()
132         throws Exception
133     {
134         String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
135         setupTestableManagedRepository( path );
136
137         Path expectedFile = managedDefaultDir.resolve(path);
138
139         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
140
141         assertTrue( Files.exists(expectedFile) );
142
143         // Configure Connector (usually done within archiva.xml configuration)
144         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE,
145                        CachedFailuresPolicy.NO, false );
146
147         // Attempt the proxy fetch.
148         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
149
150         assertFileEquals( expectedFile, downloadedFile, expectedFile );
151         assertNoTempFiles( expectedFile );
152     }
153
154     /**
155      * The attempt here should result in no file being transferred.
156      * <p/>
157      * The file exists locally, and the policy is ONCE.
158      *
159      * @throws Exception
160      */
161     @Test
162     public void testGetDefaultLayoutAlreadyPresentPassthrough()
163         throws Exception
164     {
165         String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar.asc";
166         setupTestableManagedRepository( path );
167
168         Path expectedFile = managedDefaultDir.resolve(path);
169         Path remoteFile = Paths.get(REPOPATH_PROXIED1, path);
170
171         assertTrue( Files.exists(expectedFile) );
172
173         // Set the managed File to be newer than local.
174         setManagedOlderThanRemote( expectedFile, remoteFile );
175         long originalModificationTime = Files.getLastModifiedTime(expectedFile).toMillis();
176
177         // Configure Connector (usually done within archiva.xml configuration)
178         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE,
179                        CachedFailuresPolicy.NO, false );
180
181         // Attempt the proxy fetch.
182         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path );
183
184         assertNotDownloaded( downloadedFile );
185         assertNotModified( expectedFile, originalModificationTime );
186         assertNoTempFiles( expectedFile );
187     }
188
189     /**
190      * <p>
191      * Request a file, that exists locally, and remotely.
192      * </p>
193      * <p>
194      * All policies are set to IGNORE.
195      * </p>
196      * <p>
197      * Managed file is newer than remote file.
198      * </p>
199      * <p>
200      * Transfer should not have occured, as managed file is newer.
201      * </p>
202      *
203      * @throws Exception
204      */
205     @Test
206     public void testGetDefaultLayoutAlreadyPresentNewerThanRemotePolicyIgnored()
207         throws Exception
208     {
209         String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
210         setupTestableManagedRepository( path );
211
212         Path expectedFile = managedDefaultDir.resolve(path);
213         Path remoteFile = Paths.get(REPOPATH_PROXIED1, path);
214
215         // Set the managed File to be newer than local.
216         setManagedNewerThanRemote( expectedFile, remoteFile );
217
218         long originalModificationTime = Files.getLastModifiedTime( expectedFile).toMillis();
219         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
220
221         assertTrue( Files.exists(expectedFile) );
222
223         // Configure Connector (usually done within archiva.xml configuration)
224         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
225                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
226
227         // Attempt the proxy fetch.
228         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
229
230         assertNotDownloaded( downloadedFile );
231         assertNotModified( expectedFile, originalModificationTime );
232         assertNoTempFiles( expectedFile );
233     }
234
235     /**
236      * <p>
237      * Request a file, that exists locally, and remotely.
238      * </p>
239      * <p>
240      * All policies are set to IGNORE.
241      * </p>
242      * <p>
243      * Managed file is older than Remote file.
244      * </p>
245      * <p>
246      * Transfer should have occured, as managed file is older than remote.
247      * </p>
248      *
249      * @throws Exception
250      */
251     @Test
252     public void testGetDefaultLayoutAlreadyPresentOlderThanRemotePolicyIgnored()
253         throws Exception
254     {
255         String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
256         setupTestableManagedRepository( path );
257
258         Path expectedFile = managedDefaultDir.resolve(path);
259         Path remoteFile = Paths.get(REPOPATH_PROXIED1, path);
260
261         // Set the managed file to be newer than remote file.
262         setManagedOlderThanRemote( expectedFile, remoteFile );
263
264         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
265
266         assertTrue( Files.exists(expectedFile) );
267
268         // Configure Connector (usually done within archiva.xml configuration)
269         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
270                        SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
271
272         // Attempt the proxy fetch.
273         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
274
275         Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
276         assertFileEquals( expectedFile, downloadedFile, proxiedFile );
277         assertNoTempFiles( expectedFile );
278     }
279
280     /**
281      * The attempt here should result in file being transferred.
282      * <p/>
283      * The file exists locally, is over 6 years old, and the policy is DAILY.
284      *
285      * @throws Exception
286      */
287     @Test
288     public void testGetDefaultLayoutRemoteUpdate()
289         throws Exception
290     {
291         String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar";
292         setupTestableManagedRepository( path );
293
294         Path expectedFile = managedDefaultDir.resolve(path);
295         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
296
297         assertTrue( Files.exists(expectedFile) );
298         Files.setLastModifiedTime( expectedFile, FileTime.from(getPastDate().getTime(), TimeUnit.MILLISECONDS ));
299
300         // Configure Connector (usually done within archiva.xml configuration)
301         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.DAILY, SnapshotsPolicy.DAILY,
302                        CachedFailuresPolicy.NO, false );
303
304         // Attempt the proxy fetch.
305         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
306
307         Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
308         assertFileEquals( expectedFile, downloadedFile, proxiedFile );
309         assertNoTempFiles( expectedFile );
310     }
311
312     @Test
313     public void testGetWhenInBothProxiedRepos()
314         throws Exception
315     {
316         String path = "org/apache/maven/test/get-in-both-proxies/1.0/get-in-both-proxies-1.0.jar";
317         setupTestableManagedRepository( path );
318
319         Path expectedFile = managedDefaultDir.resolve(path);
320         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
321
322         assertNotExistsInManagedDefaultRepo( expectedFile );
323
324         // Configure Connector (usually done within archiva.xml configuration)
325         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false );
326         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
327
328         // Attempt the proxy fetch.
329         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
330
331         Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
332         Path proxied2File = Paths.get(REPOPATH_PROXIED2, path);
333         assertFileEquals( expectedFile, downloadedFile, proxied1File );
334         assertNoTempFiles( expectedFile );
335
336         // TODO: is this check even needed if it passes above? 
337         String actualContents = FileUtils.readFileToString( downloadedFile.toFile(), Charset.defaultCharset() );
338         String badContents = FileUtils.readFileToString( proxied2File.toFile(), Charset.defaultCharset() );
339         assertFalse( "Downloaded file contents should not be that of proxy 2",
340                      StringUtils.equals( actualContents, badContents ) );
341     }
342
343     @Test
344     public void testGetInSecondProxiedRepo()
345         throws Exception
346     {
347         String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
348         setupTestableManagedRepository( path );
349
350         Path expectedFile = managedDefaultDir.resolve(path);
351         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
352
353         assertNotExistsInManagedDefaultRepo( expectedFile );
354
355         // Configure Connector (usually done within archiva.xml configuration)
356         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false );
357         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
358
359         // Attempt the proxy fetch.
360         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
361
362         Path proxied2File = Paths.get(REPOPATH_PROXIED2, path);
363         assertFileEquals( expectedFile, downloadedFile, proxied2File );
364         assertNoTempFiles( expectedFile );
365     }
366
367     @Test
368     public void testNotFoundInAnyProxies()
369         throws Exception
370     {
371         String path = "org/apache/maven/test/does-not-exist/1.0/does-not-exist-1.0.jar";
372         setupTestableManagedRepository( path );
373
374         Path expectedFile = managedDefaultDir.resolve(path);
375         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
376
377         assertNotExistsInManagedDefaultRepo( expectedFile );
378
379         // Configure Connector (usually done within archiva.xml configuration)
380         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false );
381         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
382
383         // Attempt the proxy fetch.
384         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
385
386         assertNull( "File returned was: " + downloadedFile + "; should have got a not found exception",
387                     downloadedFile );
388         assertNoTempFiles( expectedFile );
389     }
390
391     @Test
392     public void testGetInSecondProxiedRepoFirstFails()
393         throws Exception
394     {
395         String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
396         setupTestableManagedRepository( path );
397
398         Path expectedFile = managedDefaultDir.resolve(path);
399         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
400
401         assertNotExistsInManagedDefaultRepo( expectedFile );
402
403         // Configure Repository (usually done within archiva.xml configuration)
404         saveRemoteRepositoryConfig( "badproxied", "Bad Proxied", "test://bad.machine.com/repo/", "default" );
405
406         wagonMock.get( EasyMock.eq( path), EasyMock.anyObject( File.class ) );
407         EasyMock.expectLastCall().andThrow( new ResourceDoesNotExistException( "transfer failed" )  );
408         wagonMockControl.replay();
409
410         // Configure Connector (usually done within archiva.xml configuration)
411         saveConnector( ID_DEFAULT_MANAGED, "badproxied", false );
412         saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
413
414         // Attempt the proxy fetch.
415         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
416
417         wagonMockControl.verify();
418
419         Path proxied2File = Paths.get(REPOPATH_PROXIED2, path);
420         assertFileEquals( expectedFile, downloadedFile, proxied2File );
421         assertNoTempFiles( expectedFile );
422     }
423
424     @Test
425     public void testGetAllRepositoriesFail()
426         throws Exception
427     {
428         String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar";
429         setupTestableManagedRepository( path );
430
431         Path expectedFile = managedDefaultDir.resolve( path );
432         ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
433
434         assertNotExistsInManagedDefaultRepo( expectedFile );
435
436         // Configure Repository (usually done within archiva.xml configuration)
437         saveRemoteRepositoryConfig( "badproxied1", "Bad Proxied 1", "test://bad.machine.com/repo/", "default" );
438         saveRemoteRepositoryConfig( "badproxied2", "Bad Proxied 2", "test://dead.machine.com/repo/", "default" );
439
440         // Configure Connector (usually done within archiva.xml configuration)
441         saveConnector( ID_DEFAULT_MANAGED, "badproxied1", false );
442         saveConnector( ID_DEFAULT_MANAGED, "badproxied2", false );
443
444         Path tmpFile = expectedFile.getParent().resolve(expectedFile.getFileName() + ".tmp" );
445
446         wagonMock.get( EasyMock.eq( path ), EasyMock.anyObject( File.class ) );
447         EasyMock.expectLastCall().andThrow( new ResourceDoesNotExistException( "Can't find resource." ) );
448
449         wagonMock.get( EasyMock.eq( path ), EasyMock.anyObject( File.class ) );
450         EasyMock.expectLastCall().andThrow( new ResourceDoesNotExistException( "Can't find resource." ) );
451
452         wagonMockControl.replay();
453
454         Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
455
456         assertNotDownloaded( downloadedFile );
457
458         wagonMockControl.verify();
459         assertNoTempFiles( expectedFile );
460
461         // TODO: do not want failures to present as a not found [MRM-492]
462         // TODO: How much information on each failure should we pass back to the user vs. logging in the proxy? 
463     }
464
465
466 }