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.

ReportCoverageMeasuresStepTest.java 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2021 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.ce.task.projectanalysis.step;
  21. import org.junit.Before;
  22. import org.junit.Rule;
  23. import org.junit.Test;
  24. import org.sonar.api.measures.CoreMetrics;
  25. import org.sonar.ce.task.projectanalysis.batch.BatchReportReaderRule;
  26. import org.sonar.ce.task.projectanalysis.component.FileAttributes;
  27. import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
  28. import org.sonar.ce.task.projectanalysis.formula.coverage.LinesAndConditionsWithUncoveredMetricKeys;
  29. import org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry;
  30. import org.sonar.ce.task.projectanalysis.measure.MeasureRepositoryRule;
  31. import org.sonar.ce.task.projectanalysis.metric.MetricRepositoryRule;
  32. import org.sonar.ce.task.step.TestComputationStepContext;
  33. import org.sonar.scanner.protocol.output.ScannerReport;
  34. import static java.util.Arrays.asList;
  35. import static org.assertj.core.api.Assertions.assertThat;
  36. import static org.sonar.api.measures.CoreMetrics.CONDITIONS_TO_COVER_KEY;
  37. import static org.sonar.api.measures.CoreMetrics.LINES_TO_COVER_KEY;
  38. import static org.sonar.api.measures.CoreMetrics.UNCOVERED_CONDITIONS_KEY;
  39. import static org.sonar.api.measures.CoreMetrics.UNCOVERED_LINES_KEY;
  40. import static org.sonar.ce.task.projectanalysis.component.Component.Type.DIRECTORY;
  41. import static org.sonar.ce.task.projectanalysis.component.Component.Type.FILE;
  42. import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT;
  43. import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder;
  44. import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilder;
  45. import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.entryOf;
  46. import static org.sonar.ce.task.projectanalysis.measure.MeasureRepoEntry.toEntries;
  47. public class ReportCoverageMeasuresStepTest {
  48. private static final int ROOT_REF = 1;
  49. private static final int DIRECTORY_REF = 1234;
  50. private static final int FILE_1_REF = 12341;
  51. private static final int UNIT_TEST_FILE_REF = 12342;
  52. private static final int FILE_2_REF = 12343;
  53. @Rule
  54. public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
  55. @Rule
  56. public MetricRepositoryRule metricRepository = new MetricRepositoryRule()
  57. .add(CoreMetrics.LINES_TO_COVER)
  58. .add(CoreMetrics.CONDITIONS_TO_COVER)
  59. .add(CoreMetrics.UNCOVERED_LINES)
  60. .add(CoreMetrics.UNCOVERED_CONDITIONS)
  61. .add(CoreMetrics.COVERAGE)
  62. .add(CoreMetrics.BRANCH_COVERAGE)
  63. .add(CoreMetrics.LINE_COVERAGE);
  64. @Rule
  65. public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository);
  66. @Rule
  67. public BatchReportReaderRule reportReader = new BatchReportReaderRule();
  68. CoverageMeasuresStep underTest = new CoverageMeasuresStep(treeRootHolder, metricRepository, measureRepository, reportReader);
  69. @Before
  70. public void setUp() {
  71. treeRootHolder.setRoot(
  72. builder(PROJECT, ROOT_REF)
  73. .addChildren(
  74. builder(DIRECTORY, DIRECTORY_REF)
  75. .addChildren(
  76. builder(FILE, FILE_1_REF).build(),
  77. builder(FILE, UNIT_TEST_FILE_REF).setFileAttributes(new FileAttributes(true, "some language", 1)).build(),
  78. builder(FILE, FILE_2_REF).build())
  79. .build())
  80. .build());
  81. }
  82. @Test
  83. public void verify_aggregates_values_for_lines_and_conditions() {
  84. reportReader.putCoverage(FILE_1_REF,
  85. asList(
  86. ScannerReport.LineCoverage.newBuilder().setLine(2).setHits(false).build(),
  87. ScannerReport.LineCoverage.newBuilder().setLine(3).setHits(true).build(),
  88. ScannerReport.LineCoverage.newBuilder().setLine(4).setHits(true).setConditions(4).setCoveredConditions(1).build(),
  89. ScannerReport.LineCoverage.newBuilder().setLine(5).setConditions(8).setCoveredConditions(2).build(),
  90. ScannerReport.LineCoverage.newBuilder().setLine(6).setHits(false).setConditions(3).setCoveredConditions(0).build(),
  91. ScannerReport.LineCoverage.newBuilder().setLine(7).setHits(false).build()));
  92. reportReader.putCoverage(FILE_2_REF,
  93. asList(
  94. ScannerReport.LineCoverage.newBuilder().setLine(2).setHits(true).build(),
  95. ScannerReport.LineCoverage.newBuilder().setLine(3).setHits(false).build(),
  96. ScannerReport.LineCoverage.newBuilder().setLine(5).setHits(true).setConditions(5).setCoveredConditions(1).build(),
  97. ScannerReport.LineCoverage.newBuilder().setLine(6).setConditions(10).setCoveredConditions(3).build(),
  98. ScannerReport.LineCoverage.newBuilder().setLine(7).setHits(false).setConditions(1).setCoveredConditions(0).build(),
  99. ScannerReport.LineCoverage.newBuilder().setLine(8).setHits(false).build()));
  100. underTest.execute(new TestComputationStepContext());
  101. MeasureRepoEntry[] nonFileRepoEntries = {
  102. entryOf(LINES_TO_COVER_KEY, newMeasureBuilder().create(5 + 5)),
  103. entryOf(CONDITIONS_TO_COVER_KEY, newMeasureBuilder().create(4 + 8 + 3 + 5 + 10 + 1)),
  104. entryOf(UNCOVERED_LINES_KEY, newMeasureBuilder().create(3 + 3)),
  105. entryOf(UNCOVERED_CONDITIONS_KEY, newMeasureBuilder().create(3 + 6 + 3 + 4 + 7 + 1))
  106. };
  107. assertThat(toEntries(measureRepository.getAddedRawMeasures(DIRECTORY_REF))).contains(nonFileRepoEntries);
  108. assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).contains(nonFileRepoEntries);
  109. }
  110. @Test
  111. public void verify_aggregates_values_for_code_line_and_branch_coverage() {
  112. LinesAndConditionsWithUncoveredMetricKeys metricKeys = new LinesAndConditionsWithUncoveredMetricKeys(
  113. LINES_TO_COVER_KEY, CONDITIONS_TO_COVER_KEY,
  114. UNCOVERED_LINES_KEY, UNCOVERED_CONDITIONS_KEY);
  115. String codeCoverageKey = CoreMetrics.COVERAGE_KEY;
  116. String lineCoverageKey = CoreMetrics.LINE_COVERAGE_KEY;
  117. String branchCoverageKey = CoreMetrics.BRANCH_COVERAGE_KEY;
  118. verify_coverage_aggregates_values(metricKeys, codeCoverageKey, lineCoverageKey, branchCoverageKey);
  119. }
  120. private void verify_coverage_aggregates_values(LinesAndConditionsWithUncoveredMetricKeys metricKeys, String codeCoverageKey, String lineCoverageKey, String branchCoverageKey) {
  121. measureRepository
  122. .addRawMeasure(FILE_1_REF, metricKeys.getLines(), newMeasureBuilder().create(3000))
  123. .addRawMeasure(FILE_1_REF, metricKeys.getConditions(), newMeasureBuilder().create(300))
  124. .addRawMeasure(FILE_1_REF, metricKeys.getUncoveredLines(), newMeasureBuilder().create(30))
  125. .addRawMeasure(FILE_1_REF, metricKeys.getUncoveredConditions(), newMeasureBuilder().create(9))
  126. .addRawMeasure(FILE_2_REF, metricKeys.getLines(), newMeasureBuilder().create(2000))
  127. .addRawMeasure(FILE_2_REF, metricKeys.getConditions(), newMeasureBuilder().create(400))
  128. .addRawMeasure(FILE_2_REF, metricKeys.getUncoveredLines(), newMeasureBuilder().create(200))
  129. .addRawMeasure(FILE_2_REF, metricKeys.getUncoveredConditions(), newMeasureBuilder().create(16));
  130. underTest.execute(new TestComputationStepContext());
  131. assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_1_REF))).contains(
  132. entryOf(codeCoverageKey, newMeasureBuilder().create(98.8d, 1)),
  133. entryOf(lineCoverageKey, newMeasureBuilder().create(99d, 1)),
  134. entryOf(branchCoverageKey, newMeasureBuilder().create(97d, 1)));
  135. assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_2_REF))).contains(
  136. entryOf(codeCoverageKey, newMeasureBuilder().create(91d, 1)),
  137. entryOf(lineCoverageKey, newMeasureBuilder().create(90d, 1)),
  138. entryOf(branchCoverageKey, newMeasureBuilder().create(96d, 1)));
  139. assertThat(toEntries(measureRepository.getAddedRawMeasures(UNIT_TEST_FILE_REF))).isEmpty();
  140. MeasureRepoEntry[] nonFileRepoEntries = {
  141. entryOf(codeCoverageKey, newMeasureBuilder().create(95.5d, 1)),
  142. entryOf(lineCoverageKey, newMeasureBuilder().create(95.4d, 1)),
  143. entryOf(branchCoverageKey, newMeasureBuilder().create(96.4d, 1))
  144. };
  145. assertThat(toEntries(measureRepository.getAddedRawMeasures(DIRECTORY_REF))).contains(nonFileRepoEntries);
  146. assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).contains(nonFileRepoEntries);
  147. }
  148. }