diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2015-11-13 11:54:47 +0100 |
---|---|---|
committer | Duarte Meneses <duarte.meneses@sonarsource.com> | 2015-11-16 15:21:43 +0100 |
commit | 55d74d47d9b39317083f36352fdc8df3b0151ab6 (patch) | |
tree | 04e424d6d9d094178f7a670a1fcfc412983d7c2a /sonar-plugin-api/src | |
parent | e306193f685ba72fea402b8e80875b8cd9c5341a (diff) | |
download | sonarqube-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')
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(); |