Skip to content

Commit

Permalink
Use minimum_severity when reporting issues (#47)
Browse files Browse the repository at this point in the history
  • Loading branch information
filipesperandio authored Oct 19, 2017
1 parent 198094c commit 5bee389
Showing 12 changed files with 114 additions and 42 deletions.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -57,6 +57,17 @@ engines:
- app/src/test/**
```
### Severity
Ignore issues with severity below the minimum:
```
engines:
sonar-java:
enabled: true
config:
minimum_severity: critical # default: major
# valid values are: info, minor, major, critical, blocker
```
## Sonar Documentation
http://www.sonarlint.org/commandline
2 changes: 1 addition & 1 deletion src/main/java/cc/App.java
Original file line number Diff line number Diff line change
@@ -27,7 +27,7 @@ public static void execute(System2 system) {
Charset charset = config.getCharset();

InputFileFinder fileFinder = new Finder(config.getIncludePaths(), config.getTestsPatterns(), charset);
ReportFactory reportFactory = new cc.report.ReportFactory(charset);
ReportFactory reportFactory = new cc.report.ReportFactory(charset, config.getMinimumSeverity());
ConfigurationReader reader = new ConfigurationReader();
SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getSonarlintDir());
Path projectHome = getProjectHome(system);
6 changes: 6 additions & 0 deletions src/main/java/cc/Config.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc;

import cc.models.Severity;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -38,6 +39,11 @@ public Path getSonarlintDir() {
return Paths.get("/tmp/sonarlint");
}

public Severity getMinimumSeverity() {
String severity = (String) config.get("minimum_severity");
return Severity.from(severity, Severity.MAJOR);
}

@Override
public Properties properties() {
Properties properties = super.properties();
6 changes: 3 additions & 3 deletions src/main/java/cc/models/CodeClimateIssue.java
Original file line number Diff line number Diff line change
@@ -6,13 +6,13 @@
public class CodeClimateIssue {
public final String type = "issue";
public final String checkName;
public final String severity;
public final Severity severity;
public final String description;
public final Content content;
public final Location location;
public final Categories categories;

public CodeClimateIssue(String checkName, String severity, String description, Content content, Location location, Categories categories) {
public CodeClimateIssue(String checkName, Severity severity, String description, Content content, Location location, Categories categories) {
this.checkName = checkName;
this.severity = severity;
this.description = description;
@@ -24,7 +24,7 @@ public CodeClimateIssue(String checkName, String severity, String description, C
public static CodeClimateIssue from(Issue issue, RuleDetails ruleDetails, String baseDir) {
String checkName = issue.getRuleKey();
String description = issue.getMessage();
String severity = Severity.from(ruleDetails);
Severity severity = Severity.from(ruleDetails);
Content content = Content.from(ruleDetails);
Location location = Location.from(baseDir, issue);
Categories categories = Categories.from(ruleDetails);
28 changes: 24 additions & 4 deletions src/main/java/cc/models/Severity.java
Original file line number Diff line number Diff line change
@@ -3,13 +3,33 @@
import com.google.gson.annotations.SerializedName;
import org.sonarsource.sonarlint.core.client.api.common.RuleDetails;

public class Severity {
import static java.util.Optional.ofNullable;

public static String from(RuleDetails ruleDetails) {
public enum Severity {
@SerializedName("info")
INFO,
@SerializedName("minor")
MINOR,
@SerializedName("major")
MAJOR,
@SerializedName("critical")
CRITICAL,
@SerializedName("blocker")
BLOCKER;

public static Severity from(RuleDetails ruleDetails) {
String severity = ruleDetails.getSeverity();
if(severity == null) {
return from(severity);
}

public static Severity from(String severity) {
if (severity == null) {
return null;
}
return severity.toLowerCase();
return valueOf(severity.toUpperCase());
}

public static Severity from(String severity, Severity defaultValue) {
return ofNullable(from(severity)).orElse(defaultValue);
}
}
10 changes: 8 additions & 2 deletions src/main/java/cc/report/JsonReport.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cc.report;

import cc.models.CodeClimateIssue;
import cc.models.Severity;
import cc.serialization.GsonFactory;
import com.google.gson.Gson;
import org.sonarsource.sonarlint.core.client.api.common.RuleDetails;
@@ -15,9 +16,11 @@
public class JsonReport implements org.sonarlint.cli.report.Reporter {

final Gson gson;
final Severity minimumSeverity;
final String baseDir;

public JsonReport(String baseDir) {
public JsonReport(Severity minimumSeverity, String baseDir) {
this.minimumSeverity = minimumSeverity;
this.baseDir = baseDir;
this.gson = new GsonFactory().create();
}
@@ -29,7 +32,10 @@ public void execute(String projectName, Date date, Collection<Trackable> trackab
RuleDetails ruleDetails = ruleDescriptionProducer.apply(issue.getRuleKey());

CodeClimateIssue codeClimateIssue = CodeClimateIssue.from(issue, ruleDetails, baseDir);
System.out.println(gson.toJson(codeClimateIssue) + "\0");
Severity severity = codeClimateIssue.severity;
if (severity!= null && severity.compareTo(minimumSeverity) >= 0) {
System.out.println(gson.toJson(codeClimateIssue) + "\0");
}
}
}
}
9 changes: 7 additions & 2 deletions src/main/java/cc/report/ReportFactory.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc.report;

import cc.models.Severity;
import org.sonarlint.cli.report.Reporter;

import java.nio.charset.Charset;
@@ -8,12 +9,16 @@
import java.util.List;

public class ReportFactory extends org.sonarlint.cli.report.ReportFactory {
public ReportFactory(Charset charset) {

Severity minimumSeverity;

public ReportFactory(Charset charset, Severity minimumSeverity) {
super(charset);
this.minimumSeverity = minimumSeverity;
}

@Override
public List<Reporter> createReporters(Path basePath) {
return Arrays.asList(new JsonReport(basePath.toString()));
return Arrays.asList(new JsonReport(minimumSeverity, basePath.toString()));
}
}
14 changes: 14 additions & 0 deletions src/test/java/cc/ConfigTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc;

import cc.models.Severity;
import org.junit.Test;

import java.nio.charset.Charset;
@@ -33,6 +34,18 @@ public void defaults_charset_to_utf8() throws Exception {
assertThat(config.getCharset()).isEqualTo(Charset.forName("UTF-8"));
}

@Test
public void fetch_minimum_severity() throws Exception {
Config config = Config.gson().fromJson("{\"config\":{\"minimum_severity\":\"critical\"}}", Config.class);
assertThat(config.getMinimumSeverity()).isEqualTo(Severity.CRITICAL);
}

@Test
public void defaults_minimum_severity_to_major() throws Exception {
Config config = Config.gson().fromJson("{}", Config.class);
assertThat(config.getMinimumSeverity()).isEqualTo(Severity.MAJOR);
}

@Test
public void fetch_tests_patterns() throws Exception {
Config config = Config.gson().fromJson("{\"config\":{\"tests_patterns\":[\"src/test/**\",\"src/test2/**\"]}}", Config.class);
@@ -44,6 +57,7 @@ public void null_tests_patterns_does_not_cause_error() throws Exception {
Config config = Config.gson().fromJson("{\"config\":{}}", Config.class);
assertThat(config.getTestsPatterns()).isNull();
}

@Test
public void has_default_work_dir() throws Exception {
Config config = Config.gson().fromJson("{}", Config.class);
10 changes: 4 additions & 6 deletions src/test/java/cc/models/CodeClimateIssueTest.java
Original file line number Diff line number Diff line change
@@ -9,17 +9,15 @@

public class CodeClimateIssueTest {

private Gson gson = new GsonFactory().create();

@Test
public void down_case_severities() throws Exception {
assertThat(createIssueForSeverity("MAJOR").severity).isEqualTo("major");
assertThat(createIssueForSeverity("MINOR").severity).isEqualTo("minor");
assertThat(createIssueForSeverity("CRITICAL").severity).isEqualTo("critical");
assertThat(createIssueForSeverity(null).severity).isNull();
public void down_case_severities_uppon_serialization() throws Exception {
assertThat(gson.toJson(createIssueForSeverity("CRITICAL"))).contains("critical");
}

@Test
public void properly_serialize_severity() throws Exception {
Gson gson = new GsonFactory().create();
assertThat(gson.toJson(createIssueForSeverity("INFO"))).contains("\"severity\":\"info\"");
}

16 changes: 16 additions & 0 deletions src/test/java/cc/models/SeverityTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package cc.models;

import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class SeverityTest {

@Test
public void has_order_of_importance() throws Exception {
assertThat(Severity.BLOCKER).isGreaterThan(Severity.CRITICAL);
assertThat(Severity.CRITICAL).isGreaterThan(Severity.MAJOR);
assertThat(Severity.MAJOR).isGreaterThan(Severity.MINOR);
assertThat(Severity.MINOR).isGreaterThan(Severity.INFO);
}
}
29 changes: 20 additions & 9 deletions src/test/java/cc/report/JsonReportTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cc.report;

import cc.models.Severity;
import org.junit.Before;
import org.junit.Test;
import org.sonarsource.sonarlint.core.client.api.common.RuleDetails;
@@ -36,28 +37,38 @@ public void serialize_issue_relative_path() throws Exception {
assertThat(output.stdout.toString()).contains("\"path\":\"dir/file.java\"");
}

@Test
public void does_not_include_unknown_severity() throws Exception {
executeReport(null, new FakeIssue("file.java", 0, 1));
assertThat(output.stdout.toString()).doesNotContain("severity");
}

@Test
public void does_not_include_unknown_path() throws Exception {
executeReport("major", new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).doesNotContain("path");
}

@Test
public void does_not_report_issue_below_minimum_severity() throws Exception {
executeReport(Severity.INFO,null, new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).isEmpty();

executeReport(Severity.CRITICAL,"major", new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).isEmpty();

executeReport(Severity.CRITICAL,"critical", new FakeIssue(null, 1, 0));
assertThat(output.stdout.toString()).contains("issue");
}

@Test
public void unknown_location_defaults_to_first_line() throws Exception {
executeReport("major", new FakeIssue("file.java", null, null));
assertThat(output.stdout.toString()).contains("\"lines\":{\"begin\":1,\"end\":1}");
assertThat(output.stderr.toString()).contains("File location was not provided, defaulting to line 1");
}

void executeReport(String severity, FakeIssue issue) {
RuleDetails ruleDetails = new FakeRuleDetails(severity);
void executeReport(String ruleSeverity, FakeIssue issue) {
executeReport(Severity.MAJOR, ruleSeverity, issue);
}

void executeReport(Severity minimumSeverity, String ruleSeverity, FakeIssue issue) {
RuleDetails ruleDetails = new FakeRuleDetails(ruleSeverity);
List<Trackable> trackables = asList(new FakeTrackable(issue));
new JsonReport("/tmp").execute("prj", new Date(0), trackables, null, _ruleKey -> ruleDetails);
new JsonReport(minimumSeverity, "/tmp").execute("prj", new Date(0), trackables, null, _ruleKey -> ruleDetails);
}
}
15 changes: 0 additions & 15 deletions src/test/resources/sanity_check_expected_issues.json
Original file line number Diff line number Diff line change
@@ -37,21 +37,6 @@
"Bug Risk"
]
},
{
"type": "issue",
"check_name": "squid:S1220",
"severity": "minor",
"description": "Move this file to a named package.",
"content": {
"body": "<p>According to the Java Language Specification:</p>\n<blockquote>\n <p>Unnamed packages are provided by the Java platform principally for convenience when developing small or temporary applications or when just\n beginning development.</p>\n</blockquote>\n<p>To enforce this best practice, classes located in default package can no longer be accessed from named ones since Java 1.4.</p>\n<h2>Noncompliant Code Example</h2>\n<pre>\npublic class MyClass { /* ... */ }\n</pre>\n<h2>Compliant Solution</h2>\n<pre>\npackage org.example;\n\npublic class MyClass{ /* ... */ }\n</pre>"
},
"location": {
"path": "main/java/Library.java"
},
"categories": [
"Bug Risk"
]
},
{
"type": "issue",
"check_name": "squid:S1186",

0 comments on commit 5bee389

Please sign in to comment.