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.

RepositoryScannerTest.java 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. package org.apache.archiva.repository.scanner;
  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.admin.model.beans.ManagedRepository;
  22. import org.apache.archiva.admin.model.beans.RemoteRepository;
  23. import org.apache.commons.io.FileUtils;
  24. import org.apache.archiva.consumers.InvalidRepositoryContentConsumer;
  25. import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
  26. import org.junit.Test;
  27. import org.junit.runner.RunWith;
  28. import org.springframework.context.ApplicationContext;
  29. import org.springframework.test.context.ContextConfiguration;
  30. import javax.inject.Inject;
  31. import java.io.File;
  32. import java.io.IOException;
  33. import java.text.ParseException;
  34. import java.text.SimpleDateFormat;
  35. import java.util.ArrayList;
  36. import java.util.Arrays;
  37. import java.util.List;
  38. import java.util.Locale;
  39. import java.util.TimeZone;
  40. import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
  41. /**
  42. * RepositoryScannerTest
  43. *
  44. *
  45. */
  46. @RunWith( ArchivaSpringJUnit4ClassRunner.class )
  47. @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml" } )
  48. public class RepositoryScannerTest
  49. extends TestCase
  50. {
  51. @Inject
  52. ApplicationContext applicationContext;
  53. protected ManagedRepository createRepository( String id, String name, File location )
  54. {
  55. ManagedRepository repo = new ManagedRepository();
  56. repo.setId( id );
  57. repo.setName( name );
  58. repo.setLocation( location.getAbsolutePath() );
  59. return repo;
  60. }
  61. protected RemoteRepository createRemoteRepository( String id, String name, String url )
  62. {
  63. RemoteRepository repo = new RemoteRepository();
  64. repo.setId( id );
  65. repo.setName( name );
  66. repo.setUrl( url );
  67. return repo;
  68. }
  69. private static final String[] ARTIFACT_PATTERNS =
  70. new String[]{ "**/*.jar", "**/*.pom", "**/*.rar", "**/*.zip", "**/*.war", "**/*.tar.gz" };
  71. private ManagedRepository createDefaultRepository()
  72. {
  73. File repoDir = new File( "src/test/repositories/default-repository" );
  74. assertTrue( "Default Test Repository should exist.", repoDir.exists() && repoDir.isDirectory() );
  75. return createRepository( "testDefaultRepo", "Test Default Repository", repoDir );
  76. }
  77. private ManagedRepository createSimpleRepository()
  78. throws IOException, ParseException
  79. {
  80. File srcDir = new File( "src/test/repositories/simple-repository" );
  81. File repoDir = new File( "target/test-repos/simple-repository" );
  82. FileUtils.deleteDirectory( repoDir );
  83. FileUtils.copyDirectory( srcDir, repoDir );
  84. File repoFile = new File( repoDir,
  85. "groupId/snapshot-artifact/1.0-alpha-1-SNAPSHOT/snapshot-artifact-1.0-alpha-1-20050611.202024-1.pom" );
  86. repoFile.setLastModified( getTimestampAsMillis( "20050611.202024" ) );
  87. assertTrue( "Simple Test Repository should exist.", repoDir.exists() && repoDir.isDirectory() );
  88. return createRepository( "testSimpleRepo", "Test Simple Repository", repoDir );
  89. }
  90. private static long getTimestampAsMillis( String timestamp )
  91. throws ParseException
  92. {
  93. SimpleDateFormat fmt = new SimpleDateFormat( "yyyyMMdd.HHmmss", Locale.US );
  94. fmt.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
  95. return fmt.parse( timestamp ).getTime();
  96. }
  97. private ManagedRepository createLegacyRepository()
  98. {
  99. File repoDir = new File( "src/test/repositories/legacy-repository" );
  100. assertTrue( "Legacy Test Repository should exist.", repoDir.exists() && repoDir.isDirectory() );
  101. ManagedRepository repo = createRepository( "testLegacyRepo", "Test Legacy Repository", repoDir );
  102. repo.setLayout( "legacy" );
  103. return repo;
  104. }
  105. private void assertMinimumHits( String msg, int minimumHitCount, long actualCount )
  106. {
  107. if ( actualCount < minimumHitCount )
  108. {
  109. fail( "Minimum hit count on " + msg + " not satisfied. Expected more than <" + minimumHitCount
  110. + ">, but actually got <" + actualCount + ">." );
  111. }
  112. }
  113. private RepositoryScanner lookupRepositoryScanner()
  114. throws Exception
  115. {
  116. return applicationContext.getBean( RepositoryScanner.class );
  117. }
  118. private List<String> getIgnoreList()
  119. {
  120. List<String> ignores = new ArrayList<>();
  121. ignores.addAll( Arrays.asList( RepositoryScanner.IGNORABLE_CONTENT ) );
  122. return ignores;
  123. }
  124. @Test
  125. public void testTimestampRepositoryScanner()
  126. throws Exception
  127. {
  128. ManagedRepository repository = createSimpleRepository();
  129. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  130. KnownScanConsumer consumer = new KnownScanConsumer();
  131. consumer.setIncludes( ARTIFACT_PATTERNS );
  132. knownConsumers.add( consumer );
  133. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  134. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  135. invalidConsumers.add( badconsumer );
  136. RepositoryScanner scanner = lookupRepositoryScanner();
  137. RepositoryScanStatistics stats = scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(),
  138. getTimestampAsMillis( "20061101.000000" ) );
  139. assertNotNull( "Stats should not be null.", stats );
  140. assertEquals( "Stats.totalFileCount", 4, stats.getTotalFileCount() );
  141. assertEquals( "Stats.newFileCount", 3, stats.getNewFileCount() );
  142. assertEquals( "Processed Count", 2, consumer.getProcessCount() );
  143. assertEquals( "Processed Count (of invalid items)", 1, badconsumer.getProcessCount() );
  144. }
  145. @Test
  146. public void testTimestampRepositoryScannerFreshScan()
  147. throws Exception
  148. {
  149. ManagedRepository repository = createSimpleRepository();
  150. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  151. KnownScanConsumer consumer = new KnownScanConsumer();
  152. consumer.setIncludes( ARTIFACT_PATTERNS );
  153. knownConsumers.add( consumer );
  154. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  155. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  156. invalidConsumers.add( badconsumer );
  157. RepositoryScanner scanner = lookupRepositoryScanner();
  158. RepositoryScanStatistics stats =
  159. scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(), RepositoryScanner.FRESH_SCAN );
  160. assertNotNull( "Stats should not be null.", stats );
  161. assertEquals( "Stats.totalFileCount", 4, stats.getTotalFileCount() );
  162. assertEquals( "Stats.newFileCount", 4, stats.getNewFileCount() );
  163. assertEquals( "Processed Count", 3, consumer.getProcessCount() );
  164. assertEquals( "Processed Count (of invalid items)", 1, badconsumer.getProcessCount() );
  165. }
  166. @Test
  167. public void testTimestampRepositoryScannerProcessUnmodified()
  168. throws Exception
  169. {
  170. ManagedRepository repository = createSimpleRepository();
  171. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  172. KnownScanConsumer consumer = new KnownScanConsumer();
  173. consumer.setProcessUnmodified( true );
  174. consumer.setIncludes( ARTIFACT_PATTERNS );
  175. knownConsumers.add( consumer );
  176. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  177. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  178. invalidConsumers.add( badconsumer );
  179. RepositoryScanner scanner = lookupRepositoryScanner();
  180. RepositoryScanStatistics stats = scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(),
  181. getTimestampAsMillis( "20061101.000000" ) );
  182. assertNotNull( "Stats should not be null.", stats );
  183. assertEquals( "Stats.totalFileCount", 4, stats.getTotalFileCount() );
  184. assertEquals( "Stats.newFileCount", 3, stats.getNewFileCount() );
  185. assertEquals( "Processed Count", 3, consumer.getProcessCount() );
  186. assertEquals( "Processed Count (of invalid items)", 1, badconsumer.getProcessCount() );
  187. }
  188. @Test
  189. public void testDefaultRepositoryScanner()
  190. throws Exception
  191. {
  192. ManagedRepository repository = createDefaultRepository();
  193. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  194. KnownScanConsumer consumer = new KnownScanConsumer();
  195. consumer.setIncludes(
  196. new String[]{ "**/*.jar", "**/*.war", "**/*.pom", "**/maven-metadata.xml", "**/*-site.xml", "**/*.zip",
  197. "**/*.tar.gz", "**/*.sha1", "**/*.md5" } );
  198. knownConsumers.add( consumer );
  199. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  200. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  201. invalidConsumers.add( badconsumer );
  202. RepositoryScanner scanner = lookupRepositoryScanner();
  203. RepositoryScanStatistics stats =
  204. scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(), RepositoryScanner.FRESH_SCAN );
  205. assertNotNull( "Stats should not be null.", stats );
  206. assertMinimumHits( "Stats.totalFileCount", 17, stats.getTotalFileCount() );
  207. assertMinimumHits( "Processed Count", 17, consumer.getProcessCount() );
  208. assertEquals( "Processed Count (of invalid items)", 6, badconsumer.getProcessCount() );
  209. }
  210. @Test
  211. public void testDefaultRepositoryArtifactScanner()
  212. throws Exception
  213. {
  214. List<String> actualArtifactPaths = new ArrayList<>();
  215. actualArtifactPaths.add( "invalid/invalid/1.0-20050611.123456-1/invalid-1.0-20050611.123456-1.jar" );
  216. actualArtifactPaths.add( "invalid/invalid/1.0-SNAPSHOT/invalid-1.0.jar" );
  217. actualArtifactPaths.add( "invalid/invalid/1.0/invalid-1.0b.jar" );
  218. actualArtifactPaths.add( "invalid/invalid/1.0/invalid-2.0.jar" );
  219. actualArtifactPaths.add( "invalid/invalid-1.0.jar" );
  220. actualArtifactPaths.add( "org/apache/maven/test/1.0-SNAPSHOT/wrong-artifactId-1.0-20050611.112233-1.jar" );
  221. actualArtifactPaths.add( "org/apache/maven/test/1.0-SNAPSHOT/test-1.0-20050611.112233-1-javadoc.jar" );
  222. actualArtifactPaths.add( "org/apache/maven/test/1.0-SNAPSHOT/test-1.0-20050611.112233-1.jar" );
  223. actualArtifactPaths.add( "org/apache/maven/A/1.0/A-1.0.war" );
  224. actualArtifactPaths.add( "org/apache/maven/A/1.0/A-1.0.pom" );
  225. actualArtifactPaths.add( "org/apache/maven/B/2.0/B-2.0.pom" );
  226. actualArtifactPaths.add( "org/apache/maven/B/1.0/B-1.0.pom" );
  227. actualArtifactPaths.add( "org/apache/maven/some-ejb/1.0/some-ejb-1.0-client.jar" );
  228. actualArtifactPaths.add( "org/apache/maven/C/1.0/C-1.0.war" );
  229. actualArtifactPaths.add( "org/apache/maven/C/1.0/C-1.0.pom" );
  230. actualArtifactPaths.add( "org/apache/maven/update/test-not-updated/1.0/test-not-updated-1.0.pom" );
  231. actualArtifactPaths.add( "org/apache/maven/update/test-not-updated/1.0/test-not-updated-1.0.jar" );
  232. actualArtifactPaths.add( "org/apache/maven/update/test-updated/1.0/test-updated-1.0.pom" );
  233. actualArtifactPaths.add( "org/apache/maven/update/test-updated/1.0/test-updated-1.0.jar" );
  234. actualArtifactPaths.add( "org/apache/maven/discovery/1.0/discovery-1.0.pom" );
  235. actualArtifactPaths.add( "org/apache/maven/testing/1.0/testing-1.0-test-sources.jar" );
  236. actualArtifactPaths.add( "org/apache/maven/testing/1.0/testing-1.0.jar" );
  237. actualArtifactPaths.add( "org/apache/maven/testing/1.0/testing-1.0-sources.jar" );
  238. actualArtifactPaths.add( "org/apache/maven/testing/1.0/testing-1.0.zip" );
  239. actualArtifactPaths.add( "org/apache/maven/testing/1.0/testing-1.0.tar.gz" );
  240. actualArtifactPaths.add( "org/apache/maven/samplejar/2.0/samplejar-2.0.pom" );
  241. actualArtifactPaths.add( "org/apache/maven/samplejar/2.0/samplejar-2.0.jar" );
  242. actualArtifactPaths.add( "org/apache/maven/samplejar/1.0/samplejar-1.0.pom" );
  243. actualArtifactPaths.add( "org/apache/maven/samplejar/1.0/samplejar-1.0.jar" );
  244. actualArtifactPaths.add( "org/apache/testgroup/discovery/1.0/discovery-1.0.pom" );
  245. actualArtifactPaths.add( "javax/sql/jdbc/2.0/jdbc-2.0.jar" );
  246. ManagedRepository repository = createDefaultRepository();
  247. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  248. KnownScanConsumer consumer = new KnownScanConsumer();
  249. consumer.setIncludes( ARTIFACT_PATTERNS );
  250. knownConsumers.add( consumer );
  251. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  252. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  253. invalidConsumers.add( badconsumer );
  254. RepositoryScanner scanner = lookupRepositoryScanner();
  255. RepositoryScanStatistics stats =
  256. scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(), RepositoryScanner.FRESH_SCAN );
  257. assertNotNull( "Stats should not be null.", stats );
  258. assertMinimumHits( "Stats.totalFileCount", actualArtifactPaths.size(), stats.getTotalFileCount() );
  259. assertMinimumHits( "Processed Count", actualArtifactPaths.size(), consumer.getProcessCount() );
  260. }
  261. @Test
  262. public void testDefaultRepositoryMetadataScanner()
  263. throws Exception
  264. {
  265. List<String> actualMetadataPaths = new ArrayList<>();
  266. actualMetadataPaths.add( "org/apache/maven/some-ejb/1.0/maven-metadata.xml" );
  267. actualMetadataPaths.add( "org/apache/maven/update/test-not-updated/maven-metadata.xml" );
  268. actualMetadataPaths.add( "org/apache/maven/update/test-updated/maven-metadata.xml" );
  269. actualMetadataPaths.add( "org/apache/maven/maven-metadata.xml" );
  270. actualMetadataPaths.add( "org/apache/testgroup/discovery/1.0/maven-metadata.xml" );
  271. actualMetadataPaths.add( "org/apache/testgroup/discovery/maven-metadata.xml" );
  272. actualMetadataPaths.add( "javax/sql/jdbc/2.0/maven-metadata-repository.xml" );
  273. actualMetadataPaths.add( "javax/sql/jdbc/maven-metadata-repository.xml" );
  274. actualMetadataPaths.add( "javax/sql/maven-metadata-repository.xml" );
  275. actualMetadataPaths.add( "javax/maven-metadata.xml" );
  276. ManagedRepository repository = createDefaultRepository();
  277. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  278. KnownScanConsumer knownConsumer = new KnownScanConsumer();
  279. knownConsumer.setIncludes( new String[]{ "**/maven-metadata*.xml" } );
  280. knownConsumers.add( knownConsumer );
  281. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  282. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  283. invalidConsumers.add( badconsumer );
  284. RepositoryScanner scanner = lookupRepositoryScanner();
  285. RepositoryScanStatistics stats =
  286. scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(), RepositoryScanner.FRESH_SCAN );
  287. assertNotNull( "Stats should not be null.", stats );
  288. assertMinimumHits( "Stats.totalFileCount", actualMetadataPaths.size(), stats.getTotalFileCount() );
  289. assertMinimumHits( "Processed Count", actualMetadataPaths.size(), knownConsumer.getProcessCount() );
  290. }
  291. @Test
  292. public void testDefaultRepositoryProjectScanner()
  293. throws Exception
  294. {
  295. List<String> actualProjectPaths = new ArrayList<>();
  296. actualProjectPaths.add( "org/apache/maven/A/1.0/A-1.0.pom" );
  297. actualProjectPaths.add( "org/apache/maven/B/2.0/B-2.0.pom" );
  298. actualProjectPaths.add( "org/apache/maven/B/1.0/B-1.0.pom" );
  299. actualProjectPaths.add( "org/apache/maven/C/1.0/C-1.0.pom" );
  300. actualProjectPaths.add( "org/apache/maven/update/test-not-updated/1.0/test-not-updated-1.0.pom" );
  301. actualProjectPaths.add( "org/apache/maven/update/test-updated/1.0/test-updated-1.0.pom" );
  302. actualProjectPaths.add( "org/apache/maven/discovery/1.0/discovery-1.0.pom" );
  303. actualProjectPaths.add( "org/apache/maven/samplejar/2.0/samplejar-2.0.pom" );
  304. actualProjectPaths.add( "org/apache/maven/samplejar/1.0/samplejar-1.0.pom" );
  305. actualProjectPaths.add( "org/apache/testgroup/discovery/1.0/discovery-1.0.pom" );
  306. ManagedRepository repository = createDefaultRepository();
  307. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  308. KnownScanConsumer consumer = new KnownScanConsumer();
  309. consumer.setIncludes( new String[]{ "**/*.pom" } );
  310. knownConsumers.add( consumer );
  311. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  312. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  313. invalidConsumers.add( badconsumer );
  314. RepositoryScanner scanner = lookupRepositoryScanner();
  315. RepositoryScanStatistics stats =
  316. scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(), RepositoryScanner.FRESH_SCAN );
  317. assertNotNull( "Stats should not be null.", stats );
  318. assertMinimumHits( "Stats.totalFileCount", actualProjectPaths.size(), stats.getTotalFileCount() );
  319. assertMinimumHits( "Processed Count", actualProjectPaths.size(), consumer.getProcessCount() );
  320. }
  321. @Test
  322. public void testLegacyRepositoryArtifactScanner()
  323. throws Exception
  324. {
  325. List<String> actualArtifactPaths = new ArrayList<>();
  326. actualArtifactPaths.add( "invalid/jars/1.0/invalid-1.0.jar" );
  327. actualArtifactPaths.add( "invalid/jars/invalid-1.0.rar" );
  328. actualArtifactPaths.add( "invalid/jars/invalid.jar" );
  329. actualArtifactPaths.add( "invalid/invalid-1.0.jar" );
  330. actualArtifactPaths.add( "javax.sql/jars/jdbc-2.0.jar" );
  331. actualArtifactPaths.add( "org.apache.maven/jars/some-ejb-1.0-client.jar" );
  332. actualArtifactPaths.add( "org.apache.maven/jars/testing-1.0.jar" );
  333. actualArtifactPaths.add( "org.apache.maven/jars/testing-1.0-sources.jar" );
  334. actualArtifactPaths.add( "org.apache.maven/jars/testing-UNKNOWN.jar" );
  335. actualArtifactPaths.add( "org.apache.maven/jars/testing-1.0.zip" );
  336. actualArtifactPaths.add( "org.apache.maven/jars/testing-1.0-20050611.112233-1.jar" );
  337. actualArtifactPaths.add( "org.apache.maven/jars/testing-1.0.tar.gz" );
  338. actualArtifactPaths.add( "org.apache.maven.update/jars/test-not-updated-1.0.jar" );
  339. actualArtifactPaths.add( "org.apache.maven.update/jars/test-updated-1.0.jar" );
  340. ManagedRepository repository = createLegacyRepository();
  341. List<KnownRepositoryContentConsumer> knownConsumers = new ArrayList<>();
  342. KnownScanConsumer consumer = new KnownScanConsumer();
  343. consumer.setIncludes( ARTIFACT_PATTERNS );
  344. knownConsumers.add( consumer );
  345. List<InvalidRepositoryContentConsumer> invalidConsumers = new ArrayList<>();
  346. InvalidScanConsumer badconsumer = new InvalidScanConsumer();
  347. invalidConsumers.add( badconsumer );
  348. RepositoryScanner scanner = lookupRepositoryScanner();
  349. RepositoryScanStatistics stats =
  350. scanner.scan( repository, knownConsumers, invalidConsumers, getIgnoreList(), RepositoryScanner.FRESH_SCAN );
  351. assertNotNull( "Stats should not be null.", stats );
  352. assertMinimumHits( "Stats.totalFileCount", actualArtifactPaths.size(), stats.getTotalFileCount() );
  353. assertMinimumHits( "Processed Count", actualArtifactPaths.size(), consumer.getProcessCount() );
  354. }
  355. }