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 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  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.impl.utils.TestSystem2;
  31. import org.sonar.api.utils.System2;
  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.catchThrowable;
  54. import static org.assertj.core.api.Assertions.tuple;
  55. import static org.hamcrest.Matchers.startsWith;
  56. import static org.sonar.ce.queue.CeQueue.SubmitOption.UNIQUE_QUEUE_PER_MAIN_COMPONENT;
  57. public class CeQueueImplTest {
  58. private static final String WORKER_UUID = "workerUuid";
  59. private static final long NOW = 1_450_000_000_000L;
  60. private System2 system2 = new TestSystem2().setNow(NOW);
  61. @Rule
  62. public ExpectedException expectedException = ExpectedException.none();
  63. @Rule
  64. public DbTester db = DbTester.create(system2);
  65. private DbSession session = db.getSession();
  66. private UuidFactory uuidFactory = UuidFactoryImpl.INSTANCE;
  67. private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
  68. private CeQueue underTest = new CeQueueImpl(system2, db.getDbClient(), uuidFactory, defaultOrganizationProvider);
  69. @Test
  70. public void submit_returns_task_populated_from_CeTaskSubmit_and_creates_CeQueue_row() {
  71. String componentUuid = randomAlphabetic(3);
  72. String mainComponentUuid = randomAlphabetic(4);
  73. CeTaskSubmit taskSubmit = createTaskSubmit(CeTaskTypes.REPORT, new Component(componentUuid, mainComponentUuid), "submitter uuid");
  74. UserDto userDto = db.getDbClient().userDao().selectByUuid(db.getSession(), taskSubmit.getSubmitterUuid());
  75. CeTask task = underTest.submit(taskSubmit);
  76. verifyCeTask(taskSubmit, task, null, userDto);
  77. verifyCeQueueDtoForTaskSubmit(taskSubmit);
  78. }
  79. @Test
  80. public void submit_populates_component_name_and_key_of_CeTask_if_component_exists() {
  81. ComponentDto componentDto = insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert(), "PROJECT_1"));
  82. CeTaskSubmit taskSubmit = createTaskSubmit(CeTaskTypes.REPORT, Component.fromDto(componentDto), null);
  83. CeTask task = underTest.submit(taskSubmit);
  84. verifyCeTask(taskSubmit, task, componentDto, null);
  85. }
  86. @Test
  87. public void submit_returns_task_without_component_info_when_submit_has_none() {
  88. CeTaskSubmit taskSubmit = createTaskSubmit("not cpt related");
  89. CeTask task = underTest.submit(taskSubmit);
  90. verifyCeTask(taskSubmit, task, null, null);
  91. }
  92. @Test
  93. public void submit_populates_submitter_login_of_CeTask_if_submitter_exists() {
  94. UserDto userDto = insertUser(UserTesting.newUserDto());
  95. CeTaskSubmit taskSubmit = createTaskSubmit(CeTaskTypes.REPORT, null, userDto.getUuid());
  96. CeTask task = underTest.submit(taskSubmit);
  97. verifyCeTask(taskSubmit, task, null, userDto);
  98. }
  99. @Test
  100. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_without_component_when_there_is_a_pending_task_without_component() {
  101. CeTaskSubmit taskSubmit = createTaskSubmit("no_component");
  102. CeQueueDto dto = insertPendingInQueue(null);
  103. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  104. assertThat(task).isNotEmpty();
  105. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  106. .extracting(CeQueueDto::getUuid)
  107. .containsOnly(dto.getUuid(), task.get().getUuid());
  108. }
  109. @Test
  110. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_a_pending_task_for_another_main_component() {
  111. String mainComponentUuid = randomAlphabetic(5);
  112. String otherMainComponentUuid = randomAlphabetic(6);
  113. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  114. CeQueueDto dto = insertPendingInQueue(newComponent(otherMainComponentUuid));
  115. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  116. assertThat(task).isNotEmpty();
  117. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  118. .extracting(CeQueueDto::getUuid)
  119. .containsOnly(dto.getUuid(), task.get().getUuid());
  120. }
  121. @Test
  122. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_one_pending_task_for_same_main_component() {
  123. String mainComponentUuid = randomAlphabetic(5);
  124. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  125. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  126. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  127. assertThat(task).isEmpty();
  128. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  129. .extracting(CeQueueDto::getUuid)
  130. .containsOnly(dto.getUuid());
  131. }
  132. @Test
  133. public void submit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_many_pending_task_for_same_main_component() {
  134. String mainComponentUuid = randomAlphabetic(5);
  135. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  136. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  137. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  138. .map(CeQueueDto::getUuid)
  139. .toArray(String[]::new);
  140. Optional<CeTask> task = underTest.submit(taskSubmit, UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  141. assertThat(task).isEmpty();
  142. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  143. .extracting(CeQueueDto::getUuid)
  144. .containsOnly(uuids);
  145. }
  146. @Test
  147. public void submit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_one_pending_task_for_same_main_component() {
  148. String mainComponentUuid = randomAlphabetic(5);
  149. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  150. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  151. CeTask task = underTest.submit(taskSubmit);
  152. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  153. .extracting(CeQueueDto::getUuid)
  154. .containsOnly(dto.getUuid(), task.getUuid());
  155. }
  156. @Test
  157. public void submit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_many_pending_task_for_same_main_component() {
  158. String mainComponentUuid = randomAlphabetic(5);
  159. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  160. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  161. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  162. .map(CeQueueDto::getUuid)
  163. .toArray(String[]::new);
  164. CeTask task = underTest.submit(taskSubmit);
  165. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  166. .extracting(CeQueueDto::getUuid)
  167. .hasSize(uuids.length + 1)
  168. .contains(uuids)
  169. .contains(task.getUuid());
  170. }
  171. @Test
  172. public void massSubmit_returns_tasks_for_each_CeTaskSubmit_populated_from_CeTaskSubmit_and_creates_CeQueue_row_for_each() {
  173. String mainComponentUuid = randomAlphabetic(10);
  174. CeTaskSubmit taskSubmit1 = createTaskSubmit(CeTaskTypes.REPORT, newComponent(mainComponentUuid), "submitter uuid");
  175. CeTaskSubmit taskSubmit2 = createTaskSubmit("some type");
  176. UserDto userDto1 = db.getDbClient().userDao().selectByUuid(db.getSession(), taskSubmit1.getSubmitterUuid());
  177. List<CeTask> tasks = underTest.massSubmit(asList(taskSubmit1, taskSubmit2));
  178. assertThat(tasks).hasSize(2);
  179. verifyCeTask(taskSubmit1, tasks.get(0), null, userDto1);
  180. verifyCeTask(taskSubmit2, tasks.get(1), null, null);
  181. verifyCeQueueDtoForTaskSubmit(taskSubmit1);
  182. verifyCeQueueDtoForTaskSubmit(taskSubmit2);
  183. }
  184. @Test
  185. public void massSubmit_populates_component_name_and_key_of_CeTask_if_project_exists() {
  186. ComponentDto componentDto1 = insertComponent(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization(), "PROJECT_1"));
  187. CeTaskSubmit taskSubmit1 = createTaskSubmit(CeTaskTypes.REPORT, Component.fromDto(componentDto1), null);
  188. CeTaskSubmit taskSubmit2 = createTaskSubmit("something", newComponent(randomAlphabetic(12)), null);
  189. List<CeTask> tasks = underTest.massSubmit(asList(taskSubmit1, taskSubmit2));
  190. assertThat(tasks).hasSize(2);
  191. verifyCeTask(taskSubmit1, tasks.get(0), componentDto1, null);
  192. verifyCeTask(taskSubmit2, tasks.get(1), null, null);
  193. }
  194. @Test
  195. public void massSubmit_populates_component_name_and_key_of_CeTask_if_project_and_branch_exists() {
  196. ComponentDto project = insertComponent(ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization(), "PROJECT_1"));
  197. ComponentDto branch1 = db.components().insertProjectBranch(project);
  198. ComponentDto branch2 = db.components().insertProjectBranch(project);
  199. CeTaskSubmit taskSubmit1 = createTaskSubmit(CeTaskTypes.REPORT, Component.fromDto(branch1), null);
  200. CeTaskSubmit taskSubmit2 = createTaskSubmit("something", Component.fromDto(branch2), null);
  201. List<CeTask> tasks = underTest.massSubmit(asList(taskSubmit1, taskSubmit2));
  202. assertThat(tasks).hasSize(2);
  203. verifyCeTask(taskSubmit1, tasks.get(0), branch1, project, null);
  204. verifyCeTask(taskSubmit2, tasks.get(1), branch2, project, null);
  205. }
  206. @Test
  207. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_without_component_when_there_is_a_pending_task_without_component() {
  208. CeTaskSubmit taskSubmit = createTaskSubmit("no_component");
  209. CeQueueDto dto = insertPendingInQueue(null);
  210. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  211. assertThat(tasks).hasSize(1);
  212. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  213. .extracting(CeQueueDto::getUuid)
  214. .containsOnly(dto.getUuid(), tasks.iterator().next().getUuid());
  215. }
  216. @Test
  217. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_a_pending_task_for_another_main_component() {
  218. String mainComponentUuid = randomAlphabetic(5);
  219. String otherMainComponentUuid = randomAlphabetic(6);
  220. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  221. CeQueueDto dto = insertPendingInQueue(newComponent(otherMainComponentUuid));
  222. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  223. assertThat(tasks).hasSize(1);
  224. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  225. .extracting(CeQueueDto::getUuid)
  226. .containsOnly(dto.getUuid(), tasks.iterator().next().getUuid());
  227. }
  228. @Test
  229. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_one_pending_task_for_same_main_component() {
  230. String mainComponentUuid = randomAlphabetic(5);
  231. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  232. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  233. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  234. assertThat(tasks).isEmpty();
  235. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  236. .extracting(CeQueueDto::getUuid)
  237. .containsOnly(dto.getUuid());
  238. }
  239. @Test
  240. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_does_not_create_task_when_there_is_many_pending_task_for_same_main_component() {
  241. String mainComponentUuid = randomAlphabetic(5);
  242. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  243. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  244. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  245. .map(CeQueueDto::getUuid)
  246. .toArray(String[]::new);
  247. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  248. assertThat(tasks).isEmpty();
  249. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  250. .extracting(CeQueueDto::getUuid)
  251. .containsOnly(uuids);
  252. }
  253. @Test
  254. public void massSubmit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_one_pending_task_for_other_main_component() {
  255. String mainComponentUuid = randomAlphabetic(5);
  256. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  257. CeQueueDto dto = insertPendingInQueue(newComponent(mainComponentUuid));
  258. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit));
  259. assertThat(tasks).hasSize(1);
  260. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  261. .extracting(CeQueueDto::getUuid)
  262. .containsOnly(dto.getUuid(), tasks.iterator().next().getUuid());
  263. }
  264. @Test
  265. public void massSubmit_without_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_task_when_there_is_many_pending_task_for_other_main_component() {
  266. String mainComponentUuid = randomAlphabetic(5);
  267. CeTaskSubmit taskSubmit = createTaskSubmit("with_component", newComponent(mainComponentUuid), null);
  268. String[] uuids = IntStream.range(0, 2 + new Random().nextInt(5))
  269. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid)))
  270. .map(CeQueueDto::getUuid)
  271. .toArray(String[]::new);
  272. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit));
  273. assertThat(tasks).hasSize(1);
  274. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  275. .extracting(CeQueueDto::getUuid)
  276. .hasSize(uuids.length + 1)
  277. .contains(uuids)
  278. .contains(tasks.iterator().next().getUuid());
  279. }
  280. @Test
  281. public void massSubmit_with_UNIQUE_QUEUE_PER_MAIN_COMPONENT_creates_tasks_depending_on_whether_there_is_pending_task_for_same_main_component() {
  282. String mainComponentUuid1 = randomAlphabetic(5);
  283. String mainComponentUuid2 = randomAlphabetic(6);
  284. String mainComponentUuid3 = randomAlphabetic(7);
  285. String mainComponentUuid4 = randomAlphabetic(8);
  286. String mainComponentUuid5 = randomAlphabetic(9);
  287. CeTaskSubmit taskSubmit1 = createTaskSubmit("with_one_pending", newComponent(mainComponentUuid1), null);
  288. CeQueueDto dto1 = insertPendingInQueue(newComponent(mainComponentUuid1));
  289. Component componentForMainComponentUuid2 = newComponent(mainComponentUuid2);
  290. CeTaskSubmit taskSubmit2 = createTaskSubmit("no_pending", componentForMainComponentUuid2, null);
  291. CeTaskSubmit taskSubmit3 = createTaskSubmit("with_many_pending", newComponent(mainComponentUuid3), null);
  292. String[] uuids3 = IntStream.range(0, 2 + new Random().nextInt(5))
  293. .mapToObj(i -> insertPendingInQueue(newComponent(mainComponentUuid3)))
  294. .map(CeQueueDto::getUuid)
  295. .toArray(String[]::new);
  296. Component componentForMainComponentUuid4 = newComponent(mainComponentUuid4);
  297. CeTaskSubmit taskSubmit4 = createTaskSubmit("no_pending_2", componentForMainComponentUuid4, null);
  298. CeTaskSubmit taskSubmit5 = createTaskSubmit("with_pending_2", newComponent(mainComponentUuid5), null);
  299. CeQueueDto dto5 = insertPendingInQueue(newComponent(mainComponentUuid5));
  300. List<CeTask> tasks = underTest.massSubmit(of(taskSubmit1, taskSubmit2, taskSubmit3, taskSubmit4, taskSubmit5), UNIQUE_QUEUE_PER_MAIN_COMPONENT);
  301. assertThat(tasks)
  302. .hasSize(2)
  303. .extracting(task -> task.getComponent().get().getUuid(), task -> task.getMainComponent().get().getUuid())
  304. .containsOnly(tuple(componentForMainComponentUuid2.getUuid(), componentForMainComponentUuid2.getMainComponentUuid()),
  305. tuple(componentForMainComponentUuid4.getUuid(), componentForMainComponentUuid4.getMainComponentUuid()));
  306. assertThat(db.getDbClient().ceQueueDao().selectAllInAscOrder(db.getSession()))
  307. .extracting(CeQueueDto::getUuid)
  308. .hasSize(1 + uuids3.length + 1 + tasks.size())
  309. .contains(dto1.getUuid())
  310. .contains(uuids3)
  311. .contains(dto5.getUuid())
  312. .containsAll(tasks.stream().map(CeTask::getUuid).collect(Collectors.toList()));
  313. }
  314. @Test
  315. public void cancel_pending() {
  316. CeTask task = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  317. CeQueueDto queueDto = db.getDbClient().ceQueueDao().selectByUuid(db.getSession(), task.getUuid()).get();
  318. underTest.cancel(db.getSession(), queueDto);
  319. Optional<CeActivityDto> activity = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), task.getUuid());
  320. assertThat(activity.isPresent()).isTrue();
  321. assertThat(activity.get().getStatus()).isEqualTo(CeActivityDto.Status.CANCELED);
  322. }
  323. @Test
  324. public void fail_to_cancel_if_in_progress() {
  325. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(11)));
  326. CeQueueDto ceQueueDto = db.getDbClient().ceQueueDao().peek(session, WORKER_UUID).get();
  327. expectedException.expect(IllegalStateException.class);
  328. expectedException.expectMessage(startsWith("Task is in progress and can't be canceled"));
  329. underTest.cancel(db.getSession(), ceQueueDto);
  330. }
  331. @Test
  332. public void cancelAll_pendings_but_not_in_progress() {
  333. CeTask inProgressTask = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  334. CeTask pendingTask1 = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(13)));
  335. CeTask pendingTask2 = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(14)));
  336. db.getDbClient().ceQueueDao().peek(session, WORKER_UUID);
  337. int canceledCount = underTest.cancelAll();
  338. assertThat(canceledCount).isEqualTo(2);
  339. Optional<CeActivityDto> history = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), pendingTask1.getUuid());
  340. assertThat(history.get().getStatus()).isEqualTo(CeActivityDto.Status.CANCELED);
  341. history = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), pendingTask2.getUuid());
  342. assertThat(history.get().getStatus()).isEqualTo(CeActivityDto.Status.CANCELED);
  343. history = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), inProgressTask.getUuid());
  344. assertThat(history.isPresent()).isFalse();
  345. }
  346. @Test
  347. public void pauseWorkers_marks_workers_as_paused_if_zero_tasks_in_progress() {
  348. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  349. // task is pending
  350. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  351. underTest.pauseWorkers();
  352. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSED);
  353. }
  354. @Test
  355. public void pauseWorkers_marks_workers_as_pausing_if_some_tasks_in_progress() {
  356. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  357. db.getDbClient().ceQueueDao().peek(session, WORKER_UUID);
  358. // task is in-progress
  359. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  360. underTest.pauseWorkers();
  361. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSING);
  362. }
  363. @Test
  364. public void resumeWorkers_does_nothing_if_not_paused() {
  365. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  366. underTest.resumeWorkers();
  367. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  368. }
  369. @Test
  370. public void resumeWorkers_resumes_pausing_workers() {
  371. submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  372. db.getDbClient().ceQueueDao().peek(session, WORKER_UUID);
  373. // task is in-progress
  374. underTest.pauseWorkers();
  375. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSING);
  376. underTest.resumeWorkers();
  377. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  378. }
  379. @Test
  380. public void resumeWorkers_resumes_paused_workers() {
  381. underTest.pauseWorkers();
  382. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.PAUSED);
  383. underTest.resumeWorkers();
  384. assertThat(underTest.getWorkersPauseStatus()).isEqualTo(CeQueue.WorkersPauseStatus.RESUMED);
  385. }
  386. @Test
  387. public void fail_in_progress_task() {
  388. CeTask task = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  389. CeQueueDto queueDto = db.getDbClient().ceQueueDao().peek(db.getSession(), WORKER_UUID).get();
  390. underTest.fail(db.getSession(), queueDto, "TIMEOUT", "Failed on timeout");
  391. Optional<CeActivityDto> activity = db.getDbClient().ceActivityDao().selectByUuid(db.getSession(), task.getUuid());
  392. assertThat(activity.isPresent()).isTrue();
  393. assertThat(activity.get().getStatus()).isEqualTo(CeActivityDto.Status.FAILED);
  394. assertThat(activity.get().getErrorType()).isEqualTo("TIMEOUT");
  395. assertThat(activity.get().getErrorMessage()).isEqualTo("Failed on timeout");
  396. assertThat(activity.get().getExecutedAt()).isEqualTo(NOW);
  397. assertThat(activity.get().getWorkerUuid()).isEqualTo(WORKER_UUID);
  398. }
  399. @Test
  400. public void fail_throws_exception_if_task_is_pending() {
  401. CeTask task = submit(CeTaskTypes.REPORT, newComponent(randomAlphabetic(12)));
  402. CeQueueDto queueDto = db.getDbClient().ceQueueDao().selectByUuid(db.getSession(), task.getUuid()).get();
  403. Throwable thrown = catchThrowable(() -> underTest.fail(db.getSession(), queueDto, "TIMEOUT", "Failed on timeout"));
  404. assertThat(thrown)
  405. .isInstanceOf(IllegalStateException.class)
  406. .hasMessage("Task is not in-progress and can't be marked as failed [uuid=" + task.getUuid() + "]");
  407. }
  408. private void verifyCeTask(CeTaskSubmit taskSubmit, CeTask task, @Nullable ComponentDto componentDto, UserDto userDto) {
  409. verifyCeTask(taskSubmit, task, componentDto, componentDto, userDto);
  410. }
  411. private void verifyCeTask(CeTaskSubmit taskSubmit, CeTask task, @Nullable ComponentDto componentDto, @Nullable ComponentDto mainComponentDto, @Nullable UserDto userDto) {
  412. if (componentDto == null) {
  413. assertThat(task.getOrganizationUuid()).isEqualTo(defaultOrganizationProvider.get().getUuid());
  414. } else {
  415. assertThat(task.getOrganizationUuid()).isEqualTo(componentDto.getOrganizationUuid());
  416. }
  417. assertThat(task.getUuid()).isEqualTo(taskSubmit.getUuid());
  418. if (componentDto != null) {
  419. CeTask.Component component = task.getComponent().get();
  420. assertThat(component.getUuid()).isEqualTo(componentDto.uuid());
  421. assertThat(component.getKey()).contains(componentDto.getDbKey());
  422. assertThat(component.getName()).contains(componentDto.name());
  423. } else if (taskSubmit.getComponent().isPresent()) {
  424. assertThat(task.getComponent()).contains(new CeTask.Component(taskSubmit.getComponent().get().getUuid(), null, null));
  425. } else {
  426. assertThat(task.getComponent()).isEmpty();
  427. }
  428. if (mainComponentDto != null) {
  429. CeTask.Component component = task.getMainComponent().get();
  430. assertThat(component.getUuid()).isEqualTo(mainComponentDto.uuid());
  431. assertThat(component.getKey()).contains(mainComponentDto.getDbKey());
  432. assertThat(component.getName()).contains(mainComponentDto.name());
  433. } else if (taskSubmit.getComponent().isPresent()) {
  434. assertThat(task.getMainComponent()).contains(new CeTask.Component(taskSubmit.getComponent().get().getMainComponentUuid(), null, null));
  435. } else {
  436. assertThat(task.getMainComponent()).isEmpty();
  437. }
  438. assertThat(task.getType()).isEqualTo(taskSubmit.getType());
  439. if (taskSubmit.getSubmitterUuid() != null) {
  440. if (userDto == null) {
  441. assertThat(task.getSubmitter().getUuid()).isEqualTo(taskSubmit.getSubmitterUuid());
  442. assertThat(task.getSubmitter().getLogin()).isNull();
  443. } else {
  444. assertThat(task.getSubmitter().getUuid()).isEqualTo(userDto.getUuid()).isEqualTo(taskSubmit.getSubmitterUuid());
  445. assertThat(task.getSubmitter().getLogin()).isEqualTo(userDto.getLogin());
  446. }
  447. }
  448. }
  449. private void verifyCeQueueDtoForTaskSubmit(CeTaskSubmit taskSubmit) {
  450. Optional<CeQueueDto> queueDto = db.getDbClient().ceQueueDao().selectByUuid(db.getSession(), taskSubmit.getUuid());
  451. assertThat(queueDto.isPresent()).isTrue();
  452. assertThat(queueDto.get().getTaskType()).isEqualTo(taskSubmit.getType());
  453. Optional<Component> component = taskSubmit.getComponent();
  454. if (component.isPresent()) {
  455. assertThat(queueDto.get().getComponentUuid()).isEqualTo(component.get().getUuid());
  456. assertThat(queueDto.get().getMainComponentUuid()).isEqualTo(component.get().getMainComponentUuid());
  457. } else {
  458. assertThat(queueDto.get().getComponentUuid()).isNull();
  459. assertThat(queueDto.get().getComponentUuid()).isNull();
  460. }
  461. assertThat(queueDto.get().getSubmitterUuid()).isEqualTo(taskSubmit.getSubmitterUuid());
  462. assertThat(queueDto.get().getCreatedAt()).isEqualTo(1_450_000_000_000L);
  463. }
  464. private CeTask submit(String reportType, Component component) {
  465. return underTest.submit(createTaskSubmit(reportType, component, null));
  466. }
  467. private CeTaskSubmit createTaskSubmit(String type) {
  468. return createTaskSubmit(type, null, null);
  469. }
  470. private CeTaskSubmit createTaskSubmit(String type, @Nullable Component component, @Nullable String submitterUuid) {
  471. return underTest.prepareSubmit()
  472. .setType(type)
  473. .setComponent(component)
  474. .setSubmitterUuid(submitterUuid)
  475. .setCharacteristics(emptyMap())
  476. .build();
  477. }
  478. private ComponentDto insertComponent(ComponentDto componentDto) {
  479. db.getDbClient().componentDao().insert(session, componentDto);
  480. session.commit();
  481. return componentDto;
  482. }
  483. private UserDto insertUser(UserDto userDto) {
  484. db.getDbClient().userDao().insert(session, userDto);
  485. session.commit();
  486. return userDto;
  487. }
  488. private CeQueueDto insertPendingInQueue(@Nullable Component component) {
  489. CeQueueDto dto = new CeQueueDto()
  490. .setUuid(UuidFactoryFast.getInstance().create())
  491. .setTaskType("some type")
  492. .setStatus(CeQueueDto.Status.PENDING);
  493. if (component != null) {
  494. dto.setComponentUuid(component.getUuid())
  495. .setMainComponentUuid(component.getMainComponentUuid());
  496. }
  497. db.getDbClient().ceQueueDao().insert(db.getSession(), dto);
  498. db.commit();
  499. return dto;
  500. }
  501. private static int newComponentIdGenerator = new Random().nextInt(8_999_333);
  502. private static Component newComponent(String mainComponentUuid) {
  503. return new Component("uuid_" + newComponentIdGenerator++, mainComponentUuid);
  504. }
  505. }