You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ReleasePolicyTest.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. package org.apache.archiva.policies;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import junit.framework.TestCase;
  21. import org.apache.archiva.repository.storage.StorageAsset;
  22. import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
  23. import org.junit.Before;
  24. import org.junit.Test;
  25. import org.junit.runner.RunWith;
  26. import org.springframework.test.context.ContextConfiguration;
  27. import javax.inject.Inject;
  28. import javax.inject.Named;
  29. import java.nio.charset.Charset;
  30. import java.nio.file.Files;
  31. import java.nio.file.Path;
  32. import java.nio.file.attribute.FileTime;
  33. import java.util.Properties;
  34. /**
  35. * ReleasePolicyTest
  36. *
  37. *
  38. */
  39. @RunWith( ArchivaSpringJUnit4ClassRunner.class )
  40. @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
  41. public class ReleasePolicyTest
  42. extends TestCase
  43. {
  44. private static final Charset FILE_ENCODING = Charset.forName( "UTF-8" );
  45. private static final String PATH_VERSION_METADATA = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/maven-metadata.xml";
  46. private static final String PATH_PROJECT_METADATA = "org/apache/archiva/archiva-testable/maven-metadata.xml";
  47. private static final String PATH_SNAPSHOT_ARTIFACT = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/archiva-testable-1.0-SNAPSHOT.jar";
  48. private static final String PATH_RELEASE_ARTIFACT = "org/apache/archiva/archiva-testable/2.0/archiva-testable-2.0.jar";
  49. private static final boolean WITH_LOCAL = true;
  50. private static final boolean NO_LOCAL = false;
  51. protected static final long ONE_SECOND = ( 1000 /* milliseconds */);
  52. protected static final long ONE_MINUTE = ( ONE_SECOND * 60 );
  53. protected static final long ONE_HOUR = ( ONE_MINUTE * 60 );
  54. protected static final long ONE_DAY = ( ONE_HOUR * 24 );
  55. protected static final long OVER_ONE_HOUR = ( ONE_HOUR + ONE_MINUTE );
  56. protected static final long OVER_ONE_DAY = ( ONE_DAY + ONE_HOUR );
  57. protected static final long OLDER = ( -1 );
  58. protected static final long NEWER = 0;
  59. private long generatedLocalFileUpdateDelta = 0;
  60. @Inject @Named(value = "preDownloadPolicy#releases")
  61. PreDownloadPolicy preDownloadPolicy;
  62. private PreDownloadPolicy lookupPolicy()
  63. throws Exception
  64. {
  65. return preDownloadPolicy;
  66. }
  67. @Test
  68. public void testReleasePolicyDailyProjectMetadata()
  69. throws Exception
  70. {
  71. // Pass the policy when working with metadata, no matter what.
  72. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
  73. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
  74. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  75. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
  76. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
  77. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  78. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
  79. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
  80. }
  81. @Test
  82. public void testReleasePolicyDailyReleaseArtifact()
  83. throws Exception
  84. {
  85. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  86. assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  87. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  88. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  89. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  90. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  91. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  92. assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  93. }
  94. @Test
  95. public void testReleasePolicyDailySnapshotArtifact()
  96. throws Exception
  97. {
  98. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  99. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  100. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  101. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  102. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  103. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  104. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  105. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  106. }
  107. @Test
  108. public void testReleasePolicyDailyVersionedMetadata()
  109. throws Exception
  110. {
  111. // Pass the policy when working with metadata, no matter what.
  112. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
  113. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
  114. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  115. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
  116. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
  117. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  118. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
  119. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
  120. }
  121. @Test
  122. public void testReleasePolicyRejectProjectMetadata()
  123. throws Exception
  124. {
  125. // Pass the policy when working with metadata, no matter what.
  126. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_PROJECT_METADATA, NO_LOCAL );
  127. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_PROJECT_METADATA, WITH_LOCAL );
  128. }
  129. @Test
  130. public void testReleasePolicyRejectReleaseArtifact()
  131. throws Exception
  132. {
  133. assertReleasesPolicyViolation( ReleasesPolicy.NEVER, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  134. assertReleasesPolicyViolation( ReleasesPolicy.NEVER, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  135. }
  136. @Test
  137. public void testReleasePolicyRejectSnapshotArtifact()
  138. throws Exception
  139. {
  140. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  141. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  142. }
  143. @Test
  144. public void testReleasePolicyRejectVersionedMetadata()
  145. throws Exception
  146. {
  147. // Pass the policy when working with metadata, no matter what.
  148. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_VERSION_METADATA, NO_LOCAL );
  149. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_VERSION_METADATA, WITH_LOCAL );
  150. }
  151. @Test
  152. public void testReleasePolicyHourlyProjectMetadata()
  153. throws Exception
  154. {
  155. // Pass the policy when working with metadata, no matter what.
  156. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
  157. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
  158. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  159. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
  160. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
  161. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  162. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
  163. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
  164. }
  165. @Test
  166. public void testReleasePolicyHourlyReleaseArtifact()
  167. throws Exception
  168. {
  169. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  170. assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  171. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  172. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  173. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  174. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  175. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  176. assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  177. }
  178. @Test
  179. public void testReleasePolicyHourlySnapshotArtifact()
  180. throws Exception
  181. {
  182. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  183. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  184. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  185. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  186. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  187. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  188. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  189. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  190. }
  191. @Test
  192. public void testReleasePolicyHourlyVersionedMetadata()
  193. throws Exception
  194. {
  195. // Pass the policy when working with metadata, no matter what.
  196. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
  197. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
  198. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  199. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
  200. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
  201. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  202. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
  203. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
  204. }
  205. @Test
  206. public void testReleasePolicyAlwaysProjectMetadata()
  207. throws Exception
  208. {
  209. // Pass the policy when working with metadata, no matter what.
  210. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_PROJECT_METADATA, NO_LOCAL );
  211. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_PROJECT_METADATA, WITH_LOCAL );
  212. }
  213. @Test
  214. public void testReleasePolicyAlwaysReleaseArtifact()
  215. throws Exception
  216. {
  217. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  218. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  219. }
  220. @Test
  221. public void testReleasePolicyAlwaysSnapshotArtifact()
  222. throws Exception
  223. {
  224. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  225. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  226. }
  227. @Test
  228. public void testReleasePolicyAlwaysVersionedMetadata()
  229. throws Exception
  230. {
  231. // Pass the policy when working with metadata, no matter what.
  232. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_VERSION_METADATA, NO_LOCAL );
  233. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_VERSION_METADATA, WITH_LOCAL );
  234. }
  235. @Test
  236. public void testReleasePolicyOnceProjectMetadata()
  237. throws Exception
  238. {
  239. // Pass the policy when working with metadata, no matter what.
  240. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, NO_LOCAL );
  241. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, WITH_LOCAL );
  242. }
  243. @Test
  244. public void testReleasePolicyOnceReleaseArtifact()
  245. throws Exception
  246. {
  247. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  248. assertReleasesPolicyViolation( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  249. }
  250. @Test
  251. public void testReleasePolicyOnceSnapshotArtifact()
  252. throws Exception
  253. {
  254. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  255. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  256. }
  257. @Test
  258. public void testReleasePolicyOnceVersionedMetadata()
  259. throws Exception
  260. {
  261. // Pass the policy when working with metadata, no matter what.
  262. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, NO_LOCAL );
  263. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, WITH_LOCAL );
  264. }
  265. private void assertReleasesPolicy( String setting, String path, boolean createLocalFile )
  266. throws Exception
  267. {
  268. PreDownloadPolicy policy = lookupPolicy();
  269. Properties request = new Properties();
  270. request.setProperty( "filetype", path.endsWith( "/maven-metadata.xml" ) ? "metadata" : "artifact" );
  271. if ( path.contains( "1.0-SNAPSHOT" ) )
  272. {
  273. request.setProperty( "version", "1.0-SNAPSHOT" );
  274. }
  275. if ( path.contains( "2.0" ) )
  276. {
  277. request.setProperty( "version", "2.0" );
  278. }
  279. StorageAsset targetDir = ChecksumPolicyTest.getTestFile( "target/test-policy/" );
  280. StorageAsset localFile = targetDir.resolve( path );
  281. Files.deleteIfExists( localFile.getFilePath() );
  282. if ( createLocalFile )
  283. {
  284. Files.createDirectories( localFile.getParent().getFilePath());
  285. org.apache.archiva.common.utils.FileUtils.writeStringToFile( localFile.getFilePath(), FILE_ENCODING, "random-junk" );
  286. Files.setLastModifiedTime( localFile.getFilePath(),
  287. FileTime.fromMillis(Files.getLastModifiedTime(localFile.getFilePath()).toMillis() - generatedLocalFileUpdateDelta));
  288. }
  289. policy.applyPolicy( setting, request, localFile );
  290. }
  291. private void assertReleasesPolicyViolation( String setting, String path, boolean createLocalFile )
  292. throws Exception
  293. {
  294. try
  295. {
  296. assertReleasesPolicy( setting, path, createLocalFile );
  297. fail( "Expected a PolicyViolationException." );
  298. }
  299. catch ( PolicyViolationException e )
  300. {
  301. // expected path.
  302. }
  303. }
  304. @Before
  305. @Override
  306. public void setUp()
  307. throws Exception
  308. {
  309. super.setUp();
  310. // reset delta to 0.
  311. generatedLocalFileUpdateDelta = 0;
  312. }
  313. }