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.

ReportPersistComponentsStepTest.java 33KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  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 java.text.SimpleDateFormat;
  22. import java.util.Date;
  23. import java.util.Optional;
  24. import java.util.function.Consumer;
  25. import java.util.stream.Stream;
  26. import javax.annotation.Nullable;
  27. import org.junit.Before;
  28. import org.junit.Rule;
  29. import org.junit.Test;
  30. import org.sonar.api.utils.DateUtils;
  31. import org.sonar.api.utils.System2;
  32. import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
  33. import org.sonar.ce.task.projectanalysis.analysis.Branch;
  34. import org.sonar.ce.task.projectanalysis.component.BranchPersister;
  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.FileAttributes;
  38. import org.sonar.ce.task.projectanalysis.component.MutableDbIdsRepositoryRule;
  39. import org.sonar.ce.task.projectanalysis.component.MutableDisabledComponentsHolder;
  40. import org.sonar.ce.task.projectanalysis.component.ReportComponent;
  41. import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
  42. import org.sonar.ce.task.step.ComputationStep;
  43. import org.sonar.ce.task.step.TestComputationStepContext;
  44. import org.sonar.core.component.ComponentKeys;
  45. import org.sonar.db.DbClient;
  46. import org.sonar.db.DbTester;
  47. import org.sonar.db.component.BranchType;
  48. import org.sonar.db.component.ComponentDto;
  49. import org.sonar.db.component.ComponentTesting;
  50. import org.sonar.server.project.Project;
  51. import static org.apache.commons.lang.StringUtils.isEmpty;
  52. import static org.apache.commons.lang.StringUtils.trimToNull;
  53. import static org.assertj.core.api.Assertions.assertThat;
  54. import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
  55. import static org.mockito.Mockito.mock;
  56. import static org.mockito.Mockito.when;
  57. import static org.sonar.ce.task.projectanalysis.component.Component.Type.DIRECTORY;
  58. import static org.sonar.ce.task.projectanalysis.component.Component.Type.FILE;
  59. import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT;
  60. import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder;
  61. import static org.sonar.db.component.ComponentDto.UUID_PATH_OF_ROOT;
  62. import static org.sonar.db.component.ComponentDto.UUID_PATH_SEPARATOR;
  63. import static org.sonar.db.component.ComponentTesting.newDirectory;
  64. import static org.sonar.db.component.ComponentTesting.newModuleDto;
  65. public class ReportPersistComponentsStepTest extends BaseStepTest {
  66. private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
  67. private static final String PROJECT_KEY = "PROJECT_KEY";
  68. private static final String ORGANIZATION_UUID = "org1";
  69. private static final String QUALITY_GATE_UUID = "gg1";
  70. @Rule
  71. public DbTester db = DbTester.create(System2.INSTANCE);
  72. @Rule
  73. public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
  74. @Rule
  75. public MutableDbIdsRepositoryRule dbIdsRepository = MutableDbIdsRepositoryRule.create(treeRootHolder);
  76. @Rule
  77. public AnalysisMetadataHolderRule analysisMetadataHolder = new AnalysisMetadataHolderRule()
  78. .setOrganizationUuid(ORGANIZATION_UUID, QUALITY_GATE_UUID);
  79. private System2 system2 = mock(System2.class);
  80. private DbClient dbClient = db.getDbClient();
  81. private Date now;
  82. private MutableDisabledComponentsHolder disabledComponentsHolder = mock(MutableDisabledComponentsHolder.class, RETURNS_DEEP_STUBS);
  83. private PersistComponentsStep underTest;
  84. private BranchPersister branchPersister;
  85. @Before
  86. public void setup() throws Exception {
  87. now = DATE_FORMAT.parse("2015-06-02");
  88. when(system2.now()).thenReturn(now.getTime());
  89. db.organizations().insertForUuid(ORGANIZATION_UUID);
  90. branchPersister = mock(BranchPersister.class);
  91. underTest = new PersistComponentsStep(dbClient, treeRootHolder, dbIdsRepository, system2, disabledComponentsHolder, analysisMetadataHolder, branchPersister);
  92. }
  93. @Override
  94. protected ComputationStep step() {
  95. return underTest;
  96. }
  97. @Test
  98. public void persist_components() {
  99. ComponentDto projectDto = prepareProject();
  100. Component file = builder(FILE, 4).setUuid("DEFG").setKey("PROJECT_KEY:src/main/java/dir/Foo.java")
  101. .setName("src/main/java/dir/Foo.java")
  102. .setShortName("Foo.java")
  103. .setFileAttributes(new FileAttributes(false, "java", 1))
  104. .build();
  105. Component directory = builder(DIRECTORY, 3).setUuid("CDEF").setKey("PROJECT_KEY:src/main/java/dir")
  106. .setName("src/main/java/dir")
  107. .setShortName("dir")
  108. .addChildren(file)
  109. .build();
  110. Component treeRoot = asTreeRoot(projectDto)
  111. .addChildren(directory)
  112. .build();
  113. treeRootHolder.setRoot(treeRoot);
  114. underTest.execute(new TestComputationStepContext());
  115. assertThat(db.countRowsOfTable("projects")).isEqualTo(3);
  116. ComponentDto directoryDto = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get();
  117. assertThat(directoryDto.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
  118. assertThat(directoryDto.name()).isEqualTo("dir");
  119. assertThat(directoryDto.longName()).isEqualTo("src/main/java/dir");
  120. assertThat(directoryDto.description()).isNull();
  121. assertThat(directoryDto.path()).isEqualTo("src/main/java/dir");
  122. assertThat(directoryDto.uuid()).isEqualTo("CDEF");
  123. assertThat(directoryDto.getUuidPath()).isEqualTo(UUID_PATH_SEPARATOR + projectDto.uuid() + UUID_PATH_SEPARATOR);
  124. assertThat(directoryDto.moduleUuid()).isEqualTo(projectDto.uuid());
  125. assertThat(directoryDto.moduleUuidPath()).isEqualTo(projectDto.moduleUuidPath());
  126. assertThat(directoryDto.getMainBranchProjectUuid()).isNull();
  127. assertThat(directoryDto.projectUuid()).isEqualTo(projectDto.uuid());
  128. assertThat(directoryDto.qualifier()).isEqualTo("DIR");
  129. assertThat(directoryDto.scope()).isEqualTo("DIR");
  130. assertThat(directoryDto.getRootUuid()).isEqualTo(projectDto.uuid());
  131. assertThat(directoryDto.getCreatedAt()).isEqualTo(now);
  132. ComponentDto fileDto = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get();
  133. assertThat(fileDto.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
  134. assertThat(fileDto.name()).isEqualTo("Foo.java");
  135. assertThat(fileDto.longName()).isEqualTo("src/main/java/dir/Foo.java");
  136. assertThat(fileDto.description()).isNull();
  137. assertThat(fileDto.path()).isEqualTo("src/main/java/dir/Foo.java");
  138. assertThat(fileDto.language()).isEqualTo("java");
  139. assertThat(fileDto.uuid()).isEqualTo("DEFG");
  140. assertThat(fileDto.getUuidPath()).isEqualTo(directoryDto.getUuidPath() + directoryDto.uuid() + UUID_PATH_SEPARATOR);
  141. assertThat(fileDto.moduleUuid()).isEqualTo(projectDto.uuid());
  142. assertThat(fileDto.moduleUuidPath()).isEqualTo(projectDto.moduleUuidPath());
  143. assertThat(fileDto.getMainBranchProjectUuid()).isNull();
  144. assertThat(fileDto.projectUuid()).isEqualTo(projectDto.uuid());
  145. assertThat(fileDto.qualifier()).isEqualTo("FIL");
  146. assertThat(fileDto.scope()).isEqualTo("FIL");
  147. assertThat(fileDto.getRootUuid()).isEqualTo(projectDto.uuid());
  148. assertThat(fileDto.getCreatedAt()).isEqualTo(now);
  149. assertThat(dbIdsRepository.getComponentId(directory)).isEqualTo(directoryDto.getId());
  150. assertThat(dbIdsRepository.getComponentId(file)).isEqualTo(fileDto.getId());
  151. }
  152. @Test
  153. public void persist_components_of_existing_branch() {
  154. ComponentDto project = prepareBranch("feature/foo");
  155. Component file = builder(FILE, 4).setUuid("DEFG").setKey("PROJECT_KEY:src/main/java/dir/Foo.java")
  156. .setName("src/main/java/dir/Foo.java")
  157. .setShortName("Foo.java")
  158. .setFileAttributes(new FileAttributes(false, "java", 1))
  159. .build();
  160. Component directory = builder(DIRECTORY, 3).setUuid("CDEF")
  161. .setKey("PROJECT_KEY:src/main/java/dir")
  162. .setName("src/main/java/dir")
  163. .setShortName("dir")
  164. .addChildren(file)
  165. .build();
  166. Component treeRoot = asTreeRoot(project)
  167. .addChildren(directory)
  168. .build();
  169. treeRootHolder.setRoot(treeRoot);
  170. underTest.execute(new TestComputationStepContext());
  171. assertThat(db.countRowsOfTable("projects")).isEqualTo(3);
  172. ComponentDto directoryDto = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get();
  173. assertThat(directoryDto.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
  174. assertThat(directoryDto.name()).isEqualTo("dir");
  175. assertThat(directoryDto.longName()).isEqualTo("src/main/java/dir");
  176. assertThat(directoryDto.description()).isNull();
  177. assertThat(directoryDto.path()).isEqualTo("src/main/java/dir");
  178. assertThat(directoryDto.uuid()).isEqualTo("CDEF");
  179. assertThat(directoryDto.getUuidPath()).isEqualTo(UUID_PATH_SEPARATOR + project.uuid() + UUID_PATH_SEPARATOR);
  180. assertThat(directoryDto.moduleUuid()).isEqualTo(project.uuid());
  181. assertThat(directoryDto.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  182. assertThat(directoryDto.getMainBranchProjectUuid()).isEqualTo(project.uuid());
  183. assertThat(directoryDto.projectUuid()).isEqualTo(project.uuid());
  184. assertThat(directoryDto.qualifier()).isEqualTo("DIR");
  185. assertThat(directoryDto.scope()).isEqualTo("DIR");
  186. assertThat(directoryDto.getRootUuid()).isEqualTo(project.uuid());
  187. assertThat(directoryDto.getCreatedAt()).isEqualTo(now);
  188. ComponentDto fileDto = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get();
  189. assertThat(fileDto.getOrganizationUuid()).isEqualTo(ORGANIZATION_UUID);
  190. assertThat(fileDto.name()).isEqualTo("Foo.java");
  191. assertThat(fileDto.longName()).isEqualTo("src/main/java/dir/Foo.java");
  192. assertThat(fileDto.description()).isNull();
  193. assertThat(fileDto.path()).isEqualTo("src/main/java/dir/Foo.java");
  194. assertThat(fileDto.language()).isEqualTo("java");
  195. assertThat(fileDto.uuid()).isEqualTo("DEFG");
  196. assertThat(fileDto.getUuidPath()).isEqualTo(directoryDto.getUuidPath() + directoryDto.uuid() + UUID_PATH_SEPARATOR);
  197. assertThat(fileDto.moduleUuid()).isEqualTo(project.uuid());
  198. assertThat(fileDto.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  199. assertThat(fileDto.getMainBranchProjectUuid()).isEqualTo(project.uuid());
  200. assertThat(fileDto.projectUuid()).isEqualTo(project.uuid());
  201. assertThat(fileDto.qualifier()).isEqualTo("FIL");
  202. assertThat(fileDto.scope()).isEqualTo("FIL");
  203. assertThat(fileDto.getRootUuid()).isEqualTo(project.uuid());
  204. assertThat(fileDto.getCreatedAt()).isEqualTo(now);
  205. assertThat(dbIdsRepository.getComponentId(directory)).isEqualTo(directoryDto.getId());
  206. assertThat(dbIdsRepository.getComponentId(file)).isEqualTo(fileDto.getId());
  207. }
  208. @Test
  209. public void persist_file_directly_attached_on_root_directory() {
  210. ComponentDto projectDto = prepareProject();
  211. treeRootHolder.setRoot(
  212. asTreeRoot(projectDto)
  213. .addChildren(
  214. builder(FILE, 2).setUuid("DEFG").setKey(projectDto.getDbKey() + ":pom.xml")
  215. .setName("pom.xml")
  216. .build())
  217. .build());
  218. underTest.execute(new TestComputationStepContext());
  219. assertThat(dbClient.componentDao().selectByKey(db.getSession(), projectDto.getDbKey() + ":/")).isNotPresent();
  220. ComponentDto file = dbClient.componentDao().selectByKey(db.getSession(), projectDto.getDbKey() + ":pom.xml").get();
  221. assertThat(file.name()).isEqualTo("pom.xml");
  222. assertThat(file.path()).isEqualTo("pom.xml");
  223. }
  224. @Test
  225. public void persist_unit_test() {
  226. ComponentDto projectDto = prepareProject();
  227. treeRootHolder.setRoot(
  228. asTreeRoot(projectDto)
  229. .addChildren(
  230. builder(DIRECTORY, 2).setUuid("CDEF").setKey(PROJECT_KEY + ":src/test/java/dir")
  231. .setName("src/test/java/dir")
  232. .addChildren(
  233. builder(FILE, 3).setUuid("DEFG").setKey(PROJECT_KEY + ":src/test/java/dir/FooTest.java")
  234. .setName("src/test/java/dir/FooTest.java")
  235. .setShortName("FooTest.java")
  236. .setFileAttributes(new FileAttributes(true, null, 1))
  237. .build())
  238. .build())
  239. .build());
  240. underTest.execute(new TestComputationStepContext());
  241. ComponentDto file = dbClient.componentDao().selectByKey(db.getSession(), PROJECT_KEY + ":src/test/java/dir/FooTest.java").get();
  242. assertThat(file.name()).isEqualTo("FooTest.java");
  243. assertThat(file.longName()).isEqualTo("src/test/java/dir/FooTest.java");
  244. assertThat(file.path()).isEqualTo("src/test/java/dir/FooTest.java");
  245. assertThat(file.qualifier()).isEqualTo("UTS");
  246. assertThat(file.scope()).isEqualTo("FIL");
  247. }
  248. @Test
  249. public void update_file_to_directory_change_scope() {
  250. ComponentDto project = prepareProject();
  251. ComponentDto directory = ComponentTesting.newDirectory(project, "src").setUuid("CDEF").setDbKey("PROJECT_KEY:src");
  252. ComponentDto file = ComponentTesting.newFileDto(project, directory, "DEFG").setPath("src/foo").setName("foo")
  253. .setDbKey("PROJECT_KEY:src/foo");
  254. dbClient.componentDao().insert(db.getSession(), directory, file);
  255. db.getSession().commit();
  256. assertThat(dbClient.componentDao().selectByKey(db.getSession(), PROJECT_KEY + ":src/foo").get().scope()).isEqualTo("FIL");
  257. treeRootHolder.setRoot(
  258. asTreeRoot(project)
  259. .addChildren(
  260. builder(DIRECTORY, 2).setUuid("CDEF").setKey(PROJECT_KEY + ":src")
  261. .setName("src")
  262. .addChildren(
  263. builder(DIRECTORY, 3).setUuid("DEFG").setKey(PROJECT_KEY + ":src/foo")
  264. .setName("foo")
  265. .addChildren(
  266. builder(FILE, 4).setUuid("HIJK").setKey(PROJECT_KEY + ":src/foo/FooTest.java")
  267. .setName("src/foo/FooTest.java")
  268. .setShortName("FooTest.java")
  269. .setFileAttributes(new FileAttributes(false, null, 1))
  270. .build())
  271. .build())
  272. .build())
  273. .build());
  274. underTest.execute(new TestComputationStepContext());
  275. // commit the functional transaction
  276. dbClient.componentDao().applyBChangesForRootComponentUuid(db.getSession(), project.uuid());
  277. db.commit();
  278. assertThat(dbClient.componentDao().selectByKey(db.getSession(), PROJECT_KEY + ":src/foo").get().scope()).isEqualTo("DIR");
  279. }
  280. @Test
  281. public void update_module_to_directory_change_scope() {
  282. ComponentDto project = prepareProject();
  283. ComponentDto module = ComponentTesting.newModuleDto(project).setUuid("CDEF").setDbKey("MODULE_KEY").setPath("module");
  284. dbClient.componentDao().insert(db.getSession(), module);
  285. db.getSession().commit();
  286. assertThat(dbClient.componentDao().selectByUuid(db.getSession(), "CDEF").get().scope()).isEqualTo("PRJ");
  287. treeRootHolder.setRoot(
  288. asTreeRoot(project)
  289. .addChildren(
  290. builder(DIRECTORY, 2).setUuid("CDEF").setKey(PROJECT_KEY + ":module")
  291. .setName("module")
  292. .addChildren(
  293. builder(FILE, 3).setUuid("HIJK").setKey(PROJECT_KEY + ":module/FooTest.java")
  294. .setName("module/FooTest.java")
  295. .setShortName("FooTest.java")
  296. .setFileAttributes(new FileAttributes(false, null, 1))
  297. .build())
  298. .build())
  299. .build());
  300. underTest.execute(new TestComputationStepContext());
  301. // commit the functional transaction
  302. dbClient.componentDao().applyBChangesForRootComponentUuid(db.getSession(), project.uuid());
  303. db.commit();
  304. assertThat(dbClient.componentDao().selectByUuid(db.getSession(), "CDEF").get().scope()).isEqualTo("DIR");
  305. }
  306. @Test
  307. public void persist_only_new_components() {
  308. // Project and module already exists
  309. ComponentDto project = prepareProject();
  310. db.getSession().commit();
  311. treeRootHolder.setRoot(
  312. builder(PROJECT, 1).setUuid(project.uuid()).setKey(project.getDbKey())
  313. .setName("Project")
  314. .addChildren(
  315. builder(DIRECTORY, 3).setUuid("CDEF").setKey("PROJECT_KEY:src/main/java/dir")
  316. .setName("src/main/java/dir")
  317. .addChildren(
  318. builder(FILE, 4).setUuid("DEFG").setKey("PROJECT_KEY:src/main/java/dir/Foo.java")
  319. .setName("src/main/java/dir/Foo.java")
  320. .setShortName("Foo.java")
  321. .build())
  322. .build())
  323. .build());
  324. underTest.execute(new TestComputationStepContext());
  325. assertThat(db.countRowsOfTable("projects")).isEqualTo(3);
  326. ComponentDto projectReloaded = dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get();
  327. assertThat(projectReloaded.getId()).isEqualTo(project.getId());
  328. assertThat(projectReloaded.uuid()).isEqualTo(project.uuid());
  329. assertThat(projectReloaded.getUuidPath()).isEqualTo(UUID_PATH_OF_ROOT);
  330. assertThat(projectReloaded.getMainBranchProjectUuid()).isNull();
  331. ComponentDto directory = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get();
  332. assertThat(directory.getUuidPath()).isEqualTo(directory.getUuidPath());
  333. assertThat(directory.moduleUuid()).isEqualTo(project.uuid());
  334. assertThat(directory.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  335. assertThat(directory.projectUuid()).isEqualTo(project.uuid());
  336. assertThat(directory.getRootUuid()).isEqualTo(project.uuid());
  337. assertThat(directory.getMainBranchProjectUuid()).isNull();
  338. ComponentDto file = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get();
  339. assertThat(file.getUuidPath()).isEqualTo(file.getUuidPath());
  340. assertThat(file.moduleUuid()).isEqualTo(project.uuid());
  341. assertThat(file.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  342. assertThat(file.projectUuid()).isEqualTo(project.uuid());
  343. assertThat(file.getRootUuid()).isEqualTo(project.uuid());
  344. assertThat(file.getMainBranchProjectUuid()).isNull();
  345. }
  346. @Test
  347. public void nothing_to_persist() {
  348. ComponentDto project = prepareProject();
  349. ComponentDto directory = ComponentTesting.newDirectory(project, "src/main/java/dir").setUuid("CDEF").setDbKey("PROJECT_KEY:src/main/java/dir");
  350. ComponentDto file = ComponentTesting.newFileDto(project, directory, "DEFG").setPath("src/main/java/dir/Foo.java").setName("Foo.java")
  351. .setDbKey("PROJECT_KEY:src/main/java/dir/Foo.java");
  352. dbClient.componentDao().insert(db.getSession(), directory, file);
  353. db.getSession().commit();
  354. treeRootHolder.setRoot(
  355. builder(PROJECT, 1).setUuid(project.uuid()).setKey(project.getDbKey())
  356. .setName("Project")
  357. .addChildren(
  358. builder(DIRECTORY, 3).setUuid("CDEF").setKey("PROJECT_KEY:src/main/java/dir")
  359. .setName("src/main/java/dir")
  360. .addChildren(
  361. builder(FILE, 4).setUuid("DEFG").setKey("PROJECT_KEY:src/main/java/dir/Foo.java")
  362. .setName("src/main/java/dir/Foo.java")
  363. .build())
  364. .build())
  365. .build());
  366. underTest.execute(new TestComputationStepContext());
  367. assertThat(db.countRowsOfTable("projects")).isEqualTo(3);
  368. assertThat(dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get().getId()).isEqualTo(project.getId());
  369. assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get().getId()).isEqualTo(directory.getId());
  370. assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get().getId()).isEqualTo(file.getId());
  371. ComponentDto projectReloaded = dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get();
  372. assertThat(projectReloaded.getId()).isEqualTo(project.getId());
  373. assertThat(projectReloaded.uuid()).isEqualTo(project.uuid());
  374. assertThat(projectReloaded.moduleUuid()).isEqualTo(project.moduleUuid());
  375. assertThat(projectReloaded.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  376. assertThat(projectReloaded.projectUuid()).isEqualTo(project.projectUuid());
  377. assertThat(projectReloaded.getRootUuid()).isEqualTo(project.getRootUuid());
  378. ComponentDto directoryReloaded = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get();
  379. assertThat(directoryReloaded.uuid()).isEqualTo(directory.uuid());
  380. assertThat(directoryReloaded.getUuidPath()).isEqualTo(directory.getUuidPath());
  381. assertThat(directoryReloaded.moduleUuid()).isEqualTo(directory.moduleUuid());
  382. assertThat(directoryReloaded.moduleUuidPath()).isEqualTo(directory.moduleUuidPath());
  383. assertThat(directoryReloaded.projectUuid()).isEqualTo(directory.projectUuid());
  384. assertThat(directoryReloaded.getRootUuid()).isEqualTo(directory.getRootUuid());
  385. assertThat(directoryReloaded.name()).isEqualTo(directory.name());
  386. assertThat(directoryReloaded.path()).isEqualTo(directory.path());
  387. ComponentDto fileReloaded = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get();
  388. assertThat(fileReloaded.uuid()).isEqualTo(file.uuid());
  389. assertThat(fileReloaded.getUuidPath()).isEqualTo(file.getUuidPath());
  390. assertThat(fileReloaded.moduleUuid()).isEqualTo(file.moduleUuid());
  391. assertThat(fileReloaded.moduleUuidPath()).isEqualTo(file.moduleUuidPath());
  392. assertThat(fileReloaded.projectUuid()).isEqualTo(file.projectUuid());
  393. assertThat(fileReloaded.getRootUuid()).isEqualTo(file.getRootUuid());
  394. assertThat(fileReloaded.name()).isEqualTo(file.name());
  395. assertThat(fileReloaded.path()).isEqualTo(file.path());
  396. }
  397. @Test
  398. public void update_module_uuid_when_moving_a_module() {
  399. ComponentDto project = prepareProject();
  400. ComponentDto directory = ComponentTesting.newDirectory(project, "src/main/java/dir").setUuid("CDEF").setDbKey("PROJECT_KEY:src/main/java/dir");
  401. ComponentDto file = ComponentTesting.newFileDto(project, directory, "DEFG").setPath("src/main/java/dir/Foo.java").setName("Foo.java")
  402. .setDbKey("PROJECT_KEY:src/main/java/dir/Foo.java");
  403. dbClient.componentDao().insert(db.getSession(), directory, file);
  404. db.getSession().commit();
  405. treeRootHolder.setRoot(
  406. builder(PROJECT, 1).setUuid(project.uuid()).setKey(project.getDbKey())
  407. .setName("Project")
  408. .addChildren(
  409. builder(DIRECTORY, 4).setUuid("CDEF").setKey("PROJECT_KEY:src/main/java/dir")
  410. .setName("src/main/java/dir")
  411. .addChildren(
  412. builder(FILE, 5).setUuid("DEFG").setKey("PROJECT_KEY:src/main/java/dir/Foo.java")
  413. .setName("src/main/java/dir/Foo.java")
  414. .build())
  415. .build())
  416. .build());
  417. underTest.execute(new TestComputationStepContext());
  418. // commit the functional transaction
  419. dbClient.componentDao().applyBChangesForRootComponentUuid(db.getSession(), project.uuid());
  420. db.commit();
  421. assertThat(db.countRowsOfTable("projects")).isEqualTo(3);
  422. ComponentDto directoryReloaded = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get();
  423. assertThat(directoryReloaded).isNotNull();
  424. assertThat(directoryReloaded.uuid()).isEqualTo(directory.uuid());
  425. assertThat(directoryReloaded.getUuidPath()).isEqualTo(directoryReloaded.getUuidPath());
  426. assertThat(directoryReloaded.moduleUuid()).isEqualTo(project.uuid());
  427. assertThat(directoryReloaded.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  428. assertThat(directoryReloaded.projectUuid()).isEqualTo(project.uuid());
  429. assertThat(directoryReloaded.getRootUuid()).isEqualTo(project.uuid());
  430. ComponentDto fileReloaded = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get();
  431. assertThat(fileReloaded).isNotNull();
  432. assertThat(fileReloaded.uuid()).isEqualTo(file.uuid());
  433. assertThat(fileReloaded.getUuidPath()).isEqualTo(fileReloaded.getUuidPath());
  434. assertThat(fileReloaded.moduleUuid()).isEqualTo(project.uuid());
  435. assertThat(fileReloaded.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  436. assertThat(fileReloaded.projectUuid()).isEqualTo(project.uuid());
  437. assertThat(fileReloaded.getRootUuid()).isEqualTo(project.uuid());
  438. }
  439. @Test
  440. public void do_not_update_created_at_on_existing_component() {
  441. Date oldDate = DateUtils.parseDate("2015-01-01");
  442. ComponentDto project = prepareProject(p -> p.setCreatedAt(oldDate));
  443. db.getSession().commit();
  444. treeRootHolder.setRoot(
  445. builder(PROJECT, 1).setUuid(project.uuid()).setKey(project.getDbKey())
  446. .build());
  447. underTest.execute(new TestComputationStepContext());
  448. Optional<ComponentDto> projectReloaded = dbClient.componentDao().selectByUuid(db.getSession(), project.uuid());
  449. assertThat(projectReloaded.get().getCreatedAt()).isNotEqualTo(now);
  450. }
  451. @Test
  452. public void persist_components_that_were_previously_removed() {
  453. ComponentDto project = prepareProject();
  454. ComponentDto removedDirectory = ComponentTesting.newDirectory(project, "src/main/java/dir")
  455. .setLongName("src/main/java/dir")
  456. .setName("dir")
  457. .setUuid("CDEF")
  458. .setDbKey("PROJECT_KEY:src/main/java/dir")
  459. .setEnabled(false);
  460. ComponentDto removedFile = ComponentTesting.newFileDto(project, removedDirectory, "DEFG")
  461. .setPath("src/main/java/dir/Foo.java")
  462. .setLongName("src/main/java/dir/Foo.java")
  463. .setName("Foo.java")
  464. .setDbKey("PROJECT_KEY:src/main/java/dir/Foo.java")
  465. .setEnabled(false);
  466. dbClient.componentDao().insert(db.getSession(), removedDirectory, removedFile);
  467. db.getSession().commit();
  468. treeRootHolder.setRoot(
  469. builder(PROJECT, 1).setUuid(project.uuid()).setKey(project.getDbKey())
  470. .setName("Project")
  471. .addChildren(
  472. builder(DIRECTORY, 3).setUuid("CDEF").setKey("PROJECT_KEY:src/main/java/dir")
  473. .setName("src/main/java/dir")
  474. .setShortName("dir")
  475. .addChildren(
  476. builder(FILE, 4).setUuid("DEFG").setKey("PROJECT_KEY:src/main/java/dir/Foo.java")
  477. .setName("src/main/java/dir/Foo.java")
  478. .setShortName("Foo.java")
  479. .build())
  480. .build())
  481. .build());
  482. underTest.execute(new TestComputationStepContext());
  483. assertThat(db.countRowsOfTable("projects")).isEqualTo(3);
  484. assertThat(dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get().getId()).isEqualTo(project.getId());
  485. assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get().getId()).isEqualTo(removedDirectory.getId());
  486. assertThat(dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get().getId()).isEqualTo(removedFile.getId());
  487. assertExistButDisabled(removedDirectory.getDbKey(), removedFile.getDbKey());
  488. // commit the functional transaction
  489. dbClient.componentDao().applyBChangesForRootComponentUuid(db.getSession(), project.uuid());
  490. ComponentDto projectReloaded = dbClient.componentDao().selectByKey(db.getSession(), project.getDbKey()).get();
  491. assertThat(projectReloaded.getId()).isEqualTo(project.getId());
  492. assertThat(projectReloaded.uuid()).isEqualTo(project.uuid());
  493. assertThat(projectReloaded.getUuidPath()).isEqualTo(project.getUuidPath());
  494. assertThat(projectReloaded.moduleUuid()).isEqualTo(project.moduleUuid());
  495. assertThat(projectReloaded.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
  496. assertThat(projectReloaded.projectUuid()).isEqualTo(project.projectUuid());
  497. assertThat(projectReloaded.getRootUuid()).isEqualTo(project.getRootUuid());
  498. assertThat(projectReloaded.isEnabled()).isTrue();
  499. ComponentDto directoryReloaded = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir").get();
  500. assertThat(directoryReloaded.getId()).isEqualTo(removedDirectory.getId());
  501. assertThat(directoryReloaded.uuid()).isEqualTo(removedDirectory.uuid());
  502. assertThat(directoryReloaded.getUuidPath()).isEqualTo(removedDirectory.getUuidPath());
  503. assertThat(directoryReloaded.moduleUuid()).isEqualTo(removedDirectory.moduleUuid());
  504. assertThat(directoryReloaded.moduleUuidPath()).isEqualTo(removedDirectory.moduleUuidPath());
  505. assertThat(directoryReloaded.projectUuid()).isEqualTo(removedDirectory.projectUuid());
  506. assertThat(directoryReloaded.getRootUuid()).isEqualTo(removedDirectory.getRootUuid());
  507. assertThat(directoryReloaded.name()).isEqualTo(removedDirectory.name());
  508. assertThat(directoryReloaded.longName()).isEqualTo(removedDirectory.longName());
  509. assertThat(directoryReloaded.path()).isEqualTo(removedDirectory.path());
  510. assertThat(directoryReloaded.isEnabled()).isTrue();
  511. ComponentDto fileReloaded = dbClient.componentDao().selectByKey(db.getSession(), "PROJECT_KEY:src/main/java/dir/Foo.java").get();
  512. assertThat(fileReloaded.getId()).isEqualTo(fileReloaded.getId());
  513. assertThat(fileReloaded.uuid()).isEqualTo(removedFile.uuid());
  514. assertThat(fileReloaded.getUuidPath()).isEqualTo(removedFile.getUuidPath());
  515. assertThat(fileReloaded.moduleUuid()).isEqualTo(removedFile.moduleUuid());
  516. assertThat(fileReloaded.moduleUuidPath()).isEqualTo(removedFile.moduleUuidPath());
  517. assertThat(fileReloaded.projectUuid()).isEqualTo(removedFile.projectUuid());
  518. assertThat(fileReloaded.getRootUuid()).isEqualTo(removedFile.getRootUuid());
  519. assertThat(fileReloaded.name()).isEqualTo(removedFile.name());
  520. assertThat(fileReloaded.path()).isEqualTo(removedFile.path());
  521. assertThat(fileReloaded.isEnabled()).isTrue();
  522. }
  523. private void assertExistButDisabled(String... keys) {
  524. for (String key : keys) {
  525. ComponentDto dto = dbClient.componentDao().selectByKey(db.getSession(), key).get();
  526. assertThat(dto.isEnabled()).isFalse();
  527. }
  528. }
  529. @Test
  530. public void persists_existing_components_with_visibility_of_root_in_db_out_of_functional_transaction() {
  531. ComponentDto project = prepareProject(p -> p.setPrivate(true));
  532. ComponentDto module = newModuleDto(project).setPrivate(false);
  533. db.components().insertComponent(module);
  534. ComponentDto dir = db.components().insertComponent(newDirectory(module, "DEFG", "Directory").setDbKey("DIR").setPrivate(true));
  535. treeRootHolder.setRoot(createSampleProjectComponentTree(project));
  536. underTest.execute(new TestComputationStepContext());
  537. Stream.of(project.uuid(), module.uuid(), dir.uuid())
  538. .forEach(uuid -> assertThat(dbClient.componentDao().selectByUuid(db.getSession(), uuid).get().isPrivate())
  539. .describedAs("for uuid " + uuid)
  540. .isEqualTo(true));
  541. }
  542. private ReportComponent createSampleProjectComponentTree(ComponentDto project) {
  543. return createSampleProjectComponentTree(project.uuid(), project.getDbKey());
  544. }
  545. private ReportComponent createSampleProjectComponentTree(String projectUuid, String projectKey) {
  546. return builder(PROJECT, 1).setUuid(projectUuid).setKey(projectKey)
  547. .setName("Project")
  548. .addChildren(
  549. builder(Component.Type.DIRECTORY, 3).setUuid("DEFG").setKey("DIR")
  550. .setName("Directory")
  551. .addChildren(
  552. builder(FILE, 4).setUuid("CDEF").setKey("FILE")
  553. .setName("file")
  554. .build())
  555. .build())
  556. .build();
  557. }
  558. private ReportComponent.Builder asTreeRoot(ComponentDto project) {
  559. return builder(PROJECT, 1).setUuid(project.uuid()).setKey(project.getDbKey()).setName(project.name());
  560. }
  561. private ComponentDto prepareProject(Consumer<ComponentDto>... populators) {
  562. ComponentDto dto = db.components().insertPrivateProject(db.organizations().insert(), populators);
  563. analysisMetadataHolder.setProject(Project.from(dto));
  564. analysisMetadataHolder.setBranch(new DefaultBranchImpl());
  565. return dto;
  566. }
  567. private ComponentDto prepareBranch(String branchName, Consumer<ComponentDto>... populators) {
  568. ComponentDto dto = db.components().insertPrivateProject(db.organizations().insert(), populators);
  569. analysisMetadataHolder.setProject(Project.from(dto));
  570. analysisMetadataHolder.setBranch(new TestBranch(branchName));
  571. return dto;
  572. }
  573. private static class TestBranch implements Branch {
  574. private final String name;
  575. public TestBranch(String name) {
  576. this.name = name;
  577. }
  578. @Override
  579. public BranchType getType() {
  580. return BranchType.LONG;
  581. }
  582. @Override
  583. public boolean isMain() {
  584. return false;
  585. }
  586. @Override
  587. public String getMergeBranchUuid() {
  588. throw new UnsupportedOperationException();
  589. }
  590. @Override
  591. public String getName() {
  592. return name;
  593. }
  594. @Override
  595. public boolean supportsCrossProjectCpd() {
  596. return false;
  597. }
  598. @Override
  599. public String getPullRequestKey() {
  600. throw new UnsupportedOperationException();
  601. }
  602. @Override
  603. public String getTargetBranchName() {
  604. throw new UnsupportedOperationException();
  605. }
  606. @Override
  607. public String generateKey(String projectKey, @Nullable String fileOrDirPath) {
  608. if (isEmpty(fileOrDirPath)) {
  609. return projectKey;
  610. }
  611. return ComponentKeys.createEffectiveKey(projectKey, trimToNull(fileOrDirPath));
  612. }
  613. }
  614. }