Fixing release / snapshot policies from applying tests on maven-metadata.xml files. Creating unit tests for release / snapshot policies. Switching from boolean return on .applyPolicy() to throwing exception, to gain better logging of why the transfer failed. Logging policy failures better. git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@590858 13f79535-47bb-0310-9956-ffa450edef68tags/archiva-1.0-beta-4
@@ -76,7 +76,7 @@ public abstract class AbstractUpdatePolicy | |||
*/ | |||
public static final String ONCE = "once"; | |||
private List options = new ArrayList(); | |||
private List<String> options = new ArrayList<String>(); | |||
public AbstractUpdatePolicy() | |||
{ | |||
@@ -91,13 +91,20 @@ public abstract class AbstractUpdatePolicy | |||
protected abstract String getUpdateMode(); | |||
public List getOptions() | |||
public List<String> getOptions() | |||
{ | |||
return options; | |||
} | |||
public boolean applyPolicy( String policySetting, Properties request, File localFile ) | |||
public void applyPolicy( String policySetting, Properties request, File localFile ) | |||
throws PolicyViolationException, PolicyConfigurationException | |||
{ | |||
if ( !StringUtils.equals( request.getProperty( "filetype" ), "artifact" ) ) | |||
{ | |||
// Only process artifact file types. | |||
return; | |||
} | |||
String version = request.getProperty( "version", "" ); | |||
boolean isSnapshotVersion = false; | |||
@@ -108,50 +115,48 @@ public abstract class AbstractUpdatePolicy | |||
if ( !options.contains( policySetting ) ) | |||
{ | |||
// No valid code? false it is then. | |||
getLogger().error( "Unknown artifact-update policyCode [" + policySetting + "]" ); | |||
return false; | |||
// Not a valid code. | |||
throw new PolicyConfigurationException( "Unknown " + getUpdateMode() + " policy setting [" + policySetting | |||
+ "], valid settings are [" + StringUtils.join( options.iterator(), "," ) + "]" ); | |||
} | |||
if ( IGNORED.equals( policySetting ) ) | |||
{ | |||
// Ignored means ok to update. | |||
getLogger().debug( "OK to update, " + getUpdateMode() + " policy set to IGNORED." ); | |||
return true; | |||
return; | |||
} | |||
// Test for mismatches. | |||
if ( !isSnapshotVersion && isSnapshotPolicy() ) | |||
{ | |||
getLogger().debug( "OK to update, snapshot policy does not apply for non-snapshot versions." ); | |||
return true; | |||
return; | |||
} | |||
if ( isSnapshotVersion && !isSnapshotPolicy() ) | |||
{ | |||
getLogger().debug( "OK to update, release policy does not apply for snapshot versions." ); | |||
return true; | |||
return; | |||
} | |||
if ( DISABLED.equals( policySetting ) ) | |||
{ | |||
// Disabled means no. | |||
getLogger().debug( "NO to update, " + getUpdateMode() + " policy set to DISABLED." ); | |||
return false; | |||
throw new PolicyViolationException( "NO to update, " + getUpdateMode() + " policy set to DISABLED." ); | |||
} | |||
if ( !localFile.exists() ) | |||
{ | |||
// No file means it's ok. | |||
getLogger().debug( "OK to update " + getUpdateMode() + ", local file does not exist." ); | |||
return true; | |||
return; | |||
} | |||
if ( ONCE.equals( policySetting ) ) | |||
{ | |||
// File exists, but policy is once. | |||
getLogger().debug( "NO to update" + getUpdateMode() + ", local file exist (and policy is ONCE)." ); | |||
return false; | |||
throw new PolicyViolationException( "NO to update " + getUpdateMode() + ", policy is ONCE, and local file exist." ); | |||
} | |||
if ( DAILY.equals( policySetting ) ) | |||
@@ -161,7 +166,16 @@ public abstract class AbstractUpdatePolicy | |||
Calendar fileCal = Calendar.getInstance(); | |||
fileCal.setTimeInMillis( localFile.lastModified() ); | |||
return cal.after( fileCal ); | |||
if( cal.after( fileCal ) ) | |||
{ | |||
// Its ok. | |||
return; | |||
} | |||
else | |||
{ | |||
throw new PolicyViolationException( "NO to update " + getUpdateMode() | |||
+ ", policy is DAILY, local file exist, and has been updated within the last day." ); | |||
} | |||
} | |||
if ( HOURLY.equals( policySetting ) ) | |||
@@ -171,10 +185,19 @@ public abstract class AbstractUpdatePolicy | |||
Calendar fileCal = Calendar.getInstance(); | |||
fileCal.setTimeInMillis( localFile.lastModified() ); | |||
return cal.after( fileCal ); | |||
if( cal.after( fileCal ) ) | |||
{ | |||
// Its ok. | |||
return; | |||
} | |||
else | |||
{ | |||
throw new PolicyViolationException( "NO to update " + getUpdateMode() | |||
+ ", policy is HOURLY, local file exist, and has been updated within the last hour." ); | |||
} | |||
} | |||
getLogger().error( "Unhandled policyCode [" + policySetting + "]" ); | |||
return false; | |||
throw new PolicyConfigurationException( "Unable to process " + getUpdateMode() | |||
+ " policy of [" + policySetting + "], please file a bug report." ); | |||
} | |||
} |
@@ -52,7 +52,7 @@ public class CachedFailuresPolicy | |||
*/ | |||
private UrlFailureCache urlFailureCache; | |||
private List options = new ArrayList(); | |||
private List<String> options = new ArrayList<String>(); | |||
public CachedFailuresPolicy() | |||
{ | |||
@@ -60,20 +60,21 @@ public class CachedFailuresPolicy | |||
options.add( CACHED ); | |||
} | |||
public boolean applyPolicy( String policySetting, Properties request, File localFile ) | |||
public void applyPolicy( String policySetting, Properties request, File localFile ) | |||
throws PolicyViolationException, PolicyConfigurationException | |||
{ | |||
if ( !options.contains( policySetting ) ) | |||
{ | |||
// No valid code? false it is then. | |||
getLogger().error( "Unknown check-failures policyCode [" + policySetting + "]" ); | |||
return false; | |||
// Not a valid code. | |||
throw new PolicyConfigurationException( "Unknown cache-failues policy setting [" + policySetting | |||
+ "], valid settings are [" + StringUtils.join( options.iterator(), "," ) + "]" ); | |||
} | |||
if ( IGNORED.equals( policySetting ) ) | |||
{ | |||
// Ignore. | |||
getLogger().debug( "OK to fetch, check-failures policy set to IGNORED." ); | |||
return true; | |||
return; | |||
} | |||
String url = request.getProperty( "url" ); | |||
@@ -82,14 +83,11 @@ public class CachedFailuresPolicy | |||
{ | |||
if ( urlFailureCache.hasFailedBefore( url ) ) | |||
{ | |||
getLogger().debug( "NO to fetch, check-failures detected previous failure on url: " + url ); | |||
return false; | |||
throw new PolicyViolationException( "NO to fetch, check-failures detected previous failure on url: " + url ); | |||
} | |||
} | |||
getLogger().debug( "OK to fetch, check-failures detected no issues." ); | |||
return true; | |||
} | |||
public String getDefaultOption() | |||
@@ -102,7 +100,7 @@ public class CachedFailuresPolicy | |||
return "cache-failures"; | |||
} | |||
public List getOptions() | |||
public List<String> getOptions() | |||
{ | |||
return options; | |||
} |
@@ -19,6 +19,7 @@ package org.apache.maven.archiva.policies; | |||
* under the License. | |||
*/ | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.maven.archiva.common.utils.Checksums; | |||
import org.codehaus.plexus.logging.AbstractLogEnabled; | |||
@@ -28,7 +29,8 @@ import java.util.List; | |||
import java.util.Properties; | |||
/** | |||
* ChecksumPolicy | |||
* ChecksumPolicy - a policy applied after the download to see if the file has been downloaded | |||
* successfully and completely (or not). | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
@@ -68,60 +70,70 @@ public class ChecksumPolicy | |||
options.add( IGNORED ); | |||
} | |||
public boolean applyPolicy( String policySetting, Properties request, File localFile ) | |||
public void applyPolicy( String policySetting, Properties request, File localFile ) | |||
throws PolicyViolationException, PolicyConfigurationException | |||
{ | |||
if ( !options.contains( policySetting ) ) | |||
{ | |||
// No valid code? false it is then. | |||
getLogger().error( "Unknown checksum policyCode [" + policySetting + "]" ); | |||
return false; | |||
// Not a valid code. | |||
throw new PolicyConfigurationException( "Unknown checksum policy setting [" + policySetting | |||
+ "], valid settings are [" + StringUtils.join( options.iterator(), "," ) + "]" ); | |||
} | |||
if ( IGNORED.equals( policySetting ) ) | |||
{ | |||
// Ignore. | |||
return true; | |||
return; | |||
} | |||
if ( !localFile.exists() ) | |||
{ | |||
// Local File does not exist. | |||
getLogger().debug( "Local file " + localFile.getAbsolutePath() + " does not exist." ); | |||
return false; | |||
throw new PolicyViolationException( "Checksum policy failure, local file " + localFile.getAbsolutePath() | |||
+ " does not exist to check." ); | |||
} | |||
if ( FAIL.equals( policySetting ) ) | |||
{ | |||
boolean checksPass = checksums.check( localFile ); | |||
if( ! checksPass ) | |||
if( checksums.check( localFile ) ) | |||
{ | |||
File sha1File = new File( localFile.getAbsolutePath() + ".sha1" ); | |||
File md5File = new File( localFile.getAbsolutePath() + ".md5" ); | |||
// On failure. delete files. | |||
if ( sha1File.exists() ) | |||
{ | |||
sha1File.delete(); | |||
} | |||
return; | |||
} | |||
File sha1File = new File( localFile.getAbsolutePath() + ".sha1" ); | |||
File md5File = new File( localFile.getAbsolutePath() + ".md5" ); | |||
if ( md5File.exists() ) | |||
{ | |||
md5File.delete(); | |||
} | |||
// On failure. delete files. | |||
if ( sha1File.exists() ) | |||
{ | |||
sha1File.delete(); | |||
} | |||
localFile.delete(); | |||
if ( md5File.exists() ) | |||
{ | |||
md5File.delete(); | |||
} | |||
return checksPass; | |||
localFile.delete(); | |||
throw new PolicyViolationException( "Checksums do not match, policy set to FAIL, " | |||
+ "deleting checksum files and local file " + localFile.getAbsolutePath() + "." ); | |||
} | |||
if ( FIX.equals( policySetting ) ) | |||
{ | |||
return checksums.update( localFile ); | |||
if( checksums.update( localFile ) ) | |||
{ | |||
return; | |||
} | |||
else | |||
{ | |||
throw new PolicyViolationException( "Checksum policy set to FIX, " | |||
+ "yet unable to update checksums for local file " + localFile.getAbsolutePath() + "." ); | |||
} | |||
} | |||
getLogger().error( "Unhandled policyCode [" + policySetting + "]" ); | |||
return false; | |||
throw new PolicyConfigurationException( "Unable to process checksum policy of [" + policySetting | |||
+ "], please file a bug report." ); | |||
} | |||
public String getDefaultOption() |
@@ -67,7 +67,8 @@ public interface DownloadPolicy | |||
* @param request the list of request properties that the policy might use. | |||
* @param localFile | |||
* | |||
* @return true if the policy passes. | |||
* @throws PolicyViolationException if the policy has been violated. | |||
*/ | |||
public boolean applyPolicy( String policySetting, Properties request, File localFile ); | |||
public void applyPolicy( String policySetting, Properties request, File localFile ) | |||
throws PolicyViolationException, PolicyConfigurationException; | |||
} |
@@ -0,0 +1,44 @@ | |||
package org.apache.maven.archiva.policies; | |||
/* | |||
* 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.maven.archiva.common.ArchivaException; | |||
/** | |||
* PolicyConfigurationException is thrown when a policy cannot be executed due to a | |||
* configuration issue. | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public class PolicyConfigurationException | |||
extends ArchivaException | |||
{ | |||
public PolicyConfigurationException( String message, Throwable cause ) | |||
{ | |||
super( message, cause ); | |||
} | |||
public PolicyConfigurationException( String message ) | |||
{ | |||
super( message ); | |||
} | |||
} |
@@ -19,26 +19,24 @@ package org.apache.maven.archiva.policies; | |||
* under the License. | |||
*/ | |||
import junit.framework.Test; | |||
import junit.framework.TestSuite; | |||
import org.apache.maven.archiva.common.ArchivaException; | |||
/** | |||
* Helper class for IDE testing. | |||
* PolicyViolationException | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public class AllTests | |||
public class PolicyViolationException | |||
extends ArchivaException | |||
{ | |||
public static Test suite() | |||
public PolicyViolationException( String message, Throwable cause ) | |||
{ | |||
TestSuite suite = new TestSuite( "Test for org.apache.maven.archiva.policies" ); | |||
//$JUnit-BEGIN$ | |||
suite.addTestSuite( ChecksumPolicyTest.class ); | |||
suite.addTestSuite( CachedFailuresPolicyTest.class ); | |||
//$JUnit-END$ | |||
return suite; | |||
super( message, cause ); | |||
} | |||
public PolicyViolationException( String message ) | |||
{ | |||
super( message ); | |||
} | |||
} |
@@ -19,7 +19,6 @@ package org.apache.maven.archiva.policies; | |||
* under the License. | |||
*/ | |||
import java.io.File; | |||
import java.util.Properties; | |||
@@ -30,7 +29,8 @@ import java.util.Properties; | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public interface PostDownloadPolicy extends DownloadPolicy | |||
public interface PostDownloadPolicy | |||
extends DownloadPolicy | |||
{ | |||
/** | |||
* Apply the download policy. | |||
@@ -42,7 +42,8 @@ public interface PostDownloadPolicy extends DownloadPolicy | |||
* @param request the list of request properties that the policy might use. | |||
* @param localFile the local file that this policy affects | |||
* | |||
* @return true if the policy passes. false if not. | |||
* @throws PolicyViolationException if the policy has been violated. | |||
*/ | |||
public boolean applyPolicy( String policySetting, Properties request, File localFile ); | |||
public void applyPolicy( String policySetting, Properties request, File localFile ) | |||
throws PolicyViolationException, PolicyConfigurationException; | |||
} |
@@ -41,7 +41,8 @@ public interface PreDownloadPolicy extends DownloadPolicy | |||
* @param request the list of request properties that the policy might use. | |||
* @param localFile the local file that this policy affects | |||
* | |||
* @return true if the policy passes. false if not. | |||
* @throws PolicyViolationException if the policy has been violated. | |||
*/ | |||
public boolean applyPolicy( String policySetting, Properties request, File localFile ); | |||
public void applyPolicy( String policySetting, Properties request, File localFile ) | |||
throws PolicyViolationException, PolicyConfigurationException; | |||
} |
@@ -67,7 +67,7 @@ public class CachedFailuresPolicyTest | |||
request.setProperty( "url", "http://a.bad.hostname.maven.org/path/to/resource.txt" ); | |||
assertTrue( policy.applyPolicy( CachedFailuresPolicy.IGNORED, request, localFile ) ); | |||
policy.applyPolicy( CachedFailuresPolicy.IGNORED, request, localFile ); | |||
} | |||
public void testCachedNotInCache() | |||
@@ -79,7 +79,7 @@ public class CachedFailuresPolicyTest | |||
request.setProperty( "url", "http://a.bad.hostname.maven.org/path/to/resource.txt" ); | |||
assertTrue( policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile ) ); | |||
policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile ); | |||
} | |||
public void testCachedInCache() | |||
@@ -97,6 +97,14 @@ public class CachedFailuresPolicyTest | |||
request.setProperty( "url", url ); | |||
assertFalse( policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile ) ); | |||
try | |||
{ | |||
policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile ); | |||
fail( "Expected a PolicyViolationException." ); | |||
} | |||
catch ( PolicyViolationException e ) | |||
{ | |||
// expected path. | |||
} | |||
} | |||
} |
@@ -155,7 +155,7 @@ public class ChecksumPolicyTest | |||
File localFile = createTestableFiles( null, null ); | |||
Properties request = createRequest(); | |||
assertTrue( policy.applyPolicy( ChecksumPolicy.IGNORED, request, localFile ) ); | |||
policy.applyPolicy( ChecksumPolicy.IGNORED, request, localFile ); | |||
} | |||
private void assertFailSetting( boolean expectedResult, String md5State, String sha1State ) | |||
@@ -165,11 +165,18 @@ public class ChecksumPolicyTest | |||
File localFile = createTestableFiles( md5State, sha1State ); | |||
Properties request = createRequest(); | |||
boolean actualResult = policy.applyPolicy( ChecksumPolicy.FAIL, request, localFile ); | |||
String msg = createMessage( ChecksumPolicy.FAIL, md5State, sha1State ); | |||
if ( actualResult == false ) | |||
boolean actualResult; | |||
try | |||
{ | |||
policy.applyPolicy( ChecksumPolicy.FAIL, request, localFile ); | |||
actualResult = true; | |||
} | |||
catch ( PolicyViolationException e ) | |||
{ | |||
actualResult = false; | |||
String msg = createMessage( ChecksumPolicy.FAIL, md5State, sha1State ); | |||
assertFalse( msg + " local file should not exist:", localFile.exists() ); | |||
File md5File = new File( localFile.getAbsolutePath() + ".sha1" ); | |||
File sha1File = new File( localFile.getAbsolutePath() + ".md5" ); | |||
@@ -187,7 +194,18 @@ public class ChecksumPolicyTest | |||
File localFile = createTestableFiles( md5State, sha1State ); | |||
Properties request = createRequest(); | |||
boolean actualResult = policy.applyPolicy( ChecksumPolicy.FIX, request, localFile ); | |||
boolean actualResult; | |||
try | |||
{ | |||
policy.applyPolicy( ChecksumPolicy.FIX, request, localFile ); | |||
actualResult = true; | |||
} | |||
catch ( PolicyViolationException e ) | |||
{ | |||
actualResult = false; | |||
} | |||
assertEquals( createMessage( ChecksumPolicy.FIX, md5State, sha1State ), expectedResult, actualResult ); | |||
// End result should be legitimate SHA1 and MD5 files. | |||
@@ -278,8 +296,8 @@ public class ChecksumPolicyTest | |||
private File createTestableFiles( String md5State, String sha1State ) | |||
throws Exception | |||
{ | |||
File sourceDir = new File( "src/test/resources/checksums/" ); | |||
File destDir = new File( "target/checksum-tests/" + getName() + "/" ); | |||
File sourceDir = getTestFile( "src/test/resources/checksums/" ); | |||
File destDir = getTestFile( "target/checksum-tests/" + getName() + "/" ); | |||
FileUtils.copyFileToDirectory( new File( sourceDir, "artifact.jar" ), destDir ); | |||
@@ -0,0 +1,347 @@ | |||
package org.apache.maven.archiva.policies; | |||
/* | |||
* 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.codehaus.plexus.PlexusTestCase; | |||
import org.codehaus.plexus.util.FileUtils; | |||
import java.io.File; | |||
import java.util.Properties; | |||
/** | |||
* ReleasePolicyTest | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public class ReleasePolicyTest | |||
extends PlexusTestCase | |||
{ | |||
private static final String PATH_VERSION_METADATA = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/maven-metadata.xml"; | |||
private static final String PATH_PROJECT_METADATA = "org/apache/archiva/archiva-testable/maven-metadata.xml"; | |||
private static final String PATH_SNAPSHOT_ARTIFACT = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/archiva-testable-1.0-SNAPSHOT.jar"; | |||
private static final String PATH_RELEASE_ARTIFACT = "org/apache/archiva/archiva-testable/2.0/archiva-testable-2.0.jar"; | |||
private static final boolean WITH_LOCAL = true; | |||
private static final boolean NO_LOCAL = false; | |||
protected static final long ONE_SECOND = ( 1000 /* milliseconds */); | |||
protected static final long ONE_MINUTE = ( ONE_SECOND * 60 ); | |||
protected static final long ONE_HOUR = ( ONE_MINUTE * 60 ); | |||
protected static final long ONE_DAY = ( ONE_HOUR * 24 ); | |||
protected static final long OVER_ONE_HOUR = ( ONE_HOUR + ONE_MINUTE ); | |||
protected static final long OVER_ONE_DAY = ( ONE_DAY + ONE_HOUR ); | |||
protected static final long OLDER = ( -1 ); | |||
protected static final long NEWER = 0; | |||
private long generatedLocalFileUpdateDelta = 0; | |||
public void testReleasePolicyDailyProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyDailyReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyDailySnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyDailyVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyDisabledProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyDisabledReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicyViolation( ReleasesPolicy.DISABLED, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicyViolation( ReleasesPolicy.DISABLED, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyDisabledSnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyDisabledVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyHourlyProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyHourlyReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyHourlySnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyHourlyVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyIgnoredProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyIgnoredReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyIgnoredSnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyIgnoredVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyOnceProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyOnceReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicyViolation( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyOnceSnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testReleasePolicyOnceVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
private void assertReleasesPolicy( String setting, String path, boolean createLocalFile ) | |||
throws Exception | |||
{ | |||
PreDownloadPolicy policy = lookupPolicy(); | |||
Properties request = new Properties(); | |||
request.setProperty( "filetype", path.endsWith( "/maven-metadata.xml" ) ? "metadata" : "artifact" ); | |||
if ( path.contains( "1.0-SNAPSHOT" ) ) | |||
{ | |||
request.setProperty( "version", "1.0-SNAPSHOT" ); | |||
} | |||
if ( path.contains( "2.0" ) ) | |||
{ | |||
request.setProperty( "version", "2.0" ); | |||
} | |||
File targetDir = getTestFile( "target/test-policy/" ); | |||
File localFile = new File( targetDir, path ); | |||
if ( localFile.exists() ) | |||
{ | |||
localFile.delete(); | |||
} | |||
if ( createLocalFile ) | |||
{ | |||
localFile.getParentFile().mkdirs(); | |||
FileUtils.fileWrite( localFile.getAbsolutePath(), "random-junk" ); | |||
localFile.setLastModified( localFile.lastModified() - generatedLocalFileUpdateDelta ); | |||
} | |||
policy.applyPolicy( setting, request, localFile ); | |||
} | |||
private void assertReleasesPolicyViolation( String setting, String path, boolean createLocalFile ) | |||
throws Exception | |||
{ | |||
try | |||
{ | |||
assertReleasesPolicy( setting, path, createLocalFile ); | |||
fail( "Expected a PolicyViolationException." ); | |||
} | |||
catch ( PolicyViolationException e ) | |||
{ | |||
// expected path. | |||
} | |||
} | |||
private PreDownloadPolicy lookupPolicy() | |||
throws Exception | |||
{ | |||
PreDownloadPolicy policy = (PreDownloadPolicy) lookup( PreDownloadPolicy.class.getName(), "releases" ); | |||
assertNotNull( policy ); | |||
return policy; | |||
} | |||
@Override | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
super.setUp(); | |||
// reset delta to 0. | |||
generatedLocalFileUpdateDelta = 0; | |||
} | |||
} |
@@ -0,0 +1,347 @@ | |||
package org.apache.maven.archiva.policies; | |||
/* | |||
* 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.codehaus.plexus.PlexusTestCase; | |||
import org.codehaus.plexus.util.FileUtils; | |||
import java.io.File; | |||
import java.util.Properties; | |||
/** | |||
* SnapshotsPolicyTest | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public class SnapshotsPolicyTest | |||
extends PlexusTestCase | |||
{ | |||
private static final String PATH_VERSION_METADATA = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/maven-metadata.xml"; | |||
private static final String PATH_PROJECT_METADATA = "org/apache/archiva/archiva-testable/maven-metadata.xml"; | |||
private static final String PATH_SNAPSHOT_ARTIFACT = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/archiva-testable-1.0-SNAPSHOT.jar"; | |||
private static final String PATH_RELEASE_ARTIFACT = "org/apache/archiva/archiva-testable/2.0/archiva-testable-2.0.jar"; | |||
private static final boolean WITH_LOCAL = true; | |||
private static final boolean NO_LOCAL = false; | |||
protected static final long ONE_SECOND = ( 1000 /* milliseconds */); | |||
protected static final long ONE_MINUTE = ( ONE_SECOND * 60 ); | |||
protected static final long ONE_HOUR = ( ONE_MINUTE * 60 ); | |||
protected static final long ONE_DAY = ( ONE_HOUR * 24 ); | |||
protected static final long OVER_ONE_HOUR = ( ONE_HOUR + ONE_MINUTE ); | |||
protected static final long OVER_ONE_DAY = ( ONE_DAY + ONE_HOUR ); | |||
protected static final long OLDER = ( -1 ); | |||
protected static final long NEWER = 0; | |||
private long generatedLocalFileUpdateDelta = 0; | |||
public void testSnapshotPolicyDailyProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyDailyReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyDailySnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicyViolation( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicyViolation( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyDailyVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_DAY; | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyDisabledProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyDisabledReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyDisabledSnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicyViolation( SnapshotsPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicyViolation( SnapshotsPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyDisabledVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyHourlyProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyHourlyReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyHourlySnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicyViolation( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicyViolation( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyHourlyVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = OVER_ONE_HOUR; | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyIgnoredProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyIgnoredReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyIgnoredSnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyIgnoredVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyOnceProjectMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_PROJECT_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_PROJECT_METADATA, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyOnceReleaseArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_RELEASE_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_RELEASE_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyOnceSnapshotArtifact() | |||
throws Exception | |||
{ | |||
assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL ); | |||
assertSnapshotPolicyViolation( SnapshotsPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL ); | |||
} | |||
public void testSnapshotPolicyOnceVersionedMetadata() | |||
throws Exception | |||
{ | |||
// Pass the policy when working with metadata, no matter what. | |||
assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_VERSION_METADATA, NO_LOCAL ); | |||
assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_VERSION_METADATA, WITH_LOCAL ); | |||
} | |||
private void assertSnapshotPolicy( String setting, String path, boolean createLocalFile ) | |||
throws Exception | |||
{ | |||
PreDownloadPolicy policy = lookupPolicy(); | |||
Properties request = new Properties(); | |||
request.setProperty( "filetype", path.endsWith( "/maven-metadata.xml" ) ? "metadata" : "artifact" ); | |||
if ( path.contains( "1.0-SNAPSHOT" ) ) | |||
{ | |||
request.setProperty( "version", "1.0-SNAPSHOT" ); | |||
} | |||
if ( path.contains( "2.0" ) ) | |||
{ | |||
request.setProperty( "version", "2.0" ); | |||
} | |||
File targetDir = getTestFile( "target/test-policy/" ); | |||
File localFile = new File( targetDir, path ); | |||
if ( localFile.exists() ) | |||
{ | |||
localFile.delete(); | |||
} | |||
if ( createLocalFile ) | |||
{ | |||
localFile.getParentFile().mkdirs(); | |||
FileUtils.fileWrite( localFile.getAbsolutePath(), "random-junk" ); | |||
localFile.setLastModified( localFile.lastModified() - generatedLocalFileUpdateDelta ); | |||
} | |||
policy.applyPolicy( setting, request, localFile ); | |||
} | |||
private void assertSnapshotPolicyViolation( String setting, String path, boolean createLocalFile ) | |||
throws Exception | |||
{ | |||
try | |||
{ | |||
assertSnapshotPolicy( setting, path, createLocalFile ); | |||
fail( "Expected a PolicyViolationException." ); | |||
} | |||
catch ( PolicyViolationException e ) | |||
{ | |||
// expected path. | |||
} | |||
} | |||
private PreDownloadPolicy lookupPolicy() | |||
throws Exception | |||
{ | |||
PreDownloadPolicy policy = (PreDownloadPolicy) lookup( PreDownloadPolicy.class.getName(), "snapshots" ); | |||
assertNotNull( policy ); | |||
return policy; | |||
} | |||
@Override | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
super.setUp(); | |||
// reset delta to 0. | |||
generatedLocalFileUpdateDelta = 0; | |||
} | |||
} |
@@ -32,6 +32,8 @@ import org.apache.maven.archiva.model.ProjectReference; | |||
import org.apache.maven.archiva.model.RepositoryURL; | |||
import org.apache.maven.archiva.model.VersionedReference; | |||
import org.apache.maven.archiva.policies.DownloadPolicy; | |||
import org.apache.maven.archiva.policies.PolicyConfigurationException; | |||
import org.apache.maven.archiva.policies.PolicyViolationException; | |||
import org.apache.maven.archiva.policies.PostDownloadPolicy; | |||
import org.apache.maven.archiva.policies.PreDownloadPolicy; | |||
import org.apache.maven.archiva.policies.urlcache.UrlFailureCache; | |||
@@ -140,6 +142,7 @@ public class DefaultRepositoryProxyConnectors | |||
File localFile = toLocalFile( repository, artifact ); | |||
Properties requestProperties = new Properties(); | |||
requestProperties.setProperty( "filetype", "artifact" ); | |||
requestProperties.setProperty( "version", artifact.getVersion() ); | |||
List<ProxyConnector> connectors = getProxyConnectors( repository ); | |||
@@ -186,6 +189,7 @@ public class DefaultRepositoryProxyConnectors | |||
File localFile = toLocalFile( repository, metadata ); | |||
Properties requestProperties = new Properties(); | |||
requestProperties.setProperty( "filetype", "metadata" ); | |||
boolean metadataNeedsUpdating = false; | |||
long originalTimestamp = getLastModified( localFile ); | |||
@@ -298,6 +302,7 @@ public class DefaultRepositoryProxyConnectors | |||
File localFile = toLocalFile( repository, metadata ); | |||
Properties requestProperties = new Properties(); | |||
requestProperties.setProperty( "filetype", "metadata" ); | |||
boolean metadataNeedsUpdating = false; | |||
long originalTimestamp = getLastModified( localFile ); | |||
@@ -480,15 +485,20 @@ public class DefaultRepositoryProxyConnectors | |||
} | |||
// Handle pre-download policy | |||
if ( !applyPolicies( this.preDownloadPolicies, connector.getPolicies(), requestProperties, localFile ) ) | |||
try | |||
{ | |||
getLogger().debug( "Failed pre-download policies - " + localFile.getAbsolutePath() ); | |||
validatePolicies( this.preDownloadPolicies, connector.getPolicies(), requestProperties, localFile ); | |||
} | |||
catch ( PolicyViolationException e ) | |||
{ | |||
String emsg = "Transfer not attempted on " + url + " : " + e.getMessage(); | |||
if ( fileExists( localFile ) ) | |||
{ | |||
getLogger().info( emsg + ": using already present local file." ); | |||
return localFile; | |||
} | |||
getLogger().info( emsg ); | |||
return null; | |||
} | |||
@@ -543,10 +553,13 @@ public class DefaultRepositoryProxyConnectors | |||
} | |||
// Handle post-download policies. | |||
if ( !applyPolicies( this.postDownloadPolicies, connector.getPolicies(), requestProperties, localFile ) ) | |||
try | |||
{ | |||
getLogger().debug( "Failed post-download policies - " + localFile.getAbsolutePath() ); | |||
validatePolicies( this.postDownloadPolicies, connector.getPolicies(), requestProperties, localFile ); | |||
} | |||
catch ( PolicyViolationException e ) | |||
{ | |||
getLogger().info( "Transfer invalidated from " + url + " : " + e.getMessage() ); | |||
if ( fileExists( localFile ) ) | |||
{ | |||
return localFile; | |||
@@ -697,10 +710,10 @@ public class DefaultRepositoryProxyConnectors | |||
* @param settings the map of settings for the policies to execute. (Map of String policy keys, to String policy setting) | |||
* @param request the request properties (utilized by the {@link DownloadPolicy#applyPolicy(String,Properties,File)}) | |||
* @param localFile the local file (utilized by the {@link DownloadPolicy#applyPolicy(String,Properties,File)}) | |||
* @return true if all of the policies passed, false if a policy failed. | |||
*/ | |||
private boolean applyPolicies( Map<String, ? extends DownloadPolicy> policies, Map<String, String> settings, | |||
private void validatePolicies( Map<String, ? extends DownloadPolicy> policies, Map<String, String> settings, | |||
Properties request, File localFile ) | |||
throws PolicyViolationException | |||
{ | |||
for ( Entry<String, ? extends DownloadPolicy> entry : policies.entrySet() ) | |||
{ | |||
@@ -710,13 +723,15 @@ public class DefaultRepositoryProxyConnectors | |||
String setting = StringUtils.defaultString( (String) settings.get( key ), defaultSetting ); | |||
getLogger().debug( "Applying [" + key + "] policy with [" + setting + "]" ); | |||
if ( !policy.applyPolicy( setting, request, localFile ) ) | |||
try | |||
{ | |||
getLogger().debug( "Didn't pass the [" + key + "] policy." ); | |||
return false; | |||
policy.applyPolicy( setting, request, localFile ); | |||
} | |||
catch ( PolicyConfigurationException e ) | |||
{ | |||
getLogger().error( e.getMessage(), e ); | |||
} | |||
} | |||
return true; | |||
} | |||
/** |