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.

BuildComponentTreeStepTest.java 24KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  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.task.projectanalysis.step;
  21. import com.tngtech.java.junit.dataprovider.DataProvider;
  22. import com.tngtech.java.junit.dataprovider.DataProviderRunner;
  23. import com.tngtech.java.junit.dataprovider.UseDataProvider;
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. import java.util.Optional;
  27. import javax.annotation.Nullable;
  28. import org.junit.Rule;
  29. import org.junit.Test;
  30. import org.junit.runner.RunWith;
  31. import org.sonar.api.utils.System2;
  32. import org.sonar.ce.task.projectanalysis.analysis.Branch;
  33. import org.sonar.ce.task.projectanalysis.analysis.MutableAnalysisMetadataHolderRule;
  34. import org.sonar.ce.task.projectanalysis.batch.BatchReportReaderRule;
  35. import org.sonar.ce.task.projectanalysis.component.Component;
  36. import org.sonar.ce.task.projectanalysis.component.DefaultBranchImpl;
  37. import org.sonar.ce.task.projectanalysis.component.MutableTreeRootHolderRule;
  38. import org.sonar.ce.task.projectanalysis.component.ReportModulesPath;
  39. import org.sonar.ce.task.step.TestComputationStepContext;
  40. import org.sonar.db.DbClient;
  41. import org.sonar.db.DbTester;
  42. import org.sonar.db.component.BranchType;
  43. import org.sonar.db.component.ComponentDto;
  44. import org.sonar.db.component.SnapshotDto;
  45. import org.sonar.db.organization.OrganizationDto;
  46. import org.sonar.scanner.protocol.output.ScannerReport;
  47. import org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType;
  48. import org.sonar.scanner.protocol.output.ScannerReport.Component.FileStatus;
  49. import org.sonar.server.project.Project;
  50. import static java.util.Optional.ofNullable;
  51. import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
  52. import static org.assertj.core.api.Assertions.assertThat;
  53. import static org.mockito.ArgumentMatchers.any;
  54. import static org.mockito.Mockito.mock;
  55. import static org.mockito.Mockito.when;
  56. import static org.sonar.db.component.ComponentTesting.newDirectory;
  57. import static org.sonar.db.component.ComponentTesting.newFileDto;
  58. import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
  59. import static org.sonar.db.component.SnapshotTesting.newAnalysis;
  60. import static org.sonar.db.organization.OrganizationTesting.newOrganizationDto;
  61. import static org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType.FILE;
  62. import static org.sonar.scanner.protocol.output.ScannerReport.Component.ComponentType.PROJECT;
  63. @RunWith(DataProviderRunner.class)
  64. public class BuildComponentTreeStepTest {
  65. private static final String NO_SCANNER_PROJECT_VERSION = null;
  66. private static final String NO_SCANNER_BUILD_STRING = null;
  67. private static final int ROOT_REF = 1;
  68. private static final int FILE_1_REF = 4;
  69. private static final int FILE_2_REF = 5;
  70. private static final int FILE_3_REF = 7;
  71. private static final int UNCHANGED_FILE_REF = 10;
  72. private static final String REPORT_PROJECT_KEY = "REPORT_PROJECT_KEY";
  73. private static final String REPORT_MODULE_KEY = "MODULE_KEY";
  74. private static final String REPORT_DIR_PATH_1 = "src/main/java/dir1";
  75. private static final String REPORT_FILE_PATH_1 = "src/main/java/dir1/File1.java";
  76. private static final String REPORT_FILE_NAME_1 = "File1.java";
  77. private static final String REPORT_DIR_PATH_2 = "src/main/java/dir2";
  78. private static final String REPORT_FILE_PATH_2 = "src/main/java/dir2/File2.java";
  79. private static final String REPORT_FILE_PATH_3 = "src/main/java/dir2/File3.java";
  80. private static final String REPORT_LEAFLESS_MODULE_KEY = "LEAFLESS_MODULE_KEY";
  81. private static final String REPORT_LEAFLESS_DIR_PATH = "src/main/java/leafless";
  82. private static final String REPORT_UNCHANGED_FILE_PATH = "src/main/java/leafless/File3.java";
  83. private static final long ANALYSIS_DATE = 123456789L;
  84. @Rule
  85. public DbTester dbTester = DbTester.create(System2.INSTANCE);
  86. @Rule
  87. public BatchReportReaderRule reportReader = new BatchReportReaderRule().setMetadata(createReportMetadata(NO_SCANNER_PROJECT_VERSION, NO_SCANNER_BUILD_STRING));
  88. @Rule
  89. public MutableTreeRootHolderRule treeRootHolder = new MutableTreeRootHolderRule();
  90. @Rule
  91. public MutableAnalysisMetadataHolderRule analysisMetadataHolder = new MutableAnalysisMetadataHolderRule();
  92. private ReportModulesPath reportModulesPath = new ReportModulesPath(reportReader);
  93. private DbClient dbClient = dbTester.getDbClient();
  94. private BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, reportModulesPath);
  95. @Test(expected = NullPointerException.class)
  96. public void fails_if_root_component_does_not_exist_in_reportReader() {
  97. setAnalysisMetadataHolder();
  98. underTest.execute(new TestComputationStepContext());
  99. }
  100. @Test
  101. public void verify_tree_is_correctly_built() {
  102. setAnalysisMetadataHolder();
  103. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF, FILE_2_REF, FILE_3_REF));
  104. reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
  105. reportReader.putComponent(componentWithPath(FILE_2_REF, FILE, REPORT_FILE_PATH_2));
  106. reportReader.putComponent(componentWithPath(FILE_3_REF, FILE, REPORT_FILE_PATH_3));
  107. TestComputationStepContext context = new TestComputationStepContext();
  108. underTest.execute(context);
  109. Component root = treeRootHolder.getRoot();
  110. assertThat(root).isNotNull();
  111. verifyComponent(root, Component.Type.PROJECT, ROOT_REF, 1);
  112. Component dir = root.getChildren().iterator().next();
  113. verifyComponent(dir, Component.Type.DIRECTORY, null, 2);
  114. Component dir1 = dir.getChildren().get(0);
  115. verifyComponent(dir1, Component.Type.DIRECTORY, null, 1);
  116. verifyComponent(dir1.getChildren().get(0), Component.Type.FILE, FILE_1_REF, 0);
  117. Component dir2 = dir.getChildren().get(1);
  118. verifyComponent(dir2, Component.Type.DIRECTORY, null, 2);
  119. verifyComponent(dir2.getChildren().get(0), Component.Type.FILE, FILE_2_REF, 0);
  120. verifyComponent(dir2.getChildren().get(1), Component.Type.FILE, FILE_3_REF, 0);
  121. context.getStatistics().assertValue("components", 7);
  122. }
  123. @Test
  124. public void compute_keys_and_uuids() {
  125. setAnalysisMetadataHolder();
  126. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF));
  127. reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
  128. underTest.execute(new TestComputationStepContext());
  129. verifyComponentByRef(ROOT_REF, REPORT_PROJECT_KEY, analysisMetadataHolder.getProject().getName());
  130. verifyComponentByKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1, REPORT_DIR_PATH_1);
  131. verifyComponentByRef(FILE_1_REF, REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1, REPORT_FILE_NAME_1);
  132. }
  133. @Test
  134. public void return_existing_uuids() {
  135. setAnalysisMetadataHolder();
  136. OrganizationDto organizationDto = dbTester.organizations().insert();
  137. ComponentDto project = insertComponent(newPrivateProjectDto(organizationDto, "ABCD").setDbKey(REPORT_PROJECT_KEY));
  138. ComponentDto directory = newDirectory(project, "CDEF", REPORT_DIR_PATH_1);
  139. insertComponent(directory.setDbKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1));
  140. insertComponent(newFileDto(project, directory, "DEFG")
  141. .setDbKey(REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1)
  142. .setPath(REPORT_FILE_PATH_1));
  143. // new structure, without modules
  144. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF));
  145. reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
  146. underTest.execute(new TestComputationStepContext());
  147. verifyComponentByRef(ROOT_REF, REPORT_PROJECT_KEY, analysisMetadataHolder.getProject().getName(), "ABCD");
  148. verifyComponentByKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1, REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1, REPORT_DIR_PATH_1, "CDEF");
  149. verifyComponentByRef(FILE_1_REF, REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1, REPORT_FILE_NAME_1, "DEFG");
  150. }
  151. @Test
  152. public void generate_keys_when_using_new_branch() {
  153. Branch branch = mock(Branch.class);
  154. when(branch.getName()).thenReturn("origin/feature");
  155. when(branch.isMain()).thenReturn(false);
  156. when(branch.generateKey(any(), any())).thenReturn("generated");
  157. analysisMetadataHolder.setRootComponentRef(ROOT_REF)
  158. .setAnalysisDate(ANALYSIS_DATE)
  159. .setProject(Project.from(newPrivateProjectDto(newOrganizationDto()).setDbKey(REPORT_PROJECT_KEY)))
  160. .setBranch(branch);
  161. BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, reportModulesPath);
  162. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF));
  163. reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
  164. underTest.execute(new TestComputationStepContext());
  165. verifyComponentByRef(ROOT_REF, "generated", REPORT_PROJECT_KEY, analysisMetadataHolder.getProject().getName(), null);
  166. verifyComponentByKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1, "generated", REPORT_DIR_PATH_1);
  167. verifyComponentByRef(FILE_1_REF, "generated", REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1, REPORT_FILE_NAME_1, null);
  168. }
  169. @DataProvider
  170. public static Object[][] shortLivingBranchAndPullRequest() {
  171. return new Object[][] {{BranchType.SHORT}, {BranchType.PULL_REQUEST}};
  172. }
  173. @Test
  174. public void generate_keys_when_using_existing_branch() {
  175. ComponentDto projectDto = dbTester.components().insertMainBranch();
  176. ComponentDto branchDto = dbTester.components().insertProjectBranch(projectDto);
  177. Branch branch = mock(Branch.class);
  178. when(branch.getName()).thenReturn(branchDto.getBranch());
  179. when(branch.isMain()).thenReturn(false);
  180. when(branch.generateKey(any(), any())).thenReturn(branchDto.getDbKey());
  181. analysisMetadataHolder.setRootComponentRef(ROOT_REF)
  182. .setAnalysisDate(ANALYSIS_DATE)
  183. .setProject(Project.from(projectDto))
  184. .setBranch(branch);
  185. BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, reportModulesPath);
  186. reportReader.putComponent(component(ROOT_REF, PROJECT, branchDto.getKey()));
  187. underTest.execute(new TestComputationStepContext());
  188. verifyComponentByRef(ROOT_REF, branchDto.getDbKey(), branchDto.getKey(), analysisMetadataHolder.getProject().getName(), branchDto.uuid());
  189. }
  190. @Test
  191. public void generate_keys_when_using_main_branch() {
  192. Branch branch = new DefaultBranchImpl();
  193. analysisMetadataHolder.setRootComponentRef(ROOT_REF)
  194. .setAnalysisDate(ANALYSIS_DATE)
  195. .setProject(Project.from(newPrivateProjectDto(newOrganizationDto()).setDbKey(REPORT_PROJECT_KEY)))
  196. .setBranch(branch);
  197. BuildComponentTreeStep underTest = new BuildComponentTreeStep(dbClient, reportReader, treeRootHolder, analysisMetadataHolder, reportModulesPath);
  198. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF));
  199. reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
  200. underTest.execute(new TestComputationStepContext());
  201. verifyComponentByRef(ROOT_REF, REPORT_PROJECT_KEY, REPORT_PROJECT_KEY, analysisMetadataHolder.getProject().getName(), null);
  202. verifyComponentByKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1, REPORT_DIR_PATH_1);
  203. verifyComponentByRef(FILE_1_REF, REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1, REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1, REPORT_FILE_NAME_1, null);
  204. }
  205. @Test
  206. public void compute_keys_and_uuids_on_project_having_module_and_directory() {
  207. setAnalysisMetadataHolder();
  208. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF, FILE_2_REF));
  209. reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
  210. reportReader.putComponent(componentWithPath(FILE_2_REF, FILE, REPORT_FILE_PATH_2));
  211. underTest.execute(new TestComputationStepContext());
  212. verifyComponentByRef(ROOT_REF, REPORT_PROJECT_KEY, analysisMetadataHolder.getProject().getName());
  213. verifyComponentByKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1, "dir1");
  214. verifyComponentByRef(FILE_1_REF, REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1, REPORT_FILE_NAME_1);
  215. verifyComponentByKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_2, "dir2");
  216. verifyComponentByRef(FILE_2_REF, REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_2, "File2.java");
  217. }
  218. @Test
  219. public void compute_keys_and_uuids_on_multi_modules() {
  220. setAnalysisMetadataHolder();
  221. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY, FILE_1_REF));
  222. reportReader.putComponent(componentWithPath(FILE_1_REF, FILE, REPORT_FILE_PATH_1));
  223. underTest.execute(new TestComputationStepContext());
  224. verifyComponentByRef(ROOT_REF, REPORT_PROJECT_KEY, analysisMetadataHolder.getProject().getName());
  225. verifyComponentByKey(REPORT_PROJECT_KEY + ":" + REPORT_DIR_PATH_1, REPORT_DIR_PATH_1);
  226. verifyComponentByRef(FILE_1_REF, REPORT_PROJECT_KEY + ":" + REPORT_FILE_PATH_1, REPORT_FILE_NAME_1);
  227. }
  228. @Test
  229. public void set_no_base_project_snapshot_when_no_snapshot() {
  230. setAnalysisMetadataHolder();
  231. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  232. underTest.execute(new TestComputationStepContext());
  233. assertThat(analysisMetadataHolder.isFirstAnalysis()).isTrue();
  234. }
  235. @Test
  236. public void set_no_base_project_snapshot_when_no_last_snapshot() {
  237. setAnalysisMetadataHolder();
  238. OrganizationDto organizationDto = dbTester.organizations().insert();
  239. ComponentDto project = insertComponent(newPrivateProjectDto(organizationDto, "ABCD").setDbKey(REPORT_PROJECT_KEY));
  240. insertSnapshot(newAnalysis(project).setLast(false));
  241. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  242. underTest.execute(new TestComputationStepContext());
  243. assertThat(analysisMetadataHolder.isFirstAnalysis()).isTrue();
  244. }
  245. @Test
  246. public void set_base_project_snapshot_when_last_snapshot_exist() {
  247. setAnalysisMetadataHolder();
  248. OrganizationDto organizationDto = dbTester.organizations().insert();
  249. ComponentDto project = insertComponent(newPrivateProjectDto(organizationDto, "ABCD").setDbKey(REPORT_PROJECT_KEY));
  250. insertSnapshot(newAnalysis(project).setLast(true));
  251. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  252. underTest.execute(new TestComputationStepContext());
  253. assertThat(analysisMetadataHolder.isFirstAnalysis()).isFalse();
  254. }
  255. @Test
  256. public void set_projectVersion_to_not_provided_when_not_set_on_first_analysis() {
  257. setAnalysisMetadataHolder();
  258. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  259. underTest.execute(new TestComputationStepContext());
  260. assertThat(treeRootHolder.getReportTreeRoot().getProjectAttributes().getProjectVersion()).isEqualTo("not provided");
  261. }
  262. @Test
  263. @UseDataProvider("oneParameterNullNonNullCombinations")
  264. public void set_projectVersion_to_previous_analysis_when_not_set(@Nullable String previousAnalysisProjectVersion) {
  265. setAnalysisMetadataHolder();
  266. OrganizationDto organizationDto = dbTester.organizations().insert();
  267. ComponentDto project = insertComponent(newPrivateProjectDto(organizationDto, "ABCD").setDbKey(REPORT_PROJECT_KEY));
  268. insertSnapshot(newAnalysis(project).setProjectVersion(previousAnalysisProjectVersion).setLast(true));
  269. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  270. underTest.execute(new TestComputationStepContext());
  271. String projectVersion = treeRootHolder.getReportTreeRoot().getProjectAttributes().getProjectVersion();
  272. if (previousAnalysisProjectVersion == null) {
  273. assertThat(projectVersion).isEqualTo("not provided");
  274. } else {
  275. assertThat(projectVersion).isEqualTo(previousAnalysisProjectVersion);
  276. }
  277. }
  278. @Test
  279. public void set_projectVersion_when_it_is_set_on_first_analysis() {
  280. String scannerProjectVersion = randomAlphabetic(12);
  281. setAnalysisMetadataHolder();
  282. reportReader.setMetadata(createReportMetadata(scannerProjectVersion, NO_SCANNER_BUILD_STRING));
  283. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  284. underTest.execute(new TestComputationStepContext());
  285. assertThat(treeRootHolder.getReportTreeRoot().getProjectAttributes().getProjectVersion())
  286. .isEqualTo(scannerProjectVersion);
  287. }
  288. @Test
  289. @UseDataProvider("oneParameterNullNonNullCombinations")
  290. public void set_projectVersion_when_it_is_set_on_later_analysis(@Nullable String previousAnalysisProjectVersion) {
  291. String scannerProjectVersion = randomAlphabetic(12);
  292. setAnalysisMetadataHolder();
  293. reportReader.setMetadata(createReportMetadata(scannerProjectVersion, NO_SCANNER_BUILD_STRING));
  294. OrganizationDto organizationDto = dbTester.organizations().insert();
  295. ComponentDto project = insertComponent(newPrivateProjectDto(organizationDto, "ABCD").setDbKey(REPORT_PROJECT_KEY));
  296. insertSnapshot(newAnalysis(project).setProjectVersion(previousAnalysisProjectVersion).setLast(true));
  297. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  298. underTest.execute(new TestComputationStepContext());
  299. assertThat(treeRootHolder.getReportTreeRoot().getProjectAttributes().getProjectVersion())
  300. .isEqualTo(scannerProjectVersion);
  301. }
  302. @Test
  303. @UseDataProvider("oneParameterNullNonNullCombinations")
  304. public void set_buildString(@Nullable String buildString) {
  305. String projectVersion = randomAlphabetic(7);
  306. setAnalysisMetadataHolder();
  307. reportReader.setMetadata(createReportMetadata(projectVersion, buildString));
  308. reportReader.putComponent(component(ROOT_REF, PROJECT, REPORT_PROJECT_KEY));
  309. underTest.execute(new TestComputationStepContext());
  310. assertThat(treeRootHolder.getReportTreeRoot().getProjectAttributes().getBuildString()).isEqualTo(Optional.ofNullable(buildString));
  311. }
  312. @DataProvider
  313. public static Object[][] oneParameterNullNonNullCombinations() {
  314. return new Object[][] {
  315. {null},
  316. {randomAlphabetic(7)}
  317. };
  318. }
  319. private void verifyComponent(Component component, Component.Type type, @Nullable Integer componentRef, int size) {
  320. assertThat(component.getType()).isEqualTo(type);
  321. assertThat(component.getReportAttributes().getRef()).isEqualTo(componentRef);
  322. assertThat(component.getChildren()).hasSize(size);
  323. }
  324. private void verifyComponentByRef(int ref, String key, String shortName) {
  325. verifyComponentByRef(ref, key, key, shortName, null);
  326. }
  327. private void verifyComponentByRef(int ref, String key, String shortName, @Nullable String uuid) {
  328. verifyComponentByRef(ref, key, key, shortName, uuid);
  329. }
  330. private void verifyComponentByKey(String publicKey, String shortName) {
  331. verifyComponentByKey(publicKey, publicKey, shortName, null);
  332. }
  333. private void verifyComponentByKey(String publicKey, String key, String shortName) {
  334. verifyComponentByKey(publicKey, key, shortName, null);
  335. }
  336. private void verifyComponentByKey(String publicKey, String key, String shortName, @Nullable String uuid) {
  337. Map<String, Component> componentsByKey = indexAllComponentsInTreeByKey(treeRootHolder.getRoot());
  338. Component component = componentsByKey.get(publicKey);
  339. assertThat(component.getDbKey()).isEqualTo(key);
  340. assertThat(component.getReportAttributes().getRef()).isNull();
  341. assertThat(component.getKey()).isEqualTo(publicKey);
  342. assertThat(component.getShortName()).isEqualTo(shortName);
  343. if (uuid != null) {
  344. assertThat(component.getUuid()).isEqualTo(uuid);
  345. } else {
  346. assertThat(component.getUuid()).isNotNull();
  347. }
  348. }
  349. private void verifyComponentByRef(int ref, String key, String publicKey, String shortName, @Nullable String uuid) {
  350. Map<Integer, Component> componentsByRef = indexAllComponentsInTreeByRef(treeRootHolder.getRoot());
  351. Component component = componentsByRef.get(ref);
  352. assertThat(component.getDbKey()).isEqualTo(key);
  353. assertThat(component.getKey()).isEqualTo(publicKey);
  354. assertThat(component.getShortName()).isEqualTo(shortName);
  355. if (uuid != null) {
  356. assertThat(component.getUuid()).isEqualTo(uuid);
  357. } else {
  358. assertThat(component.getUuid()).isNotNull();
  359. }
  360. }
  361. private static ScannerReport.Component component(int componentRef, ComponentType componentType, String key, int... children) {
  362. return component(componentRef, componentType, key, null, children);
  363. }
  364. private static ScannerReport.Component componentWithPath(int componentRef, ComponentType componentType, String path, int... children) {
  365. return component(componentRef, componentType, REPORT_PROJECT_KEY + ":" + path, path, children);
  366. }
  367. private static ScannerReport.Component component(int componentRef, ComponentType componentType, String key, @Nullable String path, int... children) {
  368. ScannerReport.Component.Builder builder = ScannerReport.Component.newBuilder()
  369. .setType(componentType)
  370. .setRef(componentRef)
  371. .setStatus(FileStatus.UNAVAILABLE)
  372. .setLines(1)
  373. .setKey(key);
  374. if (path != null) {
  375. builder.setProjectRelativePath(path);
  376. }
  377. for (int child : children) {
  378. builder.addChildRef(child);
  379. }
  380. return builder.build();
  381. }
  382. private static Map<Integer, Component> indexAllComponentsInTreeByRef(Component root) {
  383. Map<Integer, Component> componentsByRef = new HashMap<>();
  384. feedComponentByRef(root, componentsByRef);
  385. return componentsByRef;
  386. }
  387. private static Map<String, Component> indexAllComponentsInTreeByKey(Component root) {
  388. Map<String, Component> componentsByKey = new HashMap<>();
  389. feedComponentByKey(root, componentsByKey);
  390. return componentsByKey;
  391. }
  392. private static void feedComponentByKey(Component component, Map<String, Component> map) {
  393. map.put(component.getKey(), component);
  394. for (Component child : component.getChildren()) {
  395. feedComponentByKey(child, map);
  396. }
  397. }
  398. private static void feedComponentByRef(Component component, Map<Integer, Component> map) {
  399. if (component.getReportAttributes().getRef() != null) {
  400. map.put(component.getReportAttributes().getRef(), component);
  401. }
  402. for (Component child : component.getChildren()) {
  403. feedComponentByRef(child, map);
  404. }
  405. }
  406. private ComponentDto insertComponent(ComponentDto component) {
  407. dbClient.componentDao().insert(dbTester.getSession(), component);
  408. dbTester.getSession().commit();
  409. return component;
  410. }
  411. private SnapshotDto insertSnapshot(SnapshotDto snapshot) {
  412. dbClient.snapshotDao().insert(dbTester.getSession(), snapshot);
  413. dbTester.getSession().commit();
  414. return snapshot;
  415. }
  416. private void setAnalysisMetadataHolder() {
  417. analysisMetadataHolder.setRootComponentRef(ROOT_REF)
  418. .setAnalysisDate(ANALYSIS_DATE)
  419. .setBranch(new DefaultBranchImpl())
  420. .setProject(Project.from(newPrivateProjectDto(newOrganizationDto()).setDbKey(REPORT_PROJECT_KEY)));
  421. }
  422. public static ScannerReport.Metadata createReportMetadata(@Nullable String projectVersion, @Nullable String buildString) {
  423. ScannerReport.Metadata.Builder builder = ScannerReport.Metadata.newBuilder()
  424. .setProjectKey(REPORT_PROJECT_KEY)
  425. .setRootComponentRef(ROOT_REF);
  426. ofNullable(projectVersion).ifPresent(builder::setProjectVersion);
  427. ofNullable(buildString).ifPresent(builder::setBuildString);
  428. return builder.build();
  429. }
  430. }