import javax.annotation.concurrent.ThreadSafe; | import javax.annotation.concurrent.ThreadSafe; | ||||
import org.sonar.api.ExtensionPoint; | import org.sonar.api.ExtensionPoint; | ||||
import org.sonar.api.batch.ScannerSide; | |||||
import org.sonar.api.scanner.ScannerSide; | |||||
import org.sonarsource.api.sonarlint.SonarLintSide; | import org.sonarsource.api.sonarlint.SonarLintSide; | ||||
/** | /** | ||||
* @since 5.3 | * @since 5.3 | ||||
* @since 7.6 moved to project container | |||||
* @deprecated since 7.6 | * @deprecated since 7.6 | ||||
*/ | */ | ||||
@ScannerSide | @ScannerSide |
package org.sonar.scanner.issue; | package org.sonar.scanner.issue; | ||||
import java.util.Date; | import java.util.Date; | ||||
import javax.annotation.concurrent.ThreadSafe; | import javax.annotation.concurrent.ThreadSafe; | ||||
import org.apache.commons.lang.builder.ToStringBuilder; | import org.apache.commons.lang.builder.ToStringBuilder; | ||||
import org.apache.commons.lang.builder.ToStringStyle; | import org.apache.commons.lang.builder.ToStringStyle; | ||||
import org.sonar.api.batch.fs.InputModule; | |||||
import org.sonar.api.batch.fs.TextRange; | import org.sonar.api.batch.fs.TextRange; | ||||
import org.sonar.api.batch.fs.internal.AbstractProjectOrModule; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputProject; | |||||
import org.sonar.api.batch.fs.internal.DefaultTextPointer; | import org.sonar.api.batch.fs.internal.DefaultTextPointer; | ||||
import org.sonar.api.batch.fs.internal.DefaultTextRange; | import org.sonar.api.batch.fs.internal.DefaultTextRange; | ||||
import org.sonar.api.rule.RuleKey; | import org.sonar.api.rule.RuleKey; | ||||
private final Issue rawIssue; | private final Issue rawIssue; | ||||
private final ProjectAnalysisInfo projectAnalysisInfo; | private final ProjectAnalysisInfo projectAnalysisInfo; | ||||
private final String componentKey; | private final String componentKey; | ||||
private AbstractProjectOrModule module; | |||||
private DefaultInputProject project; | |||||
public DefaultFilterableIssue(InputModule module, ProjectAnalysisInfo projectAnalysisInfo, Issue rawIssue, String componentKey) { | |||||
this.module = (AbstractProjectOrModule) module; | |||||
public DefaultFilterableIssue(DefaultInputProject project, ProjectAnalysisInfo projectAnalysisInfo, Issue rawIssue, String componentKey) { | |||||
this.project = project; | |||||
this.projectAnalysisInfo = projectAnalysisInfo; | this.projectAnalysisInfo = projectAnalysisInfo; | ||||
this.rawIssue = rawIssue; | this.rawIssue = rawIssue; | ||||
this.componentKey = componentKey; | this.componentKey = componentKey; | ||||
@Override | @Override | ||||
public String projectKey() { | public String projectKey() { | ||||
return module.key(); | |||||
return project.key(); | |||||
} | } | ||||
@Override | @Override |
*/ | */ | ||||
package org.sonar.scanner.issue; | package org.sonar.scanner.issue; | ||||
import org.sonar.api.batch.fs.InputModule; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputProject; | |||||
import org.sonar.api.scan.issue.filter.FilterableIssue; | import org.sonar.api.scan.issue.filter.FilterableIssue; | ||||
import org.sonar.api.scan.issue.filter.IssueFilter; | import org.sonar.api.scan.issue.filter.IssueFilter; | ||||
import org.sonar.api.scan.issue.filter.IssueFilterChain; | import org.sonar.api.scan.issue.filter.IssueFilterChain; | ||||
* @deprecated since 7.6, {@link IssueFilter} is deprecated | * @deprecated since 7.6, {@link IssueFilter} is deprecated | ||||
*/ | */ | ||||
@Deprecated | @Deprecated | ||||
public class ModuleIssueFilters { | |||||
public class IssueFilters { | |||||
private final IssueFilterChain filterChain; | private final IssueFilterChain filterChain; | ||||
private final InputModule module; | |||||
private final DefaultInputProject project; | |||||
private final ProjectAnalysisInfo projectAnalysisInfo; | private final ProjectAnalysisInfo projectAnalysisInfo; | ||||
public ModuleIssueFilters(InputModule module, ProjectAnalysisInfo projectAnalysisInfo, IssueFilter[] exclusionFilters) { | |||||
this.module = module; | |||||
public IssueFilters(DefaultInputProject project, ProjectAnalysisInfo projectAnalysisInfo, IssueFilter[] exclusionFilters) { | |||||
this.project = project; | |||||
this.filterChain = new DefaultIssueFilterChain(exclusionFilters); | this.filterChain = new DefaultIssueFilterChain(exclusionFilters); | ||||
this.projectAnalysisInfo = projectAnalysisInfo; | this.projectAnalysisInfo = projectAnalysisInfo; | ||||
} | } | ||||
public ModuleIssueFilters(InputModule module, ProjectAnalysisInfo projectAnalysisInfo) { | |||||
this(module, projectAnalysisInfo, new IssueFilter[0]); | |||||
public IssueFilters(DefaultInputProject project, ProjectAnalysisInfo projectAnalysisInfo) { | |||||
this(project, projectAnalysisInfo, new IssueFilter[0]); | |||||
} | } | ||||
public boolean accept(String componentKey, ScannerReport.Issue rawIssue) { | public boolean accept(String componentKey, ScannerReport.Issue rawIssue) { | ||||
FilterableIssue fIssue = new DefaultFilterableIssue(module, projectAnalysisInfo, rawIssue, componentKey); | |||||
FilterableIssue fIssue = new DefaultFilterableIssue(project, projectAnalysisInfo, rawIssue, componentKey); | |||||
return filterChain.accept(fIssue); | return filterChain.accept(fIssue); | ||||
} | } | ||||
* Initialize the issues raised during scan. | * Initialize the issues raised during scan. | ||||
*/ | */ | ||||
@ThreadSafe | @ThreadSafe | ||||
public class ModuleIssues { | |||||
public class IssuePublisher { | |||||
private final ActiveRules activeRules; | private final ActiveRules activeRules; | ||||
private final ModuleIssueFilters filters; | |||||
private final IssueFilters filters; | |||||
private final ReportPublisher reportPublisher; | private final ReportPublisher reportPublisher; | ||||
public ModuleIssues(ActiveRules activeRules, ModuleIssueFilters filters, ReportPublisher reportPublisher) { | |||||
public IssuePublisher(ActiveRules activeRules, IssueFilters filters, ReportPublisher reportPublisher) { | |||||
this.activeRules = activeRules; | this.activeRules = activeRules; | ||||
this.filters = filters; | this.filters = filters; | ||||
this.reportPublisher = reportPublisher; | this.reportPublisher = reportPublisher; |
import org.sonar.scanner.bootstrap.ExtensionInstaller; | import org.sonar.scanner.bootstrap.ExtensionInstaller; | ||||
import org.sonar.scanner.bootstrap.SensorExtensionDictionnary; | import org.sonar.scanner.bootstrap.SensorExtensionDictionnary; | ||||
import org.sonar.scanner.deprecated.perspectives.ScannerPerspectives; | import org.sonar.scanner.deprecated.perspectives.ScannerPerspectives; | ||||
import org.sonar.scanner.issue.ModuleIssueFilters; | |||||
import org.sonar.scanner.issue.ModuleIssues; | |||||
import org.sonar.scanner.phases.ModuleCoverageExclusions; | |||||
import org.sonar.scanner.phases.SensorsExecutor; | import org.sonar.scanner.phases.SensorsExecutor; | ||||
import org.sonar.scanner.scan.filesystem.DefaultModuleFileSystem; | import org.sonar.scanner.scan.filesystem.DefaultModuleFileSystem; | ||||
import org.sonar.scanner.scan.filesystem.ModuleInputComponentStore; | import org.sonar.scanner.scan.filesystem.ModuleInputComponentStore; | ||||
DefaultSensorStorage.class, | DefaultSensorStorage.class, | ||||
DefaultSensorContext.class, | DefaultSensorContext.class, | ||||
SensorExtensionDictionnary.class, | SensorExtensionDictionnary.class, | ||||
ModuleIssueFilters.class, | |||||
ModuleCoverageExclusions.class, | |||||
// issues | |||||
ModuleIssues.class, | |||||
// Perspectives | // Perspectives | ||||
ScannerPerspectives.class, | ScannerPerspectives.class, |
import org.sonar.scanner.deprecated.test.TestableBuilder; | import org.sonar.scanner.deprecated.test.TestableBuilder; | ||||
import org.sonar.scanner.issue.DefaultProjectIssues; | import org.sonar.scanner.issue.DefaultProjectIssues; | ||||
import org.sonar.scanner.issue.IssueCache; | import org.sonar.scanner.issue.IssueCache; | ||||
import org.sonar.scanner.issue.IssueFilters; | |||||
import org.sonar.scanner.issue.IssuePublisher; | |||||
import org.sonar.scanner.issue.ignore.EnforceIssuesFilter; | import org.sonar.scanner.issue.ignore.EnforceIssuesFilter; | ||||
import org.sonar.scanner.issue.ignore.IgnoreIssuesFilter; | import org.sonar.scanner.issue.ignore.IgnoreIssuesFilter; | ||||
import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer; | import org.sonar.scanner.issue.ignore.pattern.IssueExclusionPatternInitializer; | ||||
DefaultProjectIssues.class, | DefaultProjectIssues.class, | ||||
IssueTransition.class, | IssueTransition.class, | ||||
NoSonarFilter.class, | NoSonarFilter.class, | ||||
IssueFilters.class, | |||||
IssuePublisher.class, | |||||
// metrics | // metrics | ||||
DefaultMetricFinder.class, | DefaultMetricFinder.class, |
import org.sonar.duplications.block.Block; | import org.sonar.duplications.block.Block; | ||||
import org.sonar.duplications.internal.pmd.PmdBlockChunker; | import org.sonar.duplications.internal.pmd.PmdBlockChunker; | ||||
import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; | import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; | ||||
import org.sonar.scanner.issue.ModuleIssues; | |||||
import org.sonar.scanner.issue.IssuePublisher; | |||||
import org.sonar.scanner.protocol.Constants; | import org.sonar.scanner.protocol.Constants; | ||||
import org.sonar.scanner.protocol.output.FileStructure; | import org.sonar.scanner.protocol.output.FileStructure; | ||||
import org.sonar.scanner.protocol.output.ScannerReport; | import org.sonar.scanner.protocol.output.ScannerReport; | ||||
} | } | ||||
private final MetricFinder metricFinder; | private final MetricFinder metricFinder; | ||||
private final ModuleIssues moduleIssues; | |||||
private final IssuePublisher moduleIssues; | |||||
private final ReportPublisher reportPublisher; | private final ReportPublisher reportPublisher; | ||||
private final MeasureCache measureCache; | private final MeasureCache measureCache; | ||||
private final SonarCpdBlockIndex index; | private final SonarCpdBlockIndex index; | ||||
private final BranchConfiguration branchConfiguration; | private final BranchConfiguration branchConfiguration; | ||||
private final Set<String> alreadyLogged = new HashSet<>(); | private final Set<String> alreadyLogged = new HashSet<>(); | ||||
public DefaultSensorStorage(MetricFinder metricFinder, ModuleIssues moduleIssues, Configuration settings, | |||||
ReportPublisher reportPublisher, MeasureCache measureCache, SonarCpdBlockIndex index, | |||||
ContextPropertiesCache contextPropertiesCache, ScannerMetrics scannerMetrics, BranchConfiguration branchConfiguration) { | |||||
public DefaultSensorStorage(MetricFinder metricFinder, IssuePublisher moduleIssues, Configuration settings, | |||||
ReportPublisher reportPublisher, MeasureCache measureCache, SonarCpdBlockIndex index, | |||||
ContextPropertiesCache contextPropertiesCache, ScannerMetrics scannerMetrics, BranchConfiguration branchConfiguration) { | |||||
this.metricFinder = metricFinder; | this.metricFinder = metricFinder; | ||||
this.moduleIssues = moduleIssues; | this.moduleIssues = moduleIssues; | ||||
this.settings = settings; | this.settings = settings; |
*/ | */ | ||||
package org.sonar.scanner; | package org.sonar.scanner; | ||||
import java.io.File; | |||||
import java.util.List; | |||||
import org.junit.Before; | import org.junit.Before; | ||||
import org.junit.Rule; | import org.junit.Rule; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.junit.rules.ExpectedException; | import org.junit.rules.ExpectedException; | ||||
import org.junit.rules.TemporaryFolder; | import org.junit.rules.TemporaryFolder; | ||||
import org.mockito.ArgumentCaptor; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputFile; | |||||
import org.sonar.api.batch.fs.internal.TestInputFileBuilder; | import org.sonar.api.batch.fs.internal.TestInputFileBuilder; | ||||
import org.sonar.api.batch.measure.MetricFinder; | import org.sonar.api.batch.measure.MetricFinder; | ||||
import org.sonar.api.batch.sensor.internal.SensorContextTester; | |||||
import org.sonar.api.batch.sensor.internal.SensorStorage; | |||||
import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; | import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; | ||||
import org.sonar.api.measures.CoreMetrics; | import org.sonar.api.measures.CoreMetrics; | ||||
import org.sonar.scanner.scan.measure.MeasureCache; | import org.sonar.scanner.scan.measure.MeasureCache; | ||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
import static org.assertj.core.api.Assertions.tuple; | |||||
import static org.hamcrest.CoreMatchers.is; | import static org.hamcrest.CoreMatchers.is; | ||||
import static org.hamcrest.CoreMatchers.nullValue; | import static org.hamcrest.CoreMatchers.nullValue; | ||||
import static org.junit.Assert.assertThat; | import static org.junit.Assert.assertThat; | ||||
import static org.mockito.Mockito.mock; | import static org.mockito.Mockito.mock; | ||||
import static org.mockito.Mockito.times; | |||||
import static org.mockito.Mockito.verify; | |||||
import static org.mockito.Mockito.when; | import static org.mockito.Mockito.when; | ||||
import static org.sonar.api.measures.CoreMetrics.EXECUTABLE_LINES_DATA_KEY; | import static org.sonar.api.measures.CoreMetrics.EXECUTABLE_LINES_DATA_KEY; | ||||
import static org.sonar.api.measures.CoreMetrics.NCLOC_DATA_KEY; | import static org.sonar.api.measures.CoreMetrics.NCLOC_DATA_KEY; | ||||
private DefaultFileLinesContext fileLineMeasures; | private DefaultFileLinesContext fileLineMeasures; | ||||
private SensorContextTester sensorContextTester; | |||||
private MeasureCache measureCache; | private MeasureCache measureCache; | ||||
private SensorStorage sensorStorage; | |||||
private DefaultInputFile file; | |||||
@Before | @Before | ||||
public void setUp() throws Exception { | public void setUp() throws Exception { | ||||
sensorContextTester = SensorContextTester.create(temp.newFolder()); | |||||
MetricFinder metricFinder = mock(MetricFinder.class); | MetricFinder metricFinder = mock(MetricFinder.class); | ||||
org.sonar.api.batch.measure.Metric<String> hitsMetric = mock(org.sonar.api.batch.measure.Metric.class); | org.sonar.api.batch.measure.Metric<String> hitsMetric = mock(org.sonar.api.batch.measure.Metric.class); | ||||
when(hitsMetric.valueType()).thenReturn(String.class); | when(hitsMetric.valueType()).thenReturn(String.class); | ||||
when(metricFinder.<String>findByKey(CoreMetrics.NCLOC_DATA_KEY)).thenReturn(CoreMetrics.NCLOC_DATA); | when(metricFinder.<String>findByKey(CoreMetrics.NCLOC_DATA_KEY)).thenReturn(CoreMetrics.NCLOC_DATA); | ||||
when(metricFinder.<String>findByKey(CoreMetrics.EXECUTABLE_LINES_DATA_KEY)).thenReturn(CoreMetrics.EXECUTABLE_LINES_DATA); | when(metricFinder.<String>findByKey(CoreMetrics.EXECUTABLE_LINES_DATA_KEY)).thenReturn(CoreMetrics.EXECUTABLE_LINES_DATA); | ||||
measureCache = mock(MeasureCache.class); | measureCache = mock(MeasureCache.class); | ||||
fileLineMeasures = new DefaultFileLinesContext(sensorContextTester, new TestInputFileBuilder("foo", "src/foo.php").initMetadata("Foo\nbar\nbiz").build(), metricFinder, | |||||
sensorStorage = mock(SensorStorage.class); | |||||
file = new TestInputFileBuilder("foo", "src/foo.php").initMetadata("Foo\nbar\nbiz").build(); | |||||
fileLineMeasures = new DefaultFileLinesContext(sensorStorage, file, metricFinder, | |||||
measureCache); | measureCache); | ||||
} | } | ||||
assertThat(fileLineMeasures.toString()).isEqualTo("DefaultFileLinesContext{map={hits={1=2, 3=0}}}"); | assertThat(fileLineMeasures.toString()).isEqualTo("DefaultFileLinesContext{map={hits={1=2, 3=0}}}"); | ||||
assertThat(sensorContextTester.measure("foo:src/foo.php", HITS_METRIC_KEY).value()).isEqualTo("1=2;3=0"); | |||||
ArgumentCaptor<DefaultMeasure> captor = ArgumentCaptor.forClass(DefaultMeasure.class); | |||||
verify(sensorStorage).store(captor.capture()); | |||||
DefaultMeasure measure = captor.getValue(); | |||||
assertThat(measure.inputComponent()).isEqualTo(file); | |||||
assertThat(measure.metric().key()).isEqualTo(HITS_METRIC_KEY); | |||||
assertThat(measure.value()).isEqualTo("1=2;3=0"); | |||||
} | } | ||||
@Test | @Test | ||||
fileLineMeasures.setIntValue(EXECUTABLE_LINES_DATA_KEY, 2, 1); | fileLineMeasures.setIntValue(EXECUTABLE_LINES_DATA_KEY, 2, 1); | ||||
fileLineMeasures.save(); | fileLineMeasures.save(); | ||||
assertThat(sensorContextTester.measure("foo:src/foo.php", NCLOC_DATA_KEY).value()).isEqualTo("2=1"); | |||||
assertThat(sensorContextTester.measure("foo:src/foo.php", EXECUTABLE_LINES_DATA_KEY).value()).isEqualTo("2=1"); | |||||
ArgumentCaptor<DefaultMeasure> captor = ArgumentCaptor.forClass(DefaultMeasure.class); | |||||
verify(sensorStorage, times(2)).store(captor.capture()); | |||||
List<DefaultMeasure> measures = captor.getAllValues(); | |||||
assertThat(measures).extracting(DefaultMeasure::inputComponent, m -> m.metric().key(), DefaultMeasure::value) | |||||
.containsExactlyInAnyOrder(tuple(file, NCLOC_DATA_KEY, "2=1"), | |||||
tuple(file, EXECUTABLE_LINES_DATA_KEY, "2=1")); | |||||
} | } | ||||
@Test | @Test | ||||
fileLineMeasures.setIntValue(BRANCHES_METRIC_KEY, 3, 4); | fileLineMeasures.setIntValue(BRANCHES_METRIC_KEY, 3, 4); | ||||
fileLineMeasures.save(); | fileLineMeasures.save(); | ||||
assertThat(sensorContextTester.measure("foo:src/foo.php", HITS_METRIC_KEY).value()).isEqualTo("1=2;3=4"); | |||||
assertThat(sensorContextTester.measure("foo:src/foo.php", AUTHOR_METRIC_KEY).value()).isEqualTo("1=simon;3=evgeny"); | |||||
assertThat(sensorContextTester.measure("foo:src/foo.php", BRANCHES_METRIC_KEY).value()).isEqualTo("1=2;3=4"); | |||||
ArgumentCaptor<DefaultMeasure> captor = ArgumentCaptor.forClass(DefaultMeasure.class); | |||||
verify(sensorStorage, times(3)).store(captor.capture()); | |||||
List<DefaultMeasure> measures = captor.getAllValues(); | |||||
assertThat(measures).extracting(DefaultMeasure::inputComponent, m -> m.metric().key(), DefaultMeasure::value) | |||||
.containsExactlyInAnyOrder(tuple(file, HITS_METRIC_KEY, "1=2;3=4"), | |||||
tuple(file, AUTHOR_METRIC_KEY, "1=simon;3=evgeny"), | |||||
tuple(file, BRANCHES_METRIC_KEY, "1=2;3=4")); | |||||
} | } | ||||
@Test(expected = UnsupportedOperationException.class) | @Test(expected = UnsupportedOperationException.class) |
import java.util.Date; | import java.util.Date; | ||||
import org.junit.Before; | import org.junit.Before; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.sonar.api.batch.fs.internal.DefaultInputModule; | |||||
import org.sonar.api.batch.fs.internal.DefaultInputProject; | |||||
import org.sonar.scanner.ProjectAnalysisInfo; | import org.sonar.scanner.ProjectAnalysisInfo; | ||||
import org.sonar.scanner.protocol.Constants.Severity; | import org.sonar.scanner.protocol.Constants.Severity; | ||||
import org.sonar.scanner.protocol.output.ScannerReport.Issue; | import org.sonar.scanner.protocol.output.ScannerReport.Issue; | ||||
public class DefaultFilterableIssueTest { | public class DefaultFilterableIssueTest { | ||||
private DefaultFilterableIssue issue; | private DefaultFilterableIssue issue; | ||||
private DefaultInputModule mockedProject; | |||||
private DefaultInputProject mockedProject; | |||||
private ProjectAnalysisInfo projectAnalysisInfo; | private ProjectAnalysisInfo projectAnalysisInfo; | ||||
private String componentKey; | private String componentKey; | ||||
private Issue rawIssue; | private Issue rawIssue; | ||||
@Before | @Before | ||||
public void setUp() { | public void setUp() { | ||||
mockedProject = mock(DefaultInputModule.class); | |||||
mockedProject = mock(DefaultInputProject.class); | |||||
projectAnalysisInfo = mock(ProjectAnalysisInfo.class); | projectAnalysisInfo = mock(ProjectAnalysisInfo.class); | ||||
componentKey = "component"; | componentKey = "component"; | ||||
} | } |
import static org.mockito.Mockito.when; | import static org.mockito.Mockito.when; | ||||
@RunWith(MockitoJUnitRunner.class) | @RunWith(MockitoJUnitRunner.class) | ||||
public class ModuleIssuesTest { | |||||
public class IssuePublisherTest { | |||||
static final RuleKey SQUID_RULE_KEY = RuleKey.of("squid", "AvoidCycle"); | static final RuleKey SQUID_RULE_KEY = RuleKey.of("squid", "AvoidCycle"); | ||||
static final String SQUID_RULE_NAME = "Avoid Cycle"; | static final String SQUID_RULE_NAME = "Avoid Cycle"; | ||||
public TemporaryFolder temp = new TemporaryFolder(); | public TemporaryFolder temp = new TemporaryFolder(); | ||||
@Mock | @Mock | ||||
ModuleIssueFilters filters; | |||||
IssueFilters filters; | |||||
ActiveRulesBuilder activeRulesBuilder = new ActiveRulesBuilder(); | ActiveRulesBuilder activeRulesBuilder = new ActiveRulesBuilder(); | ||||
RulesBuilder ruleBuilder = new RulesBuilder(); | RulesBuilder ruleBuilder = new RulesBuilder(); | ||||
ModuleIssues moduleIssues; | |||||
IssuePublisher moduleIssues; | |||||
DefaultInputFile file = new TestInputFileBuilder("foo", "src/Foo.php").initMetadata("Foo\nBar\nBiz\n").build(); | DefaultInputFile file = new TestInputFileBuilder("foo", "src/Foo.php").initMetadata("Foo\nBar\nBiz\n").build(); | ||||
ReportPublisher reportPublisher = mock(ReportPublisher.class, RETURNS_DEEP_STUBS); | ReportPublisher reportPublisher = mock(ReportPublisher.class, RETURNS_DEEP_STUBS); | ||||
} | } | ||||
/** | /** | ||||
* Every rules and active rules has to be added in builders before creating ModuleIssues | |||||
* Every rules and active rules has to be added in builders before creating IssuePublisher | |||||
*/ | */ | ||||
private void initModuleIssues() { | private void initModuleIssues() { | ||||
moduleIssues = new ModuleIssues(activeRulesBuilder.build(), filters, reportPublisher); | |||||
moduleIssues = new IssuePublisher(activeRulesBuilder.build(), filters, reportPublisher); | |||||
} | } | ||||
} | } |
import org.sonar.api.utils.KeyValueFormat; | import org.sonar.api.utils.KeyValueFormat; | ||||
import org.sonar.core.metric.ScannerMetrics; | import org.sonar.core.metric.ScannerMetrics; | ||||
import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; | import org.sonar.scanner.cpd.index.SonarCpdBlockIndex; | ||||
import org.sonar.scanner.issue.ModuleIssues; | |||||
import org.sonar.scanner.issue.IssuePublisher; | |||||
import org.sonar.scanner.protocol.output.FileStructure; | import org.sonar.scanner.protocol.output.FileStructure; | ||||
import org.sonar.scanner.protocol.output.ScannerReportWriter; | import org.sonar.scanner.protocol.output.ScannerReportWriter; | ||||
import org.sonar.scanner.report.ReportPublisher; | import org.sonar.scanner.report.ReportPublisher; | ||||
private DefaultSensorStorage underTest; | private DefaultSensorStorage underTest; | ||||
private MapSettings settings; | private MapSettings settings; | ||||
private ModuleIssues moduleIssues; | |||||
private IssuePublisher moduleIssues; | |||||
private MeasureCache measureCache; | private MeasureCache measureCache; | ||||
private ScannerReportWriter reportWriter; | private ScannerReportWriter reportWriter; | ||||
private ContextPropertiesCache contextPropertiesCache = new ContextPropertiesCache(); | private ContextPropertiesCache contextPropertiesCache = new ContextPropertiesCache(); | ||||
when(metricFinder.<Integer>findByKey(CoreMetrics.LINES_TO_COVER_KEY)).thenReturn(CoreMetrics.LINES_TO_COVER); | when(metricFinder.<Integer>findByKey(CoreMetrics.LINES_TO_COVER_KEY)).thenReturn(CoreMetrics.LINES_TO_COVER); | ||||
settings = new MapSettings(); | settings = new MapSettings(); | ||||
moduleIssues = mock(ModuleIssues.class); | |||||
moduleIssues = mock(IssuePublisher.class); | |||||
measureCache = mock(MeasureCache.class); | measureCache = mock(MeasureCache.class); | ||||
ReportPublisher reportPublisher = mock(ReportPublisher.class); | ReportPublisher reportPublisher = mock(ReportPublisher.class); |