@@ -98,8 +98,8 @@ public class CoveragePerTestSensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("Xoo Coverage Per Test Sensor") | |||
.workOnLanguages(Xoo.KEY) | |||
.workOnFileTypes(InputFile.Type.TEST); | |||
.onlyOnLanguages(Xoo.KEY) | |||
.onlyOnFileType(InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -91,8 +91,8 @@ public class DependencySensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("Xoo Dependency Sensor") | |||
.workOnLanguages(Xoo.KEY) | |||
.workOnFileTypes(InputFile.Type.MAIN); | |||
.onlyOnLanguages(Xoo.KEY) | |||
.onlyOnFileType(InputFile.Type.MAIN); | |||
} | |||
@Override |
@@ -112,8 +112,8 @@ public class MeasureSensor implements Sensor { | |||
descriptor | |||
.name("Xoo Measure Sensor") | |||
.provides(CoreMetrics.LINES) | |||
.workOnLanguages(Xoo.KEY) | |||
.workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
.onlyOnLanguages(Xoo.KEY) | |||
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -87,8 +87,8 @@ public class SymbolReferencesSensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("Xoo Symbol Reference Sensor") | |||
.workOnLanguages(Xoo.KEY) | |||
.workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
.onlyOnLanguages(Xoo.KEY) | |||
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -85,8 +85,8 @@ public class SyntaxHighlightingSensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("Xoo Highlighting Sensor") | |||
.workOnLanguages(Xoo.KEY) | |||
.workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
.onlyOnLanguages(Xoo.KEY) | |||
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -97,8 +97,8 @@ public class TestCaseSensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("Xoo TestPlan Sensor") | |||
.workOnLanguages(Xoo.KEY) | |||
.workOnFileTypes(InputFile.Type.TEST); | |||
.onlyOnLanguages(Xoo.KEY) | |||
.onlyOnFileType(InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -61,8 +61,8 @@ public class XooTokenizerSensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("Xoo Tokenizer Sensor") | |||
.workOnLanguages(Xoo.KEY) | |||
.workOnFileTypes(InputFile.Type.MAIN); | |||
.onlyOnLanguages(Xoo.KEY) | |||
.onlyOnFileType(InputFile.Type.MAIN); | |||
} | |||
@Override |
@@ -34,9 +34,9 @@ public class CreateIssueByInternalKeySensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("CreateIssueByInternalKeySensor") | |||
.workOnLanguages(Xoo.KEY) | |||
.onlyOnLanguages(Xoo.KEY) | |||
.createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY) | |||
.workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -35,9 +35,9 @@ public class OneIssueOnDirPerFileSensor implements Sensor { | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("One Issue On Dir Per File") | |||
.workOnLanguages(Xoo.KEY) | |||
.onlyOnLanguages(Xoo.KEY) | |||
.createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY) | |||
.workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -39,9 +39,9 @@ public class OneIssuePerLineSensor implements Sensor { | |||
descriptor | |||
.name("One Issue Per Line") | |||
.dependsOn(CoreMetrics.LINES) | |||
.workOnLanguages(Xoo.KEY) | |||
.onlyOnLanguages(Xoo.KEY) | |||
.createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY) | |||
.workOnFileTypes(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST); | |||
} | |||
@Override |
@@ -21,18 +21,12 @@ package org.sonar.batch.scan; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.sonar.api.batch.DependedUpon; | |||
import org.sonar.api.batch.DependsUpon; | |||
import org.sonar.api.batch.measure.Metric; | |||
import org.sonar.api.batch.sensor.Sensor; | |||
import org.sonar.api.batch.sensor.SensorContext; | |||
import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; | |||
import org.sonar.api.resources.Project; | |||
import org.sonar.batch.scan2.AnalyzerOptimizer; | |||
import java.util.Arrays; | |||
import java.util.List; | |||
public class SensorWrapper implements org.sonar.api.batch.Sensor { | |||
private static final Logger LOG = LoggerFactory.getLogger(SensorWrapper.class); | |||
@@ -54,16 +48,6 @@ public class SensorWrapper implements org.sonar.api.batch.Sensor { | |||
return wrappedSensor; | |||
} | |||
@DependedUpon | |||
public List<Metric> provides() { | |||
return Arrays.asList(descriptor.provides()); | |||
} | |||
@DependsUpon | |||
public List<Metric> depends() { | |||
return Arrays.asList(descriptor.dependsOn()); | |||
} | |||
@Override | |||
public boolean shouldExecuteOnProject(Project project) { | |||
return optimizer.shouldExecute(descriptor); |
@@ -24,9 +24,9 @@ import org.slf4j.LoggerFactory; | |||
import org.sonar.api.BatchComponent; | |||
import org.sonar.api.batch.fs.FilePredicate; | |||
import org.sonar.api.batch.fs.FileSystem; | |||
import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.batch.rule.ActiveRules; | |||
import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; | |||
import org.sonar.api.config.Settings; | |||
public class AnalyzerOptimizer implements BatchComponent { | |||
@@ -34,10 +34,12 @@ public class AnalyzerOptimizer implements BatchComponent { | |||
private final FileSystem fs; | |||
private final ActiveRules activeRules; | |||
private final Settings settings; | |||
public AnalyzerOptimizer(FileSystem fs, ActiveRules activeRules) { | |||
public AnalyzerOptimizer(FileSystem fs, ActiveRules activeRules, Settings settings) { | |||
this.fs = fs; | |||
this.activeRules = activeRules; | |||
this.settings = settings; | |||
} | |||
/** | |||
@@ -52,6 +54,21 @@ public class AnalyzerOptimizer implements BatchComponent { | |||
LOG.debug("'{}' skipped because there is no related rule activated in the quality profile", descriptor.name()); | |||
return false; | |||
} | |||
if (!settingsCondition(descriptor)) { | |||
LOG.debug("'{}' skipped because one of the required properties is missing", descriptor.name()); | |||
return false; | |||
} | |||
return true; | |||
} | |||
private boolean settingsCondition(DefaultSensorDescriptor descriptor) { | |||
if (!descriptor.properties().isEmpty()) { | |||
for (String propertyKey : descriptor.properties()) { | |||
if (!settings.hasKey(propertyKey)) { | |||
return false; | |||
} | |||
} | |||
} | |||
return true; | |||
} | |||
@@ -68,15 +85,10 @@ public class AnalyzerOptimizer implements BatchComponent { | |||
} | |||
private boolean fsCondition(DefaultSensorDescriptor descriptor) { | |||
if (!descriptor.languages().isEmpty() || !descriptor.types().isEmpty()) { | |||
if (!descriptor.languages().isEmpty() || descriptor.type() != null) { | |||
FilePredicate langPredicate = descriptor.languages().isEmpty() ? fs.predicates().all() : fs.predicates().hasLanguages(descriptor.languages()); | |||
FilePredicate typePredicate = descriptor.types().isEmpty() ? fs.predicates().all() : fs.predicates().none(); | |||
for (InputFile.Type type : descriptor.types()) { | |||
typePredicate = fs.predicates().or( | |||
typePredicate, | |||
fs.predicates().hasType(type)); | |||
} | |||
FilePredicate typePredicate = descriptor.type() == null ? fs.predicates().all() : fs.predicates().hasType(descriptor.type()); | |||
return fs.hasFiles(fs.predicates().and(langPredicate, typePredicate)); | |||
} | |||
return true; |
@@ -59,11 +59,7 @@ public final class ScmSensor implements Sensor { | |||
@Override | |||
public void describe(SensorDescriptor descriptor) { | |||
descriptor | |||
.name("SCM Sensor") | |||
.provides(CoreMetrics.SCM_AUTHORS_BY_LINE, | |||
CoreMetrics.SCM_LAST_COMMIT_DATETIMES_BY_LINE, | |||
CoreMetrics.SCM_REVISIONS_BY_LINE); | |||
descriptor.name("SCM Sensor"); | |||
} | |||
@Override |
@@ -29,6 +29,7 @@ import org.sonar.api.batch.fs.internal.DefaultInputFile; | |||
import org.sonar.api.batch.rule.ActiveRules; | |||
import org.sonar.api.batch.rule.internal.ActiveRulesBuilder; | |||
import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; | |||
import org.sonar.api.config.Settings; | |||
import org.sonar.api.rule.RuleKey; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
@@ -41,9 +42,12 @@ public class AnalyzerOptimizerTest { | |||
public ExpectedException thrown = ExpectedException.none(); | |||
private AnalyzerOptimizer optimizer; | |||
private Settings settings; | |||
@Before | |||
public void prepare() { | |||
optimizer = new AnalyzerOptimizer(fs, new ActiveRulesBuilder().build()); | |||
settings = new Settings(); | |||
optimizer = new AnalyzerOptimizer(fs, new ActiveRulesBuilder().build(), settings); | |||
} | |||
@Test | |||
@@ -56,7 +60,7 @@ public class AnalyzerOptimizerTest { | |||
@Test | |||
public void should_optimize_on_language() throws Exception { | |||
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor() | |||
.workOnLanguages("java", "php"); | |||
.onlyOnLanguages("java", "php"); | |||
assertThat(optimizer.shouldExecute(descriptor)).isFalse(); | |||
fs.add(new DefaultInputFile("foo", "src/Foo.java").setLanguage("java")); | |||
@@ -66,7 +70,7 @@ public class AnalyzerOptimizerTest { | |||
@Test | |||
public void should_optimize_on_type() throws Exception { | |||
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor() | |||
.workOnFileTypes(InputFile.Type.MAIN); | |||
.onlyOnFileType(InputFile.Type.MAIN); | |||
assertThat(optimizer.shouldExecute(descriptor)).isFalse(); | |||
fs.add(new DefaultInputFile("foo", "tests/FooTest.java").setType(InputFile.Type.TEST)); | |||
@@ -79,8 +83,8 @@ public class AnalyzerOptimizerTest { | |||
@Test | |||
public void should_optimize_on_both_type_and_language() throws Exception { | |||
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor() | |||
.workOnLanguages("java", "php") | |||
.workOnFileTypes(InputFile.Type.MAIN); | |||
.onlyOnLanguages("java", "php") | |||
.onlyOnFileType(InputFile.Type.MAIN); | |||
assertThat(optimizer.shouldExecute(descriptor)).isFalse(); | |||
fs.add(new DefaultInputFile("foo", "tests/FooTest.java").setLanguage("java").setType(InputFile.Type.TEST)); | |||
@@ -101,7 +105,7 @@ public class AnalyzerOptimizerTest { | |||
.create(RuleKey.of("repo1", "foo")) | |||
.activate() | |||
.build(); | |||
optimizer = new AnalyzerOptimizer(fs, activeRules); | |||
optimizer = new AnalyzerOptimizer(fs, activeRules, settings); | |||
assertThat(optimizer.shouldExecute(descriptor)).isFalse(); | |||
@@ -111,7 +115,17 @@ public class AnalyzerOptimizerTest { | |||
.create(RuleKey.of("squid", "rule")) | |||
.activate() | |||
.build(); | |||
optimizer = new AnalyzerOptimizer(fs, activeRules); | |||
optimizer = new AnalyzerOptimizer(fs, activeRules, settings); | |||
assertThat(optimizer.shouldExecute(descriptor)).isTrue(); | |||
} | |||
@Test | |||
public void should_optimize_on_settings() throws Exception { | |||
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor() | |||
.requireProperty("sonar.foo.reportPath"); | |||
assertThat(optimizer.shouldExecute(descriptor)).isFalse(); | |||
settings.setProperty("sonar.foo.reportPath", "foo"); | |||
assertThat(optimizer.shouldExecute(descriptor)).isTrue(); | |||
} | |||
} |
@@ -26,8 +26,6 @@ import org.apache.commons.lang.ClassUtils; | |||
import org.sonar.api.BatchExtension; | |||
import org.sonar.api.batch.maven.DependsUponMavenPlugin; | |||
import org.sonar.api.batch.maven.MavenPluginHandler; | |||
import org.sonar.api.batch.sensor.Sensor; | |||
import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; | |||
import org.sonar.api.platform.ComponentContainer; | |||
import org.sonar.api.resources.Project; | |||
import org.sonar.api.utils.AnnotationUtils; | |||
@@ -148,11 +146,6 @@ public class BatchExtensionDictionnary { | |||
private <T> List<Object> getDependencies(T extension) { | |||
List<Object> result = new ArrayList<Object>(); | |||
result.addAll(evaluateAnnotatedClasses(extension, DependsUpon.class)); | |||
if (ClassUtils.isAssignable(extension.getClass(), Sensor.class)) { | |||
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor(); | |||
((Sensor) extension).describe(descriptor); | |||
result.addAll(Arrays.asList(descriptor.dependsOn())); | |||
} | |||
return result; | |||
} | |||
@@ -162,11 +155,6 @@ public class BatchExtensionDictionnary { | |||
public <T> List<Object> getDependents(T extension) { | |||
List<Object> result = new ArrayList<Object>(); | |||
result.addAll(evaluateAnnotatedClasses(extension, DependedUpon.class)); | |||
if (ClassUtils.isAssignable(extension.getClass(), Sensor.class)) { | |||
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor(); | |||
((Sensor) extension).describe(descriptor); | |||
result.addAll(Arrays.asList(descriptor.provides())); | |||
} | |||
return result; | |||
} | |||
@@ -20,50 +20,63 @@ | |||
package org.sonar.api.batch.sensor; | |||
import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.batch.measure.Metric; | |||
/** | |||
* Describe what an {@link Sensor} is doing. Information may be used by the platform | |||
* Describe what a {@link Sensor} is doing. Information may be used by the platform | |||
* to log interesting information or perform some optimization. | |||
* See {@link Sensor#describe(SensorDescriptor)} | |||
* @since 5.0 | |||
* @since 5.1 | |||
*/ | |||
public interface SensorDescriptor { | |||
/** | |||
* Name of the {@link Sensor}. Will be displayed in logs. | |||
* Displayable name of the {@link Sensor}. Will be displayed in logs. | |||
*/ | |||
SensorDescriptor name(String name); | |||
SensorDescriptor name(String sensorName); | |||
/** | |||
* List {@link Metric} this {@link Sensor} depends on. Will be used to execute sensors in correct order. | |||
* Language this {@link Sensor} work on. Used by the platform to skip execution of the {@link Sensor} when | |||
* no file for given languages are present in the project. | |||
* Default is to execute sensor for all languages. | |||
*/ | |||
SensorDescriptor dependsOn(Metric<?>... metrics); | |||
SensorDescriptor onlyOnLanguage(String languageKey); | |||
/** | |||
* List {@link Metric} this {@link Sensor} provides. Will be used to execute sensors in correct order. | |||
* List languages this {@link Sensor} work on. Used by the platform to skip execution of the {@link Sensor} when | |||
* no file for given languages are present in the project. | |||
* Default is to execute sensor for all languages. | |||
*/ | |||
SensorDescriptor provides(Metric<?>... metrics); | |||
SensorDescriptor onlyOnLanguages(String... languageKeys); | |||
/** | |||
* List languages this {@link Sensor} work on. May be used by the platform to skip execution of the {@link Sensor} when | |||
* no file for given languages are present in the project. | |||
* If no language is provided then it will be executed for all languages. | |||
* {@link InputFile.Type} this {@link Sensor} work on. Used by the platform to skip execution of the {@link Sensor} when | |||
* no file for given type are present in the project. | |||
* Default is to execute sensor whatever are the available file types. | |||
*/ | |||
SensorDescriptor workOnLanguages(String... languageKeys); | |||
SensorDescriptor onlyOnFileType(InputFile.Type type); | |||
/** | |||
* List {@link InputFile.Type} this {@link Sensor} work on. May be used by the platform to skip execution of the {@link Sensor} when | |||
* no file for given type are present in the project. | |||
* If you don't call this method then it means sensor is working on all input file types. | |||
* Rule repository this {@link Sensor} create issues for. Used by the platform to skip execution of the {@link Sensor} when | |||
* no rule is activated for the given repository. | |||
*/ | |||
SensorDescriptor workOnFileTypes(InputFile.Type... types); | |||
SensorDescriptor createIssuesForRuleRepository(String... repositoryKey); | |||
/** | |||
* List {@link InputFile.Type} this {@link Sensor} work on. May be used by the platform to skip execution of the {@link Sensor} when | |||
* no file for given type are present in the project. | |||
* If not type is provided then it will be executed for all types. | |||
* List rule repositories this {@link Sensor} create issues for. Used by the platform to skip execution of the {@link Sensor} when | |||
* no rule is activated for the given repositories. | |||
*/ | |||
SensorDescriptor createIssuesForRuleRepositories(String... repositoryKeys); | |||
/** | |||
* Property this {@link Sensor} depends on. Used by the platform to skip execution of the {@link Sensor} when | |||
* property is not set. | |||
*/ | |||
SensorDescriptor requireProperty(String... propertyKey); | |||
/** | |||
* List properties this {@link Sensor} depends on. Used by the platform to skip execution of the {@link Sensor} when | |||
* property is not set. | |||
*/ | |||
SensorDescriptor requireProperties(String... propertyKeys); | |||
} |
@@ -19,10 +19,10 @@ | |||
*/ | |||
package org.sonar.api.batch.sensor.internal; | |||
import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.batch.sensor.SensorDescriptor; | |||
import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.batch.measure.Metric; | |||
import javax.annotation.Nullable; | |||
import java.util.Arrays; | |||
import java.util.Collection; | |||
@@ -30,36 +30,32 @@ import java.util.Collection; | |||
public class DefaultSensorDescriptor implements SensorDescriptor { | |||
private String name; | |||
private Metric<?>[] dependsOn = new Metric<?>[0]; | |||
private Metric<?>[] provides = new Metric<?>[0]; | |||
private String[] languages = new String[0]; | |||
private InputFile.Type[] types = new InputFile.Type[0]; | |||
private InputFile.Type type = null; | |||
private String[] ruleRepositories = new String[0]; | |||
private String[] properties = new String[0]; | |||
public String name() { | |||
return name; | |||
} | |||
public Metric[] dependsOn() { | |||
return dependsOn; | |||
} | |||
public Metric[] provides() { | |||
return provides; | |||
} | |||
public Collection<String> languages() { | |||
return Arrays.asList(languages); | |||
} | |||
public Collection<InputFile.Type> types() { | |||
return Arrays.asList(types); | |||
@Nullable | |||
public InputFile.Type type() { | |||
return type; | |||
} | |||
public Collection<String> ruleRepositories() { | |||
return Arrays.asList(ruleRepositories); | |||
} | |||
public Collection<String> properties() { | |||
return Arrays.asList(properties); | |||
} | |||
@Override | |||
public DefaultSensorDescriptor name(String name) { | |||
this.name = name; | |||
@@ -67,27 +63,25 @@ public class DefaultSensorDescriptor implements SensorDescriptor { | |||
} | |||
@Override | |||
public DefaultSensorDescriptor dependsOn(Metric<?>... metrics) { | |||
this.dependsOn = metrics; | |||
return this; | |||
public DefaultSensorDescriptor onlyOnLanguage(String languageKey) { | |||
return onlyOnLanguages(languageKey); | |||
} | |||
@Override | |||
public DefaultSensorDescriptor provides(Metric<?>... metrics) { | |||
this.provides = metrics; | |||
public DefaultSensorDescriptor onlyOnLanguages(String... languageKeys) { | |||
this.languages = languageKeys; | |||
return this; | |||
} | |||
@Override | |||
public DefaultSensorDescriptor workOnLanguages(String... languageKeys) { | |||
this.languages = languageKeys; | |||
public DefaultSensorDescriptor onlyOnFileType(InputFile.Type type) { | |||
this.type = type; | |||
return this; | |||
} | |||
@Override | |||
public DefaultSensorDescriptor workOnFileTypes(InputFile.Type... types) { | |||
this.types = types; | |||
return this; | |||
public DefaultSensorDescriptor createIssuesForRuleRepository(String... repositoryKey) { | |||
return createIssuesForRuleRepositories(repositoryKey); | |||
} | |||
@Override | |||
@@ -96,4 +90,15 @@ public class DefaultSensorDescriptor implements SensorDescriptor { | |||
return this; | |||
} | |||
@Override | |||
public DefaultSensorDescriptor requireProperty(String... propertyKey) { | |||
return requireProperties(propertyKey); | |||
} | |||
@Override | |||
public DefaultSensorDescriptor requireProperties(String... propertyKeys) { | |||
this.properties = propertyKeys; | |||
return this; | |||
} | |||
} |
@@ -19,11 +19,9 @@ | |||
*/ | |||
package org.sonar.api.batch.sensor.internal; | |||
import org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor; | |||
import org.junit.Test; | |||
import org.sonar.api.batch.fs.InputFile; | |||
import org.sonar.api.measures.CoreMetrics; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
public class DefaultSensorDescriptorTest { | |||
@@ -33,16 +31,16 @@ public class DefaultSensorDescriptorTest { | |||
DefaultSensorDescriptor descriptor = new DefaultSensorDescriptor(); | |||
descriptor | |||
.name("Foo") | |||
.dependsOn(CoreMetrics.NCLOC) | |||
.provides(CoreMetrics.BLOCKER_VIOLATIONS) | |||
.workOnLanguages("java", "php") | |||
.workOnFileTypes(InputFile.Type.MAIN); | |||
.onlyOnLanguage("java") | |||
.onlyOnFileType(InputFile.Type.MAIN) | |||
.requireProperty("sonar.foo.reportPath") | |||
.createIssuesForRuleRepository("squid-java"); | |||
assertThat(descriptor.name()).isEqualTo("Foo"); | |||
assertThat(descriptor.dependsOn()).containsOnly(CoreMetrics.NCLOC); | |||
assertThat(descriptor.provides()).containsOnly(CoreMetrics.BLOCKER_VIOLATIONS); | |||
assertThat(descriptor.languages()).containsOnly("java", "php"); | |||
assertThat(descriptor.types()).containsOnly(InputFile.Type.MAIN); | |||
assertThat(descriptor.languages()).containsOnly("java"); | |||
assertThat(descriptor.type()).isEqualTo(InputFile.Type.MAIN); | |||
assertThat(descriptor.properties()).containsOnly("sonar.foo.reportPath"); | |||
assertThat(descriptor.ruleRepositories()).containsOnly("squid-java"); | |||
} | |||
} |