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

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