aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2015-02-20 15:19:16 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2015-02-20 15:43:34 +0100
commit237bc2074a3a8641d9464289ddb5d06b9f7565ea (patch)
tree27eefc4738bc62fbbbfd0d882c342aa7f528b793
parent0ab4cf92edb6337b45b3beffe4c70e3ae1dd555d (diff)
downloadsonarqube-237bc2074a3a8641d9464289ddb5d06b9f7565ea.tar.gz
sonarqube-237bc2074a3a8641d9464289ddb5d06b9f7565ea.zip
SONAR-6116 Validate line is correct when creating issue on file
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java8
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java47
2 files changed, 49 insertions, 6 deletions
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java
index 585ebcf647a..280502d23b7 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssue.java
@@ -19,14 +19,13 @@
*/
package org.sonar.api.batch.sensor.issue.internal;
-import org.sonar.api.batch.sensor.internal.SensorStorage;
-
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import org.sonar.api.batch.fs.InputDir;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.InputPath;
import org.sonar.api.batch.sensor.internal.DefaultStorable;
+import org.sonar.api.batch.sensor.internal.SensorStorage;
import org.sonar.api.batch.sensor.issue.Issue;
import org.sonar.api.batch.sensor.issue.NewIssue;
import org.sonar.api.rule.RuleKey;
@@ -94,7 +93,10 @@ public class DefaultIssue extends DefaultStorable implements Issue, NewIssue {
@Override
public DefaultIssue atLine(int line) {
- Preconditions.checkState(this.path != null && this.path instanceof InputFile, "atLine should be called after onFile");
+ Preconditions.checkState(this.path != null && this.path instanceof InputFile, "atLine should be called after onFile.");
+ Preconditions.checkArgument(line > 0, "line starts at 1, invalid value " + line + ".");
+ int lines = ((InputFile) path).lines();
+ Preconditions.checkArgument(line <= lines, "File " + path + " has " + lines + " lines. Unable to create issue at line " + line + ".");
this.line = line;
return this;
}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java
index 86be3bd947f..098266cff6f 100644
--- a/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java
+++ b/sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/issue/internal/DefaultIssueTest.java
@@ -19,13 +19,15 @@
*/
package org.sonar.api.batch.sensor.issue.internal;
-import org.sonar.api.batch.sensor.internal.SensorStorage;
-
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import org.sonar.api.batch.fs.internal.DefaultInputDir;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
+import org.sonar.api.batch.sensor.internal.SensorStorage;
+import org.sonar.api.batch.sensor.issue.Issue.Severity;
import org.sonar.api.rule.RuleKey;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -39,7 +41,7 @@ public class DefaultIssueTest {
public void build_file_issue() {
SensorStorage storage = mock(SensorStorage.class);
DefaultIssue issue = new DefaultIssue(storage)
- .onFile(new DefaultInputFile("foo", "src/Foo.php"))
+ .onFile(new DefaultInputFile("foo", "src/Foo.php").setLines(3))
.forRule(RuleKey.of("repo", "rule"))
.atLine(1)
.effortToFix(10.0)
@@ -57,6 +59,25 @@ public class DefaultIssueTest {
}
@Test
+ public void build_directory_issue() {
+ SensorStorage storage = mock(SensorStorage.class);
+ DefaultIssue issue = new DefaultIssue(storage)
+ .onDir(new DefaultInputDir("foo", "src"))
+ .forRule(RuleKey.of("repo", "rule"))
+ .overrideSeverity(Severity.BLOCKER)
+ .message("Wrong way!");
+
+ assertThat(issue.inputPath()).isEqualTo(new DefaultInputDir("foo", "src"));
+ assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("repo", "rule"));
+ assertThat(issue.message()).isEqualTo("Wrong way!");
+ assertThat(issue.overridenSeverity()).isEqualTo(Severity.BLOCKER);
+
+ issue.save();
+
+ verify(storage).store(issue);
+ }
+
+ @Test
public void build_project_issue() {
SensorStorage storage = mock(SensorStorage.class);
DefaultIssue issue = new DefaultIssue(storage)
@@ -89,4 +110,24 @@ public class DefaultIssueTest {
.message("Wrong way!");
}
+ @Test
+ public void line_is_positive() {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("line starts at 1, invalid value 0.");
+ new DefaultIssue()
+ .onFile(new DefaultInputFile("foo", "src/Foo.php").setLines(3))
+ .forRule(RuleKey.of("repo", "rule"))
+ .atLine(0);
+ }
+
+ @Test
+ public void not_allowed_to_create_issues_on_unexisting_line() {
+ thrown.expect(IllegalArgumentException.class);
+ thrown.expectMessage("File [moduleKey=foo, relative=src/Foo.php, basedir=null] has 3 lines. Unable to create issue at line 5.");
+ new DefaultIssue()
+ .onFile(new DefaultInputFile("foo", "src/Foo.php").setLines(3))
+ .forRule(RuleKey.of("repo", "rule"))
+ .atLine(5);
+ }
+
}