From: Joakim Erdfelt Date: Wed, 31 Oct 2007 22:47:50 +0000 (+0000) Subject: [MRM-577] Release policy of disabled fails all metadata requests. X-Git-Tag: archiva-1.0-beta-4~22 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=255949579d3ab36bf59eda5948cf28321db59e18;p=archiva.git [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 --- diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java index 6cb2aef60..536bda9de 100644 --- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java @@ -76,7 +76,7 @@ public abstract class AbstractUpdatePolicy */ public static final String ONCE = "once"; - private List options = new ArrayList(); + private List options = new ArrayList(); public AbstractUpdatePolicy() { @@ -91,13 +91,20 @@ public abstract class AbstractUpdatePolicy protected abstract String getUpdateMode(); - public List getOptions() + public List 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." ); } } diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java index d418daeb9..46a0f3252 100644 --- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java @@ -52,7 +52,7 @@ public class CachedFailuresPolicy */ private UrlFailureCache urlFailureCache; - private List options = new ArrayList(); + private List options = new ArrayList(); 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 getOptions() { return options; } diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java index 63c888036..2f80d5aa5 100644 --- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java @@ -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 Joakim Erdfelt * @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() diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java index d49d07565..e9ff75319 100644 --- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java @@ -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; } diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java new file mode 100644 index 000000000..0d705e1db --- /dev/null +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java @@ -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 Joakim Erdfelt + * @version $Id$ + */ +public class PolicyConfigurationException + extends ArchivaException +{ + + public PolicyConfigurationException( String message, Throwable cause ) + { + super( message, cause ); + } + + public PolicyConfigurationException( String message ) + { + super( message ); + } +} diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java new file mode 100644 index 000000000..0de36ec76 --- /dev/null +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java @@ -0,0 +1,42 @@ +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; + +/** + * PolicyViolationException + * + * @author Joakim Erdfelt + * @version $Id$ + */ +public class PolicyViolationException + extends ArchivaException +{ + public PolicyViolationException( String message, Throwable cause ) + { + super( message, cause ); + } + + public PolicyViolationException( String message ) + { + super( message ); + } +} diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java index 634be98e1..d1f6d216e 100644 --- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java @@ -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 Joakim Erdfelt * @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; } diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java index 29c0ae444..f88eb938f 100644 --- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java +++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java @@ -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; } diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/AllTests.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/AllTests.java deleted file mode 100644 index 8b3cc7646..000000000 --- a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/AllTests.java +++ /dev/null @@ -1,44 +0,0 @@ -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 junit.framework.Test; -import junit.framework.TestSuite; - -/** - * Helper class for IDE testing. - * - * @author Joakim Erdfelt - * @version $Id$ - */ -public class AllTests -{ - - public static Test suite() - { - 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; - } - -} diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java index 725b7b843..5d70a9db7 100644 --- a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java +++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java @@ -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. + } } } diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java index 1668b5b72..5c33317d5 100644 --- a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java +++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java @@ -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 ); diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java new file mode 100644 index 000000000..548693f4e --- /dev/null +++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java @@ -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 Joakim Erdfelt + * @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; + } +} diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java new file mode 100644 index 000000000..96f6bd899 --- /dev/null +++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java @@ -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 Joakim Erdfelt + * @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; + } +} diff --git a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java index b2851c7b3..c2946b33c 100644 --- a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java +++ b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java @@ -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 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 policies, Map settings, + private void validatePolicies( Map policies, Map settings, Properties request, File localFile ) + throws PolicyViolationException { for ( Entry 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; } /**