package org.apache.archiva.proxy; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import org.apache.archiva.model.ArtifactReference; import org.apache.archiva.policies.CachedFailuresPolicy; import org.apache.archiva.policies.ChecksumPolicy; import org.apache.archiva.policies.ReleasesPolicy; import org.apache.archiva.policies.SnapshotsPolicy; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.maven.wagon.ResourceDoesNotExistException; import org.easymock.EasyMock; import org.junit.Test; import java.io.File; import java.nio.charset.Charset; import static org.junit.Assert.*; /** * ManagedDefaultTransferTest */ public class ManagedDefaultTransferTest extends AbstractProxyTestCase { @Test public void testGetDefaultLayoutNotPresentConnectorOffline() throws Exception { String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); // Ensure file isn't present first. assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE, CachedFailuresPolicy.NO, true ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); assertNull( "File should not have been downloaded", downloadedFile ); } @Test public void testGetDefaultLayoutNotPresent() throws Exception { String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); // Ensure file isn't present first. assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE, CachedFailuresPolicy.NO, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); File sourceFile = new File( REPOPATH_PROXIED1, path ); assertFileEquals( expectedFile, downloadedFile, sourceFile ); assertNoTempFiles( expectedFile ); } @Test public void testGetDefaultLayoutNotPresentPassthrough() throws Exception { String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar.asc"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); // Ensure file isn't present first. assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE, CachedFailuresPolicy.NO, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path ); File sourceFile = new File( REPOPATH_PROXIED1, path ); assertFileEquals( expectedFile, downloadedFile, sourceFile ); assertFalse( new File( downloadedFile.getParentFile(), downloadedFile.getName() + ".sha1" ).exists() ); assertFalse( new File( downloadedFile.getParentFile(), downloadedFile.getName() + ".md5" ).exists() ); assertFalse( new File( downloadedFile.getParentFile(), downloadedFile.getName() + ".asc" ).exists() ); assertNoTempFiles( expectedFile ); } /** * The attempt here should result in no file being transferred. * <p/> * The file exists locally, and the policy is ONCE. * * @throws Exception */ @Test public void testGetDefaultLayoutAlreadyPresentPolicyOnce() throws Exception { String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertTrue( expectedFile.exists() ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE, CachedFailuresPolicy.NO, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); assertFileEquals( expectedFile, downloadedFile, expectedFile ); assertNoTempFiles( expectedFile ); } /** * The attempt here should result in no file being transferred. * <p/> * The file exists locally, and the policy is ONCE. * * @throws Exception */ @Test public void testGetDefaultLayoutAlreadyPresentPassthrough() throws Exception { String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar.asc"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); File remoteFile = new File( REPOPATH_PROXIED1, path ); assertTrue( expectedFile.exists() ); // Set the managed File to be newer than local. setManagedOlderThanRemote( expectedFile, remoteFile ); long originalModificationTime = expectedFile.lastModified(); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ONCE, SnapshotsPolicy.ONCE, CachedFailuresPolicy.NO, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path ); assertNotDownloaded( downloadedFile ); assertNotModified( expectedFile, originalModificationTime ); assertNoTempFiles( expectedFile ); } /** * <p> * Request a file, that exists locally, and remotely. * </p> * <p> * All policies are set to IGNORE. * </p> * <p> * Managed file is newer than remote file. * </p> * <p> * Transfer should not have occured, as managed file is newer. * </p> * * @throws Exception */ @Test public void testGetDefaultLayoutAlreadyPresentNewerThanRemotePolicyIgnored() throws Exception { String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); File remoteFile = new File( REPOPATH_PROXIED1, path ); // Set the managed File to be newer than local. setManagedNewerThanRemote( expectedFile, remoteFile ); long originalModificationTime = expectedFile.lastModified(); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertTrue( expectedFile.exists() ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS, SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); assertNotDownloaded( downloadedFile ); assertNotModified( expectedFile, originalModificationTime ); assertNoTempFiles( expectedFile ); } /** * <p> * Request a file, that exists locally, and remotely. * </p> * <p> * All policies are set to IGNORE. * </p> * <p> * Managed file is older than Remote file. * </p> * <p> * Transfer should have occured, as managed file is older than remote. * </p> * * @throws Exception */ @Test public void testGetDefaultLayoutAlreadyPresentOlderThanRemotePolicyIgnored() throws Exception { String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); File remoteFile = new File( REPOPATH_PROXIED1, path ); // Set the managed file to be newer than remote file. setManagedOlderThanRemote( expectedFile, remoteFile ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertTrue( expectedFile.exists() ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS, SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); File proxiedFile = new File( REPOPATH_PROXIED1, path ); assertFileEquals( expectedFile, downloadedFile, proxiedFile ); assertNoTempFiles( expectedFile ); } /** * The attempt here should result in file being transferred. * <p/> * The file exists locally, is over 6 years old, and the policy is DAILY. * * @throws Exception */ @Test public void testGetDefaultLayoutRemoteUpdate() throws Exception { String path = "org/apache/maven/test/get-default-layout-present/1.0/get-default-layout-present-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertTrue( expectedFile.exists() ); expectedFile.setLastModified( getPastDate().getTime() ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FIX, ReleasesPolicy.DAILY, SnapshotsPolicy.DAILY, CachedFailuresPolicy.NO, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); File proxiedFile = new File( REPOPATH_PROXIED1, path ); assertFileEquals( expectedFile, downloadedFile, proxiedFile ); assertNoTempFiles( expectedFile ); } @Test public void testGetWhenInBothProxiedRepos() throws Exception { String path = "org/apache/maven/test/get-in-both-proxies/1.0/get-in-both-proxies-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false ); saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); File proxied1File = new File( REPOPATH_PROXIED1, path ); File proxied2File = new File( REPOPATH_PROXIED2, path ); assertFileEquals( expectedFile, downloadedFile, proxied1File ); assertNoTempFiles( expectedFile ); // TODO: is this check even needed if it passes above? String actualContents = FileUtils.readFileToString( downloadedFile, Charset.defaultCharset() ); String badContents = FileUtils.readFileToString( proxied2File, Charset.defaultCharset() ); assertFalse( "Downloaded file contents should not be that of proxy 2", StringUtils.equals( actualContents, badContents ) ); } @Test public void testGetInSecondProxiedRepo() throws Exception { String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false ); saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); File proxied2File = new File( REPOPATH_PROXIED2, path ); assertFileEquals( expectedFile, downloadedFile, proxied2File ); assertNoTempFiles( expectedFile ); } @Test public void testNotFoundInAnyProxies() throws Exception { String path = "org/apache/maven/test/does-not-exist/1.0/does-not-exist-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false ); saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); assertNull( "File returned was: " + downloadedFile + "; should have got a not found exception", downloadedFile ); assertNoTempFiles( expectedFile ); } @Test public void testGetInSecondProxiedRepoFirstFails() throws Exception { String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir, path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Repository (usually done within archiva.xml configuration) saveRemoteRepositoryConfig( "badproxied", "Bad Proxied", "test://bad.machine.com/repo/", "default" ); wagonMock.get( EasyMock.eq( path), EasyMock.anyObject( File.class ) ); EasyMock.expectLastCall().andThrow( new ResourceDoesNotExistException( "transfer failed" ) ); wagonMockControl.replay(); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, "badproxied", false ); saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false ); // Attempt the proxy fetch. File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); wagonMockControl.verify(); File proxied2File = new File( REPOPATH_PROXIED2, path ); assertFileEquals( expectedFile, downloadedFile, proxied2File ); assertNoTempFiles( expectedFile ); } @Test public void testGetAllRepositoriesFail() throws Exception { String path = "org/apache/maven/test/get-in-second-proxy/1.0/get-in-second-proxy-1.0.jar"; setupTestableManagedRepository( path ); File expectedFile = new File( managedDefaultDir.getAbsoluteFile(), path ); ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); assertNotExistsInManagedDefaultRepo( expectedFile ); // Configure Repository (usually done within archiva.xml configuration) saveRemoteRepositoryConfig( "badproxied1", "Bad Proxied 1", "test://bad.machine.com/repo/", "default" ); saveRemoteRepositoryConfig( "badproxied2", "Bad Proxied 2", "test://dead.machine.com/repo/", "default" ); // Configure Connector (usually done within archiva.xml configuration) saveConnector( ID_DEFAULT_MANAGED, "badproxied1", false ); saveConnector( ID_DEFAULT_MANAGED, "badproxied2", false ); File tmpFile = new File( expectedFile.getParentFile(), expectedFile.getName() + ".tmp" ); wagonMock.get( EasyMock.eq( path ), EasyMock.anyObject( File.class ) ); EasyMock.expectLastCall().andThrow( new ResourceDoesNotExistException( "Can't find resource." ) ); wagonMock.get( EasyMock.eq( path ), EasyMock.anyObject( File.class ) ); EasyMock.expectLastCall().andThrow( new ResourceDoesNotExistException( "Can't find resource." ) ); wagonMockControl.replay(); File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); assertNotDownloaded( downloadedFile ); wagonMockControl.verify(); assertNoTempFiles( expectedFile ); // TODO: do not want failures to present as a not found [MRM-492] // TODO: How much information on each failure should we pass back to the user vs. logging in the proxy? } }