Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ReleasePolicyTest.java 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  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.Locale;
  34. import java.util.MissingResourceException;
  35. import java.util.Properties;
  36. import static org.junit.Assert.assertEquals;
  37. import static org.junit.Assert.assertTrue;
  38. /**
  39. * ReleasePolicyTest
  40. *
  41. *
  42. */
  43. @RunWith( ArchivaSpringJUnit4ClassRunner.class )
  44. @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" } )
  45. public class ReleasePolicyTest
  46. extends TestCase
  47. {
  48. private static final Charset FILE_ENCODING = Charset.forName( "UTF-8" );
  49. private static final String PATH_VERSION_METADATA = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/maven-metadata.xml";
  50. private static final String PATH_PROJECT_METADATA = "org/apache/archiva/archiva-testable/maven-metadata.xml";
  51. private static final String PATH_SNAPSHOT_ARTIFACT = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/archiva-testable-1.0-SNAPSHOT.jar";
  52. private static final String PATH_RELEASE_ARTIFACT = "org/apache/archiva/archiva-testable/2.0/archiva-testable-2.0.jar";
  53. private static final boolean WITH_LOCAL = true;
  54. private static final boolean NO_LOCAL = false;
  55. protected static final long ONE_SECOND = ( 1000 /* milliseconds */);
  56. protected static final long ONE_MINUTE = ( ONE_SECOND * 60 );
  57. protected static final long ONE_HOUR = ( ONE_MINUTE * 60 );
  58. protected static final long ONE_DAY = ( ONE_HOUR * 24 );
  59. protected static final long OVER_ONE_HOUR = ( ONE_HOUR + ONE_MINUTE );
  60. protected static final long OVER_ONE_DAY = ( ONE_DAY + ONE_HOUR );
  61. protected static final long OLDER = ( -1 );
  62. protected static final long NEWER = 0;
  63. private long generatedLocalFileUpdateDelta = 0;
  64. @Inject @Named(value = "preDownloadPolicy#releases")
  65. PreDownloadPolicy preDownloadPolicy;
  66. private PreDownloadPolicy lookupPolicy()
  67. throws Exception
  68. {
  69. return preDownloadPolicy;
  70. }
  71. @Test
  72. public void testReleasePolicyDailyProjectMetadata()
  73. throws Exception
  74. {
  75. // Pass the policy when working with metadata, no matter what.
  76. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
  77. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
  78. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  79. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
  80. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
  81. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  82. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
  83. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
  84. }
  85. @Test
  86. public void testReleasePolicyDailyReleaseArtifact()
  87. throws Exception
  88. {
  89. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  90. assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  91. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  92. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  93. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  94. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  95. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  96. assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  97. }
  98. @Test
  99. public void testReleasePolicyDailySnapshotArtifact()
  100. throws Exception
  101. {
  102. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  103. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  104. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  105. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  106. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  107. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  108. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  109. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  110. }
  111. @Test
  112. public void testReleasePolicyDailyVersionedMetadata()
  113. throws Exception
  114. {
  115. // Pass the policy when working with metadata, no matter what.
  116. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
  117. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
  118. generatedLocalFileUpdateDelta = OVER_ONE_DAY;
  119. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
  120. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
  121. generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
  122. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
  123. assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
  124. }
  125. @Test
  126. public void testReleasePolicyRejectProjectMetadata()
  127. throws Exception
  128. {
  129. // Pass the policy when working with metadata, no matter what.
  130. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_PROJECT_METADATA, NO_LOCAL );
  131. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_PROJECT_METADATA, WITH_LOCAL );
  132. }
  133. @Test
  134. public void testReleasePolicyRejectReleaseArtifact()
  135. throws Exception
  136. {
  137. assertReleasesPolicyViolation( ReleasesPolicy.NEVER, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  138. assertReleasesPolicyViolation( ReleasesPolicy.NEVER, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  139. }
  140. @Test
  141. public void testReleasePolicyRejectSnapshotArtifact()
  142. throws Exception
  143. {
  144. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  145. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  146. }
  147. @Test
  148. public void testReleasePolicyRejectVersionedMetadata()
  149. throws Exception
  150. {
  151. // Pass the policy when working with metadata, no matter what.
  152. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_VERSION_METADATA, NO_LOCAL );
  153. assertReleasesPolicy( ReleasesPolicy.NEVER, PATH_VERSION_METADATA, WITH_LOCAL );
  154. }
  155. @Test
  156. public void testReleasePolicyHourlyProjectMetadata()
  157. throws Exception
  158. {
  159. // Pass the policy when working with metadata, no matter what.
  160. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
  161. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
  162. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  163. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
  164. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
  165. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  166. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
  167. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
  168. }
  169. @Test
  170. public void testReleasePolicyHourlyReleaseArtifact()
  171. throws Exception
  172. {
  173. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  174. assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  175. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  176. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  177. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  178. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  179. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  180. assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  181. }
  182. @Test
  183. public void testReleasePolicyHourlySnapshotArtifact()
  184. throws Exception
  185. {
  186. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  187. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  188. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  189. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  190. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  191. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  192. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  193. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  194. }
  195. @Test
  196. public void testReleasePolicyHourlyVersionedMetadata()
  197. throws Exception
  198. {
  199. // Pass the policy when working with metadata, no matter what.
  200. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
  201. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
  202. generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
  203. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
  204. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
  205. generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
  206. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
  207. assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
  208. }
  209. @Test
  210. public void testReleasePolicyAlwaysProjectMetadata()
  211. throws Exception
  212. {
  213. // Pass the policy when working with metadata, no matter what.
  214. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_PROJECT_METADATA, NO_LOCAL );
  215. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_PROJECT_METADATA, WITH_LOCAL );
  216. }
  217. @Test
  218. public void testReleasePolicyAlwaysReleaseArtifact()
  219. throws Exception
  220. {
  221. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  222. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  223. }
  224. @Test
  225. public void testReleasePolicyAlwaysSnapshotArtifact()
  226. throws Exception
  227. {
  228. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  229. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  230. }
  231. @Test
  232. public void testReleasePolicyAlwaysVersionedMetadata()
  233. throws Exception
  234. {
  235. // Pass the policy when working with metadata, no matter what.
  236. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_VERSION_METADATA, NO_LOCAL );
  237. assertReleasesPolicy( ReleasesPolicy.ALWAYS, PATH_VERSION_METADATA, WITH_LOCAL );
  238. }
  239. @Test
  240. public void testReleasePolicyOnceProjectMetadata()
  241. throws Exception
  242. {
  243. // Pass the policy when working with metadata, no matter what.
  244. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, NO_LOCAL );
  245. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, WITH_LOCAL );
  246. }
  247. @Test
  248. public void testReleasePolicyOnceReleaseArtifact()
  249. throws Exception
  250. {
  251. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, NO_LOCAL );
  252. assertReleasesPolicyViolation( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
  253. }
  254. @Test
  255. public void testReleasePolicyOnceSnapshotArtifact()
  256. throws Exception
  257. {
  258. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
  259. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
  260. }
  261. @Test
  262. public void testReleasePolicyOnceVersionedMetadata()
  263. throws Exception
  264. {
  265. // Pass the policy when working with metadata, no matter what.
  266. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, NO_LOCAL );
  267. assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, WITH_LOCAL );
  268. }
  269. private void assertReleasesPolicy( PolicyOption setting, String path, boolean createLocalFile )
  270. throws Exception
  271. {
  272. PreDownloadPolicy policy = lookupPolicy();
  273. Properties request = new Properties();
  274. request.setProperty( "filetype", path.endsWith( "/maven-metadata.xml" ) ? "metadata" : "artifact" );
  275. if ( path.contains( "1.0-SNAPSHOT" ) )
  276. {
  277. request.setProperty( "version", "1.0-SNAPSHOT" );
  278. }
  279. if ( path.contains( "2.0" ) )
  280. {
  281. request.setProperty( "version", "2.0" );
  282. }
  283. StorageAsset targetDir = ChecksumPolicyTest.getTestFile( "target/test-policy/" );
  284. StorageAsset localFile = targetDir.resolve( path );
  285. Files.deleteIfExists( localFile.getFilePath() );
  286. if ( createLocalFile )
  287. {
  288. Files.createDirectories( localFile.getParent().getFilePath());
  289. org.apache.archiva.common.utils.FileUtils.writeStringToFile( localFile.getFilePath(), FILE_ENCODING, "random-junk" );
  290. Files.setLastModifiedTime( localFile.getFilePath(),
  291. FileTime.fromMillis(Files.getLastModifiedTime(localFile.getFilePath()).toMillis() - generatedLocalFileUpdateDelta));
  292. }
  293. policy.applyPolicy( setting, request, localFile );
  294. }
  295. private void assertReleasesPolicyViolation( PolicyOption setting, String path, boolean createLocalFile )
  296. throws Exception
  297. {
  298. try
  299. {
  300. assertReleasesPolicy( setting, path, createLocalFile );
  301. fail( "Expected a PolicyViolationException." );
  302. }
  303. catch ( PolicyViolationException e )
  304. {
  305. // expected path.
  306. }
  307. }
  308. @Before
  309. @Override
  310. public void setUp()
  311. throws Exception
  312. {
  313. super.setUp();
  314. // reset delta to 0.
  315. generatedLocalFileUpdateDelta = 0;
  316. }
  317. @Test
  318. public void testNamesAndDescriptions() throws Exception {
  319. PreDownloadPolicy policy = lookupPolicy();
  320. assertEquals("Release Artifact Update Policy", policy.getName());
  321. assertTrue(policy.getDescription(Locale.US).contains("when a release artifact will be updated"));
  322. assertEquals("Update always", policy.getOptionName(Locale.US, UpdateOption.ALWAYS));
  323. assertEquals("Do not download from remote", policy.getOptionName(Locale.US, UpdateOption.NEVER));
  324. assertEquals("Update, if older than a day", policy.getOptionName(Locale.US, UpdateOption.DAILY));
  325. assertEquals("Update, if older than a hour", policy.getOptionName(Locale.US, UpdateOption.HOURLY));
  326. assertEquals("Download only once", policy.getOptionName(Locale.US, UpdateOption.ONCE));
  327. assertTrue(policy.getOptionDescription(Locale.US, UpdateOption.ALWAYS).contains("each download"));
  328. assertTrue(policy.getOptionDescription(Locale.US, UpdateOption.NEVER).contains("never from the remote"));
  329. assertTrue(policy.getOptionDescription(Locale.US, UpdateOption.DAILY).contains("older than one day"));
  330. assertTrue(policy.getOptionDescription(Locale.US, UpdateOption.HOURLY).contains("older than one hour"));
  331. assertTrue(policy.getOptionDescription(Locale.US, UpdateOption.ONCE).contains("if it does not exist"));
  332. try {
  333. policy.getOptionName(Locale.US, StandardOption.NOOP);
  334. // Exception should be thrown
  335. assertTrue(false);
  336. } catch (MissingResourceException e) {
  337. //
  338. }
  339. }
  340. }