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.

RepositoryTaskAdministrationTest.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. package org.apache.archiva.admin.repository.admin;
  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. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. import org.apache.archiva.admin.model.RepositoryAdminException;
  20. import org.apache.archiva.admin.model.admin.RepositoryTaskAdministration;
  21. import org.apache.archiva.admin.model.beans.ScanStatus;
  22. import org.apache.archiva.components.taskqueue.TaskQueue;
  23. import org.apache.archiva.components.taskqueue.TaskQueueException;
  24. import org.apache.archiva.components.taskqueue.execution.TaskQueueExecutor;
  25. import org.apache.archiva.repository.ManagedRepository;
  26. import org.apache.archiva.repository.RepositoryRegistry;
  27. import org.apache.archiva.repository.storage.StorageAsset;
  28. import org.apache.archiva.scheduler.indexing.ArtifactIndexingTask;
  29. import org.apache.archiva.scheduler.indexing.IndexingArchivaTaskScheduler;
  30. import org.apache.archiva.scheduler.repository.model.RepositoryArchivaTaskScheduler;
  31. import org.apache.archiva.scheduler.repository.model.RepositoryTask;
  32. import org.junit.jupiter.api.BeforeEach;
  33. import org.junit.jupiter.api.DisplayName;
  34. import org.junit.jupiter.api.Tag;
  35. import org.junit.jupiter.api.Test;
  36. import org.mockito.ArgumentCaptor;
  37. import java.nio.file.Paths;
  38. import java.util.ArrayList;
  39. import java.util.List;
  40. import static org.junit.jupiter.api.Assertions.*;
  41. import static org.mockito.Mockito.*;
  42. /**
  43. * @author Martin Stockhammer <martin_s@apache.org>
  44. */
  45. @Tag( "archiva-admin" )
  46. @DisplayName( "Unit Tests for RepositoryTaskAdministration" )
  47. public class RepositoryTaskAdministrationTest
  48. {
  49. private RepositoryTaskAdministration taskAdministration;
  50. private TaskQueueExecutor<ArtifactIndexingTask> indexingTaskExecutor;
  51. private TaskQueueExecutor<RepositoryTask> scanningTaskExecutor;
  52. private RepositoryArchivaTaskScheduler repositoryArchivaTaskScheduler;
  53. private IndexingArchivaTaskScheduler indexingArchivaTaskScheduler;
  54. private RepositoryRegistry registry;
  55. @BeforeEach
  56. public void init() {
  57. registry = mock( RepositoryRegistry.class );
  58. indexingTaskExecutor = mock( TaskQueueExecutor.class );
  59. scanningTaskExecutor = mock( TaskQueueExecutor.class );
  60. repositoryArchivaTaskScheduler = mock( RepositoryArchivaTaskScheduler.class );
  61. indexingArchivaTaskScheduler = mock( IndexingArchivaTaskScheduler.class );
  62. this.taskAdministration = new DefaultRepositoryTaskAdministration( registry, indexingTaskExecutor,
  63. scanningTaskExecutor, repositoryArchivaTaskScheduler, indexingArchivaTaskScheduler );
  64. }
  65. @Test
  66. public void testScanStatus() throws RepositoryAdminException, TaskQueueException
  67. {
  68. TaskQueue queue = mock( TaskQueue.class );
  69. TaskQueue indexQueue = mock( TaskQueue.class );
  70. List<RepositoryTask> scanList = new ArrayList<>( );
  71. RepositoryTask scanTask1 = new RepositoryTask( );
  72. scanTask1.setRepositoryId( "abcde" );
  73. scanTask1.setScanAll( true );
  74. scanTask1.setResourceFile( null );
  75. scanList.add( scanTask1 );
  76. RepositoryTask scanTask2 = new RepositoryTask( );
  77. scanTask2.setRepositoryId( "testrepo2" );
  78. scanTask2.setScanAll( true );
  79. scanTask2.setResourceFile( null );
  80. scanList.add( scanTask1 );
  81. List<ArtifactIndexingTask> indexList = new ArrayList<>( );
  82. ArtifactIndexingTask indexTask1 = mock( ArtifactIndexingTask.class, RETURNS_DEEP_STUBS );
  83. when( indexTask1.getRepository( ).getId( ) ).thenReturn( "indexrepo1" );
  84. when( indexTask1.isExecuteOnEntireRepo( ) ).thenReturn( true );
  85. when( indexTask1.getResourceFile( ) ).thenReturn( null );
  86. indexList.add( indexTask1 );
  87. ArtifactIndexingTask indexTask2 = mock( ArtifactIndexingTask.class, RETURNS_DEEP_STUBS );
  88. when( indexTask2.getRepository( ).getId( ) ).thenReturn( "indexrepo2" );
  89. when( indexTask2.isExecuteOnEntireRepo( ) ).thenReturn( true );
  90. when( indexTask2.getResourceFile( ) ).thenReturn( null );
  91. indexList.add( indexTask2 );
  92. when( scanningTaskExecutor.getQueue( ) ).thenReturn( queue );
  93. when( indexingTaskExecutor.getQueue( ) ).thenReturn( indexQueue );
  94. when( queue.getQueueSnapshot( ) ).thenReturn( scanList );
  95. when( indexQueue.getQueueSnapshot( ) ).thenReturn( indexList );
  96. ScanStatus currentScanStatus = taskAdministration.getCurrentScanStatus( );
  97. assertNotNull( currentScanStatus );
  98. assertNotNull( currentScanStatus.getIndexingQueue( ) );
  99. assertNotNull( currentScanStatus.getScanQueue( ) );
  100. assertEquals( 2, currentScanStatus.getScanQueue( ).size( ) );
  101. assertEquals( 2, currentScanStatus.getIndexingQueue( ).size( ) );
  102. }
  103. @Test
  104. public void testScanStatusWithId() throws RepositoryAdminException, TaskQueueException
  105. {
  106. TaskQueue queue = mock( TaskQueue.class );
  107. TaskQueue indexQueue = mock( TaskQueue.class );
  108. List<RepositoryTask> scanList = new ArrayList<>( );
  109. RepositoryTask scanTask1 = new RepositoryTask( );
  110. scanTask1.setRepositoryId( "abcde" );
  111. scanTask1.setScanAll( true );
  112. scanTask1.setResourceFile( null );
  113. scanList.add( scanTask1 );
  114. RepositoryTask scanTask2 = new RepositoryTask( );
  115. scanTask2.setRepositoryId( "testrepo2" );
  116. scanTask2.setScanAll( true );
  117. scanTask2.setResourceFile( null );
  118. scanList.add( scanTask1 );
  119. List<ArtifactIndexingTask> indexList = new ArrayList<>( );
  120. ArtifactIndexingTask indexTask1 = mock( ArtifactIndexingTask.class, RETURNS_DEEP_STUBS );
  121. when( indexTask1.getRepository( ).getId( ) ).thenReturn( "indexrepo1" );
  122. when( indexTask1.isExecuteOnEntireRepo( ) ).thenReturn( true );
  123. when( indexTask1.getResourceFile( ) ).thenReturn( null );
  124. indexList.add( indexTask1 );
  125. ArtifactIndexingTask indexTask2 = mock( ArtifactIndexingTask.class, RETURNS_DEEP_STUBS );
  126. when( indexTask2.getRepository( ).getId( ) ).thenReturn( "indexrepo2" );
  127. when( indexTask2.isExecuteOnEntireRepo( ) ).thenReturn( true );
  128. when( indexTask2.getResourceFile( ) ).thenReturn( null );
  129. indexList.add( indexTask2 );
  130. when( scanningTaskExecutor.getQueue( ) ).thenReturn( queue );
  131. when( indexingTaskExecutor.getQueue( ) ).thenReturn( indexQueue );
  132. when( queue.getQueueSnapshot( ) ).thenReturn( scanList );
  133. when( indexQueue.getQueueSnapshot( ) ).thenReturn( indexList );
  134. when( registry.getManagedRepository( "indexrepo2" ) ).thenReturn( mock( ManagedRepository.class ) );
  135. ScanStatus currentScanStatus = taskAdministration.getCurrentScanStatus( "indexrepo2");
  136. assertNotNull( currentScanStatus );
  137. assertNotNull( currentScanStatus.getIndexingQueue( ) );
  138. assertNotNull( currentScanStatus.getScanQueue( ) );
  139. assertEquals( 0, currentScanStatus.getScanQueue( ).size( ) );
  140. assertEquals( 1, currentScanStatus.getIndexingQueue( ).size( ) );
  141. }
  142. @Test
  143. public void testScheduleFullScan() throws RepositoryAdminException, TaskQueueException
  144. {
  145. when( registry.getManagedRepository( "internal" ) ).thenReturn( mock( ManagedRepository.class ) );
  146. taskAdministration.scheduleFullScan( "internal" );
  147. verify( repositoryArchivaTaskScheduler, times(1) ).queueTask( any() );
  148. verify( indexingArchivaTaskScheduler, times(1) ).queueTask( any() );
  149. }
  150. @Test
  151. public void testScheduleIndexScan() throws RepositoryAdminException, TaskQueueException
  152. {
  153. when( registry.getManagedRepository( "internal" ) ).thenReturn( mock( ManagedRepository.class ) );
  154. taskAdministration.scheduleIndexFullScan( "internal" );
  155. ArgumentCaptor<ArtifactIndexingTask> captor = ArgumentCaptor.forClass( ArtifactIndexingTask.class );
  156. verify( repositoryArchivaTaskScheduler, times(0) ).queueTask( any() );
  157. verify( indexingArchivaTaskScheduler, times(1) ).queueTask( captor.capture() );
  158. assertTrue(captor.getValue().isExecuteOnEntireRepo());
  159. }
  160. @Test
  161. public void testScheduleIndexScanWithFile() throws RepositoryAdminException, TaskQueueException
  162. {
  163. ManagedRepository managedRepo = mock( ManagedRepository.class, RETURNS_DEEP_STUBS );
  164. when( registry.getManagedRepository( "internal" ) ).thenReturn( managedRepo );
  165. StorageAsset asset = mock( StorageAsset.class );
  166. when( asset.getFilePath( ) ).thenReturn( Paths.get( "abc/def/ghij.pom" ) );
  167. when( asset.exists( ) ).thenReturn( true );
  168. when( registry.getManagedRepository( "internal" ).getAsset( "abc/def/ghij.pom" ) ).thenReturn( asset );
  169. taskAdministration.scheduleIndexScan( "internal", "abc/def/ghij.pom" );
  170. ArgumentCaptor<ArtifactIndexingTask> captor = ArgumentCaptor.forClass( ArtifactIndexingTask.class );
  171. verify( repositoryArchivaTaskScheduler, times(0) ).queueTask( any() );
  172. verify( indexingArchivaTaskScheduler, times(1) ).queueTask( captor.capture() );
  173. ArtifactIndexingTask caption = captor.getValue( );
  174. assertFalse(caption.isExecuteOnEntireRepo());
  175. assertEquals( "abc/def/ghij.pom", caption.getResourceFile( ).toString() );
  176. }
  177. @Test
  178. public void testScheduleMetadataScan() throws RepositoryAdminException, TaskQueueException
  179. {
  180. when( registry.getManagedRepository( "internal" ) ).thenReturn( mock( ManagedRepository.class ) );
  181. taskAdministration.scheduleMetadataFullScan( "internal" );
  182. ArgumentCaptor<RepositoryTask> captor = ArgumentCaptor.forClass( RepositoryTask.class );
  183. verify( repositoryArchivaTaskScheduler, times(1) ).queueTask( captor.capture( ) );
  184. verify( indexingArchivaTaskScheduler, times(0) ).queueTask( any() );
  185. assertTrue(captor.getValue().isScanAll());
  186. }
  187. @Test
  188. public void testScheduleMetadataUpdateScan() throws RepositoryAdminException, TaskQueueException
  189. {
  190. when( registry.getManagedRepository( "internal" ) ).thenReturn( mock( ManagedRepository.class ) );
  191. taskAdministration.scheduleMetadataUpdateScan( "internal" );
  192. ArgumentCaptor<RepositoryTask> captor = ArgumentCaptor.forClass( RepositoryTask.class );
  193. verify( repositoryArchivaTaskScheduler, times(1) ).queueTask( captor.capture( ) );
  194. verify( indexingArchivaTaskScheduler, times(0) ).queueTask( any() );
  195. assertFalse(captor.getValue().isScanAll());
  196. }
  197. @Test
  198. void cancelAllTasks() throws TaskQueueException, RepositoryAdminException
  199. {
  200. TaskQueue queue = mock( TaskQueue.class );
  201. TaskQueue indexQueue = mock( TaskQueue.class );
  202. List<RepositoryTask> scanList = new ArrayList<>( );
  203. RepositoryTask scanTask1 = new RepositoryTask( );
  204. scanTask1.setRepositoryId( "abcde" );
  205. scanTask1.setScanAll( true );
  206. scanTask1.setResourceFile( null );
  207. scanList.add( scanTask1 );
  208. RepositoryTask scanTask2 = new RepositoryTask( );
  209. scanTask2.setRepositoryId( "testrepo2" );
  210. scanTask2.setScanAll( true );
  211. scanTask2.setResourceFile( null );
  212. scanList.add( scanTask1 );
  213. List<ArtifactIndexingTask> indexList = new ArrayList<>( );
  214. ArtifactIndexingTask indexTask1 = mock( ArtifactIndexingTask.class, RETURNS_DEEP_STUBS );
  215. when( indexTask1.getRepository( ).getId( ) ).thenReturn( "indexrepo1" );
  216. when( indexTask1.isExecuteOnEntireRepo( ) ).thenReturn( true );
  217. when( indexTask1.getResourceFile( ) ).thenReturn( null );
  218. indexList.add( indexTask1 );
  219. ArtifactIndexingTask indexTask2 = mock( ArtifactIndexingTask.class, RETURNS_DEEP_STUBS );
  220. when( indexTask2.getRepository( ).getId( ) ).thenReturn( "indexrepo2" );
  221. when( indexTask2.isExecuteOnEntireRepo( ) ).thenReturn( true );
  222. when( indexTask2.getResourceFile( ) ).thenReturn( null );
  223. indexList.add( indexTask2 );
  224. when( scanningTaskExecutor.getQueue( ) ).thenReturn( queue );
  225. when( indexingTaskExecutor.getQueue( ) ).thenReturn( indexQueue );
  226. when( queue.getQueueSnapshot( ) ).thenReturn( scanList );
  227. when( indexQueue.getQueueSnapshot( ) ).thenReturn( indexList );
  228. taskAdministration.cancelTasks( "indexrepo1" );
  229. ArgumentCaptor<List> scanCaptor = ArgumentCaptor.forClass( List.class );
  230. ArgumentCaptor<List> indexCaptor = ArgumentCaptor.forClass( List.class );
  231. verify( queue ).removeAll( scanCaptor.capture() );
  232. verify( indexQueue ).removeAll( indexCaptor.capture() );
  233. List scanCancelList = scanCaptor.getValue( );
  234. List indexCancelList = indexCaptor.getValue( );
  235. assertEquals( 0, scanCancelList.size( ) );
  236. assertEquals( 1, indexCancelList.size( ) );
  237. assertEquals( "indexrepo1", ( (ArtifactIndexingTask) indexCancelList.get( 0 ) ).getRepository( ).getId( ) );
  238. }
  239. }