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.

ReportPersistAnalysisStepTest.java 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2021 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.task.projectanalysis.step;
  21. import java.util.List;
  22. import java.util.Optional;
  23. import org.junit.Before;
  24. import org.junit.Rule;
  25. import org.junit.Test;
  26. import org.sonar.api.utils.DateUtils;
  27. import org.sonar.api.utils.System2;
  28. import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
  29. import org.sonar.ce.task.projectanalysis.component.Component;
  30. import org.sonar.ce.task.projectanalysis.component.ReportComponent;
  31. import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
  32. import org.sonar.ce.task.projectanalysis.period.Period;
  33. import org.sonar.ce.task.projectanalysis.period.PeriodHolderRule;
  34. import org.sonar.ce.task.step.ComputationStep;
  35. import org.sonar.ce.task.step.TestComputationStepContext;
  36. import org.sonar.db.DbClient;
  37. import org.sonar.db.DbTester;
  38. import org.sonar.db.component.ComponentDto;
  39. import org.sonar.db.component.ComponentTesting;
  40. import org.sonar.db.component.SnapshotDto;
  41. import org.sonar.db.component.SnapshotQuery;
  42. import org.sonar.db.component.SnapshotTesting;
  43. import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
  44. import static org.assertj.core.api.Assertions.assertThat;
  45. import static org.mockito.Mockito.mock;
  46. import static org.mockito.Mockito.when;
  47. public class ReportPersistAnalysisStepTest extends BaseStepTest {
  48. private static final String PROJECT_KEY = "PROJECT_KEY";
  49. private static final String ANALYSIS_UUID = "U1";
  50. private static final String REVISION_ID = "5f6432a1";
  51. @Rule
  52. public DbTester dbTester = DbTester.create(System2.INSTANCE);
  53. @Rule
  54. public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
  55. @Rule
  56. public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule();
  57. @Rule
  58. public PeriodHolderRule periodsHolder = new PeriodHolderRule();
  59. private System2 system2 = mock(System2.class);
  60. private DbClient dbClient = dbTester.getDbClient();
  61. private long analysisDate;
  62. private long now;
  63. private PersistAnalysisStep underTest;
  64. @Before
  65. public void setup() {
  66. analysisDate = DateUtils.parseDateQuietly("2015-06-01").getTime();
  67. analysisMetadataHolder.setUuid(ANALYSIS_UUID);
  68. analysisMetadataHolder.setAnalysisDate(analysisDate);
  69. analysisMetadataHolder.setScmRevision(REVISION_ID);
  70. now = DateUtils.parseDateQuietly("2015-06-02").getTime();
  71. when(system2.now()).thenReturn(now);
  72. underTest = new PersistAnalysisStep(system2, dbClient, treeRootHolder, analysisMetadataHolder, periodsHolder);
  73. // initialize PeriodHolder to empty by default
  74. periodsHolder.setPeriod(null);
  75. }
  76. @Override
  77. protected ComputationStep step() {
  78. return underTest;
  79. }
  80. @Test
  81. public void persist_analysis() {
  82. String projectVersion = randomAlphabetic(10);
  83. ComponentDto projectDto = ComponentTesting.newPrivateProjectDto("ABCD").setDbKey(PROJECT_KEY).setName("Project");
  84. dbTester.components().insertComponent(projectDto);
  85. ComponentDto moduleDto = ComponentTesting.newModuleDto("BCDE", projectDto).setDbKey("MODULE_KEY").setName("Module");
  86. dbTester.components().insertComponent(moduleDto);
  87. ComponentDto directoryDto = ComponentTesting.newDirectory(moduleDto, "CDEF", "MODULE_KEY:src/main/java/dir").setDbKey("MODULE_KEY:src/main/java/dir");
  88. dbTester.components().insertComponent(directoryDto);
  89. ComponentDto fileDto = ComponentTesting.newFileDto(moduleDto, directoryDto, "DEFG").setDbKey("MODULE_KEY:src/main/java/dir/Foo.java");
  90. dbTester.components().insertComponent(fileDto);
  91. dbTester.getSession().commit();
  92. Component file = ReportComponent.builder(Component.Type.FILE, 3).setUuid("DEFG").setKey("MODULE_KEY:src/main/java/dir/Foo.java").build();
  93. Component directory = ReportComponent.builder(Component.Type.DIRECTORY, 2).setUuid("CDEF").setKey("MODULE_KEY:src/main/java/dir").addChildren(file).build();
  94. String buildString = Optional.ofNullable(projectVersion).map(v -> randomAlphabetic(7)).orElse(null);
  95. Component project = ReportComponent.builder(Component.Type.PROJECT, 1)
  96. .setUuid("ABCD")
  97. .setKey(PROJECT_KEY)
  98. .setProjectVersion(projectVersion)
  99. .setBuildString(buildString)
  100. .setScmRevisionId(REVISION_ID)
  101. .addChildren(directory)
  102. .build();
  103. treeRootHolder.setRoot(project);
  104. underTest.execute(new TestComputationStepContext());
  105. assertThat(dbTester.countRowsOfTable("snapshots")).isOne();
  106. SnapshotDto projectSnapshot = getUnprocessedSnapshot(projectDto.uuid());
  107. assertThat(projectSnapshot.getUuid()).isEqualTo(ANALYSIS_UUID);
  108. assertThat(projectSnapshot.getComponentUuid()).isEqualTo(project.getUuid());
  109. assertThat(projectSnapshot.getProjectVersion()).isEqualTo(projectVersion);
  110. assertThat(projectSnapshot.getBuildString()).isEqualTo(buildString);
  111. assertThat(projectSnapshot.getLast()).isFalse();
  112. assertThat(projectSnapshot.getStatus()).isEqualTo("U");
  113. assertThat(projectSnapshot.getCreatedAt()).isEqualTo(analysisDate);
  114. assertThat(projectSnapshot.getBuildDate()).isEqualTo(now);
  115. assertThat(projectSnapshot.getRevision()).isEqualTo(REVISION_ID);
  116. }
  117. @Test
  118. public void persist_snapshots_with_new_code_period() {
  119. ComponentDto projectDto = ComponentTesting.newPrivateProjectDto("ABCD").setDbKey(PROJECT_KEY).setName("Project");
  120. dbTester.components().insertComponent(projectDto);
  121. SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(projectDto).setCreatedAt(DateUtils.parseDateQuietly("2015-01-01").getTime());
  122. dbClient.snapshotDao().insert(dbTester.getSession(), snapshotDto);
  123. dbTester.getSession().commit();
  124. periodsHolder.setPeriod(new Period("NUMBER_OF_DAYS", "10", analysisDate));
  125. Component project = ReportComponent.builder(Component.Type.PROJECT, 1).setUuid("ABCD").setKey(PROJECT_KEY).build();
  126. treeRootHolder.setRoot(project);
  127. underTest.execute(new TestComputationStepContext());
  128. SnapshotDto projectSnapshot = getUnprocessedSnapshot(projectDto.uuid());
  129. assertThat(projectSnapshot.getPeriodMode()).isEqualTo("NUMBER_OF_DAYS");
  130. assertThat(projectSnapshot.getPeriodDate()).isEqualTo(analysisDate);
  131. assertThat(projectSnapshot.getPeriodModeParameter()).isNotNull();
  132. }
  133. @Test
  134. public void only_persist_snapshots_with_new_code_period_on_project_and_module() {
  135. periodsHolder.setPeriod(new Period("PREVIOUS_VERSION", null, analysisDate));
  136. ComponentDto projectDto = ComponentTesting.newPrivateProjectDto("ABCD").setDbKey(PROJECT_KEY).setName("Project");
  137. dbTester.components().insertComponent(projectDto);
  138. SnapshotDto projectSnapshot = SnapshotTesting.newAnalysis(projectDto);
  139. dbClient.snapshotDao().insert(dbTester.getSession(), projectSnapshot);
  140. ComponentDto moduleDto = ComponentTesting.newModuleDto("BCDE", projectDto).setDbKey("MODULE_KEY").setName("Module");
  141. dbTester.components().insertComponent(moduleDto);
  142. ComponentDto directoryDto = ComponentTesting.newDirectory(moduleDto, "CDEF", "MODULE_KEY:src/main/java/dir").setDbKey("MODULE_KEY:src/main/java/dir");
  143. dbTester.components().insertComponent(directoryDto);
  144. ComponentDto fileDto = ComponentTesting.newFileDto(moduleDto, directoryDto, "DEFG").setDbKey("MODULE_KEY:src/main/java/dir/Foo.java");
  145. dbTester.components().insertComponent(fileDto);
  146. dbTester.getSession().commit();
  147. Component file = ReportComponent.builder(Component.Type.FILE, 3).setUuid("DEFG").setKey("MODULE_KEY:src/main/java/dir/Foo.java").build();
  148. Component directory = ReportComponent.builder(Component.Type.DIRECTORY, 2).setUuid("CDEF").setKey("MODULE_KEY:src/main/java/dir").addChildren(file).build();
  149. Component project = ReportComponent.builder(Component.Type.PROJECT, 1).setUuid("ABCD").setKey(PROJECT_KEY).addChildren(directory).build();
  150. treeRootHolder.setRoot(project);
  151. underTest.execute(new TestComputationStepContext());
  152. SnapshotDto newProjectSnapshot = getUnprocessedSnapshot(projectDto.uuid());
  153. assertThat(newProjectSnapshot.getPeriodMode()).isEqualTo("PREVIOUS_VERSION");
  154. }
  155. @Test
  156. public void set_no_period_on_snapshots_when_no_period() {
  157. ComponentDto projectDto = ComponentTesting.newPrivateProjectDto("ABCD").setDbKey(PROJECT_KEY).setName("Project");
  158. dbTester.components().insertComponent(projectDto);
  159. SnapshotDto snapshotDto = SnapshotTesting.newAnalysis(projectDto);
  160. dbClient.snapshotDao().insert(dbTester.getSession(), snapshotDto);
  161. dbTester.getSession().commit();
  162. Component project = ReportComponent.builder(Component.Type.PROJECT, 1).setUuid("ABCD").setKey(PROJECT_KEY).build();
  163. treeRootHolder.setRoot(project);
  164. underTest.execute(new TestComputationStepContext());
  165. SnapshotDto projectSnapshot = getUnprocessedSnapshot(projectDto.uuid());
  166. assertThat(projectSnapshot.getPeriodMode()).isNull();
  167. assertThat(projectSnapshot.getPeriodDate()).isNull();
  168. assertThat(projectSnapshot.getPeriodModeParameter()).isNull();
  169. }
  170. private SnapshotDto getUnprocessedSnapshot(String componentUuid) {
  171. List<SnapshotDto> projectSnapshots = dbClient.snapshotDao().selectAnalysesByQuery(dbTester.getSession(),
  172. new SnapshotQuery().setComponentUuid(componentUuid).setIsLast(false).setStatus(SnapshotDto.STATUS_UNPROCESSED));
  173. assertThat(projectSnapshots).hasSize(1);
  174. return projectSnapshots.get(0);
  175. }
  176. }