aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-plugin-api/src
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2015-11-13 11:54:47 +0100
committerDuarte Meneses <duarte.meneses@sonarsource.com>2015-11-16 15:21:43 +0100
commit55d74d47d9b39317083f36352fdc8df3b0151ab6 (patch)
tree04e424d6d9d094178f7a670a1fcfc412983d7c2a /sonar-plugin-api/src
parente306193f685ba72fea402b8e80875b8cd9c5341a (diff)
downloadsonarqube-55d74d47d9b39317083f36352fdc8df3b0151ab6.tar.gz
sonarqube-55d74d47d9b39317083f36352fdc8df3b0151ab6.zip
SONAR-6183 Validate that coverage measures are correct regarding line number and resource
Diffstat (limited to 'sonar-plugin-api/src')
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/coverage/internal/DefaultCoverage.java34
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/SensorContextTesterTest.java42
2 files changed, 69 insertions, 7 deletions
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/coverage/internal/DefaultCoverage.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/coverage/internal/DefaultCoverage.java
index 8aa9d38ac47..d11b73583c2 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/coverage/internal/DefaultCoverage.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/coverage/internal/DefaultCoverage.java
@@ -54,7 +54,6 @@ public class DefaultCoverage extends DefaultStorable implements NewCoverage {
@Override
public DefaultCoverage onFile(InputFile inputFile) {
- Preconditions.checkNotNull(inputFile, "file can't be null");
this.inputFile = (DefaultInputFile) inputFile;
return this;
}
@@ -65,6 +64,7 @@ public class DefaultCoverage extends DefaultStorable implements NewCoverage {
@Override
public NewCoverage ofType(CoverageType type) {
+ validateFile();
Preconditions.checkNotNull(type, "type can't be null");
this.type = type;
return this;
@@ -76,6 +76,9 @@ public class DefaultCoverage extends DefaultStorable implements NewCoverage {
@Override
public NewCoverage lineHits(int line, int hits) {
+ validateFile();
+ validateLine(line);
+
if (!hitsByLine.containsKey(line)) {
hitsByLine.put(line, hits);
if (hits > 0) {
@@ -85,8 +88,34 @@ public class DefaultCoverage extends DefaultStorable implements NewCoverage {
return this;
}
+ private void validateLine(int line) {
+ Preconditions.checkState(line <= inputFile.lines(), String.format("Line %d is out of range in the file %s (lines: %d)", line, inputFile.relativePath(), inputFile.lines()));
+ Preconditions.checkState(line > 0, "Line number must be strictly positive: " + line);
+ }
+
+ private void validateLines() {
+ for (int l : hitsByLine.keySet()) {
+ validateLine(l);
+ }
+
+ for (int l : conditionsByLine.keySet()) {
+ validateLine(l);
+ }
+
+ for (int l : coveredConditionsByLine.keySet()) {
+ validateLine(l);
+ }
+ }
+
+ private void validateFile() {
+ Preconditions.checkNotNull(inputFile, "Call onFile() first");
+ }
+
@Override
public NewCoverage conditions(int line, int conditions, int coveredConditions) {
+ validateFile();
+ validateLine(line);
+
if (conditions > 0 && !conditionsByLine.containsKey(line)) {
totalConditions += conditions;
totalCoveredConditions += coveredConditions;
@@ -126,8 +155,9 @@ public class DefaultCoverage extends DefaultStorable implements NewCoverage {
@Override
public void doSave() {
- Preconditions.checkNotNull(inputFile, "Call onFile() first");
+ validateFile();
Preconditions.checkNotNull(type, "Call ofType() first");
+ validateLines();
storage.store(this);
}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/SensorContextTesterTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/SensorContextTesterTest.java
index 493547b6698..7895ab3f3ee 100644
--- a/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/SensorContextTesterTest.java
+++ b/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/internal/SensorContextTesterTest.java
@@ -19,8 +19,13 @@
*/
package org.sonar.api.batch.sensor.internal;
+import org.sonar.api.batch.sensor.coverage.NewCoverage;
+
+import org.junit.rules.ExpectedException;
+
import java.io.File;
import java.io.StringReader;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -37,13 +42,16 @@ import org.sonar.api.batch.sensor.issue.NewIssue;
import org.sonar.api.config.Settings;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.rule.RuleKey;
-
import static org.assertj.core.api.Assertions.assertThat;
public class SensorContextTesterTest {
@Rule
public TemporaryFolder temp = new TemporaryFolder();
+
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
private SensorContextTester tester;
private File baseDir;
@@ -151,18 +159,42 @@ public class SensorContextTesterTest {
}
@Test
+ public void testCoverageAtLineZero() {
+ assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 1)).isNull();
+ assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 4)).isNull();
+
+ exception.expect(IllegalStateException.class);
+ NewCoverage coverage = tester.newCoverage()
+ .onFile(new DefaultInputFile("foo", "src/Foo.java").initMetadata(new FileMetadata().readMetadata(new StringReader("annot dsf fds foo bar"))))
+ .ofType(CoverageType.UNIT)
+ .lineHits(0, 3);
+ }
+
+ @Test
+ public void testCoverageAtLineOutOfRange() {
+ assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 1)).isNull();
+ assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 4)).isNull();
+ exception.expect(IllegalStateException.class);
+
+ NewCoverage coverage = tester.newCoverage()
+ .onFile(new DefaultInputFile("foo", "src/Foo.java").initMetadata(new FileMetadata().readMetadata(new StringReader("annot dsf fds foo bar"))))
+ .ofType(CoverageType.UNIT)
+ .lineHits(4, 3);
+ }
+
+ @Test
public void testLineHits() {
assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 1)).isNull();
assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 4)).isNull();
tester.newCoverage()
- .onFile(new DefaultInputFile("foo", "src/Foo.java").initMetadata(new FileMetadata().readMetadata(new StringReader("annot dsf fds foo bar"))))
+ .onFile(new DefaultInputFile("foo", "src/Foo.java").initMetadata(new FileMetadata().readMetadata(new StringReader("annot dsf fds foo bar\nasdas"))))
.ofType(CoverageType.UNIT)
.lineHits(1, 2)
- .lineHits(4, 3)
+ .lineHits(2, 3)
.save();
assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 1)).isEqualTo(2);
assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.IT, 1)).isNull();
- assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 4)).isEqualTo(3);
+ assertThat(tester.lineHits("foo:src/Foo.java", CoverageType.UNIT, 2)).isEqualTo(3);
}
@Test
@@ -170,7 +202,7 @@ public class SensorContextTesterTest {
assertThat(tester.conditions("foo:src/Foo.java", CoverageType.UNIT, 1)).isNull();
assertThat(tester.coveredConditions("foo:src/Foo.java", CoverageType.UNIT, 1)).isNull();
tester.newCoverage()
- .onFile(new DefaultInputFile("foo", "src/Foo.java").initMetadata(new FileMetadata().readMetadata(new StringReader("annot dsf fds foo bar"))))
+ .onFile(new DefaultInputFile("foo", "src/Foo.java").initMetadata(new FileMetadata().readMetadata(new StringReader("annot dsf fds foo bar\nasd\nasdas\nasdfas"))))
.ofType(CoverageType.UNIT)
.conditions(1, 4, 2)
.save();