PageRenderTime 56ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/jira-project/jira-components/jira-tests-parent/jira-tests-unit-db/src/test/java/com/atlassian/jira/upgrade/tasks/TestUpgradeTask_Build73010.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 272 lines | 197 code | 54 blank | 21 comment | 4 complexity | 805f8e7be90f45f36e5acfe1d6edbac7 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.upgrade.tasks;
  2. import com.atlassian.jira.database.DbConnection;
  3. import com.atlassian.jira.database.QueryDslAccessor;
  4. import com.atlassian.jira.junit.rules.DatabaseContainer;
  5. import com.atlassian.jira.model.querydsl.UpgradeHistoryDTO;
  6. import com.atlassian.jira.upgrade.UpgradeTaskHistoryDaoImpl;
  7. import com.atlassian.upgrade.api.UpgradeContext;
  8. import com.atlassian.upgrade.core.HostUpgradeTaskCollector;
  9. import com.atlassian.upgrade.core.dao.UpgradeTaskHistory;
  10. import com.atlassian.upgrade.core.dao.UpgradeTaskHistoryDao;
  11. import com.google.common.collect.ImmutableList;
  12. import org.junit.Before;
  13. import org.junit.Rule;
  14. import org.junit.Test;
  15. import java.util.List;
  16. import java.util.stream.Collectors;
  17. import static com.atlassian.jira.model.querydsl.QUpgradeHistory.UPGRADE_HISTORY;
  18. import static com.atlassian.upgrade.core.dao.UpgradeTaskHistory.Status.COMPLETED;
  19. import static com.atlassian.upgrade.core.dao.UpgradeTaskHistory.Status.IN_PROGRESS;
  20. import static com.atlassian.upgrade.core.dao.UpgradeTaskHistory.UpgradeType.SERVER;
  21. import static org.hamcrest.MatcherAssert.assertThat;
  22. import static org.hamcrest.Matchers.contains;
  23. import static org.hamcrest.Matchers.equalTo;
  24. import static org.hamcrest.Matchers.hasItem;
  25. import static org.hamcrest.Matchers.hasSize;
  26. import static org.junit.Assert.fail;
  27. public class TestUpgradeTask_Build73010 {
  28. private final UpgradeContext UPGRADE_CONTEXT = () -> UpgradeContext.UpgradeTrigger.UPGRADE;
  29. private final String UPGRADE_FACTORY_KEY = HostUpgradeTaskCollector.HOST_APP_KEY;
  30. @Rule
  31. public DatabaseContainer container = DatabaseContainer.rule(this);
  32. private UpgradeTaskHistoryDao upgradeTaskHistoryDao;
  33. private QueryDslAccessor queryDslAccessor;
  34. private UpgradeTask_Build73010 upgradeTask;
  35. private final List<Integer> OLD_UPGRADE_TASKS = ImmutableList.of(
  36. 4000,
  37. 4001,
  38. 5000,
  39. 5300,
  40. 6300,
  41. 6310,
  42. 64001,
  43. 64011,
  44. 70007,
  45. 72001,
  46. 72002
  47. );
  48. private static final Integer BUILD_NUMBER = UpgradeTask_Build73010.BUILD_NUMBER;
  49. @Before
  50. public void setup() {
  51. queryDslAccessor = container.getAttachToDatabase().getQueryDslAccessor();
  52. upgradeTask = new UpgradeTask_Build73010(queryDslAccessor);
  53. upgradeTaskHistoryDao = new UpgradeTaskHistoryDaoImpl(queryDslAccessor);
  54. }
  55. @Test
  56. public void whenAllUpgradesHadBeenDoneInTheOldFrameworkNothingIsDone() {
  57. //setup
  58. allUpgradeTaskDoneInOldFramework();
  59. addNewUpgradeTaskIsInProgess(BUILD_NUMBER);
  60. //run
  61. upgradeTask.runUpgrade(UPGRADE_CONTEXT);
  62. //post-assert
  63. assertUpgradeHistoryInCorrectState();
  64. }
  65. @Test
  66. public void whenAllUpgradesHadBeenDoneInTheNewFrameworkAllAreMovedToTheOldTable() {
  67. //setup
  68. allUpgradeTasksDoneInNewFramework();
  69. addNewUpgradeTaskIsInProgess(BUILD_NUMBER);
  70. //run
  71. upgradeTask.runUpgrade(UPGRADE_CONTEXT);
  72. //post-assert
  73. assertUpgradeHistoryInCorrectState();
  74. }
  75. @Test
  76. public void upgradesDoneInBothAndOldFrameworkResultInThemBeingMovedToTheOldTable() {
  77. //setup
  78. upgradesDoneInOldAndThenNewFramework();
  79. addNewUpgradeTaskIsInProgess(BUILD_NUMBER);
  80. //run
  81. upgradeTask.runUpgrade(UPGRADE_CONTEXT);
  82. //post-assert
  83. assertUpgradeHistoryInCorrectState();
  84. }
  85. @Test
  86. public void upgradesThatWerePendingInTheOldTableWillGetOverwrittenWithComplete() {
  87. //setup
  88. addOldUpgradeTaskHasRun(72000, "pending");
  89. addNewUpgradeTaskHasRun(72000);
  90. addNewUpgradeTaskIsInProgess(BUILD_NUMBER);
  91. //run
  92. upgradeTask.runUpgrade(UPGRADE_CONTEXT);
  93. //post-assert
  94. assertOldTableHasItemsCompleted(72000);
  95. assertNewTableHasThisBuild();
  96. }
  97. @Test
  98. public void upgradeClassIsProperlyPopulatedAfterMigration() {
  99. //setup
  100. allUpgradeTasksDoneInNewFramework();
  101. addNewUpgradeTaskIsInProgess(BUILD_NUMBER);
  102. //run
  103. upgradeTask.runUpgrade(UPGRADE_CONTEXT);
  104. //post-assert
  105. assertUpgradeHistoryInCorrectState();
  106. //Check that the upgrade task classes were generated correctly
  107. getOldUpgradeTasksRun().stream().forEach(oldUpgradeTask ->
  108. assertThat(oldUpgradeTask.getUpgradeclass(),
  109. equalTo("com.atlassian.jira.upgrade.tasks.UpgradeTask_Build" + oldUpgradeTask.getTargetbuild())));
  110. }
  111. @Test
  112. public void anyUpgradeBeforeMinVersionAreMaintained() {
  113. addOldUpgradeTaskHasRun(6300);
  114. //run
  115. upgradeTask.runUpgrade(UPGRADE_CONTEXT);
  116. //post-assert
  117. assertThat(getOldUpgradeTasksRun().stream().filter(upgradeTask -> upgradeTask.getTargetbuild().equals("6300")).count(),
  118. equalTo(1L));
  119. }
  120. @Test
  121. public void ifInsertingTheNewEntriesIntoTheOldTableFailsTheChangesAreRolledBackSoNoDataLoss() {
  122. //setup
  123. upgradeTask = new UpgradeTask_Build73010(queryDslAccessor) {
  124. @Override
  125. void addUpgradesToOldTable(DbConnection connection, List<Integer> buildNumbers) {
  126. throw new RuntimeException("Error inserting into second table");
  127. }
  128. };
  129. allUpgradeTaskDoneInOldFramework();
  130. //run
  131. try {
  132. upgradeTask.runUpgrade(UPGRADE_CONTEXT);
  133. fail("Should not have successfully upgraded");
  134. //post-assert
  135. } catch (Throwable e) {
  136. assertThat(getOldUpgradeTasksRun(), hasSize(11));
  137. assertThat(upgradeTaskHistoryDao.getAllUpgradeTaskHistory(UPGRADE_FACTORY_KEY), hasSize(0));
  138. }
  139. }
  140. private List<UpgradeHistoryDTO> getOldUpgradeTasksRun() {
  141. return getOldUpgradeTasksRun(0);
  142. }
  143. private List<UpgradeHistoryDTO> getOldUpgradeTasksRun(int minimumBuildToInclude) {
  144. return queryDslAccessor.executeQuery(callback -> callback.newSqlQuery()
  145. .select(UPGRADE_HISTORY)
  146. .from(UPGRADE_HISTORY)
  147. .fetch()).stream().filter(upgradeTask -> Integer.parseInt(upgradeTask.getTargetbuild()) >= minimumBuildToInclude)
  148. .collect(Collectors.toList());
  149. }
  150. private void addNewUpgradeTaskHasRun(int buildNumber) {
  151. upgradeTaskHistoryDao.createUpgradeTaskHistory(new UpgradeTaskHistory(null, UPGRADE_FACTORY_KEY, buildNumber,
  152. COMPLETED, SERVER));
  153. }
  154. private void addNewUpgradeTaskIsInProgess(int buildNumber) {
  155. upgradeTaskHistoryDao.createUpgradeTaskHistory(new UpgradeTaskHistory(null, UPGRADE_FACTORY_KEY, buildNumber,
  156. IN_PROGRESS, SERVER));
  157. }
  158. private void addOldUpgradeTaskHasRun(int buildNumber) {
  159. addOldUpgradeTaskHasRun(buildNumber, "complete");
  160. }
  161. private void addOldUpgradeTaskHasRun(int buildNumber, String status) {
  162. queryDslAccessor.execute(callback -> callback
  163. .insert(UPGRADE_HISTORY)
  164. .set(UPGRADE_HISTORY.upgradeclass, "com.atlassian.jira.upgrade.tasks.UpgradeTask_Build" + buildNumber)
  165. .set(UPGRADE_HISTORY.targetbuild, String.valueOf(buildNumber))
  166. .set(UPGRADE_HISTORY.status, status)
  167. .set(UPGRADE_HISTORY.downgradetaskrequired, "N")
  168. .executeWithId());
  169. }
  170. private void assertUpgradeHistoryInCorrectState() {
  171. List<Integer> oldUpgradeTaskBuildIds = getOldUpgradeTasksRun().stream()
  172. .filter(upgradeTask -> upgradeTask.getStatus().equals("complete"))
  173. .filter(upgradeTask -> upgradeTask.getDowngradetaskrequired().equals("N"))
  174. .map(UpgradeHistoryDTO::getTargetbuild)
  175. .map(Integer::parseInt)
  176. .collect(Collectors.toList());
  177. assertThat("Should have all of the old upgrade tasks in the old table", oldUpgradeTaskBuildIds, hasSize(OLD_UPGRADE_TASKS.size()));
  178. OLD_UPGRADE_TASKS.forEach(buildNumber -> {
  179. assertThat("Build " + buildNumber + " should be in the old upgrade table", oldUpgradeTaskBuildIds, hasItem(buildNumber));
  180. });
  181. assertNewTableHasThisBuild();
  182. }
  183. private void assertNewTableHasThisBuild() {
  184. List<Integer> newUpgradeTaskBuildIds = upgradeTaskHistoryDao.getAllUpgradeTaskHistory(UPGRADE_FACTORY_KEY).stream()
  185. .filter(upgradeTask -> upgradeTask.getUpgradeType().equals(SERVER))
  186. .map(UpgradeTaskHistory::getBuildNumber)
  187. .collect(Collectors.toList());
  188. assertThat("Should only have build 73000 in the UpgradeTaskHistory table", newUpgradeTaskBuildIds, contains(BUILD_NUMBER));
  189. }
  190. private void assertOldTableHasItemsCompleted(int... buildNumbers) {
  191. List<Integer> oldUpgradeTaskBuildIds = getOldUpgradeTasksRun().stream()
  192. .filter(upgradeTask -> upgradeTask.getStatus().equals("complete"))
  193. .filter(upgradeTask -> upgradeTask.getDowngradetaskrequired().equals("N"))
  194. .map(UpgradeHistoryDTO::getTargetbuild)
  195. .map(Integer::parseInt)
  196. .collect(Collectors.toList());
  197. assertThat("Should have all of the old upgrade tasks in the old table", oldUpgradeTaskBuildIds, hasSize(buildNumbers.length));
  198. for (int buildNumber : buildNumbers) {
  199. assertThat("Build " + buildNumber + " should be in the old upgrade table", oldUpgradeTaskBuildIds, hasItem(buildNumber));
  200. }
  201. }
  202. private void allUpgradeTaskDoneInOldFramework() {
  203. OLD_UPGRADE_TASKS.forEach(this::addOldUpgradeTaskHasRun);
  204. }
  205. private void allUpgradeTasksDoneInNewFramework() {
  206. OLD_UPGRADE_TASKS.forEach(this::addNewUpgradeTaskHasRun);
  207. }
  208. private void upgradesDoneInOldAndThenNewFramework() {
  209. for (int i = 0; i < OLD_UPGRADE_TASKS.size(); ++i) {
  210. final Integer buildNumber = OLD_UPGRADE_TASKS.get(i);
  211. if (i < (OLD_UPGRADE_TASKS.size() / 2)) {
  212. addOldUpgradeTaskHasRun(buildNumber);
  213. } else {
  214. addNewUpgradeTaskHasRun(buildNumber);
  215. }
  216. }
  217. }
  218. }