/** * Writes the test results in XML format to the supplied writer. * * <p>This method does NOT close the writer object. * * @param allResults The test results. * @param writer The writer in which the XML data will be written to. */ public static void writeXmlOutput(List<TestResults> allResults, Writer writer) throws IOException { try { // Build the XML output. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbf.newDocumentBuilder(); Document doc = docBuilder.newDocument(); // Create the <tests> tag. All test data will be within this tag. Element testsEl = doc.createElement("tests"); doc.appendChild(testsEl); for (TestResults results : allResults) { for (TestCaseSummary testCase : results.getTestCases()) { // Create the <test name="..." status="..." time="..."> tag. // This records a single test case result in the test suite. Element testEl = doc.createElement("test"); testEl.setAttribute("name", testCase.getTestCaseName()); testEl.setAttribute("status", testCase.isSuccess() ? "PASS" : "FAIL"); testEl.setAttribute("time", Long.toString(testCase.getTotalTime())); testsEl.appendChild(testEl); // Loop through the test case and add XML data (name, message, and // stacktrace) for each individual test, if present. addExtraXmlInfo(testCase, testEl); } } // Write XML to the writer. TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(new DOMSource(doc), new StreamResult(writer)); } catch (TransformerException | ParserConfigurationException ex) { throw new IOException("Unable to build the XML document!"); } }
@Override public Callable<TestResults> interpretTestResults( final ExecutionContext executionContext, boolean isUsingTestSelectors, boolean isDryRun) { return () -> { List<TestCaseSummary> testCaseSummaries; if (xctoolStdoutReader.isPresent()) { // We've already run the tests with 'xctool' and parsed // their output; no need to parse the same output again. testCaseSummaries = xctoolStdoutReader.get().getTestCaseSummaries(); } else if (xctestOutputReader.isPresent()) { // We've already run the tests with 'xctest' and parsed // their output; no need to parse the same output again. testCaseSummaries = xctestOutputReader.get().getTestCaseSummaries(); } else if (isUiTest()) { TestCaseSummary noTestsSummary = new TestCaseSummary( "XCUITest runs not supported with buck test", Collections.emptyList()); testCaseSummaries = Collections.singletonList(noTestsSummary); } else { Path resolvedOutputPath = getProjectFilesystem().resolve(testOutputPath); try (BufferedReader reader = Files.newBufferedReader(resolvedOutputPath, StandardCharsets.UTF_8)) { if (useXctest) { TestCaseSummariesBuildingXctestEventHandler xctestEventHandler = new TestCaseSummariesBuildingXctestEventHandler(NOOP_REPORTING_CALLBACK); XctestOutputParsing.streamOutput(reader, xctestEventHandler); testCaseSummaries = xctestEventHandler.getTestCaseSummaries(); } else { TestCaseSummariesBuildingXctoolEventHandler xctoolEventHandler = new TestCaseSummariesBuildingXctoolEventHandler(NOOP_REPORTING_CALLBACK); XctoolOutputParsing.streamOutputFromReader(reader, xctoolEventHandler); testCaseSummaries = xctoolEventHandler.getTestCaseSummaries(); } } } TestResults.Builder testResultsBuilder = TestResults.builder() .setBuildTarget(getBuildTarget()) .setTestCases(testCaseSummaries) .setContacts(contacts) .setLabels( labels.stream().map(Object::toString).collect(MoreCollectors.toImmutableSet())); if (getProjectFilesystem().isDirectory(testLogsPath)) { for (Path testLogPath : getProjectFilesystem().getDirectoryContents(testLogsPath)) { testResultsBuilder.addTestLogPaths(testLogPath); } } return testResultsBuilder.build(); }; }
@Override public Callable<TestResults> interpretTestResults( final ExecutionContext executionContext, boolean isUsingTestSelectors, final boolean isDryRun) { return () -> { ImmutableList.Builder<TestCaseSummary> summaries = ImmutableList.builder(); if (!isDryRun) { ImmutableList<TestResultSummary> resultSummaries = parseResults(getPathToTestExitCode(), getPathToTestOutput(), getPathToTestResults()); TestCaseSummary summary = new TestCaseSummary(getBuildTarget().getFullyQualifiedName(), resultSummaries); summaries.add(summary); } return TestResults.of( getBuildTarget(), summaries.build(), contacts, labels.stream().map(Object::toString).collect(MoreCollectors.toImmutableSet())); }; }