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.

ViewsMeasureComputersVisitorTest.java 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2024 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.measure;
  21. import java.util.Arrays;
  22. import org.junit.jupiter.api.Test;
  23. import org.junit.jupiter.api.extension.RegisterExtension;
  24. import org.sonar.api.ce.measure.MeasureComputer;
  25. import org.sonar.api.testfixtures.measure.TestMeasureComputerDefinitionContext;
  26. import org.sonar.ce.task.projectanalysis.api.measurecomputer.MeasureComputerDefinitionImpl;
  27. import org.sonar.ce.task.projectanalysis.component.Component;
  28. import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
  29. import org.sonar.ce.task.projectanalysis.component.VisitorsCrawler;
  30. import org.sonar.ce.task.projectanalysis.issue.ComponentIssuesRepository;
  31. import org.sonar.ce.task.projectanalysis.metric.MetricRepositoryRule;
  32. import static org.assertj.core.api.Assertions.assertThat;
  33. import static org.mockito.Mockito.mock;
  34. import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES;
  35. import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES_KEY;
  36. import static org.sonar.api.measures.CoreMetrics.NCLOC;
  37. import static org.sonar.api.measures.CoreMetrics.NCLOC_KEY;
  38. import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT_VIEW;
  39. import static org.sonar.ce.task.projectanalysis.component.Component.Type.SUBVIEW;
  40. import static org.sonar.ce.task.projectanalysis.component.Component.Type.VIEW;
  41. import static org.sonar.ce.task.projectanalysis.component.ViewsComponent.builder;
  42. import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilder;
  43. import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.entryOf;
  44. import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.toEntries;
  45. class ViewsMeasureComputersVisitorTest {
  46. private static final String NEW_METRIC_KEY = "new_metric_key";
  47. private static final String NEW_METRIC_NAME = "new metric name";
  48. private static final org.sonar.api.measures.Metric<Integer> NEW_METRIC = new org.sonar.api.measures.Metric.Builder(NEW_METRIC_KEY, NEW_METRIC_NAME,
  49. org.sonar.api.measures.Metric.ValueType.INT)
  50. .create();
  51. private static final int ROOT_REF = 1;
  52. private static final int VIEW_REF = 12;
  53. private static final int SUB_SUBVIEW_REF = 123;
  54. private static final int PROJECT_VIEW_1_REF = 1231;
  55. private static final int PROJECT_VIEW_2_REF = 1232;
  56. private static final Component TREE_WITH_SUB_VIEWS = builder(VIEW, ROOT_REF)
  57. .addChildren(
  58. builder(SUBVIEW, VIEW_REF)
  59. .addChildren(
  60. builder(SUBVIEW, SUB_SUBVIEW_REF)
  61. .addChildren(
  62. builder(PROJECT_VIEW, PROJECT_VIEW_1_REF).build(),
  63. builder(PROJECT_VIEW, PROJECT_VIEW_2_REF).build())
  64. .build())
  65. .build())
  66. .build();
  67. private static final Component TREE_WITH_DIRECT_PROJECT_VIEW = builder(VIEW, ROOT_REF)
  68. .addChildren(
  69. builder(PROJECT_VIEW, PROJECT_VIEW_1_REF).build(),
  70. builder(PROJECT_VIEW, PROJECT_VIEW_2_REF).build())
  71. .build();
  72. private static final MeasureComputer MEASURE_COMPUTER = new MeasureComputer() {
  73. @Override
  74. public MeasureComputer.MeasureComputerDefinition define(MeasureComputer.MeasureComputerDefinitionContext defContext) {
  75. return new MeasureComputerDefinitionImpl.BuilderImpl()
  76. .setInputMetrics(NCLOC_KEY, COMMENT_LINES_KEY)
  77. .setOutputMetrics(NEW_METRIC_KEY)
  78. .build();
  79. }
  80. @Override
  81. public void compute(MeasureComputer.MeasureComputerContext context) {
  82. org.sonar.api.ce.measure.Measure ncloc = context.getMeasure(NCLOC_KEY);
  83. org.sonar.api.ce.measure.Measure comment = context.getMeasure(COMMENT_LINES_KEY);
  84. if (ncloc != null && comment != null) {
  85. context.addMeasure(NEW_METRIC_KEY, ncloc.getIntValue() + comment.getIntValue());
  86. }
  87. }
  88. };
  89. @RegisterExtension
  90. private final TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
  91. @RegisterExtension
  92. private final MetricRepositoryRule metricRepository = new MetricRepositoryRule()
  93. .add(NCLOC)
  94. .add(COMMENT_LINES)
  95. .add(NEW_METRIC);
  96. @RegisterExtension
  97. private final MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(TREE_WITH_SUB_VIEWS, metricRepository);
  98. @RegisterExtension
  99. private final MeasureComputersHolderRule measureComputersHolder = new MeasureComputersHolderRule(new TestMeasureComputerDefinitionContext());
  100. private final ComponentIssuesRepository componentIssuesRepository = mock(ComponentIssuesRepository.class);
  101. @Test
  102. void compute_plugin_measure() {
  103. treeRootHolder.setRoot(TREE_WITH_SUB_VIEWS);
  104. addRawMeasure(PROJECT_VIEW_1_REF, NCLOC_KEY, 10);
  105. addRawMeasure(PROJECT_VIEW_1_REF, COMMENT_LINES_KEY, 2);
  106. addRawMeasure(PROJECT_VIEW_2_REF, NCLOC_KEY, 40);
  107. addRawMeasure(PROJECT_VIEW_2_REF, COMMENT_LINES_KEY, 5);
  108. addRawMeasure(SUB_SUBVIEW_REF, NCLOC_KEY, 50);
  109. addRawMeasure(SUB_SUBVIEW_REF, COMMENT_LINES_KEY, 7);
  110. addRawMeasure(VIEW_REF, NCLOC_KEY, 50);
  111. addRawMeasure(VIEW_REF, COMMENT_LINES_KEY, 7);
  112. addRawMeasure(ROOT_REF, NCLOC_KEY, 50);
  113. addRawMeasure(ROOT_REF, COMMENT_LINES_KEY, 7);
  114. measureComputersHolder.addMeasureComputer(MEASURE_COMPUTER);
  115. VisitorsCrawler visitorsCrawler = new VisitorsCrawler(Arrays.asList(new MeasureComputersVisitor(metricRepository, measureRepository, null,
  116. measureComputersHolder, componentIssuesRepository)));
  117. visitorsCrawler.visit(treeRootHolder.getRoot());
  118. assertNoAddedRawMeasureOnProjectViews();
  119. assertAddedRawMeasure(57, SUB_SUBVIEW_REF, NEW_METRIC_KEY);
  120. assertAddedRawMeasure(57, VIEW_REF, NEW_METRIC_KEY);
  121. assertAddedRawMeasure(57, ROOT_REF, NEW_METRIC_KEY);
  122. }
  123. @Test
  124. void compute_plugin_measure_on_views_tree_having_only_one_view_with_a_project_view() {
  125. treeRootHolder.setRoot(TREE_WITH_DIRECT_PROJECT_VIEW);
  126. addRawMeasure(PROJECT_VIEW_1_REF, NCLOC_KEY, 10);
  127. addRawMeasure(PROJECT_VIEW_1_REF, COMMENT_LINES_KEY, 2);
  128. addRawMeasure(PROJECT_VIEW_2_REF, NCLOC_KEY, 40);
  129. addRawMeasure(PROJECT_VIEW_2_REF, COMMENT_LINES_KEY, 5);
  130. addRawMeasure(ROOT_REF, NCLOC_KEY, 50);
  131. addRawMeasure(ROOT_REF, COMMENT_LINES_KEY, 7);
  132. measureComputersHolder.addMeasureComputer(MEASURE_COMPUTER);
  133. VisitorsCrawler visitorsCrawler = new VisitorsCrawler(Arrays.asList(new MeasureComputersVisitor(metricRepository, measureRepository, null,
  134. measureComputersHolder, componentIssuesRepository)));
  135. visitorsCrawler.visit(treeRootHolder.getRoot());
  136. assertNoAddedRawMeasureOnProjectViews();
  137. assertAddedRawMeasure(57, ROOT_REF, NEW_METRIC_KEY);
  138. }
  139. @Test
  140. void nothing_to_compute_when_no_project_view() {
  141. treeRootHolder.setRoot(builder(VIEW, ROOT_REF)
  142. .addChildren(
  143. builder(SUBVIEW, VIEW_REF)
  144. .addChildren(
  145. builder(SUBVIEW, SUB_SUBVIEW_REF)
  146. .build())
  147. .build())
  148. .build());
  149. measureComputersHolder.addMeasureComputer(MEASURE_COMPUTER);
  150. VisitorsCrawler visitorsCrawler = new VisitorsCrawler(Arrays.asList(new MeasureComputersVisitor(metricRepository, measureRepository, null,
  151. measureComputersHolder, componentIssuesRepository)));
  152. visitorsCrawler.visit(treeRootHolder.getRoot());
  153. assertNoAddedRawMeasureOnProjectViews();
  154. assertNoAddedRawMeasure(SUB_SUBVIEW_REF);
  155. assertNoAddedRawMeasure(VIEW_REF);
  156. assertNoAddedRawMeasure(ROOT_REF);
  157. }
  158. @Test
  159. void nothing_to_compute_when_no_measure_computers() {
  160. treeRootHolder.setRoot(TREE_WITH_SUB_VIEWS);
  161. addRawMeasure(PROJECT_VIEW_1_REF, NCLOC_KEY, 10);
  162. addRawMeasure(PROJECT_VIEW_1_REF, COMMENT_LINES_KEY, 2);
  163. addRawMeasure(PROJECT_VIEW_2_REF, NCLOC_KEY, 40);
  164. addRawMeasure(PROJECT_VIEW_2_REF, COMMENT_LINES_KEY, 5);
  165. addRawMeasure(SUB_SUBVIEW_REF, NCLOC_KEY, 50);
  166. addRawMeasure(SUB_SUBVIEW_REF, COMMENT_LINES_KEY, 7);
  167. addRawMeasure(VIEW_REF, NCLOC_KEY, 50);
  168. addRawMeasure(VIEW_REF, COMMENT_LINES_KEY, 7);
  169. addRawMeasure(ROOT_REF, NCLOC_KEY, 50);
  170. addRawMeasure(ROOT_REF, COMMENT_LINES_KEY, 7);
  171. VisitorsCrawler visitorsCrawler = new VisitorsCrawler(Arrays.asList(new MeasureComputersVisitor(metricRepository, measureRepository, null,
  172. measureComputersHolder, componentIssuesRepository)));
  173. visitorsCrawler.visit(treeRootHolder.getRoot());
  174. assertNoAddedRawMeasureOnProjectViews();
  175. assertNoAddedRawMeasure(SUB_SUBVIEW_REF);
  176. assertNoAddedRawMeasure(VIEW_REF);
  177. assertNoAddedRawMeasure(ROOT_REF);
  178. }
  179. private void assertNoAddedRawMeasureOnProjectViews() {
  180. assertNoAddedRawMeasure(PROJECT_VIEW_1_REF);
  181. assertNoAddedRawMeasure(PROJECT_VIEW_2_REF);
  182. }
  183. private void addRawMeasure(int componentRef, String metricKey, int value) {
  184. measureRepository.addRawMeasure(componentRef, metricKey, newMeasureBuilder().create(value));
  185. }
  186. private void assertNoAddedRawMeasure(int componentRef) {
  187. assertThat(toEntries(measureRepository.getAddedRawMeasures(componentRef))).isEmpty();
  188. }
  189. private void assertAddedRawMeasure(int value, int componentRef, String metricKey) {
  190. assertThat(toEntries(measureRepository.getAddedRawMeasures(componentRef))).containsOnly(entryOf(metricKey, newMeasureBuilder().create(value)));
  191. }
  192. }