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.

CleanCeChildTablesOrphansTest.java 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2018 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.server.platform.db.migration.version.v71;
  21. import java.sql.SQLException;
  22. import java.util.Random;
  23. import org.junit.Rule;
  24. import org.junit.Test;
  25. import org.sonar.core.util.UuidFactoryFast;
  26. import org.sonar.db.CoreDbTester;
  27. import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
  28. import static org.assertj.core.api.Assertions.assertThat;
  29. public class CleanCeChildTablesOrphansTest {
  30. @Rule
  31. public final CoreDbTester db = CoreDbTester.createForSchema(CleanCeChildTablesOrphansTest.class, "ce_tables.sql");
  32. private final Random random = new Random();
  33. private CleanCeChildTablesOrphans underTest = new CleanCeChildTablesOrphans(db.database());
  34. @Test
  35. public void execute_has_no_effect_if_tables_are_empty() throws SQLException {
  36. underTest.execute();
  37. }
  38. @Test
  39. public void execute_deletes_rows_of_ce_task_input_which_task_uuid_appears_in_neither_ce_queue_nor_ce_activity() throws SQLException {
  40. String taskInQueueUuid = insertCeQueue();
  41. String taskInActivityUuid = insertCeActivity();
  42. insertCeTaskInput(taskInQueueUuid);
  43. insertCeTaskInput(taskInActivityUuid);
  44. insertCeTaskInput("missing_task");
  45. underTest.execute();
  46. assertThat(db.select("select task_uuid as \"TASK_UUID\" from ce_task_input"))
  47. .extracting(r -> (String) r.get("TASK_UUID"))
  48. .containsOnly(taskInQueueUuid, taskInActivityUuid);
  49. }
  50. @Test
  51. public void execute_deletes_rows_of_ce_scanner_context_which_task_uuid_appears_in_neither_ce_queue_nor_ce_activity() throws SQLException {
  52. String taskInQueueUuid = insertCeQueue();
  53. String taskInActivityUuid = insertCeActivity();
  54. insertCeScannerContext(taskInQueueUuid);
  55. insertCeScannerContext(taskInActivityUuid);
  56. insertCeScannerContext("missing_task");
  57. underTest.execute();
  58. assertThat(db.select("select task_uuid as \"TASK_UUID\" from ce_scanner_context"))
  59. .extracting(r -> (String) r.get("TASK_UUID"))
  60. .containsOnly(taskInQueueUuid, taskInActivityUuid);
  61. }
  62. @Test
  63. public void execute_deletes_rows_of_ce_task_characteristics_which_task_uuid_appears_in_neither_ce_queue_nor_ce_activity() throws SQLException {
  64. String taskInQueueUuid = insertCeQueue();
  65. String taskInActivityUuid = insertCeActivity();
  66. insertCeTaskCharacteristics(taskInQueueUuid);
  67. insertCeTaskCharacteristics(taskInActivityUuid);
  68. insertCeTaskCharacteristics("missing_task");
  69. underTest.execute();
  70. assertThat(db.select("select task_uuid as \"TASK_UUID\" from ce_task_characteristics"))
  71. .extracting(r -> (String) r.get("TASK_UUID"))
  72. .containsOnly(taskInQueueUuid, taskInActivityUuid);
  73. }
  74. @Test
  75. public void execute_is_reentrant() throws SQLException {
  76. String taskInQueueUuid = insertCeQueue();
  77. String taskInActivityUuid = insertCeActivity();
  78. insertCeScannerContext(taskInQueueUuid);
  79. insertCeScannerContext(taskInActivityUuid);
  80. insertCeTaskInput(taskInQueueUuid);
  81. insertCeTaskInput(taskInActivityUuid);
  82. insertCeTaskCharacteristics(taskInQueueUuid);
  83. insertCeTaskCharacteristics(taskInActivityUuid);
  84. insertCeTaskInput("missing_task");
  85. insertCeScannerContext("missing_task");
  86. insertCeTaskCharacteristics("missing_task");
  87. underTest.execute();
  88. verifyOrphansDeleted(taskInQueueUuid, taskInActivityUuid);
  89. underTest.execute();
  90. verifyOrphansDeleted(taskInQueueUuid, taskInActivityUuid);
  91. }
  92. private void verifyOrphansDeleted(String taskInQueueUuid, String taskInActivityUuid) {
  93. assertThat(db.select("select task_uuid as \"TASK_UUID\" from ce_task_input"))
  94. .extracting(r -> (String) r.get("TASK_UUID"))
  95. .containsOnly(taskInQueueUuid, taskInActivityUuid);
  96. assertThat(db.select("select task_uuid as \"TASK_UUID\" from ce_scanner_context"))
  97. .extracting(r -> (String) r.get("TASK_UUID"))
  98. .containsOnly(taskInQueueUuid, taskInActivityUuid);
  99. assertThat(db.select("select task_uuid as \"TASK_UUID\" from ce_task_characteristics"))
  100. .extracting(r -> (String) r.get("TASK_UUID"))
  101. .containsOnly(taskInQueueUuid, taskInActivityUuid);
  102. }
  103. private String insertCeQueue() {
  104. String uuid = UuidFactoryFast.getInstance().create();
  105. db.executeInsert(
  106. "ce_queue",
  107. "UUID", uuid,
  108. "TASK_TYPE", randomAlphanumeric(10),
  109. "STATUS", randomAlphanumeric(10),
  110. "EXECUTION_COUNT", random.nextInt(99),
  111. "CREATED_AT", random.nextInt(95654354),
  112. "UPDATED_AT", random.nextInt(95654354));
  113. return uuid;
  114. }
  115. private String insertCeActivity() {
  116. String uuid = UuidFactoryFast.getInstance().create();
  117. db.executeInsert(
  118. "ce_activity",
  119. "UUID", uuid,
  120. "TASK_TYPE", randomAlphanumeric(10),
  121. "STATUS", randomAlphanumeric(10),
  122. "IS_LAST", random.nextBoolean(),
  123. "IS_LAST_KEY", randomAlphanumeric(15),
  124. "EXECUTION_COUNT", random.nextInt(99),
  125. "SUBMITTED_AT", random.nextInt(95654354),
  126. "CREATED_AT", random.nextInt(95654354),
  127. "UPDATED_AT", random.nextInt(95654354));
  128. return uuid;
  129. }
  130. private void insertCeTaskInput(String taskUuid) {
  131. db.executeInsert(
  132. "ce_task_input",
  133. "TASK_UUID", taskUuid,
  134. "INPUT_DATA", randomAlphanumeric(123).getBytes(),
  135. "CREATED_AT", random.nextInt(95654354),
  136. "UPDATED_AT", random.nextInt(95654354));
  137. }
  138. private void insertCeScannerContext(String taskUuid) {
  139. db.executeInsert(
  140. "ce_scanner_context",
  141. "TASK_UUID", taskUuid,
  142. "CONTEXT_DATA", randomAlphanumeric(123).getBytes(),
  143. "CREATED_AT", random.nextInt(95654354),
  144. "UPDATED_AT", random.nextInt(95654354));
  145. }
  146. private void insertCeTaskCharacteristics(String taskUuid) {
  147. for (int i = 0; i < 1 + random.nextInt(3); i++) {
  148. String uuid = UuidFactoryFast.getInstance().create();
  149. db.executeInsert(
  150. "ce_task_characteristics",
  151. "UUID", uuid,
  152. "TASK_UUID", taskUuid,
  153. "KEE", "kee_" + uuid + i,
  154. "TEXT_VALUE", randomAlphanumeric(18));
  155. }
  156. }
  157. }