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