package org.sonar.scanner.genericcoverage;
import com.google.common.base.Preconditions;
+import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.batch.sensor.coverage.NewCoverage;
+import org.sonar.api.utils.MessageException;
import org.sonar.api.utils.StaxParser;
public class GenericCoverageReportParser {
private final List<String> firstUnknownFiles = new ArrayList<>();
private final Set<String> matchedFileKeys = new HashSet<>();
- public void parse(java.io.File reportFile, SensorContext context) {
+ public void parse(File reportFile, SensorContext context) {
try (InputStream inputStream = new FileInputStream(reportFile)) {
parse(inputStream, context);
} catch (Exception e) {
- throw new IllegalStateException("Error during parsing of coverage report " + reportFile, e);
+ throw MessageException.of("Error during parsing of the generic coverage report '" + reportFile + "'. Look at SonarQube documentation to know the expected XML format.",
+ e);
}
}
- void parse(InputStream inputStream, SensorContext context) throws XMLStreamException {
+ private void parse(InputStream inputStream, SensorContext context) throws XMLStreamException {
new StaxParser(rootCursor -> {
rootCursor.advance();
parseRootNode(rootCursor, context);
"Line %s of report refers to a file with an unknown language: %s",
fileCursor.getCursorLocation().getLineNumber(),
filePath);
- matchedFileKeys.add(inputFile.absolutePath());
+ matchedFileKeys.add(inputFile.key());
NewCoverage newCoverage = context.newCoverage().onFile(inputFile);
SMInputCursor lineToCoverCursor = fileCursor.childElementCursor();
*/
package org.sonar.scanner.genericcoverage;
-import java.io.ByteArrayInputStream;
import java.io.File;
+import java.nio.charset.StandardCharsets;
+import org.apache.commons.io.FileUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.api.batch.sensor.internal.SensorContextTester;
+import org.sonar.api.utils.MessageException;
import static org.assertj.core.api.Assertions.assertThat;
public class GenericCoverageReportParserTest {
+
+ @Rule
+ public TemporaryFolder temp = new TemporaryFolder();
+
private DefaultInputFile fileWithBranches;
private DefaultInputFile fileWithoutBranch;
private DefaultInputFile emptyFile;
public void empty_file() throws Exception {
addFileToFs(emptyFile);
GenericCoverageReportParser parser = new GenericCoverageReportParser();
- parser.parse(this.getClass().getResourceAsStream("coverage.xml"), context);
+ parser.parse(new File(this.getClass().getResource("coverage.xml").toURI()), context);
assertThat(parser.numberOfMatchedFiles()).isEqualTo(1);
assertThat(parser.numberOfUnknownFiles()).isEqualTo(3);
assertThat(parser.firstUnknownFiles()).hasSize(3);
public void file_without_branch() throws Exception {
addFileToFs(fileWithoutBranch);
GenericCoverageReportParser parser = new GenericCoverageReportParser();
- parser.parse(this.getClass().getResourceAsStream("coverage.xml"), context);
+ parser.parse(new File(this.getClass().getResource("coverage.xml").toURI()), context);
assertThat(parser.numberOfMatchedFiles()).isEqualTo(1);
assertThat(context.lineHits(fileWithoutBranch.key(), 2)).isEqualTo(0);
public void file_with_branches() throws Exception {
addFileToFs(fileWithBranches);
GenericCoverageReportParser parser = new GenericCoverageReportParser();
- parser.parse(this.getClass().getResourceAsStream("coverage.xml"), context);
+ parser.parse(new File(this.getClass().getResource("coverage.xml").toURI()), context);
assertThat(parser.numberOfMatchedFiles()).isEqualTo(1);
assertThat(context.lineHits(fileWithBranches.key(), 3)).isEqualTo(1);
assertThat(context.coveredConditions(fileWithBranches.key(), 4)).isEqualTo(0);
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_invalid_root_node_name() throws Exception {
- new GenericCoverageReportParser().parse(new ByteArrayInputStream("<mycoverage version=\"1\"></mycoverage>".getBytes()), context);
+ parseCoverageReport("<mycoverage version=\"1\"></mycoverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_invalid_report_version() throws Exception {
parseCoverageReport("<coverage version=\"2\"></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_no_report_version() throws Exception {
parseCoverageReport("<coverage></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_invalid_file_node_name() throws Exception {
parseCoverageReport("<coverage version=\"1\"><xx></xx></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unitTest_invalid_file_node_name() throws Exception {
parseCoverageReport("<unitTest version=\"1\"><xx></xx></unitTest>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_missing_path_attribute() throws Exception {
parseCoverageReport("<coverage version=\"1\"><file></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unitTest_missing_path_attribute() throws Exception {
parseCoverageReport("<unitTest version=\"1\"><file></file></unitTest>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_invalid_lineToCover_node_name() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\"><xx/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_missing_lineNumber_in_lineToCover() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\"><lineToCover covered=\"true\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_lineNumber_in_lineToCover_should_be_a_number() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\"><lineToCover lineNumber=\"x\" covered=\"true\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_lineNumber_in_lineToCover_should_be_positive() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\"><lineToCover lineNumber=\"0\" covered=\"true\"/></file></coverage>");
+ "<lineToCover lineNumber=\"1\" covered=\"true\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_missing_covered_in_lineToCover() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\"><lineToCover lineNumber=\"3\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_covered_in_lineToCover_should_be_a_boolean() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\"><lineToCover lineNumber=\"3\" covered=\"x\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_branchesToCover_in_lineToCover_should_be_a_number() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\">"
+ "<lineToCover lineNumber=\"1\" covered=\"true\" branchesToCover=\"x\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_branchesToCover_in_lineToCover_should_not_be_negative() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\">"
+ "<lineToCover lineNumber=\"1\" covered=\"true\" branchesToCover=\"-1\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_coveredBranches_in_lineToCover_should_be_a_number() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\">"
+ "<lineToCover lineNumber=\"1\" covered=\"true\" branchesToCover=\"2\" coveredBranches=\"x\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_coveredBranches_in_lineToCover_should_not_be_negative() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\">"
+ "<lineToCover lineNumber=\"1\" covered=\"true\" branchesToCover=\"2\" coveredBranches=\"-1\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void coverage_coveredBranches_should_not_be_greater_than_branchesToCover() throws Exception {
addFileToFs(setupFile("file1"));
parseCoverageReport("<coverage version=\"1\"><file path=\"file1\">"
+ "<lineToCover lineNumber=\"1\" covered=\"true\" branchesToCover=\"2\" coveredBranches=\"3\"/></file></coverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void testUnknownFile() throws Exception {
parseCoverageReportFile("xxx.xml");
}
}
private void parseCoverageReport(String string) throws Exception {
- new GenericCoverageReportParser().parse(new ByteArrayInputStream(string.getBytes()), context);
+ File report = temp.newFile();
+ FileUtils.write(report, string, StandardCharsets.UTF_8);
+ new GenericCoverageReportParser().parse(report, context);
}
private void parseCoverageReportFile(String reportLocation) throws Exception {
*/
package org.sonar.scanner.genericcoverage;
-import java.io.ByteArrayInputStream;
import java.io.File;
+import java.nio.charset.StandardCharsets;
+import org.apache.commons.io.FileUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.api.batch.sensor.internal.SensorContextTester;
import org.sonar.api.test.MutableTestCase;
import org.sonar.api.test.MutableTestPlan;
+import org.sonar.api.utils.MessageException;
import org.sonar.scanner.deprecated.test.TestPlanBuilder;
import static org.assertj.core.api.Assertions.assertThat;
public class GenericTestExecutionReportParserTest {
+ @Rule
+ public TemporaryFolder temp = new TemporaryFolder();
+
private TestPlanBuilder testPlanBuilder;
private DefaultInputFile fileWithBranches;
private DefaultInputFile emptyFile;
verify(testPlan).addTestCase("test3");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unittest_invalid_root_node_name() throws Exception {
parseUnitTestReport("<mycoverage version=\"1\"></mycoverage>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unittest_invalid_report_version() throws Exception {
parseUnitTestReport("<unitTest version=\"2\"></unitTest>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unittest_duration_in_testCase_should_be_a_number() throws Exception {
addFileToFs(setupFile("file1"));
parseUnitTestReport("<unitTest version=\"1\"><file path=\"file1\">"
+ "<testCase name=\"test1\" duration=\"aaa\"/></file></unitTest>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unittest_failure_should_have_a_message() throws Exception {
addFileToFs(setupFile("file1"));
parseUnitTestReport("<unitTest version=\"1\"><file path=\"file1\">"
+ "<testCase name=\"test1\" duration=\"2\"><failure /></testCase></file></unitTest>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unittest_error_should_have_a_message() throws Exception {
addFileToFs(setupFile("file1"));
parseUnitTestReport("<unitTest version=\"1\"><file path=\"file1\">"
+ "<testCase name=\"test1\" duration=\"2\"><error /></testCase></file></unitTest>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unittest_skipped_should_have_a_message() throws Exception {
addFileToFs(setupFile("file1"));
parseUnitTestReport("<unitTest version=\"1\"><file path=\"file1\">"
+ "<testCase name=\"test1\" duration=\"2\"><skipped notmessage=\"\"/></testCase></file></unitTest>");
}
- @Test(expected = IllegalStateException.class)
+ @Test(expected = MessageException.class)
public void unittest_duration_in_testCase_should_not_be_negative() throws Exception {
addFileToFs(setupFile("file1"));
parseUnitTestReport("<unitTest version=\"1\"><file path=\"file1\">"
private GenericTestExecutionReportParser parseUnitTestReport(String string) throws Exception {
GenericTestExecutionReportParser parser = new GenericTestExecutionReportParser(testPlanBuilder);
- parser.parse(new ByteArrayInputStream(string.getBytes()), context);
+ File report = temp.newFile();
+ FileUtils.write(report, string, StandardCharsets.UTF_8);
+ parser.parse(report, context);
return parser;
}
private GenericTestExecutionReportParser parseReportFile(String reportLocation) throws Exception {
GenericTestExecutionReportParser parser = new GenericTestExecutionReportParser(testPlanBuilder);
- parser.parse(this.getClass().getResourceAsStream(reportLocation), context);
+ parser.parse(new File(this.getClass().getResource(reportLocation).toURI()), context);
return parser;
}