Parcourir la source

[MRM-577] Release policy of disabled fails all metadata requests.

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-ffa450edef68
tags/archiva-1.0-beta-4
Joakim Erdfelt il y a 16 ans
Parent
révision
255949579d
13 fichiers modifiés avec 912 ajouts et 99 suppressions
  1. 41
    18
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java
  2. 9
    11
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java
  3. 39
    27
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java
  4. 3
    2
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java
  5. 44
    0
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java
  6. 10
    12
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java
  7. 5
    4
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java
  8. 3
    2
      archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java
  9. 11
    3
      archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java
  10. 26
    8
      archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java
  11. 347
    0
      archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java
  12. 347
    0
      archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java
  13. 27
    12
      archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java

+ 41
- 18
archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java Voir le fichier

@@ -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." );
}
}

+ 9
- 11
archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java Voir le fichier

@@ -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;
}

+ 39
- 27
archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java Voir le fichier

@@ -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()

+ 3
- 2
archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java Voir le fichier

@@ -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;
}

+ 44
- 0
archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java Voir le fichier

@@ -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 );
}
}

archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/AllTests.java → archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java Voir le fichier

@@ -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 );
}
}

+ 5
- 4
archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java Voir le fichier

@@ -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;
}

+ 3
- 2
archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java Voir le fichier

@@ -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;
}

+ 11
- 3
archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java Voir le fichier

@@ -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.
}
}
}

+ 26
- 8
archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java Voir le fichier

@@ -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 );


+ 347
- 0
archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java Voir le fichier

@@ -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;
}
}

+ 347
- 0
archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java Voir le fichier

@@ -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;
}
}

+ 27
- 12
archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java Voir le fichier

@@ -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;
}

/**

Chargement…
Annuler
Enregistrer