This is an automated email from the ASF dual-hosted git repository. michaelo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
The following commit(s) were added to refs/heads/master by this push: new d24adb4cd [SUREFIRE-2277] RunResult#getFlakes() is lost during serialisation/deserialisation to/from failsafe-summary.xml d24adb4cd is described below commit d24adb4cd702253fa3bf1799e6f067c61d78d75f Author: Bing Xu <b...@atlassian.com> AuthorDate: Thu Oct 10 09:40:53 2024 +1100 [SUREFIRE-2277] RunResult#getFlakes() is lost during serialisation/deserialisation to/from failsafe-summary.xml This closes #790 --- .../failsafe/util/FailsafeSummaryXmlUtils.java | 6 +++ .../maven/plugin/failsafe/RunResultTest.java | 48 ++++++++++++++++++++++ .../src/site/resources/xsd/failsafe-summary.xsd | 1 + .../apache/maven/surefire/api/suite/RunResult.java | 4 ++ 4 files changed, 59 insertions(+) diff --git a/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/util/FailsafeSummaryXmlUtils.java b/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/util/FailsafeSummaryXmlUtils.java index ed39cc90a..fac986b39 100644 --- a/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/util/FailsafeSummaryXmlUtils.java +++ b/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/util/FailsafeSummaryXmlUtils.java @@ -64,6 +64,7 @@ public final class FailsafeSummaryXmlUtils { + " <errors>%d</errors>\n" + " <failures>%d</failures>\n" + " <skipped>%d</skipped>\n" + + " <flakes>%d</flakes>\n" + " %s\n" + "</failsafe-summary>"; @@ -84,12 +85,16 @@ public final class FailsafeSummaryXmlUtils { String skipped = xpath.evaluate("/failsafe-summary/skipped", root); String failureMessage = xpath.evaluate("/failsafe-summary/failureMessage", root); String timeout = xpath.evaluate("/failsafe-summary/@timeout", root); + String flakes = xpath.evaluate("/failsafe-summary/flakes", root); return new RunResult( parseInt(completed), parseInt(errors), parseInt(failures), parseInt(skipped), + // FIXME Backwards compatability: to be replaced with parseInt in a future release + // synchronize with maven-surefire-plugin/src/site/resources/xsd/failsafe-summary.xsd + isBlank(flakes) ? 0 : parseInt(flakes), isBlank(failureMessage) ? null : unescapeXml(failureMessage), parseBoolean(timeout)); } @@ -107,6 +112,7 @@ public final class FailsafeSummaryXmlUtils { fromRunResult.getErrors(), fromRunResult.getFailures(), fromRunResult.getSkipped(), + fromRunResult.getFlakes(), msg); Files.write( diff --git a/maven-failsafe-plugin/src/test/java/org/apache/maven/plugin/failsafe/RunResultTest.java b/maven-failsafe-plugin/src/test/java/org/apache/maven/plugin/failsafe/RunResultTest.java index 1bd4145bc..80d3eeaa4 100644 --- a/maven-failsafe-plugin/src/test/java/org/apache/maven/plugin/failsafe/RunResultTest.java +++ b/maven-failsafe-plugin/src/test/java/org/apache/maven/plugin/failsafe/RunResultTest.java @@ -19,12 +19,17 @@ package org.apache.maven.plugin.failsafe; import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.util.Locale; import org.apache.maven.plugin.failsafe.util.FailsafeSummaryXmlUtils; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.api.util.SureFireFileManager; import org.junit.Test; +import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; /** @@ -64,6 +69,49 @@ public class RunResultTest { writeReadCheck(new RunResult(3, 2, 1, 0, null, true)); } + @Test + public void testFlakes() throws Exception { + writeReadCheck(new RunResult(3, 2, 1, 0, 2, null, true)); + } + + @Test + public void testLegacyDeserialization() throws Exception { + File legacySummary = SureFireFileManager.createTempFile("failsafe", "test"); + String legacyFailsafeSummaryXmlTemplate = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + + "<failsafe-summary xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + + " xsi:noNamespaceSchemaLocation=\"https://maven.apache.org/surefire/maven-surefire-plugin/xsd/failsafe-summary.xsd\"" + + " result=\"%s\" timeout=\"%s\">\n" + + " <completed>%d</completed>\n" + + " <errors>%d</errors>\n" + + " <failures>%d</failures>\n" + + " <skipped>%d</skipped>\n" + + " %s\n" + + "</failsafe-summary>"; + String xml = format(Locale.ROOT, legacyFailsafeSummaryXmlTemplate, 0, false, 3, 2, 1, 0, "msg"); + Files.write( + legacySummary.toPath(), + xml.getBytes(StandardCharsets.UTF_8), + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING, + StandardOpenOption.WRITE); + + // When the failsafe-summary.xml does not contain the <flakes> element, it should be considered as 0. + RunResult expected = new RunResult(3, 2, 1, 0, 0, null, false); + RunResult actual = FailsafeSummaryXmlUtils.toRunResult(legacySummary); + + assertThat(actual.getCompletedCount()).isEqualTo(expected.getCompletedCount()); + + assertThat(actual.getErrors()).isEqualTo(expected.getErrors()); + + assertThat(actual.getFailures()).isEqualTo(expected.getFailures()); + + assertThat(actual.getSkipped()).isEqualTo(expected.getSkipped()); + + assertThat(actual.getFlakes()).isEqualTo(expected.getFlakes()); + + assertThat(actual).isEqualTo(expected); + } + @Test public void testAppendSerialization() throws Exception { RunResult simpleAggregate = getSimpleAggregate(); diff --git a/maven-surefire-plugin/src/site/resources/xsd/failsafe-summary.xsd b/maven-surefire-plugin/src/site/resources/xsd/failsafe-summary.xsd index c412ec59e..b81565234 100644 --- a/maven-surefire-plugin/src/site/resources/xsd/failsafe-summary.xsd +++ b/maven-surefire-plugin/src/site/resources/xsd/failsafe-summary.xsd @@ -25,6 +25,7 @@ <xsd:element name="errors" type="xsd:int"/> <xsd:element name="failures" type="xsd:int"/> <xsd:element name="skipped" type="xsd:int"/> + <xsd:element name="flakes" type="xsd:int" minOccurs="0"/> <xsd:element name="failureMessage" type="xsd:string" nillable="true"/> </xsd:sequence> <xsd:attribute name="result" type="errorType" use="optional"/> diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/suite/RunResult.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/suite/RunResult.java index 8be1df1d0..545e7ab44 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/suite/RunResult.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/suite/RunResult.java @@ -202,6 +202,9 @@ public class RunResult { if (skipped != runResult.skipped) { return false; } + if (flakes != runResult.flakes) { + return false; + } if (timeout != runResult.timeout) { return false; } @@ -218,6 +221,7 @@ public class RunResult { result = 31 * result + errors; result = 31 * result + failures; result = 31 * result + skipped; + result = 31 * result + flakes; result = 31 * result + (failure != null ? failure.hashCode() : 0); result = 31 * result + (timeout ? 1 : 0); return result;