]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8282 Deprecate overall/it coverage fields from file sources 1337/head
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 26 Oct 2016 13:56:21 +0000 (15:56 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 26 Oct 2016 15:26:19 +0000 (17:26 +0200)
16 files changed:
it/it-tests/src/test/resources/test/CoverageTest/it_coverage-expected.json
it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage-expected.json
it/it-tests/src/test/resources/test/CoverageTest/unit_test_coverage_no_condition-expected.json
it/it-tests/src/test/resources/test/CoverageTest/ut_and_it_coverage-expected.json
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/source/CoverageLineReader.java
server/sonar-server/src/main/java/org/sonar/server/source/ws/LinesAction.java
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/source/CoverageLineReaderTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStepTest.java
server/sonar-server/src/test/java/org/sonar/server/source/index/FileSourceTesting.java
server/sonar-server/src/test/java/org/sonar/server/source/ws/LinesActionTest.java
server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/convert_deprecated_data.json [new file with mode: 0644]
server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/display_deprecated_fields.json [new file with mode: 0644]
server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/show_paginated_lines.json
server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/show_source.json
sonar-db/src/main/java/org/sonar/db/version/v51/FeedFileSourcesBinaryData.java
sonar-db/src/main/protobuf/db-file-sources.proto

index 25e10e11bd35da7de2f0c9c5fe32a5abcae47455..521b372b6ea367cfc0cddea0b63530dde7efd561 100644 (file)
@@ -23,6 +23,7 @@
     {
       "line": 6,
       "code": "\t\tint j = i++;",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
     {
       "line": 10,
       "code": "\t\tif (foo == bar) {",
+      "lineHits": 0,
       "utLineHits": 0,
+      "conditions": 2,
       "utConditions": 2,
+      "coveredConditions": 1,
       "utCoveredConditions": 1
     },
     {
       "line": 11,
       "code": "\t\t\treturn \"hello\";",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
@@ -56,6 +61,7 @@
     {
       "line": 13,
       "code": "\t\t\tthrow new IllegalStateException();",
+      "lineHits": 0,
       "utLineHits": 0
     },
     {
index ae72588b5b06e56199c54474abc5fa49d73ec4d6..c2f25a610a93c54a6bed24949a6a18569548fc41 100644 (file)
@@ -23,6 +23,7 @@
     {
       "line": 6,
       "code": "\t\tint j = i++;",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
     {
       "line": 10,
       "code": "\t\tif (foo == bar) {",
+      "lineHits": 0,
       "utLineHits": 0,
+      "conditions": 2,
       "utConditions": 2,
+      "coveredConditions": 1,
       "utCoveredConditions": 1
     },
     {
       "line": 11,
       "code": "\t\t\treturn \"hello\";",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
@@ -56,6 +61,7 @@
     {
       "line": 13,
       "code": "\t\t\tthrow new IllegalStateException();",
+      "lineHits": 0,
       "utLineHits": 0
     },
     {
index 6f5d2f7cd10e3968f46f9e5823d6f6ed16fda6ac..aabf73102ff176c41793b6e443e8c21569d2fb48 100644 (file)
@@ -23,6 +23,7 @@
     {
       "line": 6,
       "code": "\t\tint j = i++;",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
     {
       "line": 10,
       "code": "\t\tif (foo == bar) {",
+      "lineHits": 0,
       "utLineHits": 0
     },
     {
       "line": 11,
       "code": "\t\t\treturn \"hello\";",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
@@ -54,6 +57,7 @@
     {
       "line": 13,
       "code": "\t\t\tthrow new IllegalStateException();",
+      "lineHits": 0,
       "utLineHits": 0
     },
     {
index 49e3401459df90eb73f4d12dd443ed705c3384e2..d2b26d19c6100bb7c218aa435579c820ce1368ac 100644 (file)
@@ -23,6 +23,7 @@
     {
       "line": 6,
       "code": "\t\tint j = i++;",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
     {
       "line": 10,
       "code": "\t\tif (foo == bar &amp;&amp; biz &gt; 1) {",
+      "lineHits": 0,
       "utLineHits": 0,
+      "conditions": 4,
       "utConditions": 4,
+      "coveredConditions": 2,
       "utCoveredConditions": 2
     },
     {
       "line": 11,
       "code": "\t\t\treturn \"hello\";",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
@@ -56,6 +61,7 @@
     {
       "line": 13,
       "code": "\t\t\tthrow new IllegalStateException();",
+      "lineHits": 1,
       "utLineHits": 1
     },
     {
index 1f3fdedbf5fb72ca092c79a7eacea664a07cd4b5..2998d75bb46c60ed6c0834fd2e6df5c320de535b 100644 (file)
@@ -39,29 +39,18 @@ public class CoverageLineReader implements LineReader {
   public void read(DbFileSources.Line.Builder lineBuilder) {
     ScannerReport.LineCoverage reportCoverage = getNextLineCoverageIfMatchLine(lineBuilder.getLine());
     if (reportCoverage != null) {
-      processUnitTest(lineBuilder, reportCoverage);
-      processOverallTest(lineBuilder, reportCoverage);
+      processCoverage(lineBuilder, reportCoverage);
       coverage = null;
     }
   }
 
-  private static void processUnitTest(DbFileSources.Line.Builder lineBuilder, ScannerReport.LineCoverage reportCoverage) {
+  private static void processCoverage(DbFileSources.Line.Builder lineBuilder, ScannerReport.LineCoverage reportCoverage) {
     if (reportCoverage.getHasHitsCase() == HasHitsCase.HITS) {
-      lineBuilder.setUtLineHits(reportCoverage.getHits() ? 1 : 0);
+      lineBuilder.setLineHits(reportCoverage.getHits() ? 1 : 0);
     }
     if (reportCoverage.getHasCoveredConditionsCase() == HasCoveredConditionsCase.COVERED_CONDITIONS) {
-      lineBuilder.setUtConditions(reportCoverage.getConditions());
-      lineBuilder.setUtCoveredConditions(reportCoverage.getCoveredConditions());
-    }
-  }
-
-  private static void processOverallTest(DbFileSources.Line.Builder lineBuilder, ScannerReport.LineCoverage reportCoverage) {
-    if (reportCoverage.getHasHitsCase() == HasHitsCase.HITS) {
-      lineBuilder.setOverallLineHits(reportCoverage.getHits() ? 1 : 0);
-    }
-    if (reportCoverage.getHasCoveredConditionsCase() == HasCoveredConditionsCase.COVERED_CONDITIONS) {
-      lineBuilder.setOverallConditions(reportCoverage.getConditions());
-      lineBuilder.setOverallCoveredConditions(reportCoverage.getCoveredConditions());
+      lineBuilder.setConditions(reportCoverage.getConditions());
+      lineBuilder.setCoveredConditions(reportCoverage.getCoveredConditions());
     }
   }
 
index e3dbdd0bc397a07aba5013315aea25e3cb7644a5..0d24edaa0f963a59c42b371ef3d08d590b65b23f 100644 (file)
@@ -20,9 +20,9 @@
 package org.sonar.server.source.ws;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Optional;
 import com.google.common.io.Resources;
 import java.util.Date;
+import java.util.Optional;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -56,7 +56,7 @@ public class LinesAction implements SourcesWsAction {
   private final UserSession userSession;
 
   public LinesAction(ComponentFinder componentFinder, DbClient dbClient, SourceService sourceService,
-                     HtmlSourceDecorator htmlSourceDecorator, UserSession userSession) {
+    HtmlSourceDecorator htmlSourceDecorator, UserSession userSession) {
     this.componentFinder = componentFinder;
     this.sourceService = sourceService;
     this.htmlSourceDecorator = htmlSourceDecorator;
@@ -75,13 +75,12 @@ public class LinesAction implements SourcesWsAction {
         "<li>Author of the line (from SCM information)</li>" +
         "<li>Revision of the line (from SCM information)</li>" +
         "<li>Last commit date of the line (from SCM information)</li>" +
-        "<li>Line hits from unit test coverage</li>" +
-        "<li>Number of conditions to cover in unit tests</li>" +
-        "<li>Number of conditions covered by unit tests</li>" +
-        "<li>Line hits from integration test coverage</li>" +
-        "<li>Number of conditions to cover in integration tests</li>" +
-        "<li>Number of conditions covered by integration tests</li>" +
-        "</ol>")
+        "<li>Line hits from coverage</li>" +
+        "<li>Number of conditions to cover in tests</li>" +
+        "<li>Number of conditions covered by tests</li>" +
+        "</ol>" +
+        "Since 6.2, response fields utLineHits, utConditions and utCoveredConditions has been renamed lineHits, conditions and coveredConditions<br/>" +
+        "Since 6.2, response fields itLineHits, itConditions and itCoveredConditions are no more returned<br/>")
       .setSince("5.0")
       .setInternal(true)
       .setResponseExample(Resources.getResource(getClass(), "example-lines.json"))
@@ -121,7 +120,7 @@ public class LinesAction implements SourcesWsAction {
       int from = request.mandatoryParamAsInt(PARAM_FROM);
       int to = MoreObjects.firstNonNull(request.paramAsInt(PARAM_TO), Integer.MAX_VALUE);
 
-      Optional<Iterable<DbFileSources.Line>> lines = sourceService.getLines(dbSession, file.uuid(), from, to);
+      com.google.common.base.Optional<Iterable<DbFileSources.Line>> lines = sourceService.getLines(dbSession, file.uuid(), from, to);
       if (!lines.isPresent()) {
         throw new NotFoundException();
       }
@@ -145,23 +144,20 @@ public class LinesAction implements SourcesWsAction {
       if (line.hasScmDate()) {
         json.prop("scmDate", DateUtils.formatDateTime(new Date(line.getScmDate())));
       }
-      if (line.hasUtLineHits()) {
-        json.prop("utLineHits", line.getUtLineHits());
+      Optional<Integer> lineHits = getLineHits(line);
+      if (lineHits.isPresent()) {
+        json.prop("utLineHits", lineHits.get());
+        json.prop("lineHits", lineHits.get());
       }
-      if (line.hasUtConditions()) {
-        json.prop("utConditions", line.getUtConditions());
+      Optional<Integer> conditions = getConditions(line);
+      if (conditions.isPresent()) {
+        json.prop("utConditions", conditions.get());
+        json.prop("conditions", conditions.get());
       }
-      if (line.hasUtCoveredConditions()) {
-        json.prop("utCoveredConditions", line.getUtCoveredConditions());
-      }
-      if (line.hasItLineHits()) {
-        json.prop("itLineHits", line.getItLineHits());
-      }
-      if (line.hasItConditions()) {
-        json.prop("itConditions", line.getItConditions());
-      }
-      if (line.hasItCoveredConditions()) {
-        json.prop("itCoveredConditions", line.getItCoveredConditions());
+      Optional<Integer> coveredConditions = getCoveredConditions(line);
+      if (coveredConditions.isPresent()) {
+        json.prop("utCoveredConditions", coveredConditions.get());
+        json.prop("coveredConditions", coveredConditions.get());
       }
       json.prop("duplicated", line.getDuplicationCount() > 0);
       json.endObject();
@@ -169,4 +165,43 @@ public class LinesAction implements SourcesWsAction {
     json.endArray();
   }
 
+  private static Optional<Integer> getLineHits(DbFileSources.Line line) {
+    if (line.hasLineHits()) {
+      return Optional.of(line.getLineHits());
+    } else if (line.hasDeprecatedOverallLineHits()) {
+      return Optional.of(line.getDeprecatedOverallLineHits());
+    } else if (line.hasDeprecatedUtLineHits()) {
+      return Optional.of(line.getDeprecatedUtLineHits());
+    } else if (line.hasDeprecatedItLineHits()) {
+      return Optional.of(line.getDeprecatedItLineHits());
+    }
+    return Optional.empty();
+  }
+
+  private static Optional<Integer> getConditions(DbFileSources.Line line) {
+    if (line.hasConditions()) {
+      return Optional.of(line.getConditions());
+    } else if (line.hasDeprecatedOverallConditions()) {
+      return Optional.of(line.getDeprecatedOverallConditions());
+    } else if (line.hasDeprecatedUtConditions()) {
+      return Optional.of(line.getDeprecatedUtConditions());
+    } else if (line.hasDeprecatedItConditions()) {
+      return Optional.of(line.getDeprecatedItConditions());
+    }
+    return Optional.empty();
+  }
+
+  private static Optional<Integer> getCoveredConditions(DbFileSources.Line line) {
+    if (line.hasCoveredConditions()) {
+      return Optional.of(line.getCoveredConditions());
+    } else if (line.hasDeprecatedOverallCoveredConditions()) {
+      return Optional.of(line.getDeprecatedOverallCoveredConditions());
+    } else if (line.hasDeprecatedUtCoveredConditions()) {
+      return Optional.of(line.getDeprecatedUtCoveredConditions());
+    } else if (line.hasDeprecatedItCoveredConditions()) {
+      return Optional.of(line.getDeprecatedItCoveredConditions());
+    }
+    return Optional.empty();
+  }
+
 }
index 7a756748e8d25d0d07d5fd9255bc275361a59a23..285838c30db3dd392952692c160dd40ddb41f18e 100644 (file)
@@ -41,8 +41,9 @@ public class CoverageLineReaderTest {
     DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
     computeCoverageLine.read(lineBuilder);
 
-    assertThat(lineBuilder.getUtLineHits()).isEqualTo(1);
-    assertThat(lineBuilder.getUtConditions()).isEqualTo(10);
+    assertThat(lineBuilder.getLineHits()).isEqualTo(1);
+    assertThat(lineBuilder.getConditions()).isEqualTo(10);
+    assertThat(lineBuilder.getCoveredConditions()).isEqualTo(2);
   }
 
   // Some tools are only able to report condition coverage
@@ -57,35 +58,8 @@ public class CoverageLineReaderTest {
     DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
     computeCoverageLine.read(lineBuilder);
 
-    assertThat(lineBuilder.hasUtLineHits()).isFalse();
-    assertThat(lineBuilder.getUtConditions()).isEqualTo(10);
-    assertThat(lineBuilder.hasItLineHits()).isFalse();
-    assertThat(lineBuilder.hasOverallLineHits()).isFalse();
-    assertThat(lineBuilder.hasOverallConditions()).isTrue();
-    assertThat(lineBuilder.getOverallConditions()).isEqualTo(10);
-  }
-
-  @Test
-  public void set_coverage_only_ut() {
-    CoverageLineReader computeCoverageLine = new CoverageLineReader(newArrayList(ScannerReport.LineCoverage.newBuilder()
-      .setLine(1)
-      .setConditions(10)
-      .setHits(true)
-      .setCoveredConditions(2)
-      .build()).iterator());
-
-    DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
-    computeCoverageLine.read(lineBuilder);
-
-    assertThat(lineBuilder.getUtLineHits()).isEqualTo(1);
-    assertThat(lineBuilder.getUtConditions()).isEqualTo(10);
-    assertThat(lineBuilder.getUtCoveredConditions()).isEqualTo(2);
-    assertThat(lineBuilder.hasItLineHits()).isFalse();
-    assertThat(lineBuilder.hasItConditions()).isFalse();
-    assertThat(lineBuilder.hasItCoveredConditions()).isFalse();
-    assertThat(lineBuilder.getOverallLineHits()).isEqualTo(1);
-    assertThat(lineBuilder.hasOverallCoveredConditions()).isTrue();
-    assertThat(lineBuilder.getOverallCoveredConditions()).isEqualTo(2);
+    assertThat(lineBuilder.hasLineHits()).isFalse();
+    assertThat(lineBuilder.getConditions()).isEqualTo(10);
   }
 
   @Test
@@ -98,49 +72,8 @@ public class CoverageLineReaderTest {
     DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
     computeCoverageLine.read(lineBuilder);
 
-    assertThat(lineBuilder.hasUtLineHits()).isTrue();
-    assertThat(lineBuilder.getUtLineHits()).isEqualTo(0);
-    assertThat(lineBuilder.hasOverallLineHits()).isTrue();
-    assertThat(lineBuilder.getOverallLineHits()).isEqualTo(0);
-  }
-
-  @Test
-  public void set_overall_line_hits_with_only_ut() {
-    CoverageLineReader computeCoverageLine = new CoverageLineReader(newArrayList(ScannerReport.LineCoverage.newBuilder()
-      .setLine(1)
-      .setHits(true)
-      .build()).iterator());
-
-    DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
-    computeCoverageLine.read(lineBuilder);
-
-    assertThat(lineBuilder.getOverallLineHits()).isEqualTo(1);
-  }
-
-  @Test
-  public void set_overall_line_hits_with_only_it() {
-    CoverageLineReader computeCoverageLine = new CoverageLineReader(newArrayList(ScannerReport.LineCoverage.newBuilder()
-      .setLine(1)
-      .setHits(true)
-      .build()).iterator());
-
-    DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
-    computeCoverageLine.read(lineBuilder);
-
-    assertThat(lineBuilder.getOverallLineHits()).isEqualTo(1);
-  }
-
-  @Test
-  public void set_overall_line_hits_with_ut_and_it() {
-    CoverageLineReader computeCoverageLine = new CoverageLineReader(newArrayList(ScannerReport.LineCoverage.newBuilder()
-      .setLine(1)
-      .setHits(true)
-      .build()).iterator());
-
-    DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
-    computeCoverageLine.read(lineBuilder);
-
-    assertThat(lineBuilder.getOverallLineHits()).isEqualTo(1);
+    assertThat(lineBuilder.hasLineHits()).isTrue();
+    assertThat(lineBuilder.getLineHits()).isEqualTo(0);
   }
 
   @Test
@@ -150,13 +83,9 @@ public class CoverageLineReaderTest {
     DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
     computeCoverageLine.read(lineBuilder);
 
-    assertThat(lineBuilder.hasUtLineHits()).isFalse();
-    assertThat(lineBuilder.hasUtConditions()).isFalse();
-    assertThat(lineBuilder.hasItLineHits()).isFalse();
-    assertThat(lineBuilder.hasItConditions()).isFalse();
-    assertThat(lineBuilder.hasItCoveredConditions()).isFalse();
-    assertThat(lineBuilder.hasOverallLineHits()).isFalse();
-    assertThat(lineBuilder.hasOverallConditions()).isFalse();
+    assertThat(lineBuilder.hasLineHits()).isFalse();
+    assertThat(lineBuilder.hasConditions()).isFalse();
+    assertThat(lineBuilder.hasCoveredConditions()).isFalse();
   }
 
   @Test
@@ -174,13 +103,9 @@ public class CoverageLineReaderTest {
     DbFileSources.Line.Builder line2Builder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(2);
     computeCoverageLine.read(line2Builder);
 
-    assertThat(line2Builder.hasUtLineHits()).isFalse();
-    assertThat(line2Builder.hasUtConditions()).isFalse();
-    assertThat(line2Builder.hasItLineHits()).isFalse();
-    assertThat(line2Builder.hasItConditions()).isFalse();
-    assertThat(line2Builder.hasItCoveredConditions()).isFalse();
-    assertThat(line2Builder.hasOverallLineHits()).isFalse();
-    assertThat(line2Builder.hasOverallConditions()).isFalse();
+    assertThat(line2Builder.hasLineHits()).isFalse();
+    assertThat(line2Builder.hasConditions()).isFalse();
+    assertThat(line2Builder.hasCoveredConditions()).isFalse();
   }
 
   @Test
@@ -201,13 +126,32 @@ public class CoverageLineReaderTest {
     computeCoverageLine.read(line1Builder);
     computeCoverageLine.read(line2Builder);
 
-    assertThat(line2Builder.hasUtLineHits()).isFalse();
-    assertThat(line2Builder.hasUtConditions()).isFalse();
-    assertThat(line2Builder.hasItLineHits()).isFalse();
-    assertThat(line2Builder.hasItConditions()).isFalse();
-    assertThat(line2Builder.hasItCoveredConditions()).isFalse();
-    assertThat(line2Builder.hasOverallLineHits()).isFalse();
-    assertThat(line2Builder.hasOverallConditions()).isFalse();
+    assertThat(line2Builder.hasLineHits()).isFalse();
+    assertThat(line2Builder.hasConditions()).isFalse();
+    assertThat(line2Builder.hasCoveredConditions()).isFalse();
+  }
+
+  @Test
+  public void does_not_set_deprecated_coverage_fields() {
+    CoverageLineReader computeCoverageLine = new CoverageLineReader(newArrayList(ScannerReport.LineCoverage.newBuilder()
+      .setLine(1)
+      .setConditions(10)
+      .setHits(true)
+      .setCoveredConditions(2)
+      .build()).iterator());
+
+    DbFileSources.Line.Builder lineBuilder = DbFileSources.Data.newBuilder().addLinesBuilder().setLine(1);
+    computeCoverageLine.read(lineBuilder);
+
+    assertThat(lineBuilder.hasDeprecatedUtLineHits()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedUtConditions()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedUtCoveredConditions()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedOverallLineHits()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedOverallConditions()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedOverallCoveredConditions()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedItLineHits()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedItConditions()).isFalse();
+    assertThat(lineBuilder.hasDeprecatedItCoveredConditions()).isFalse();
   }
 
 }
index 387241fce2ff47fe96ed0104a2aeeb07043957a7..b267afd4f0bdb0a8b189b5bd4c3d060636a81ac8 100644 (file)
@@ -150,9 +150,9 @@ public class PersistFileSourcesStepTest extends BaseStepTest {
 
     assertThat(data.getLinesList()).hasSize(1);
 
-    assertThat(data.getLines(0).getUtLineHits()).isEqualTo(1);
-    assertThat(data.getLines(0).getUtConditions()).isEqualTo(10);
-    assertThat(data.getLines(0).getUtCoveredConditions()).isEqualTo(2);
+    assertThat(data.getLines(0).getLineHits()).isEqualTo(1);
+    assertThat(data.getLines(0).getConditions()).isEqualTo(10);
+    assertThat(data.getLines(0).getCoveredConditions()).isEqualTo(2);
   }
 
   @Test
index abf1a94c1f9ce7aa8949b0b7ba990dc03425ca54..27b387427df9798e945f0b8df4c5a477a4cad145 100644 (file)
@@ -59,15 +59,9 @@ public class FileSourceTesting {
         .setScmAuthor("AUTHOR_" + i)
         .setScmDate(1_500_000_000_00L + i)
         .setSource("SOURCE_" + i)
-        .setUtLineHits(i)
-        .setUtConditions(i + 1)
-        .setUtCoveredConditions(i + 2)
-        .setItLineHits(i + 3)
-        .setItConditions(i + 4)
-        .setItCoveredConditions(i + 5)
-        .setOverallLineHits(i + 6)
-        .setOverallConditions(i + 7)
-        .setOverallCoveredConditions(i + 8)
+        .setLineHits(i)
+        .setConditions(i + 1)
+        .setCoveredConditions(i + 2)
         .setHighlighting("HIGHLIGHTING_" + i)
         .setSymbols("SYMBOLS_" + i)
         .addAllDuplication(Arrays.asList(i))
@@ -88,15 +82,9 @@ public class FileSourceTesting {
         .setScmAuthor(RandomStringUtils.randomAlphanumeric(10))
         .setScmDate(RandomUtils.nextLong())
         .setSource(RandomStringUtils.randomAlphanumeric(20))
-        .setUtLineHits(RandomUtils.nextInt(4))
-        .setUtConditions(RandomUtils.nextInt(4))
-        .setUtCoveredConditions(RandomUtils.nextInt(4))
-        .setItLineHits(RandomUtils.nextInt(4))
-        .setItConditions(RandomUtils.nextInt(4))
-        .setItCoveredConditions(RandomUtils.nextInt(4))
-        .setOverallLineHits(RandomUtils.nextInt(4))
-        .setOverallConditions(RandomUtils.nextInt(4))
-        .setOverallCoveredConditions(RandomUtils.nextInt(4))
+        .setLineHits(RandomUtils.nextInt(4))
+        .setConditions(RandomUtils.nextInt(4))
+        .setCoveredConditions(RandomUtils.nextInt(4))
         .setHighlighting(RandomStringUtils.randomAlphanumeric(40))
         .setSymbols(RandomStringUtils.randomAlphanumeric(30))
         .addAllDuplication(Arrays.asList(RandomUtils.nextInt(200), RandomUtils.nextInt(200)))
index d0e7fc2e4f37843aa44cee1e516ccb6af14b6be9..11357855d6ce0179bc48cf8db551d80d74da1846 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.server.source.ws;
 
+import java.io.IOException;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -31,6 +32,7 @@ import org.sonar.db.DbTester;
 import org.sonar.db.component.ComponentDao;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.component.ComponentTesting;
+import org.sonar.db.protobuf.DbFileSources;
 import org.sonar.db.source.FileSourceDto;
 import org.sonar.server.component.ComponentFinder;
 import org.sonar.server.exceptions.ForbiddenException;
@@ -41,8 +43,6 @@ import org.sonar.server.source.index.FileSourceTesting;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.WsTester;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.fail;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -54,7 +54,7 @@ public class LinesActionTest {
   private static final String FILE_KEY = "Foo.java";
 
   @Rule
-  public ExpectedException thrown = ExpectedException.none();
+  public ExpectedException expectedException = ExpectedException.none();
 
   @Rule
   public DbTester dbTester = DbTester.create(System2.INSTANCE);
@@ -87,44 +87,26 @@ public class LinesActionTest {
 
   @Test
   public void show_source() throws Exception {
-    newFile();
-
-    dbTester.getDbClient().fileSourceDao().insert(new FileSourceDto()
-      .setProjectUuid(PROJECT_UUID)
-      .setFileUuid(FILE_UUID)
-      .setSourceData(FileSourceTesting.newFakeData(3).build()));
-
-    userSessionRule.login("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+    setUserWithValidPermission();
+    insertFileWithData(FileSourceTesting.newFakeData(3).build());
 
     WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines").setParam("uuid", FILE_UUID);
     request.execute().assertJson(getClass(), "show_source.json");
   }
 
   @Test
-  public void fail_to_show_source_if_no_source_found() {
-    newFile();
+  public void fail_to_show_source_if_no_source_found() throws Exception {
+    setUserWithValidPermission();
+    insertFile();
 
-    userSessionRule.login("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
-
-    try {
-      WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines").setParam("uuid", FILE_UUID);
-      request.execute();
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(NotFoundException.class);
-    }
+    expectedException.expect(NotFoundException.class);
+    wsTester.newGetRequest("api/sources", "lines").setParam("uuid", FILE_UUID).execute();
   }
 
   @Test
   public void show_paginated_lines() throws Exception {
-    newFile();
-
-    userSessionRule.login("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
-
-    dbTester.getDbClient().fileSourceDao().insert(new FileSourceDto()
-      .setProjectUuid(PROJECT_UUID)
-      .setFileUuid(FILE_UUID)
-      .setSourceData(FileSourceTesting.newFakeData(3).build()));
+    setUserWithValidPermission();
+    insertFileWithData(FileSourceTesting.newFakeData(3).build());
 
     WsTester.TestRequest request = wsTester
       .newGetRequest("api/sources", "lines")
@@ -136,8 +118,8 @@ public class LinesActionTest {
 
   @Test
   public void fail_when_no_uuid_or_key_param() throws Exception {
-    thrown.expect(IllegalArgumentException.class);
-    thrown.expectMessage("Either 'uuid' or 'key' must be provided, not both");
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("Either 'uuid' or 'key' must be provided, not both");
 
     WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines");
     request.execute();
@@ -145,8 +127,8 @@ public class LinesActionTest {
 
   @Test
   public void fail_when_file_key_does_not_exist() throws Exception {
-    thrown.expect(NotFoundException.class);
-    thrown.expectMessage("Component key 'Foo.java' not found");
+    expectedException.expect(NotFoundException.class);
+    expectedException.expectMessage("Component key 'Foo.java' not found");
 
     WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines").setParam("key", FILE_KEY);
     request.execute();
@@ -154,8 +136,8 @@ public class LinesActionTest {
 
   @Test
   public void fail_when_file_uuid_does_not_exist() throws Exception {
-    thrown.expect(NotFoundException.class);
-    thrown.expectMessage("Component id 'ABCD' not found");
+    expectedException.expect(NotFoundException.class);
+    expectedException.expectMessage("Component id 'ABCD' not found");
 
     WsTester.TestRequest request = wsTester.newGetRequest("api/sources", "lines").setParam("uuid", "ABCD");
     request.execute();
@@ -163,7 +145,7 @@ public class LinesActionTest {
 
   @Test(expected = ForbiddenException.class)
   public void should_check_permission() throws Exception {
-    newFile();
+    insertFileWithData(FileSourceTesting.newFakeData(1).build());
 
     userSessionRule.login("login");
 
@@ -172,10 +154,100 @@ public class LinesActionTest {
       .execute();
   }
 
-  private void newFile() {
+  @Test
+  public void display_deprecated_fields() throws Exception {
+    setUserWithValidPermission();
+    insertFileWithData(FileSourceTesting.newFakeData(1).build());
+
+    WsTester.TestRequest request = wsTester
+      .newGetRequest("api/sources", "lines")
+      .setParam("uuid", FILE_UUID);
+
+    request.execute().assertJson(getClass(), "display_deprecated_fields.json");
+  }
+
+  @Test
+  public void use_deprecated_overall_coverage_fields_if_exists() throws Exception {
+    setUserWithValidPermission();
+    DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder();
+    insertFileWithData(dataBuilder.addLines(newLineBuilder()
+      .setDeprecatedOverallLineHits(1)
+      .setDeprecatedOverallConditions(2)
+      .setDeprecatedOverallCoveredConditions(3)
+      .setDeprecatedUtLineHits(1)
+      .setDeprecatedUtConditions(2)
+      .setDeprecatedUtCoveredConditions(3)
+      .setDeprecatedItLineHits(1)
+      .setDeprecatedItConditions(2)
+      .setDeprecatedItCoveredConditions(3)).build());
+
+    WsTester.TestRequest request = wsTester
+      .newGetRequest("api/sources", "lines")
+      .setParam("uuid", FILE_UUID);
+
+    request.execute().assertJson(getClass(), "convert_deprecated_data.json");
+  }
+
+  @Test
+  public void use_deprecated_ut_coverage_fields_if_exists() throws Exception {
+    setUserWithValidPermission();
+    DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder();
+    insertFileWithData(dataBuilder.addLines(newLineBuilder()
+      .setDeprecatedUtLineHits(1)
+      .setDeprecatedUtConditions(2)
+      .setDeprecatedUtCoveredConditions(3)
+      .setDeprecatedItLineHits(1)
+      .setDeprecatedItConditions(2)
+      .setDeprecatedItCoveredConditions(3)).build());
+
+    WsTester.TestRequest request = wsTester
+      .newGetRequest("api/sources", "lines")
+      .setParam("uuid", FILE_UUID);
+
+    request.execute().assertJson(getClass(), "convert_deprecated_data.json");
+  }
+
+  @Test
+  public void use_deprecated_it_coverage_fields_if_exists() throws Exception {
+    setUserWithValidPermission();
+    DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder();
+    insertFileWithData(dataBuilder.addLines(newLineBuilder()
+      .setDeprecatedItLineHits(1)
+      .setDeprecatedItConditions(2)
+      .setDeprecatedItCoveredConditions(3)).build());
+
+    WsTester.TestRequest request = wsTester
+      .newGetRequest("api/sources", "lines")
+      .setParam("uuid", FILE_UUID);
+
+    request.execute().assertJson(getClass(), "convert_deprecated_data.json");
+  }
+
+  private void insertFileWithData(DbFileSources.Data fileData) throws IOException {
+    insertFile();
+    dbTester.getDbClient().fileSourceDao().insert(new FileSourceDto()
+      .setProjectUuid(PROJECT_UUID)
+      .setFileUuid(FILE_UUID)
+      .setSourceData(fileData));
+  }
+
+  private void setUserWithValidPermission() {
+    userSessionRule.login("login").addProjectUuidPermissions(UserRole.CODEVIEWER, PROJECT_UUID);
+  }
+
+  private void insertFile() throws IOException {
     ComponentDto project = ComponentTesting.newProjectDto(PROJECT_UUID);
     ComponentDto file = ComponentTesting.newFileDto(project, null, FILE_UUID).setKey(FILE_KEY);
     componentDao.insert(dbTester.getSession(), project, file);
     dbTester.getSession().commit();
   }
+
+  private DbFileSources.Line.Builder newLineBuilder() {
+    return DbFileSources.Line.newBuilder()
+      .setLine(1)
+      .setScmRevision("REVISION_" + 1)
+      .setScmAuthor("AUTHOR_" + 1)
+      .setScmDate(1_500_000_000_00L)
+      .setSource("SOURCE_" + 1);
+  }
 }
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/convert_deprecated_data.json b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/convert_deprecated_data.json
new file mode 100644 (file)
index 0000000..44f70eb
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "sources": [
+    {
+      "line": 1,
+      "code": "<p>SOURCE_1</p>",
+      "scmAuthor": "AUTHOR_1",
+      "scmRevision": "REVISION_1",
+      "scmDate": "1974-10-03T03:40:00+0100",
+      "lineHits": 1,
+      "conditions": 2,
+      "coveredConditions": 3,
+      "duplicated": false
+    }
+  ]
+}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/display_deprecated_fields.json b/server/sonar-server/src/test/resources/org/sonar/server/source/ws/LinesActionTest/display_deprecated_fields.json
new file mode 100644 (file)
index 0000000..595b76c
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "sources": [
+    {
+      "line": 1,
+      "code": "<p>SOURCE_1</p>",
+      "scmAuthor": "AUTHOR_1",
+      "scmRevision": "REVISION_1",
+      "scmDate": "1974-10-03T03:40:00+0100",
+      "lineHits": 1,
+      "utLineHits": 1,
+      "conditions": 2,
+      "utConditions": 2,
+      "coveredConditions": 3,
+      "utCoveredConditions": 3,
+      "duplicated": true
+    }
+  ]
+}
index 36e9c5b0c460cfde821b1c1c033671aff21b3864..4be06fa1a3a656db1de59c6618baea2c61d83b1b 100644 (file)
@@ -6,12 +6,9 @@
       "scmAuthor": "AUTHOR_3",
       "scmRevision": "REVISION_3",
       "scmDate": "1974-10-03T03:40:00+0100",
-      "utLineHits": 3,
-      "utConditions": 4,
-      "utCoveredConditions": 5,
-      "itLineHits": 6,
-      "itConditions": 7,
-      "itCoveredConditions": 8,
+      "lineHits": 3,
+      "conditions": 4,
+      "coveredConditions": 5,
       "duplicated": true
     }
   ]
index d87632e1424f0d9e068eb046505d4e8c6ff79e6c..beb67322c54ca3bebebe073f1f12043d65dfed88 100644 (file)
@@ -6,12 +6,9 @@
       "scmAuthor": "AUTHOR_1",
       "scmRevision": "REVISION_1",
       "scmDate": "1974-10-03T03:40:00+0100",
-      "utLineHits": 1,
-      "utConditions": 2,
-      "utCoveredConditions": 3,
-      "itLineHits": 4,
-      "itConditions": 5,
-      "itCoveredConditions": 6,
+      "lineHits": 1,
+      "conditions": 2,
+      "coveredConditions": 3,
       "duplicated": true
     },
     {
       "scmAuthor": "AUTHOR_2",
       "scmRevision": "REVISION_2",
       "scmDate": "1974-10-03T03:40:00+0100",
-      "utLineHits": 2,
-      "utConditions": 3,
-      "utCoveredConditions": 4,
-      "itLineHits": 5,
-      "itConditions": 6,
-      "itCoveredConditions": 7,
+      "lineHits": 2,
+      "conditions": 3,
+      "coveredConditions": 4,
       "duplicated": true
     },
     {
       "scmAuthor": "AUTHOR_3",
       "scmRevision": "REVISION_3",
       "scmDate": "1974-10-03T03:40:00+0100",
-      "utLineHits": 3,
-      "utConditions": 4,
-      "utCoveredConditions": 5,
-      "itLineHits": 6,
-      "itConditions": 7,
-      "itCoveredConditions": 8,
+      "lineHits": 3,
+      "conditions": 4,
+      "coveredConditions": 5,
       "duplicated": true
     }
   ]
index 9a6f23047e756c5d69ffa66e7b3670d4a80b6b8b..49f624799fecfe1983e0b150051d5a0b38d93952 100644 (file)
@@ -93,39 +93,39 @@ public class FeedFileSourcesBinaryData extends BaseDataChange {
             }
             s = row.get(3);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setUtLineHits(Integer.parseInt(s));
+              lineBuilder.setDeprecatedUtLineHits(Integer.parseInt(s));
             }
             s = row.get(4);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setUtConditions(Integer.parseInt(s));
+              lineBuilder.setDeprecatedUtConditions(Integer.parseInt(s));
             }
             s = row.get(5);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setUtCoveredConditions(Integer.parseInt(s));
+              lineBuilder.setDeprecatedUtCoveredConditions(Integer.parseInt(s));
             }
             s = row.get(6);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setItLineHits(Integer.parseInt(s));
+              lineBuilder.setDeprecatedItLineHits(Integer.parseInt(s));
             }
             s = row.get(7);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setItConditions(Integer.parseInt(s));
+              lineBuilder.setDeprecatedItConditions(Integer.parseInt(s));
             }
             s = row.get(8);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setItCoveredConditions(Integer.parseInt(s));
+              lineBuilder.setDeprecatedItCoveredConditions(Integer.parseInt(s));
             }
             s = row.get(9);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setOverallLineHits(Integer.parseInt(s));
+              lineBuilder.setDeprecatedOverallLineHits(Integer.parseInt(s));
             }
             s = row.get(10);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setOverallConditions(Integer.parseInt(s));
+              lineBuilder.setDeprecatedOverallConditions(Integer.parseInt(s));
             }
             s = row.get(11);
             if (StringUtils.isNotEmpty(s)) {
-              lineBuilder.setOverallCoveredConditions(Integer.parseInt(s));
+              lineBuilder.setDeprecatedOverallCoveredConditions(Integer.parseInt(s));
             }
             s = row.get(12);
             if (StringUtils.isNotEmpty(s)) {
index 21b846bb987d516c51be2e4a740cf991de22e02e..8e9550e70271ad3fc91b4c088bd2f161f5b312b8 100644 (file)
@@ -40,24 +40,26 @@ message Line {
   optional string scm_author = 4;
   optional int64 scm_date = 5;
 
-  // unit tests
-  optional int32 ut_line_hits = 6;
-  optional int32 ut_conditions = 7;
-  optional int32 ut_covered_conditions = 8;
-
-  // integration tests
-  optional int32 it_line_hits = 9;
-  optional int32 it_conditions = 10;
-  optional int32 it_covered_conditions = 11;
-
-  // overall tests
-  optional int32 overall_line_hits = 12;
-  optional int32 overall_conditions = 13;
-  optional int32 overall_covered_conditions = 14;
+  // Deprecated fields in 6.2 (has been deprecated when merging coverage into a single metric)
+  // They are still used to read coverage info from sources that have not be re-analyzed
+  optional int32 deprecated_ut_line_hits = 6;
+  optional int32 deprecated_ut_conditions = 7;
+  optional int32 deprecated_ut_covered_conditions = 8;
+  optional int32 deprecated_it_line_hits = 9;
+  optional int32 deprecated_it_conditions = 10;
+  optional int32 deprecated_it_covered_conditions = 11;
+  optional int32 deprecated_overall_line_hits = 12;
+  optional int32 deprecated_overall_conditions = 13;
+  optional int32 deprecated_overall_covered_conditions = 14;
 
   optional string highlighting = 15;
   optional string symbols = 16;
   repeated int32 duplication = 17 [packed = true];
+
+  // coverage info (since 6.2)
+  optional int32 line_hits = 18;
+  optional int32 conditions = 19;
+  optional int32 covered_conditions = 20;
 }
 
 // TODO should be dropped as it prevents streaming