private final Encryption encryption;
private final GlobalAnalysisMode mode;
private final Map<String, String> properties;
+ private final Map<String, String> originalProperties;
public DefaultConfiguration(PropertyDefinitions propertyDefinitions, Encryption encryption, GlobalAnalysisMode mode, Map<String, String> props) {
this.definitions = requireNonNull(propertyDefinitions);
this.encryption = encryption;
this.mode = mode;
this.properties = unmodifiableMapWithTrimmedValues(definitions, props);
+ this.originalProperties = Collections.unmodifiableMap(props);
}
protected static Map<String, String> unmodifiableMapWithTrimmedValues(PropertyDefinitions definitions, Map<String, String> props) {
return properties;
}
+ public Map<String, String> getOriginalProperties() {
+ return originalProperties;
+ }
+
@Override
public boolean hasKey(String key) {
return properties.containsKey(key);
import org.sonar.api.batch.sensor.Sensor;
import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.batch.sensor.SensorDescriptor;
-import org.sonar.api.config.Configuration;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
+import org.sonar.scanner.config.DefaultConfiguration;
import static java.util.Arrays.asList;
import static org.sonar.api.CoreProperties.CATEGORY_CODE_COVERAGE;
@Deprecated
static final String OLD_OVERALL_COVERAGE_REPORT_PATHS_PROPERTY_KEY = "sonar.genericcoverage.overallReportPaths";
- private final Configuration config;
+ private final DefaultConfiguration config;
- public GenericCoverageSensor(Configuration config) {
+ public GenericCoverageSensor(DefaultConfiguration config) {
this.config = config;
}
.description("List of comma-separated paths (absolute or relative) containing coverage report.")
.category(CATEGORY_CODE_COVERAGE)
.onQualifiers(Qualifiers.PROJECT)
+ .multiValues(true)
.deprecatedKey(OLD_COVERAGE_REPORT_PATHS_PROPERTY_KEY)
.build());
}
- private void loadDeprecated(Set<String> reportPaths, String propertyKey) {
- if (config.hasKey(propertyKey)) {
+ private void loadArrayDeprecated(Set<String> reportPaths, String propertyKey) {
+ if (config.getOriginalProperties().containsKey(propertyKey)) {
LOG.warn("Property '{}' is deprecated. Please use '{}' instead.", propertyKey, REPORT_PATHS_PROPERTY_KEY);
reportPaths.addAll(Arrays.asList(config.getStringArray(propertyKey)));
}
}
+ private void loadDeprecated(Set<String> reportPaths, String propertyKey) {
+ if (config.getOriginalProperties().containsKey(propertyKey)) {
+ LOG.warn("Property '{}' is deprecated. Please use '{}' instead.", propertyKey, REPORT_PATHS_PROPERTY_KEY);
+ config.get(propertyKey).ifPresent(reportPaths::add);
+ }
+ }
+
@Override
public void describe(SensorDescriptor descriptor) {
descriptor.name("Generic Coverage Report")
Set<String> reportPaths = new LinkedHashSet<>();
reportPaths.addAll(Arrays.asList(config.getStringArray(REPORT_PATHS_PROPERTY_KEY)));
loadDeprecated(reportPaths, OLD_REPORT_PATH_PROPERTY_KEY);
- loadDeprecated(reportPaths, OLD_COVERAGE_REPORT_PATHS_PROPERTY_KEY);
- loadDeprecated(reportPaths, OLD_IT_COVERAGE_REPORT_PATHS_PROPERTY_KEY);
- loadDeprecated(reportPaths, OLD_OVERALL_COVERAGE_REPORT_PATHS_PROPERTY_KEY);
+ loadArrayDeprecated(reportPaths, OLD_COVERAGE_REPORT_PATHS_PROPERTY_KEY);
+ loadArrayDeprecated(reportPaths, OLD_IT_COVERAGE_REPORT_PATHS_PROPERTY_KEY);
+ loadArrayDeprecated(reportPaths, OLD_OVERALL_COVERAGE_REPORT_PATHS_PROPERTY_KEY);
return reportPaths;
}
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
+import org.sonar.scanner.config.DefaultConfiguration;
import org.sonar.scanner.deprecated.test.TestPlanBuilder;
import static org.sonar.api.CoreProperties.CATEGORY_CODE_COVERAGE;
static final String OLD_UNIT_TEST_REPORT_PATHS_PROPERTY_KEY = "sonar.genericcoverage.unitTestReportPaths";
private final TestPlanBuilder testPlanBuilder;
+ private final DefaultConfiguration configuration;
- public GenericTestExecutionSensor(TestPlanBuilder testPlanBuilder) {
+ public GenericTestExecutionSensor(TestPlanBuilder testPlanBuilder, DefaultConfiguration configuration) {
this.testPlanBuilder = testPlanBuilder;
+ this.configuration = configuration;
}
public static ImmutableList<PropertyDefinition> properties() {
.description("List of comma-separated paths (absolute or relative) containing unit tests results report.")
.category(CATEGORY_CODE_COVERAGE)
.onQualifiers(Qualifiers.PROJECT)
+ .multiValues(true)
.deprecatedKey(OLD_UNIT_TEST_REPORT_PATHS_PROPERTY_KEY)
.build());
-
}
@Override
@Override
public void execute(SensorContext context) {
- if (context.settings().hasKey(OLD_UNIT_TEST_REPORT_PATHS_PROPERTY_KEY)) {
+ if (configuration.getOriginalProperties().containsKey(OLD_UNIT_TEST_REPORT_PATHS_PROPERTY_KEY)) {
LOG.warn("Property '{}' is deprecated. Please use '{}' instead.", OLD_UNIT_TEST_REPORT_PATHS_PROPERTY_KEY, REPORT_PATHS_PROPERTY_KEY);
}
- for (String reportPath : context.settings().getStringArray(REPORT_PATHS_PROPERTY_KEY)) {
+
+ for (String reportPath : configuration.getStringArray(REPORT_PATHS_PROPERTY_KEY)) {
File reportFile = context.fileSystem().resolvePath(reportPath);
LOG.info("Parsing {}", reportFile);
GenericTestExecutionReportParser parser = new GenericTestExecutionReportParser(testPlanBuilder);
import com.google.common.annotations.VisibleForTesting;
import javax.annotation.Nullable;
-import org.apache.commons.lang.StringUtils;
import org.sonar.api.CoreProperties;
import org.sonar.api.batch.InstantiationStrategy;
import org.sonar.api.batch.fs.internal.DefaultInputModule;
*/
package org.sonar.scanner.genericcoverage;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Set;
import org.junit.Rule;
import org.junit.Test;
+import org.sonar.api.config.Encryption;
import org.sonar.api.config.PropertyDefinitions;
-import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
+import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
+import org.sonar.scanner.config.DefaultConfiguration;
+import org.sonar.scanner.scan.ProjectSettings;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
public class GenericCoverageSensorTest {
@Test
public void migrateOldProperties() {
- MapSettings settings = new MapSettings(new PropertyDefinitions(GenericCoverageSensor.properties()));
- settings.setProperty(GenericCoverageSensor.OLD_REPORT_PATH_PROPERTY_KEY, "old.xml");
- settings.setProperty(GenericCoverageSensor.OLD_COVERAGE_REPORT_PATHS_PROPERTY_KEY, "old1.xml,old2.xml");
- settings.setProperty(GenericCoverageSensor.OLD_IT_COVERAGE_REPORT_PATHS_PROPERTY_KEY, "old3.xml,old4.xml,old.xml");
- settings.setProperty(GenericCoverageSensor.OLD_OVERALL_COVERAGE_REPORT_PATHS_PROPERTY_KEY, "old5.xml,old6.xml");
- Set<String> reportPaths = new GenericCoverageSensor(settings.asConfig()).loadReportPaths();
+ Map<String, String> settings = new HashMap<>();
+ settings.put(GenericCoverageSensor.OLD_REPORT_PATH_PROPERTY_KEY, "old.xml");
+ settings.put(GenericCoverageSensor.OLD_COVERAGE_REPORT_PATHS_PROPERTY_KEY, "old1.xml,old2.xml");
+ settings.put(GenericCoverageSensor.OLD_IT_COVERAGE_REPORT_PATHS_PROPERTY_KEY, "old3.xml,old4.xml,old.xml");
+ settings.put(GenericCoverageSensor.OLD_OVERALL_COVERAGE_REPORT_PATHS_PROPERTY_KEY, "old5.xml,old6.xml");
+
+ PropertyDefinitions defs = new PropertyDefinitions(GenericCoverageSensor.properties());
+ DefaultConfiguration config = new ProjectSettings(defs, new Encryption(null), mock(GlobalAnalysisMode.class), settings);
+
+ Set<String> reportPaths = new GenericCoverageSensor(config).loadReportPaths();
+
assertThat(logTester.logs(LoggerLevel.WARN)).contains(
"Property 'sonar.genericcoverage.reportPath' is deprecated. Please use 'sonar.coverageReportPaths' instead.",
"Property 'sonar.genericcoverage.reportPaths' is deprecated. Please use 'sonar.coverageReportPaths' instead.",
assertThat(reportPaths).containsOnly(
"old.xml", "old1.xml", "old2.xml", "old3.xml", "old4.xml", "old5.xml", "old6.xml");
}
-
}
import java.io.File;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.batch.sensor.internal.SensorContextTester;
+import org.sonar.api.config.Encryption;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.utils.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
+import org.sonar.scanner.bootstrap.GlobalAnalysisMode;
+import org.sonar.scanner.config.DefaultConfiguration;
import org.sonar.scanner.deprecated.test.TestPlanBuilder;
+import org.sonar.scanner.scan.ProjectSettings;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
public void logWhenDeprecatedPropsAreUsed() throws IOException {
File basedir = temp.newFolder();
File report = new File(basedir, "report.xml");
- FileUtils.write(report, "<unitTest version=\"1\"><file path=\"A.java\"><testCase name=\"test1\" duration=\"500\"/></file></unitTest>");
+ FileUtils.write(report, "<unitTest version=\"1\"><file path=\"A.java\"><testCase name=\"test1\" duration=\"500\"/></file></unitTest>", StandardCharsets.UTF_8);
SensorContextTester context = SensorContextTester.create(basedir);
- Settings settings = new MapSettings(new PropertyDefinitions(GenericTestExecutionSensor.properties()));
- settings.setProperty(GenericTestExecutionSensor.OLD_UNIT_TEST_REPORT_PATHS_PROPERTY_KEY, "report.xml");
- context.setSettings(settings);
- new GenericTestExecutionSensor(mock(TestPlanBuilder.class)).execute(context);
+
+ Map<String, String> settings = new HashMap<>();
+ settings.put(GenericTestExecutionSensor.OLD_UNIT_TEST_REPORT_PATHS_PROPERTY_KEY, "report.xml");
+ PropertyDefinitions defs = new PropertyDefinitions(GenericTestExecutionSensor.properties());
+ DefaultConfiguration config = new ProjectSettings(defs, new Encryption(null), mock(GlobalAnalysisMode.class), settings);
+
+ new GenericTestExecutionSensor(mock(TestPlanBuilder.class), config).execute(context);
assertThat(logTester.logs(LoggerLevel.WARN)).contains(
"Using 'unitTest' as root element of the report is deprecated. Please change to 'testExecutions'.",
"Property 'sonar.genericcoverage.unitTestReportPaths' is deprecated. Please use 'sonar.testExecutionReportPaths' instead.");
import com.google.common.collect.ImmutableMap;
import java.io.File;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FileUtils;
File xooFile = new File(srcDir, "sample.xoo");
File xooUtCoverageFile = new File(srcDir, "sample.xoo.coverage");
- FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}");
- FileUtils.write(xooUtCoverageFile, "2:2:2:1\n3:1");
+ FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}", StandardCharsets.UTF_8);
+ FileUtils.write(xooUtCoverageFile, "2:2:2:1\n3:1", StandardCharsets.UTF_8);
TaskResult result = tester.newTask()
.properties(ImmutableMap.<String, String>builder()
srcDir.mkdir();
File xooFile = new File(srcDir, "sample.xoo");
- FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}");
+ FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}", StandardCharsets.UTF_8);
File xooUtCoverageFile = new File(srcDir, "sample.xoo.coverage");
- FileUtils.write(xooUtCoverageFile, "2:2:2:2\n4:0");
+ FileUtils.write(xooUtCoverageFile, "2:2:2:2\n4:0", StandardCharsets.UTF_8);
File xooItCoverageFile = new File(srcDir, "sample.xoo.itcoverage");
- FileUtils.write(xooItCoverageFile, "2:2:2:1\n3:1\n5:0");
+ FileUtils.write(xooItCoverageFile, "2:2:2:1\n3:1\n5:0", StandardCharsets.UTF_8);
TaskResult result = tester.newTask()
.properties(ImmutableMap.<String, String>builder()
File xooFile = new File(srcDir, "sample.xoo");
File xooUtCoverageFile = new File(srcDir, "sample.xoo.coverage");
- FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}");
- FileUtils.write(xooUtCoverageFile, "2:2:2:1\n3:1");
+ FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}", StandardCharsets.UTF_8);
+ FileUtils.write(xooUtCoverageFile, "2:2:2:1\n3:1", StandardCharsets.UTF_8);
TaskResult result = tester.newTask()
.properties(ImmutableMap.<String, String>builder()
File xooFile = new File(srcDir, "sample.xoo");
File measuresFile = new File(srcDir, "sample.xoo.measures");
- FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}");
- FileUtils.write(measuresFile, "executable_lines_data:2=1;3=1;4=0");
+ FileUtils.write(xooFile, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}", StandardCharsets.UTF_8);
+ FileUtils.write(measuresFile, "executable_lines_data:2=1;3=1;4=0", StandardCharsets.UTF_8);
TaskResult result = tester.newTask()
.properties(ImmutableMap.<String, String>builder()
File xooFile1 = new File(srcDir, "sample1.xoo");
File measuresFile1 = new File(srcDir, "sample1.xoo.measures");
- FileUtils.write(xooFile1, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}");
- FileUtils.write(measuresFile1, "executable_lines_data:2=1;3=1;4=0");
+ FileUtils.write(xooFile1, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}", StandardCharsets.UTF_8);
+ FileUtils.write(measuresFile1, "executable_lines_data:2=1;3=1;4=0", StandardCharsets.UTF_8);
File xooFile2 = new File(srcDir, "sample2.xoo");
File measuresFile2 = new File(srcDir, "sample2.xoo.measures");
- FileUtils.write(xooFile2, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}");
- FileUtils.write(measuresFile2, "executable_lines_data:2=1;3=1;4=0");
+ FileUtils.write(xooFile2, "function foo() {\n if (a && b) {\nalert('hello');\n}\n}", StandardCharsets.UTF_8);
+ FileUtils.write(measuresFile2, "executable_lines_data:2=1;3=1;4=0", StandardCharsets.UTF_8);
TaskResult result = tester.newTask()
.properties(ImmutableMap.<String, String>builder()
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.batch.fs.InputFile;
import static org.assertj.core.api.Assertions.tuple;
public class GenericCoverageMediumTest {
-
+ private final List<String> logs = new ArrayList<>();
+
@Rule
public ScannerMediumTester tester = new ScannerMediumTester()
.registerPlugin("xoo", new XooPlugin())
File projectDir = new File("src/test/resources/mediumtest/xoo/sample-generic-coverage");
TaskResult result = tester
+ .setLogOutput((msg, level) -> logs.add(msg))
.newScanTask(new File(projectDir, "sonar-project.properties"))
.property("sonar.coverageReportPaths", "coverage.xml")
.execute();
tuple(CoreMetrics.UNCOVERED_CONDITIONS_KEY, 1, ""),
tuple(CoreMetrics.CONDITIONS_BY_LINE_KEY, 0, "3=2"),
tuple(CoreMetrics.COVERED_CONDITIONS_BY_LINE_KEY, 0, "3=1")
-
);
+ assertThat(logs).noneMatch(l -> l.contains("Please use 'sonar.coverageReportPaths'"));
+
+ }
+
+ @Test
+ public void warnAboutDeprecatedProperty() {
+ File projectDir = new File("src/test/resources/mediumtest/xoo/sample-generic-coverage");
+
+ tester
+ .setLogOutput((msg, level) -> logs.add(msg))
+ .newScanTask(new File(projectDir, "sonar-project.properties"))
+ .property("sonar.genericcoverage.reportPath", "coverage.xml")
+ .execute();
+
+
+ assertThat(logs).anyMatch(l -> l.contains("Please use 'sonar.coverageReportPaths'"));
}
@Test
File projectDir = new File("src/test/resources/mediumtest/xoo/sample-generic-coverage");
TaskResult result = tester
+ .setLogOutput((msg, level) -> logs.add(msg))
.newScanTask(new File(projectDir, "sonar-project.properties"))
.property("sonar.coverageReportPaths", "coverage.xml,coverage2.xml")
.execute();
tuple(CoreMetrics.UNCOVERED_CONDITIONS_KEY, 0, ""),
tuple(CoreMetrics.CONDITIONS_BY_LINE_KEY, 0, "3=2"),
tuple(CoreMetrics.COVERED_CONDITIONS_BY_LINE_KEY, 0, "3=2")
-
);
+
+ assertThat(logs).noneMatch(l -> l.contains("Please use 'sonar.coverageReportPaths'"));
}
-
+
}
import com.google.common.collect.ImmutableMap;
import java.io.File;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
import org.apache.commons.io.FileUtils;
import org.junit.Rule;
import org.junit.Test;
import static org.assertj.core.api.Assertions.tuple;
public class GenericTestExecutionMediumTest {
+ private final List<String> logs = new ArrayList<>();
@Rule
public TemporaryFolder temp = new TemporaryFolder();
testDir.mkdir();
File xooFile = new File(srcDir, "sample.xoo");
- FileUtils.write(xooFile, "foo");
+ FileUtils.write(xooFile, "foo", StandardCharsets.UTF_8);
File xooTestFile = new File(testDir, "sampleTest.xoo");
- FileUtils.write(xooTestFile, "failure\nerror\nok\nskipped");
+ FileUtils.write(xooTestFile, "failure\nerror\nok\nskipped", StandardCharsets.UTF_8);
File xooTestExecutionFile = new File(testDir, "sampleTest.xoo.test");
FileUtils.write(xooTestExecutionFile, "skipped::::SKIPPED:UNIT\n" +
"failure:2:Failure::FAILURE:UNIT\n" +
"error:2:Error:The stack:ERROR:UNIT\n" +
- "success:4:::OK:INTEGRATION");
+ "success:4:::OK:INTEGRATION", StandardCharsets.UTF_8);
- TaskResult result = tester.newTask()
+ TaskResult result = tester
+ .newTask()
.properties(ImmutableMap.<String, String>builder()
.put("sonar.task", "scan")
.put("sonar.projectBaseDir", baseDir.getAbsolutePath())
File projectDir = new File("src/test/resources/mediumtest/xoo/sample-generic-test-exec");
TaskResult result = tester
+ .setLogOutput((msg, level) -> logs.add(msg))
.newScanTask(new File(projectDir, "sonar-project.properties"))
.property("sonar.testExecutionReportPaths", "unittest.xml")
.execute();
tuple(CoreMetrics.TEST_ERRORS_KEY, 1, 0L),
tuple(CoreMetrics.TEST_EXECUTION_TIME_KEY, 0, 1105L),
tuple(CoreMetrics.TEST_FAILURES_KEY, 1, 0L));
+
+ assertThat(logs).noneMatch(l -> l.contains("Please use 'sonar.testExecutionReportPaths'"));
}
@Test
File projectDir = new File("src/test/resources/mediumtest/xoo/sample-generic-test-exec");
TaskResult result = tester
+ .setLogOutput((msg, level) -> logs.add(msg))
.newScanTask(new File(projectDir, "sonar-project.properties"))
.property("sonar.testExecutionReportPaths", "unittest.xml,unittest2.xml")
.execute();
tuple(CoreMetrics.TEST_ERRORS_KEY, 1, 0L),
tuple(CoreMetrics.TEST_EXECUTION_TIME_KEY, 0, 1610L),
tuple(CoreMetrics.TEST_FAILURES_KEY, 1, 0L));
+
+ assertThat(logs).noneMatch(l -> l.contains("Please use 'sonar.testExecutionReportPaths'"));
}
}