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.

CeQueueImplTest.java 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2019 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.ce.queue;
  21. import java.util.List;
  22. import java.util.Optional;
  23. import java.util.Random;
  24. import java.util.stream.Collectors;
  25. import java.util.stream.IntStream;
  26. import javax.annotation.Nullable;
  27. import org.junit.Rule;
  28. import org.junit.Test;
  29. import org.junit.rules.ExpectedException;
  30. import org.sonar.api.utils.System2;
  31. import org.sonar.api.utils.internal.TestSystem2;
  32. import org.sonar.ce.queue.CeTaskSubmit.Component;
  33. import org.sonar.ce.task.CeTask;
  34. import org.sonar.core.util.UuidFactory;
  35. import org.sonar.core.util.UuidFactoryFast;
  36. import org.sonar.core.util.UuidFactoryImpl;
  37. import org.sonar.db.DbSession;
  38. import org.sonar.db.DbTester;
  39. import org.sonar.db.ce.CeActivityDto;
  40. import org.sonar.db.ce.CeQueueDto;
  41. import org.sonar.db.ce.CeTaskTypes;
  42. import org.sonar.db.component.ComponentDto;
  43. import org.sonar.db.component.ComponentTesting;
  44. import org.sonar.db.user.UserDto;
  45. import org.sonar.db.user.UserTesting;
  46. import org.sonar.server.organization.DefaultOrganizationProvider;
  47. import org.sonar.server.organization.TestDefaultOrganizationProvider;
  48. import static com.google.common.collect.ImmutableList.of;
  49. import static java.util.Arrays.asList;
  50. import static java.util.Collections.emptyMap;
  51. import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
  52. import static org.assertj.core.api.Assertions.assertThat;
  53. import static org.assertj.core.api.Assertions.tuple;
  54. import static org.hamcrest.Matchers.startsWith;
  55. import static org.sonar.ce.queue.CeQueue.SubmitOption.UNIQUE_QUEUE_PER_MAIN_COMPONENT;
  56. public class CeQueueImplTest {
  57. private static final String WORKER_UUID = "workerUuid";
  58. private System2 system2 = new TestSystem2().setNow(1_450_000_000_000L);
  59. @Rule
  60. public ExpectedException expectedException = ExpectedException.none();
  61. @Rule
  62. public DbTester db = DbTester.create(system2);
  63. private DbSession session = db.getSession();
  64. private UuidFactory uuidFactory = UuidFactoryImpl.INSTANCE;
  65. private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
  66. private CeQueue underTest = new CeQueueImpl(db.getDbClient(), uuidFactory, defaultOrganizationProvider);
  67. @Test
  68. public void submit_returns_task_populated_from_CeTaskSubmit_and_creates_CeQueue_row() {
  69. String componentUuid = randomAlphabetic(3);
  70. String mainComponentUuid = randomAlphabetic(4);
  71. CeTaskSubmit taskSubmit = createTaskSubmit(CeTaskTypes.REPORT, new Component(componentUuid, mainComponentUuid), "submitter uuid");
  72. UserDto userDto = db.getDbClient().userDao().selectByUuid(db.getSession(), taskSubmit.getSubmitterUuid());
  73. CeTask task = underTest.submit(taskSubmit);
  74. verifyCeTask(taskSubmit, task, null, userDto);
  75. verifyCeQueueDtoForTaskSubmit(taskSubmit);
  76. }
  77. @Test
  78. public void submit_populates_component_name_and_key_of_CeTask_if_component_exists() {
  79. ComponentDto componentDto = insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert(), "PROJECT_1"));
  80. CeTaskSubmit taskSubmit = createTaskSubmit(CeTaskTypes.REPORT, Component.fromDto(componentDto), null);
  81. CeTask task = underTest.submit(taskSubmit);
  82. verifyCeTask(taskSubmit, task, componentDto, null);
  83. }
  84. @Test
  85. public void submit_returns_task_without_component_info_when_submit_has_none() {
  86. CeTaskSubmit taskSubmit = createTaskSubmit("not cpt related");
  87. CeTask task = underTest.submit(taskSubmit);
  88. verifyCeTask(taskSubmit, task, null, null);
  89. }
  90. @Test
  91. public void submit_populates_submitter_login_of_CeTask_if_submitter_exists() {
  92. UserDto userDto = insertUser(UserTesting.newUserDto());
  93. CeTaskSubmit taskSubmit = createTaskSubmit(CeTaskTypes.REPORT, null, userDto.getUuid());
  94. CeTask task = underTest.submit(taskSubmit);
  95. verifyCeTask(taskSubmit, task, null, userDto);
  96. }
  97. @Test
  98. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_without_component_when_there_is_a_pending_task_without_component() {
  99. CeTaskSubmit taskSubmit = createTaskSubmit("no_component");
  100. CeQueueDto dto = insertPendingInQueue(null);
  101. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  102. assertThat(task).isNotEmpty();
  103. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  104. .extracting(CeQueueDto::getUuid)
  105. .containsOnly(dto.getUuid(), task.get().getUuid());
  106. }
  107. @Test
  108. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_a_pending_task_for_another_main_component() {
  109. String mainComponentUuid = randomAlphabetic(5);
  110. String otherMainComponentUuid = randomAlphabetic(6);
  111. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  112. CeQueueDto dto = insertPendingInQueue(newComponent(otherMainComponentUuid));
  113. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  114. assertThat(task).isNotEmpty();
  115. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  116. .extracting(CeQueueDto::getUuid)
  117. .containsOnly(dto.getUuid(), task.get().getUuid());
  118. }
  119. @Test
  120. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_one_pending_task_for_same_main_component() {
  121. String mainComponentUuid = randomAlphabetic(5);
  122. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  123. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  124. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  125. assertThat(task).isEmpty();
  126. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  127. .extracting(CeQueueDto::getUuid)
  128. .containsOnly(dto.getUuid());
  129. }
  130. @Test
  131. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_many_pending_task_for_same_main_component() {
  132. String mainComponentUuid = randomAlphabetic(5);
  133. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  134. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  135. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  136. .map(CeQueueDto::getUuid)
  137. .toArray(String[]::new);
  138. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  139. assertThat(task).isEmpty();
  140. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  141. .extracting(CeQueueDto::getUuid)
  142. .containsOnly(uuids);
  143. }
  144. @Test
  145. public void submit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_one_pending_task_for_same_main_component() {
  146. String mainComponentUuid = randomAlphabetic(5);
  147. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  148. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  149. CeTask task = underTest.submit(taskSubmit);
  150. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  151. .extracting(CeQueueDto::getUuid)
  152. .containsOnly(dto.getUuid(), task.getUuid());
  153. }
  154. @Test
  155. public void submit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_many_pending_task_for_same_main_component() {
  156. String mainComponentUuid = randomAlphabetic(5);
  157. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  158. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  159. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  160. .map(CeQueueDto::getUuid)
  161. .toArray(String[]::new);
  162. CeTask task = underTest.submit(taskSubmit);
  163. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  164. .extracting(CeQueueDto::getUuid)
  165. .hasSize(uuids.length + 1)
  166. .contains(uuids)
  167. .contains(task.getUuid());
  168. }
  169. @Test
  170. public void massSubmit_returns_tasks_for_each_CeTaskSubmit_populated_from_CeTaskSubmit_and_creates_CeQueue_row_for_each() {
  171. String mainComponentUuid = randomAlphabetic(10);
  172. CeTaskSubmit taskSubmit1 = createTaskSubmit(CeTaskTypes.REPORT, newComponent(mainComponentUuid), "submitter uuid");
  173. CeTaskSubmit taskSubmit2 = createTaskSubmit("some type");
  174. UserDto userDto1 = db.getDbClient().userDao().selectByUuid(db.getSession(), taskSubmit1.getSubmitterUuid());
  175. List<CeTask> tasks = underTest.massSubmit(asList(taskSubmit1, taskSubmit2));
  176. assertThat(tasks).hasSize(2);
  177. verifyCeTask(taskSubmit1, tasks.get(0), null, userDto1);
  178. verifyCeTask(taskSubmit2, tasks.get(1), null, null);
  179. verifyCeQueueDtoForTaskSubmit(taskSubmit1);
  180. verifyCeQueueDtoForTaskSubmit(taskSubmit2);
  181. }
  182. @Test
  183. public void massSubmit_populates_component_name_and_key_of_CeTask_if_project_exists() {
  184. ComponentDto componentDto1 = insertComponent(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization(), "PROJECT_1"));
  185. CeTaskSubmit taskSubmit1 = createTaskSubmit(CeTaskTypes.REPORT, Component.fromDto(componentDto1), null);
  186. CeTaskSubmit taskSubmit2 = createTaskSubmit("something", newComponent(randomAlphabetic(12)), null);
  187. List<CeTask> tasks = underTest.massSubmit(asList(taskSubmit1, taskSubmit2));
  188. assertThat(tasks).hasSize(2);
  189. verifyCeTask(taskSubmit1, tasks.get(0), componentDto1, null);
  190. verifyCeTask(taskSubmit2, tasks.get(1), null, null);
  191. }
  192. @Test
  193. public void massSubmit_populates_component_name_and_key_of_CeTask_if_project_and_branch_exists() {
  194. ComponentDto project = insertComponent(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization(), "PROJECT_1"));
  195. ComponentDto branch1 = db.components().insertProjectBranch(project);
  196. ComponentDto branch2 = db.components().insertProjectBranch(project);
  197. CeTaskSubmit taskSubmit1 = createTaskSubmit(CeTaskTypes.REPORT, Component.fromDto(branch1), null);
  198. CeTaskSubmit taskSubmit2 = createTaskSubmit("something", Component.fromDto(branch2), null);
  199. List<CeTask> tasks = underTest.massSubmit(asList(taskSubmit1, taskSubmit2));
  200. assertThat(tasks).hasSize(2);
  201. verifyCeTask(taskSubmit1, tasks.get(0), branch1, project, null);
  202. verifyCeTask(taskSubmit2, tasks.get(1), branch2, project, null);
  203. }
  204. @Test
  205. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_without_component_when_there_is_a_pending_task_without_component() {
  206. CeTaskSubmit taskSubmit = createTaskSubmit("no_component");
  207. CeQueueDto dto = insertPendingInQueue(null);
  208. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  209. assertThat(tasks).hasSize(1);
  210. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  211. .extracting(CeQueueDto::getUuid)
  212. .containsOnly(dto.getUuid(), tasks.iterator().next().getUuid());
  213. }
  214. @Test
  215. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_a_pending_task_for_another_main_component() {
  216. String mainComponentUuid = randomAlphabetic(5);
  217. String otherMainComponentUuid = randomAlphabetic(6);
  218. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  219. CeQueueDto dto = insertPendingInQueue(newComponent(otherMainComponentUuid));
  220. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  221. assertThat(tasks).hasSize(1);
  222. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  223. .extracting(CeQueueDto::getUuid)
  224. .containsOnly(dto.getUuid(), tasks.iterator().next().getUuid());
  225. }
  226. @Test
  227. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_one_pending_task_for_same_main_component() {
  228. String mainComponentUuid = randomAlphabetic(5);
  229. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  230. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  231. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  232. assertThat(tasks).isEmpty();
  233. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  234. .extracting(CeQueueDto::getUuid)
  235. .containsOnly(dto.getUuid());
  236. }
  237. @Test
  238. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_many_pending_task_for_same_main_component() {
  239. String mainComponentUuid = randomAlphabetic(5);
  240. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  241. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  242. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  243. .map(CeQueueDto::getUuid)
  244. .toArray(String[]::new);
  245. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  246. assertThat(tasks).isEmpty();
  247. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  248. .extracting(CeQueueDto::getUuid)
  249. .containsOnly(uuids);
  250. }
  251. @Test
  252. public void massSubmit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_one_pending_task_for_other_main_component() {
  253. String mainComponentUuid = randomAlphabetic(5);
  254. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  255. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  256. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit));
  257. assertThat(tasks).hasSize(1);
  258. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  259. .extracting(CeQueueDto::getUuid)
  260. .containsOnly(dto.getUuid(), tasks.iterator().next().getUuid());
  261. }
  262. @Test
  263. public void massSubmit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_many_pending_task_for_other_main_component() {
  264. String mainComponentUuid = randomAlphabetic(5);
  265. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  266. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  267. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  268. .map(CeQueueDto::getUuid)
  269. .toArray(String[]::new);
  270. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit));
  271. assertThat(tasks).hasSize(1);
  272. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  273. .extracting(CeQueueDto::getUuid)
  274. .hasSize(uuids.length + 1)
  275. .contains(uuids)
  276. .contains(tasks.iterator().next().getUuid());
  277. }
  278. @Test
  279. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_tasks_depending_on_whether_there_is_pending_task_for_same_main_component() {
  280. String mainComponentUuid1 = randomAlphabetic(5);
  281. String mainComponentUuid2 = randomAlphabetic(6);
  282. String mainComponentUuid3 = randomAlphabetic(7);
  283. String mainComponentUuid4 = randomAlphabetic(8);
  284. String mainComponentUuid5 = randomAlphabetic(9);
  285. CeTaskSubmit taskSubmit1 = createTaskSubmit("with_one_pending", newComponent(mainComponentUuid1), null);
  286. CeQueueDto dto1 = insertPendingInQueue(newComponent(mainComponentUuid1));
  287. Component componentForMainComponentUuid2 = newComponent(mainComponentUuid2);
  288. CeTaskSubmit taskSubmit2 = createTaskSubmit("no_pending", componentForMainComponentUuid2, null);
  289. CeTaskSubmit taskSubmit3 = createTaskSubmit("with_many_pending", newComponent(mainComponentUuid3), null);
  290. String[] uuids3 = IntStream.range(0, 2 + new Random().nextInt(5))
  291. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid3)))
  292. .map(CeQueueDto::getUuid)
  293. .toArray(String[]::new);
  294. Component componentForMainComponentUuid4 = newComponent(mainComponentUuid4);
  295. CeTaskSubmit taskSubmit4 = createTaskSubmit("no_pending_2", componentForMainComponentUuid4, null);
  296. CeTaskSubmit taskSubmit5 = createTaskSubmit("with_pending_2", newComponent(mainComponentUuid5), null);
  297. CeQueueDto dto5 = insertPendingInQueue(newComponent(mainComponentUuid5));
  298. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit1, taskSubmit2, taskSubmit3, taskSubmit4, taskSubmit5), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  299. assertThat(tasks)
  300. .hasSize(2)
  301. .extracting(task -> task.getComponent().get().getUuid(),task -> task.getMainComponent().get().getUuid())
  302. .containsOnly(tuple(componentForMainComponentUuid2.getUuid(), componentForMainComponentUuid2.getMainComponentUuid()),
  303. tuple(componentForMainComponentUuid4.getUuid(), componentForMainComponentUuid4.getMainComponentUuid()));
  304. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  305. .extracting(CeQueueDto::getUuid)
  306. .hasSize(1 + uuids3.length + 1 + tasks.size())
  307. .contains(dto1.getUuid())
  308. .contains(uuids3)
  309. .contains(dto5.getUuid())
  310. .containsAll(tasks.stream().map(CeTask::getUuid).collect(Collectors.toList()));
  311. }
  312. @Test
  313. public void cancel_pending() {
  314. CeTask task = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  315. CeQueueDto queueDto = db.getDbClient().ceQueueDao().selectByUuid(db.getSession(), task.getUuid()).get();
  316. underTest.cancel(db.getSession(), queueDto);
  317. Optional<CeActivityDto> activity = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), task.getUuid());
  318. assertThat(activity.isPresent()).isTrue();
  319. assertThat(activity.get().getStatus()).isEqualTo(CeActivityDto.Status.CANCELED);
  320. }
  321. @Test
  322. public void fail_to_cancel_if_in_progress() {
  323. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(11)));
  324. CeQueueDto ceQueueDto = db.getDbClient().ceQueueDao().peek(session, WORKER_UUID).get();
  325. expectedException.expect(IllegalStateException.class);
  326. expectedException.expectMessage(startsWith("Task is in progress and can't be canceled"));
  327. underTest.cancel(db.getSession(), ceQueueDto);
  328. }
  329. @Test
  330. public void cancelAll_pendings_but_not_in_progress() {
  331. CeTask inProgressTask = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  332. CeTask pendingTask1 = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(13)));
  333. CeTask pendingTask2 = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(14)));
  334. db.getDbClient().ceQueueDao().peek(session, WORKER_UUID);
  335. int canceledCount = underTest.cancelAll();
  336. assertThat(canceledCount).isEqualTo(2);
  337. Optional<CeActivityDto> history = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), pendingTask1.getUuid());
  338. assertThat(history.get().getStatus()).isEqualTo(CeActivityDto.Status.CANCELED);
  339. history = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), pendingTask2.getUuid());
  340. assertThat(history.get().getStatus()).isEqualTo(CeActivityDto.Status.CANCELED);
  341. history = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), inProgressTask.getUuid());
  342. assertThat(history.isPresent()).isFalse();
  343. }
  344. @Test
  345. public void pauseWorkers_marks_workers_as_paused_if_zero_tasks_in_progress() {
  346. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  347. // task is pending
  348. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  349. underTest.pauseWorkers();
  350. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSED);
  351. }
  352. @Test
  353. public void pauseWorkers_marks_workers_as_pausing_if_some_tasks_in_progress() {
  354. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  355. db.getDbClient().ceQueueDao().peek(session, WORKER_UUID);
  356. // task is in-progress
  357. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  358. underTest.pauseWorkers();
  359. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSING);
  360. }
  361. @Test
  362. public void resumeWorkers_does_nothing_if_not_paused() {
  363. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  364. underTest.resumeWorkers();
  365. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  366. }
  367. @Test
  368. public void resumeWorkers_resumes_pausing_workers() {
  369. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  370. db.getDbClient().ceQueueDao().peek(session, WORKER_UUID);
  371. // task is in-progress
  372. underTest.pauseWorkers();
  373. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSING);
  374. underTest.resumeWorkers();
  375. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  376. }
  377. @Test
  378. public void resumeWorkers_resumes_paused_workers() {
  379. underTest.pauseWorkers();
  380. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSED);
  381. underTest.resumeWorkers();
  382. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  383. }
  384. private void verifyCeTask(CeTaskSubmit taskSubmit, CeTask task, @Nullable ComponentDto componentDto, UserDto userDto) {
  385. verifyCeTask(taskSubmit, task, componentDto, componentDto, userDto);
  386. }
  387. private void verifyCeTask(CeTaskSubmit taskSubmit, CeTask task, @Nullable ComponentDto componentDto, @Nullable ComponentDto mainComponentDto, @Nullable UserDto userDto) {
  388. if (componentDto == null) {
  389. assertThat(task.getOrganizationUuid()).isEqualTo(defaultOrganizationProvider.get().getUuid());
  390. } else {
  391. assertThat(task.getOrganizationUuid()).isEqualTo(componentDto.getOrganizationUuid());
  392. }
  393. assertThat(task.getUuid()).isEqualTo(taskSubmit.getUuid());
  394. if (componentDto != null) {
  395. CeTask.Component component = task.getComponent().get();
  396. assertThat(component.getUuid()).isEqualTo(componentDto.uuid());
  397. assertThat(component.getKey()).contains(componentDto.getDbKey());
  398. assertThat(component.getName()).contains(componentDto.name());
  399. } else if (taskSubmit.getComponent().isPresent()) {
  400. assertThat(task.getComponent()).contains(new CeTask.Component(taskSubmit.getComponent().get().getUuid(), null, null));
  401. } else {
  402. assertThat(task.getComponent()).isEmpty();
  403. }
  404. if (mainComponentDto != null) {
  405. CeTask.Component component = task.getMainComponent().get();
  406. assertThat(component.getUuid()).isEqualTo(mainComponentDto.uuid());
  407. assertThat(component.getKey()).contains(mainComponentDto.getDbKey());
  408. assertThat(component.getName()).contains(mainComponentDto.name());
  409. } else if (taskSubmit.getComponent().isPresent()) {
  410. assertThat(task.getMainComponent()).contains(new CeTask.Component(taskSubmit.getComponent().get().getMainComponentUuid(), null, null));
  411. } else {
  412. assertThat(task.getMainComponent()).isEmpty();
  413. }
  414. assertThat(task.getType()).isEqualTo(taskSubmit.getType());
  415. if (taskSubmit.getSubmitterUuid() != null) {
  416. if (userDto == null) {
  417. assertThat(task.getSubmitter().getUuid()).isEqualTo(taskSubmit.getSubmitterUuid());
  418. assertThat(task.getSubmitter().getLogin()).isNull();
  419. } else {
  420. assertThat(task.getSubmitter().getUuid()).isEqualTo(userDto.getUuid()).isEqualTo(taskSubmit.getSubmitterUuid());
  421. assertThat(task.getSubmitter().getLogin()).isEqualTo(userDto.getLogin());
  422. }
  423. }
  424. }
  425. private void verifyCeQueueDtoForTaskSubmit(CeTaskSubmit taskSubmit) {
  426. Optional<CeQueueDto> queueDto = db.getDbClient().ceQueueDao().selectByUuid(db.getSession(), taskSubmit.getUuid());
  427. assertThat(queueDto.isPresent()).isTrue();
  428. assertThat(queueDto.get().getTaskType()).isEqualTo(taskSubmit.getType());
  429. Optional<Component> component = taskSubmit.getComponent();
  430. if (component.isPresent()) {
  431. assertThat(queueDto.get().getComponentUuid()).isEqualTo(component.get().getUuid());
  432. assertThat(queueDto.get().getMainComponentUuid()).isEqualTo(component.get().getMainComponentUuid());
  433. } else {
  434. assertThat(queueDto.get().getComponentUuid()).isNull();
  435. assertThat(queueDto.get().getComponentUuid()).isNull();
  436. }
  437. assertThat(queueDto.get().getSubmitterUuid()).isEqualTo(taskSubmit.getSubmitterUuid());
  438. assertThat(queueDto.get().getCreatedAt()).isEqualTo(1_450_000_000_000L);
  439. }
  440. private CeTask submit(String reportType, Component component) {
  441. return underTest.submit(createTaskSubmit(reportType, component, null));
  442. }
  443. private CeTaskSubmit createTaskSubmit(String type) {
  444. return createTaskSubmit(type, null, null);
  445. }
  446. private CeTaskSubmit createTaskSubmit(String type, @Nullable Component component, @Nullable String submitterUuid) {
  447. return underTest.prepareSubmit()
  448. .setType(type)
  449. .setComponent(component)
  450. .setSubmitterUuid(submitterUuid)
  451. .setCharacteristics(emptyMap())
  452. .build();
  453. }
  454. private ComponentDto insertComponent(ComponentDto componentDto) {
  455. db.getDbClient().componentDao().insert(session, componentDto);
  456. session.commit();
  457. return componentDto;
  458. }
  459. private UserDto insertUser(UserDto userDto) {
  460. db.getDbClient().userDao().insert(session, userDto);
  461. session.commit();
  462. return userDto;
  463. }
  464. private CeQueueDto insertPendingInQueue(@Nullable Component component) {
  465. CeQueueDto dto = new CeQueueDto()
  466. .setUuid(UuidFactoryFast.getInstance().create())
  467. .setTaskType("some type")
  468. .setStatus(CeQueueDto.Status.PENDING);
  469. if (component != null) {
  470. dto.setComponentUuid(component.getUuid())
  471. .setMainComponentUuid(component.getMainComponentUuid());
  472. }
  473. db.getDbClient().ceQueueDao().insert(db.getSession(), dto);
  474. db.commit();
  475. return dto;
  476. }
  477. private static int newComponentIdGenerator = new Random().nextInt(8_999_333);
  478. private static Component newComponent(String mainComponentUuid) {
  479. return new Component("uuid_" + newComponentIdGenerator++, mainComponentUuid);
  480. }
  481. }