From 5b93180b18e756c6a246b8d22307785d333d0002 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Wed, 29 Jul 2015 01:45:49 +0200 Subject: Write raw issues directly in protobuf report Avoid intermediate storage in persistit --- .../org/sonar/batch/issue/DefaultIssuableTest.java | 64 ----------- .../org/sonar/batch/issue/IssuableFactoryTest.java | 6 +- .../org/sonar/batch/issue/ModuleIssuesTest.java | 123 +++++++++++---------- .../deprecated/DeprecatedApiMediumTest.java | 20 ++-- .../mediumtest/fs/ProjectBuilderMediumTest.java | 40 ++++--- .../mediumtest/fs/RandomFsAccessMediumTest.java | 18 +-- .../batch/mediumtest/issues/ChecksMediumTest.java | 27 +++-- .../batch/mediumtest/issues/IssuesMediumTest.java | 75 ++++--------- .../mediumtest/issues/IssuesOnDirMediumTest.java | 12 +- .../issues/MultilineIssuesMediumTest.java | 10 +- .../batch/mediumtest/preview/EmptyFileTest.java | 2 +- .../preview/IncrementalModeMediumTest.java | 38 +++---- .../preview/PreviewAndReportsMediumTest.java | 62 ++++++++--- .../sonar/batch/report/IssuesPublisherTest.java | 106 ------------------ .../batch/sensor/DefaultSensorStorageTest.java | 71 ------------ 15 files changed, 215 insertions(+), 459 deletions(-) delete mode 100644 sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssuableTest.java delete mode 100644 sonar-batch/src/test/java/org/sonar/batch/report/IssuesPublisherTest.java (limited to 'sonar-batch/src/test/java') diff --git a/sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssuableTest.java b/sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssuableTest.java deleted file mode 100644 index 5df84297370..00000000000 --- a/sonar-batch/src/test/java/org/sonar/batch/issue/DefaultIssuableTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.batch.issue; - -import java.util.Arrays; -import java.util.List; -import org.junit.Test; -import org.sonar.api.batch.sensor.SensorContext; -import org.sonar.api.issue.Issue; -import org.sonar.batch.index.BatchComponent; -import org.sonar.core.issue.DefaultIssue; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class DefaultIssuableTest { - - IssueCache cache = mock(IssueCache.class); - BatchComponent component = mock(BatchComponent.class); - - @Test - public void test_unresolved_issues() throws Exception { - when(component.key()).thenReturn("struts:org.apache.Action"); - DefaultIssue resolved = new DefaultIssue().setResolution(Issue.RESOLUTION_FALSE_POSITIVE); - DefaultIssue unresolved = new DefaultIssue(); - when(cache.byComponent("struts:org.apache.Action")).thenReturn(Arrays.asList(resolved, unresolved)); - - DefaultIssuable perspective = new DefaultIssuable(component, cache, mock(SensorContext.class)); - - List issues = perspective.issues(); - assertThat(issues).containsOnly(unresolved); - } - - @Test - public void test_resolved_issues() throws Exception { - when(component.key()).thenReturn("struts:org.apache.Action"); - DefaultIssue resolved = new DefaultIssue().setResolution(Issue.RESOLUTION_FALSE_POSITIVE); - DefaultIssue unresolved = new DefaultIssue(); - when(cache.byComponent("struts:org.apache.Action")).thenReturn(Arrays.asList(resolved, unresolved)); - - DefaultIssuable perspective = new DefaultIssuable(component, cache, mock(SensorContext.class)); - - List issues = perspective.resolvedIssues(); - assertThat(issues).containsOnly(resolved); - } -} diff --git a/sonar-batch/src/test/java/org/sonar/batch/issue/IssuableFactoryTest.java b/sonar-batch/src/test/java/org/sonar/batch/issue/IssuableFactoryTest.java index ddabedba240..5525d4ea049 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/issue/IssuableFactoryTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/issue/IssuableFactoryTest.java @@ -20,7 +20,6 @@ package org.sonar.batch.issue; import org.junit.Test; -import org.mockito.Mockito; import org.sonar.api.issue.Issuable; import org.sonar.api.resources.File; import org.sonar.api.resources.Project; @@ -34,12 +33,11 @@ import static org.mockito.Mockito.mock; public class IssuableFactoryTest { ModuleIssues moduleIssues = mock(ModuleIssues.class); - IssueCache cache = mock(IssueCache.class, Mockito.RETURNS_MOCKS); DefaultProjectTree projectTree = mock(DefaultProjectTree.class); @Test public void file_should_be_issuable() { - IssuableFactory factory = new IssuableFactory(cache, mock(DefaultSensorContext.class)); + IssuableFactory factory = new IssuableFactory(mock(DefaultSensorContext.class)); BatchComponent component = new BatchComponent(1, File.create("foo/bar.c").setEffectiveKey("foo/bar.c"), null); Issuable issuable = factory.loadPerspective(Issuable.class, component); @@ -49,7 +47,7 @@ public class IssuableFactoryTest { @Test public void project_should_be_issuable() { - IssuableFactory factory = new IssuableFactory(cache, mock(DefaultSensorContext.class)); + IssuableFactory factory = new IssuableFactory(mock(DefaultSensorContext.class)); BatchComponent component = new BatchComponent(1, new Project("Foo").setEffectiveKey("foo"), null); Issuable issuable = factory.loadPerspective(Issuable.class, component); diff --git a/sonar-batch/src/test/java/org/sonar/batch/issue/ModuleIssuesTest.java b/sonar-batch/src/test/java/org/sonar/batch/issue/ModuleIssuesTest.java index a602f1f6549..fb9cf921e2f 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/issue/ModuleIssuesTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/issue/ModuleIssuesTest.java @@ -19,25 +19,36 @@ */ package org.sonar.batch.issue; -import java.util.Calendar; +import java.io.StringReader; import java.util.Date; -import org.apache.commons.lang.time.DateUtils; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.api.batch.fs.InputFile; +import org.sonar.api.batch.fs.internal.DefaultInputFile; +import org.sonar.api.batch.fs.internal.FileMetadata; import org.sonar.api.batch.rule.internal.ActiveRulesBuilder; import org.sonar.api.batch.rule.internal.RulesBuilder; +import org.sonar.api.batch.sensor.issue.internal.DefaultIssue; +import org.sonar.api.batch.sensor.issue.internal.DefaultIssueLocation; +import org.sonar.api.resources.File; import org.sonar.api.resources.Project; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.Severity; import org.sonar.api.utils.MessageException; -import org.sonar.core.issue.DefaultIssue; +import org.sonar.batch.index.BatchComponentCache; +import org.sonar.batch.protocol.output.BatchReport; +import org.sonar.batch.report.ReportPublisher; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; @@ -48,11 +59,7 @@ public class ModuleIssuesTest { static final RuleKey SQUID_RULE_KEY = RuleKey.of("squid", "AvoidCycle"); static final String SQUID_RULE_NAME = "Avoid Cycle"; - @Mock - IssueCache cache; - - @Mock - Project project; + Project project = new Project("foo").setAnalysisDate(new Date()); @Mock IssueFilters filters; @@ -62,18 +69,21 @@ public class ModuleIssuesTest { ModuleIssues moduleIssues; + BatchComponentCache componentCache = new BatchComponentCache(); + InputFile file = new DefaultInputFile("foo", "src/Foo.php").initMetadata(new FileMetadata().readMetadata(new StringReader("Foo\nBar\nBiz\n"))); + ReportPublisher reportPublisher = mock(ReportPublisher.class, RETURNS_DEEP_STUBS); + @Before - public void setUp() { - when(project.getAnalysisDate()).thenReturn(new Date()); - when(project.getEffectiveKey()).thenReturn("org.apache:struts-core"); - when(project.getRoot()).thenReturn(project); + public void prepare() { + componentCache.add(File.create("src/Foo.php").setEffectiveKey("foo:src/Foo.php"), null).setInputPath(file); } @Test public void fail_on_unknown_rule() { initModuleIssues(); - DefaultIssue issue = new DefaultIssue().setRuleKey(SQUID_RULE_KEY); - + DefaultIssue issue = new DefaultIssue() + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("Foo")) + .forRule(SQUID_RULE_KEY); try { moduleIssues.initAndAddIssue(issue); fail(); @@ -81,15 +91,16 @@ public class ModuleIssuesTest { assertThat(e).isInstanceOf(MessageException.class); } - verifyZeroInteractions(cache); + verifyZeroInteractions(reportPublisher); } @Test public void fail_if_rule_has_no_name_and_issue_has_no_message() { ruleBuilder.add(SQUID_RULE_KEY).setInternalKey(SQUID_RULE_KEY.rule()); initModuleIssues(); - DefaultIssue issue = new DefaultIssue().setRuleKey(SQUID_RULE_KEY).setMessage(""); - + DefaultIssue issue = new DefaultIssue() + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("")) + .forRule(SQUID_RULE_KEY); try { moduleIssues.initAndAddIssue(issue); fail(); @@ -97,19 +108,20 @@ public class ModuleIssuesTest { assertThat(e).isInstanceOf(MessageException.class); } - verifyZeroInteractions(cache); + verifyZeroInteractions(reportPublisher); } @Test public void ignore_null_active_rule() { ruleBuilder.add(SQUID_RULE_KEY).setName(SQUID_RULE_NAME); initModuleIssues(); - - DefaultIssue issue = new DefaultIssue().setRuleKey(SQUID_RULE_KEY); + DefaultIssue issue = new DefaultIssue() + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("Foo")) + .forRule(SQUID_RULE_KEY); boolean added = moduleIssues.initAndAddIssue(issue); assertThat(added).isFalse(); - verifyZeroInteractions(cache); + verifyZeroInteractions(reportPublisher); } @Test @@ -118,11 +130,13 @@ public class ModuleIssuesTest { activeRulesBuilder.create(SQUID_RULE_KEY).activate(); initModuleIssues(); - DefaultIssue issue = new DefaultIssue().setRuleKey(SQUID_RULE_KEY); + DefaultIssue issue = new DefaultIssue() + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("Foo")) + .forRule(SQUID_RULE_KEY); boolean added = moduleIssues.initAndAddIssue(issue); assertThat(added).isFalse(); - verifyZeroInteractions(cache); + verifyZeroInteractions(reportPublisher); } @Test @@ -131,22 +145,19 @@ public class ModuleIssuesTest { activeRulesBuilder.create(SQUID_RULE_KEY).setSeverity(Severity.INFO).activate(); initModuleIssues(); - Date analysisDate = new Date(); - when(project.getAnalysisDate()).thenReturn(analysisDate); - DefaultIssue issue = new DefaultIssue() - .setKey("ABCDE") - .setRuleKey(SQUID_RULE_KEY) - .setSeverity(Severity.CRITICAL); - when(filters.accept(issue)).thenReturn(true); + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("Foo")) + .forRule(SQUID_RULE_KEY) + .overrideSeverity(org.sonar.api.batch.rule.Severity.CRITICAL); + + when(filters.accept(any(org.sonar.core.issue.DefaultIssue.class))).thenReturn(true); boolean added = moduleIssues.initAndAddIssue(issue); assertThat(added).isTrue(); - ArgumentCaptor argument = ArgumentCaptor.forClass(DefaultIssue.class); - verify(cache).put(argument.capture()); - assertThat(argument.getValue().severity()).isEqualTo(Severity.CRITICAL); - assertThat(argument.getValue().creationDate()).isEqualTo(DateUtils.truncate(analysisDate, Calendar.SECOND)); + ArgumentCaptor argument = ArgumentCaptor.forClass(BatchReport.Issue.class); + verify(reportPublisher.getWriter()).appendComponentIssue(eq(1), argument.capture()); + assertThat(argument.getValue().getSeverity()).isEqualTo(org.sonar.batch.protocol.Constants.Severity.CRITICAL); } @Test @@ -155,17 +166,15 @@ public class ModuleIssuesTest { activeRulesBuilder.create(SQUID_RULE_KEY).setSeverity(Severity.INFO).activate(); initModuleIssues(); - Date analysisDate = new Date(); - when(project.getAnalysisDate()).thenReturn(analysisDate); - - DefaultIssue issue = new DefaultIssue().setRuleKey(SQUID_RULE_KEY).setSeverity(null); - when(filters.accept(issue)).thenReturn(true); + DefaultIssue issue = new DefaultIssue() + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("Foo")) + .forRule(SQUID_RULE_KEY); + when(filters.accept(any(org.sonar.core.issue.DefaultIssue.class))).thenReturn(true); moduleIssues.initAndAddIssue(issue); - ArgumentCaptor argument = ArgumentCaptor.forClass(DefaultIssue.class); - verify(cache).put(argument.capture()); - assertThat(argument.getValue().severity()).isEqualTo(Severity.INFO); - assertThat(argument.getValue().creationDate()).isEqualTo(DateUtils.truncate(analysisDate, Calendar.SECOND)); + ArgumentCaptor argument = ArgumentCaptor.forClass(BatchReport.Issue.class); + verify(reportPublisher.getWriter()).appendComponentIssue(eq(1), argument.capture()); + assertThat(argument.getValue().getSeverity()).isEqualTo(org.sonar.batch.protocol.Constants.Severity.INFO); } @Test @@ -174,22 +183,17 @@ public class ModuleIssuesTest { activeRulesBuilder.create(SQUID_RULE_KEY).setSeverity(Severity.INFO).setName(SQUID_RULE_NAME).activate(); initModuleIssues(); - Date analysisDate = new Date(); - when(project.getAnalysisDate()).thenReturn(analysisDate); - DefaultIssue issue = new DefaultIssue() - .setKey("ABCDE") - .setRuleKey(SQUID_RULE_KEY) - .setSeverity(Severity.CRITICAL) - .setMessage(""); - when(filters.accept(issue)).thenReturn(true); + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("")) + .forRule(SQUID_RULE_KEY); + when(filters.accept(any(org.sonar.core.issue.DefaultIssue.class))).thenReturn(true); boolean added = moduleIssues.initAndAddIssue(issue); assertThat(added).isTrue(); - ArgumentCaptor argument = ArgumentCaptor.forClass(DefaultIssue.class); - verify(cache).put(argument.capture()); - assertThat(argument.getValue().message()).isEqualTo("Avoid Cycle"); + ArgumentCaptor argument = ArgumentCaptor.forClass(BatchReport.Issue.class); + verify(reportPublisher.getWriter()).appendComponentIssue(eq(1), argument.capture()); + assertThat(argument.getValue().getMsg()).isEqualTo("Avoid Cycle"); } @Test @@ -199,23 +203,22 @@ public class ModuleIssuesTest { initModuleIssues(); DefaultIssue issue = new DefaultIssue() - .setKey("ABCDE") - .setRuleKey(SQUID_RULE_KEY) - .setSeverity(Severity.CRITICAL); + .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("")) + .forRule(SQUID_RULE_KEY); - when(filters.accept(issue)).thenReturn(false); + when(filters.accept(any(org.sonar.core.issue.DefaultIssue.class))).thenReturn(false); boolean added = moduleIssues.initAndAddIssue(issue); assertThat(added).isFalse(); - verifyZeroInteractions(cache); + verifyZeroInteractions(reportPublisher); } /** * Every rules and active rules has to be added in builders before creating ModuleIssues */ private void initModuleIssues() { - moduleIssues = new ModuleIssues(activeRulesBuilder.build(), ruleBuilder.build(), cache, project, filters); + moduleIssues = new ModuleIssues(activeRulesBuilder.build(), ruleBuilder.build(), project, filters, reportPublisher, componentCache); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/deprecated/DeprecatedApiMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/deprecated/DeprecatedApiMediumTest.java index f73d1c60f46..660b861bece 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/deprecated/DeprecatedApiMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/deprecated/DeprecatedApiMediumTest.java @@ -19,8 +19,6 @@ */ package org.sonar.batch.mediumtest.deprecated; -import org.sonar.xoo.rule.XooRulesDefinition; - import com.google.common.collect.ImmutableMap; import java.io.File; import java.io.IOException; @@ -33,6 +31,7 @@ import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.input.ActiveRule; import org.sonar.xoo.XooPlugin; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.groups.Tuple.tuple; @@ -84,13 +83,16 @@ public class DeprecatedApiMediumTest { .build()) .start(); - assertThat(result.issues()).extracting("componentKey", "message", "line").containsOnly( - tuple("com.foo.project:src/sample.xoo", "Issue created using deprecated API", null), - tuple("com.foo.project:src/sample.xoo", "Issue created using deprecated API", 1), - tuple("com.foo.project:src/package/sample.xoo", "Issue created using deprecated API", null), - tuple("com.foo.project:src/package/sample.xoo", "Issue created using deprecated API", 1), - tuple("com.foo.project:src", "Issue created using deprecated API", null), - tuple("com.foo.project:src/package", "Issue created using deprecated API", null)); + assertThat(result.issuesFor(result.inputFile("src/sample.xoo"))).extracting("msg", "line").containsOnly( + tuple("Issue created using deprecated API", 0), + tuple("Issue created using deprecated API", 1)); + assertThat(result.issuesFor(result.inputFile("src/package/sample.xoo"))).extracting("msg", "line").containsOnly( + tuple("Issue created using deprecated API", 0), + tuple("Issue created using deprecated API", 1)); + assertThat(result.issuesFor(result.inputDir("src"))).extracting("msg", "line").containsOnly( + tuple("Issue created using deprecated API", 0)); + assertThat(result.issuesFor(result.inputDir("src/package"))).extracting("msg", "line").containsOnly( + tuple("Issue created using deprecated API", 0)); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/ProjectBuilderMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/ProjectBuilderMediumTest.java index 2beb8f133b5..42ef0b87433 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/ProjectBuilderMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/ProjectBuilderMediumTest.java @@ -19,23 +19,22 @@ */ package org.sonar.batch.mediumtest.fs; -import org.sonar.xoo.rule.XooRulesDefinition; - import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.api.CoreProperties; import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.input.ActiveRule; +import org.sonar.batch.protocol.output.BatchReport.Issue; import org.sonar.xoo.XooPlugin; - -import java.io.File; -import java.io.IOException; -import java.util.Date; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; @@ -48,7 +47,6 @@ public class ProjectBuilderMediumTest { .registerPlugin("xoo", new XooPlugin()) .addRules(new XooRulesDefinition()) .addDefaultQProfile("xoo", "Sonar Way") - .bootstrapProperties(ImmutableMap.of(CoreProperties.ANALYSIS_MODE, CoreProperties.ANALYSIS_MODE_PREVIEW)) .setPreviousAnalysisDate(new Date()) .activateRule(new ActiveRule("xoo", "OneIssuePerLine", null, "One issue per line", "MAJOR", "OneIssuePerLine.internal", "xoo")) .build(); @@ -88,19 +86,19 @@ public class ProjectBuilderMediumTest { .put("sonar.xoo.enableProjectBuilder", "true") .build()) .start(); - - assertThat(result.issues()).hasSize(10); + List issues = result.issuesFor(result.inputFile("src/sample.xoo")); + assertThat(issues).hasSize(10); boolean foundIssueAtLine1 = false; - for (org.sonar.api.issue.Issue issue : result.issues()) { - if (issue.line() == 1) { + for (Issue issue : issues) { + if (issue.getLine() == 1) { foundIssueAtLine1 = true; - assertThat(issue.componentKey()).isEqualTo("com.foo.project:module1:src/sample.xoo"); - assertThat(issue.message()).isEqualTo("This issue is generated on each line"); - assertThat(issue.effortToFix()).isNull(); + assertThat(issue.getMsg()).isEqualTo("This issue is generated on each line"); + assertThat(issue.hasEffortToFix()).isFalse(); } } assertThat(foundIssueAtLine1).isTrue(); + } @Test @@ -130,15 +128,15 @@ public class ProjectBuilderMediumTest { .build()) .start(); - assertThat(result.issues()).hasSize(10); + List issues = result.issuesFor(result.inputFile("src/sample.xoo")); + assertThat(issues).hasSize(10); boolean foundIssueAtLine1 = false; - for (org.sonar.api.issue.Issue issue : result.issues()) { - if (issue.line() == 1) { + for (Issue issue : issues) { + if (issue.getLine() == 1) { foundIssueAtLine1 = true; - assertThat(issue.componentKey()).isEqualTo("com.foo.project:module1:my-branch:src/sample.xoo"); - assertThat(issue.message()).isEqualTo("This issue is generated on each line"); - assertThat(issue.effortToFix()).isNull(); + assertThat(issue.getMsg()).isEqualTo("This issue is generated on each line"); + assertThat(issue.hasEffortToFix()).isFalse(); } } assertThat(foundIssueAtLine1).isTrue(); diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/RandomFsAccessMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/RandomFsAccessMediumTest.java index f27f72c5769..cfbd881e224 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/RandomFsAccessMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/fs/RandomFsAccessMediumTest.java @@ -19,9 +19,11 @@ */ package org.sonar.batch.mediumtest.fs; -import org.sonar.xoo.rule.XooRulesDefinition; - import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; @@ -32,11 +34,9 @@ import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.Benchmark; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.input.ActiveRule; +import org.sonar.batch.protocol.output.BatchReport.Issue; import org.sonar.xoo.XooPlugin; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; @@ -92,7 +92,8 @@ public class RandomFsAccessMediumTest { .build()) .start(); - assertThat(result.issues()).hasSize(ISSUE_COUNT); + List issues = result.issuesFor(result.inputFile("src/sample1.xoo")); + assertThat(issues).hasSize(10); bench.expectLessThanOrEqualTo("Time to create " + ISSUE_COUNT + " issues on random files using FileSystem query", System.currentTimeMillis() - start, 2000); } @@ -121,7 +122,8 @@ public class RandomFsAccessMediumTest { .build()) .start(); - assertThat(result.issues()).hasSize(ISSUE_COUNT); + List issues = result.issuesFor(result.inputFile("src/sample1.xoo")); + assertThat(issues).hasSize(10); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java index d5bd3b44c9a..fe31dbe7d25 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/ChecksMediumTest.java @@ -19,10 +19,10 @@ */ package org.sonar.batch.mediumtest.issues; -import org.sonar.batch.protocol.input.Rule; - -import org.sonar.xoo.rule.XooRulesDefinition; import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.io.IOException; +import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; @@ -31,10 +31,10 @@ import org.junit.rules.TemporaryFolder; import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.input.ActiveRule; +import org.sonar.batch.protocol.input.Rule; +import org.sonar.batch.protocol.output.BatchReport.Issue; import org.sonar.xoo.XooPlugin; - -import java.io.File; -import java.io.IOException; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; @@ -85,20 +85,19 @@ public class ChecksMediumTest { .build()) .start(); - assertThat(result.issues()).hasSize(2); + List issues = result.issuesFor(result.inputFile("src/sample.xoo")); + assertThat(issues).hasSize(2); boolean foundIssueAtLine1 = false; boolean foundIssueAtLine2 = false; - for (org.sonar.api.issue.Issue issue : result.issues()) { - if (issue.line() == 1) { + for (Issue issue : issues) { + if (issue.getLine() == 1) { foundIssueAtLine1 = true; - assertThat(issue.componentKey()).isEqualTo("com.foo.project:src/sample.xoo"); - assertThat(issue.message()).isEqualTo("A template rule"); + assertThat(issue.getMsg()).isEqualTo("A template rule"); } - if (issue.line() == 2) { + if (issue.getLine() == 2) { foundIssueAtLine2 = true; - assertThat(issue.componentKey()).isEqualTo("com.foo.project:src/sample.xoo"); - assertThat(issue.message()).isEqualTo("Another template rule"); + assertThat(issue.getMsg()).isEqualTo("Another template rule"); } } assertThat(foundIssueAtLine1).isTrue(); diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java index 1399a135f72..6979b4e6e2c 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesMediumTest.java @@ -19,25 +19,23 @@ */ package org.sonar.batch.mediumtest.issues; -import org.sonar.api.issue.Issue; -import org.sonar.batch.bootstrapper.IssueListener; -import org.sonar.xoo.rule.XooRulesDefinition; import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.rule.Severity; +import org.sonar.batch.bootstrapper.IssueListener; import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.input.ActiveRule; +import org.sonar.batch.protocol.output.BatchReport.Issue; import org.sonar.xoo.XooPlugin; - -import java.io.File; -import java.io.IOException; -import java.util.LinkedList; -import java.util.List; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; @@ -52,44 +50,15 @@ public class IssuesMediumTest { .addRules(new XooRulesDefinition()) .activateRule(new ActiveRule("xoo", "OneIssuePerLine", null, "One issue per line", "MAJOR", "OneIssuePerLine.internal", "xoo")) .build(); - - public BatchMediumTester testerPreview = BatchMediumTester.builder() - .registerPlugin("xoo", new XooPlugin()) - .addDefaultQProfile("xoo", "Sonar Way") - .bootstrapProperties(ImmutableMap.of("sonar.analysis.mode", "preview")) - .addRules(new XooRulesDefinition()) - .activateRule(new ActiveRule("xoo", "OneIssuePerLine", null, "One issue per line", "MAJOR", "OneIssuePerLine.internal", "xoo")) - .build(); @Before public void prepare() { tester.start(); - testerPreview.start(); } @After public void stop() { tester.stop(); - testerPreview.stop(); - } - - @Test - public void testIssueCallback() throws Exception { - File projectDir = new File(IssuesMediumTest.class.getResource("/mediumtest/xoo/sample").toURI()); - File tmpDir = temp.newFolder(); - FileUtils.copyDirectory(projectDir, tmpDir); - IssueRecorder issueListener = new IssueRecorder(); - - TaskResult result = testerPreview - .newScanTask(new File(tmpDir, "sonar-project.properties")) - .setIssueListener(issueListener) - .property("sonar.analysis.mode", "preview") - .start(); - - assertThat(result.issues()).hasSize(14); - assertThat(issueListener.issueList).hasSize(14); - - assertThat(result.issues()).containsExactlyElementsOf(issueListener.issueList); } @Test @@ -104,7 +73,7 @@ public class IssuesMediumTest { .setIssueListener(issueListener) .start(); - assertThat(result.issues()).hasSize(14); + assertThat(result.issuesFor(result.inputFile("xources/hello/HelloJava.xoo"))).hasSize(8); assertThat(issueListener.issueList).hasSize(0); } @@ -118,7 +87,8 @@ public class IssuesMediumTest { .newScanTask(new File(tmpDir, "sonar-project.properties")) .start(); - assertThat(result.issues()).hasSize(14); + List issues = result.issuesFor(result.inputFile("xources/hello/HelloJava.xoo")); + assertThat(issues).hasSize(8 /* lines */); } @Test @@ -132,7 +102,8 @@ public class IssuesMediumTest { .property("sonar.xoo.internalKey", "OneIssuePerLine.internal") .start(); - assertThat(result.issues()).hasSize(14 /* 8 + 6 lines */+ 2 /* 2 files */); + List issues = result.issuesFor(result.inputFile("xources/hello/HelloJava.xoo")); + assertThat(issues).hasSize(8 /* lines */ + 1 /* file */); } @Test @@ -146,7 +117,8 @@ public class IssuesMediumTest { .property("sonar.oneIssuePerLine.forceSeverity", "CRITICAL") .start(); - assertThat(result.issues().iterator().next().severity()).isEqualTo(Severity.CRITICAL.name()); + List issues = result.issuesFor(result.inputFile("xources/hello/HelloJava.xoo")); + assertThat(issues.get(0).getSeverity()).isEqualTo(org.sonar.batch.protocol.Constants.Severity.CRITICAL); } @Test @@ -161,7 +133,8 @@ public class IssuesMediumTest { .property("sonar.issue.ignore.allfile.1.fileRegexp", "object") .start(); - assertThat(result.issues()).hasSize(8); + assertThat(result.issuesFor(result.inputFile("xources/hello/HelloJava.xoo"))).hasSize(8 /* lines */); + assertThat(result.issuesFor(result.inputFile("xources/hello/helloscala.xoo"))).isEmpty(); } @Test @@ -186,25 +159,25 @@ public class IssuesMediumTest { .build()) .start(); - assertThat(result.issues()).hasSize(10); + List issues = result.issuesFor(result.inputFile("src/sample.xoo")); + assertThat(issues).hasSize(10); boolean foundIssueAtLine1 = false; - for (org.sonar.api.issue.Issue issue : result.issues()) { - if (issue.line() == 1) { + for (Issue issue : issues) { + if (issue.getLine() == 1) { foundIssueAtLine1 = true; - assertThat(issue.componentKey()).isEqualTo("com.foo.project:src/sample.xoo"); - assertThat(issue.message()).isEqualTo("This issue is generated on each line"); - assertThat(issue.effortToFix()).isNull(); + assertThat(issue.getMsg()).isEqualTo("This issue is generated on each line"); + assertThat(issue.hasEffortToFix()).isFalse(); } } assertThat(foundIssueAtLine1).isTrue(); } private class IssueRecorder implements IssueListener { - List issueList = new LinkedList<>(); + List issueList = new LinkedList<>(); @Override - public void handle(Issue issue) { + public void handle(org.sonar.api.issue.Issue issue) { issueList.add(issue); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java index 2d389a5d8cf..d181918a16b 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/IssuesOnDirMediumTest.java @@ -19,9 +19,9 @@ */ package org.sonar.batch.mediumtest.issues; -import org.sonar.xoo.rule.XooRulesDefinition; - import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.io.IOException; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; @@ -31,9 +31,7 @@ import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.input.ActiveRule; import org.sonar.xoo.XooPlugin; - -import java.io.File; -import java.io.IOException; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; @@ -84,9 +82,7 @@ public class IssuesOnDirMediumTest { .build()) .start(); - assertThat(result.issues()).hasSize(2); - assertThat(result.issues().iterator().next().componentKey()).isEqualTo("com.foo.project:src"); - + assertThat(result.issuesFor(result.inputDir("src"))).hasSize(2); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/MultilineIssuesMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/MultilineIssuesMediumTest.java index 02b61ca0cdb..a9c1317b014 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/MultilineIssuesMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/issues/MultilineIssuesMediumTest.java @@ -19,12 +19,7 @@ */ package org.sonar.batch.mediumtest.issues; -import org.sonar.xoo.rule.XooRulesDefinition; - -import org.sonar.batch.protocol.input.Rule; - import java.io.File; - import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; @@ -33,7 +28,10 @@ import org.junit.rules.TemporaryFolder; import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.input.ActiveRule; +import org.sonar.batch.protocol.input.Rule; import org.sonar.xoo.XooPlugin; +import org.sonar.xoo.rule.XooRulesDefinition; + import static org.assertj.core.api.Assertions.assertThat; public class MultilineIssuesMediumTest { @@ -69,7 +67,7 @@ public class MultilineIssuesMediumTest { .newScanTask(new File(tmpDir, "sonar-project.properties")) .start(); - assertThat(result.issues()).hasSize(1); + assertThat(result.issuesFor(result.inputFile("xources/hello/HelloJava.xoo"))).hasSize(1); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/EmptyFileTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/EmptyFileTest.java index 3f7be697caf..37cb1fd994d 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/EmptyFileTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/EmptyFileTest.java @@ -75,7 +75,7 @@ public class EmptyFileTest { .property("sonar.xoo.internalKey", "my/internal/key") .start(); - assertThat(result.issues()).hasSize(11); + assertThat(result.trackedIssues()).hasSize(11); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/IncrementalModeMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/IncrementalModeMediumTest.java index 86697dcea42..6d1685a3d1f 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/IncrementalModeMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/IncrementalModeMediumTest.java @@ -19,9 +19,11 @@ */ package org.sonar.batch.mediumtest.preview; -import org.sonar.xoo.rule.XooRulesDefinition; - import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import org.junit.After; @@ -29,20 +31,17 @@ import org.junit.Before; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.sonar.api.CoreProperties; -import org.sonar.api.issue.Issue; +import org.sonar.api.rule.RuleKey; import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; import org.sonar.batch.protocol.Constants.Severity; import org.sonar.batch.protocol.input.ActiveRule; import org.sonar.batch.protocol.input.FileData; import org.sonar.xoo.XooPlugin; - -import java.io.File; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.groups.Tuple.tuple; public class IncrementalModeMediumTest { @@ -143,21 +142,14 @@ public class IncrementalModeMediumTest { .build()) .start(); - int newIssues = 0; - int openIssues = 0; - int resolvedIssue = 0; - for (Issue issue : result.issues()) { - if (issue.isNew()) { - newIssues++; - } else if (issue.resolution() != null) { - resolvedIssue++; - } else { - openIssues++; - } - } - assertThat(newIssues).isEqualTo(4); - assertThat(openIssues).isEqualTo(2); - assertThat(resolvedIssue).isEqualTo(1); + assertThat(result.trackedIssues()).extracting("ruleKey", "line", "message", "status", "resolution", "new").containsOnly( + tuple(RuleKey.of("xoo", "OneIssuePerLine"), 1, "This issue is generated on each line", "OPEN", null, false), + tuple(RuleKey.of("xoo", "OneIssuePerLine"), 2, "This issue is generated on each line", "OPEN", null, true), + tuple(RuleKey.of("xoo", "OneIssuePerLine"), 3, "This issue is generated on each line", "OPEN", null, true), + tuple(RuleKey.of("xoo", "OneIssuePerLine"), 4, "This issue is generated on each line", "OPEN", null, true), + tuple(RuleKey.of("xoo", "OneIssuePerLine"), 5, "This issue is generated on each line", "OPEN", null, true), + tuple(RuleKey.of("manual", "MyManualIssue"), 4, null, "OPEN", null, false), + tuple(RuleKey.of("xoo", "OneIssuePerFile"), null, "An issue that is no more detected", "CLOSED", "REMOVED", false)); } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/PreviewAndReportsMediumTest.java b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/PreviewAndReportsMediumTest.java index e09631ac9fd..3ba49c04107 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/PreviewAndReportsMediumTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/mediumtest/preview/PreviewAndReportsMediumTest.java @@ -19,12 +19,16 @@ */ package org.sonar.batch.mediumtest.preview; -import org.sonar.batch.protocol.input.Rule; - -import org.sonar.xoo.rule.XooRulesDefinition; import com.google.common.collect.ImmutableMap; +import java.io.File; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.FileFilterUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -32,17 +36,16 @@ import org.junit.rules.TemporaryFolder; import org.sonar.api.CoreProperties; import org.sonar.api.issue.Issue; import org.sonar.api.utils.log.LogTester; +import org.sonar.batch.bootstrapper.IssueListener; import org.sonar.batch.mediumtest.BatchMediumTester; import org.sonar.batch.mediumtest.TaskResult; +import org.sonar.batch.mediumtest.issues.IssuesMediumTest; import org.sonar.batch.protocol.Constants.Severity; import org.sonar.batch.protocol.input.ActiveRule; +import org.sonar.batch.protocol.input.Rule; import org.sonar.batch.scan.report.ConsoleReport; import org.sonar.xoo.XooPlugin; - -import java.io.File; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; +import org.sonar.xoo.rule.XooRulesDefinition; import static org.assertj.core.api.Assertions.assertThat; @@ -131,9 +134,16 @@ public class PreviewAndReportsMediumTest { tester.stop(); } + private File copyProject(String path) throws Exception { + File projectDir = temp.newFolder(); + File originalProjectDir = new File(PreviewAndReportsMediumTest.class.getResource(path).toURI()); + FileUtils.copyDirectory(originalProjectDir, projectDir, FileFilterUtils.notFileFilter(FileFilterUtils.nameFileFilter(".sonar"))); + return projectDir; + } + @Test public void testIssueTracking() throws Exception { - File projectDir = new File(PreviewAndReportsMediumTest.class.getResource("/mediumtest/xoo/sample").toURI()); + File projectDir = copyProject("/mediumtest/xoo/sample"); TaskResult result = tester .newScanTask(new File(projectDir, "sonar-project.properties")) @@ -142,7 +152,7 @@ public class PreviewAndReportsMediumTest { int newIssues = 0; int openIssues = 0; int resolvedIssue = 0; - for (Issue issue : result.issues()) { + for (Issue issue : result.trackedIssues()) { if (issue.isNew()) { newIssues++; } else if (issue.resolution() != null) { @@ -158,7 +168,7 @@ public class PreviewAndReportsMediumTest { @Test public void testConsoleReport() throws Exception { - File projectDir = new File(PreviewAndReportsMediumTest.class.getResource("/mediumtest/xoo/sample").toURI()); + File projectDir = copyProject("/mediumtest/xoo/sample"); tester .newScanTask(new File(projectDir, "sonar-project.properties")) @@ -170,7 +180,7 @@ public class PreviewAndReportsMediumTest { @Test public void testPostJob() throws Exception { - File projectDir = new File(PreviewAndReportsMediumTest.class.getResource("/mediumtest/xoo/sample").toURI()); + File projectDir = copyProject("/mediumtest/xoo/sample"); tester .newScanTask(new File(projectDir, "sonar-project.properties")) @@ -191,7 +201,7 @@ public class PreviewAndReportsMediumTest { @Test public void testHtmlReport() throws Exception { - File projectDir = new File(PreviewAndReportsMediumTest.class.getResource("/mediumtest/xoo/sample").toURI()); + File projectDir = copyProject("/mediumtest/xoo/sample"); tester .newScanTask(new File(projectDir, "sonar-project.properties")) @@ -225,4 +235,30 @@ public class PreviewAndReportsMediumTest { assertThat(FileUtils.readFileToString(new File(baseDir, ".sonar/issues-report/issues-report-light.html"))).contains("No file analyzed"); } + @Test + public void testIssueCallback() throws Exception { + File projectDir = new File(IssuesMediumTest.class.getResource("/mediumtest/xoo/sample").toURI()); + File tmpDir = temp.newFolder(); + FileUtils.copyDirectory(projectDir, tmpDir); + IssueRecorder issueListener = new IssueRecorder(); + + TaskResult result = tester + .newScanTask(new File(tmpDir, "sonar-project.properties")) + .setIssueListener(issueListener) + .start(); + + assertThat(result.trackedIssues()).hasSize(14); + assertThat(issueListener.issueList).hasSize(14); + assertThat(result.trackedIssues()).containsExactlyElementsOf(issueListener.issueList); + } + + private class IssueRecorder implements IssueListener { + List issueList = new LinkedList<>(); + + @Override + public void handle(org.sonar.api.issue.Issue issue) { + issueList.add(issue); + } + } + } diff --git a/sonar-batch/src/test/java/org/sonar/batch/report/IssuesPublisherTest.java b/sonar-batch/src/test/java/org/sonar/batch/report/IssuesPublisherTest.java deleted file mode 100644 index 3e0f79030bf..00000000000 --- a/sonar-batch/src/test/java/org/sonar/batch/report/IssuesPublisherTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.batch.report; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.sonar.api.batch.bootstrap.ProjectDefinition; -import org.sonar.api.resources.Project; -import org.sonar.api.rule.RuleKey; -import org.sonar.batch.index.BatchComponentCache; -import org.sonar.batch.issue.IssueCache; -import org.sonar.batch.protocol.output.BatchReportReader; -import org.sonar.batch.protocol.output.BatchReportWriter; -import org.sonar.core.issue.DefaultIssue; -import org.sonar.core.issue.FieldDiffs; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class IssuesPublisherTest { - - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - - IssueCache issueCache; - ProjectDefinition projectDef; - Project project; - - IssuesPublisher underTest; - - @Before - public void prepare() { - projectDef = ProjectDefinition.create().setKey("foo"); - project = new Project("foo").setAnalysisDate(new Date(1234567L)); - BatchComponentCache componentCache = new BatchComponentCache(); - org.sonar.api.resources.Resource sampleFile = org.sonar.api.resources.File.create("src/Foo.php").setEffectiveKey("foo:src/Foo.php"); - componentCache.add(project, null); - componentCache.add(sampleFile, project); - issueCache = mock(IssueCache.class); - when(issueCache.byComponent(anyString())).thenReturn(Collections.emptyList()); - underTest = new IssuesPublisher(componentCache, issueCache); - } - - @Test - public void write_issues() throws Exception { - DefaultIssue issue1 = new DefaultIssue(); - issue1.setKey("uuid"); - issue1.setSeverity("MAJOR"); - issue1.setRuleKey(RuleKey.of("repo", "rule")); - DefaultIssue issue2 = new DefaultIssue(); - issue2.setKey("uuid2"); - issue2.setSeverity("MAJOR"); - issue2.setRuleKey(RuleKey.of("repo", "rule")); - issue2.setLine(2); - issue2.setMessage("msg"); - issue2.setEffortToFix(2d); - issue2.setResolution("FIXED"); - issue2.setStatus("RESOLVED"); - issue2.setChecksum("checksum"); - issue2.setReporter("reporter"); - issue2.setAssignee("assignee"); - issue2.setActionPlanKey("action"); - issue2.setAuthorLogin("author"); - issue2.setCurrentChange(new FieldDiffs().setUserLogin("foo")); - issue2.setCreationDate(new Date()); - issue2.setUpdateDate(new Date()); - issue2.setCloseDate(new Date()); - issue2.setSelectedAt(1234L); - when(issueCache.byComponent("foo:src/Foo.php")).thenReturn(Arrays.asList(issue1, issue2)); - - File outputDir = temp.newFolder(); - BatchReportWriter writer = new BatchReportWriter(outputDir); - - underTest.publish(writer); - - BatchReportReader reader = new BatchReportReader(outputDir); - assertThat(reader.readComponentIssues(1)).hasSize(0); - assertThat(reader.readComponentIssues(2)).hasSize(2); - } - -} diff --git a/sonar-batch/src/test/java/org/sonar/batch/sensor/DefaultSensorStorageTest.java b/sonar-batch/src/test/java/org/sonar/batch/sensor/DefaultSensorStorageTest.java index aa2e32f96e6..5d8a9a5cdf3 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/sensor/DefaultSensorStorageTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/sensor/DefaultSensorStorageTest.java @@ -19,25 +19,18 @@ */ package org.sonar.batch.sensor; -import java.io.StringReader; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.mockito.ArgumentCaptor; -import org.sonar.api.batch.fs.InputDir; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DefaultFileSystem; -import org.sonar.api.batch.fs.internal.DefaultInputDir; import org.sonar.api.batch.fs.internal.DefaultInputFile; -import org.sonar.api.batch.fs.internal.FileMetadata; import org.sonar.api.batch.measure.MetricFinder; import org.sonar.api.batch.rule.ActiveRules; -import org.sonar.api.batch.rule.Severity; import org.sonar.api.batch.rule.internal.ActiveRulesBuilder; -import org.sonar.api.batch.sensor.issue.internal.DefaultIssue; -import org.sonar.api.batch.sensor.issue.internal.DefaultIssueLocation; import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; import org.sonar.api.config.Settings; import org.sonar.api.measures.CoreMetrics; @@ -45,7 +38,6 @@ import org.sonar.api.measures.Measure; import org.sonar.api.resources.File; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; -import org.sonar.api.rule.RuleKey; import org.sonar.batch.duplication.DuplicationCache; import org.sonar.batch.index.BatchComponentCache; import org.sonar.batch.issue.ModuleIssues; @@ -57,7 +49,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class DefaultSensorStorageTest { @@ -143,66 +134,4 @@ public class DefaultSensorStorageTest { assertThat(m.getMetric()).isEqualTo(CoreMetrics.NCLOC); } - @Test - public void shouldAddIssueOnFile() { - InputFile file = new DefaultInputFile("foo", "src/Foo.php").initMetadata(new FileMetadata().readMetadata(new StringReader("Foo\nBar\nBiz\n"))); - - ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(org.sonar.core.issue.DefaultIssue.class); - - sensorStorage.store(new DefaultIssue() - .addLocation(new DefaultIssueLocation().onFile(file).at(file.selectLine(3)).message("Foo")) - .forRule(RuleKey.of("foo", "bar")) - .effortToFix(10.0)); - - verify(moduleIssues).initAndAddIssue(argumentCaptor.capture()); - - org.sonar.core.issue.DefaultIssue issue = argumentCaptor.getValue(); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("foo", "bar")); - assertThat(issue.message()).isEqualTo("Foo"); - assertThat(issue.line()).isEqualTo(3); - assertThat(issue.severity()).isNull(); - assertThat(issue.effortToFix()).isEqualTo(10.0); - } - - @Test - public void shouldAddIssueOnDirectory() { - InputDir dir = new DefaultInputDir("foo", "src"); - - ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(org.sonar.core.issue.DefaultIssue.class); - - sensorStorage.store(new DefaultIssue() - .addLocation(new DefaultIssueLocation().onDir(dir).message("Foo")) - .forRule(RuleKey.of("foo", "bar")) - .effortToFix(10.0)); - - verify(moduleIssues).initAndAddIssue(argumentCaptor.capture()); - - org.sonar.core.issue.DefaultIssue issue = argumentCaptor.getValue(); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("foo", "bar")); - assertThat(issue.message()).isEqualTo("Foo"); - assertThat(issue.line()).isNull(); - assertThat(issue.severity()).isNull(); - assertThat(issue.effortToFix()).isEqualTo(10.0); - } - - @Test - public void shouldAddIssueOnProject() { - ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(org.sonar.core.issue.DefaultIssue.class); - - sensorStorage.store(new DefaultIssue() - .addLocation(new DefaultIssueLocation().onProject().message("Foo")) - .forRule(RuleKey.of("foo", "bar")) - .overrideSeverity(Severity.BLOCKER) - .effortToFix(10.0)); - - verify(moduleIssues).initAndAddIssue(argumentCaptor.capture()); - - org.sonar.core.issue.DefaultIssue issue = argumentCaptor.getValue(); - assertThat(issue.ruleKey()).isEqualTo(RuleKey.of("foo", "bar")); - assertThat(issue.message()).isEqualTo("Foo"); - assertThat(issue.line()).isNull(); - assertThat(issue.severity()).isEqualTo("BLOCKER"); - assertThat(issue.effortToFix()).isEqualTo(10.0); - } - } -- cgit v1.2.3