From 9d1faed427d5453263ae09806fe20c4adde4a796 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Sep 2025 20:51:45 +0200 Subject: [PATCH 1/2] java: Write test cases in canonical order --- java/pom.xml | 10 +++- ...essagesToJunitXmlWriterAcceptanceTest.java | 52 +++++++++++-------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/java/pom.xml b/java/pom.xml index 483d8b2..1e707c4 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 @@ -67,6 +68,13 @@ [14.0.1,15.0.0) + + io.cucumber + compatibility-kit + 23.2.0 + test + + com.fasterxml.jackson.core jackson-databind diff --git a/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java b/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java index 05ef8a8..1987a51 100644 --- a/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java +++ b/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java @@ -1,5 +1,6 @@ package io.cucumber.junitxmlformatter; +import io.cucumber.compatibilitykit.MessageOrderer; import io.cucumber.messages.NdjsonToMessageIterable; import io.cucumber.messages.types.Envelope; import org.assertj.core.api.Assertions; @@ -24,6 +25,8 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.Random; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -32,6 +35,8 @@ class MessagesToJunitXmlWriterAcceptanceTest { private static final NdjsonToMessageIterable.Deserializer deserializer = (json) -> OBJECT_MAPPER.readValue(json, Envelope.class); + private static final Random random = new Random(202509282040L); + private static final MessageOrderer messageOrderer = new MessageOrderer(random); static List acceptance() throws IOException { try (Stream paths = Files.list(Paths.get("../testdata/src"))) { @@ -46,16 +51,24 @@ static List acceptance() throws IOException { @ParameterizedTest @MethodSource("acceptance") void test(TestCase testCase) throws IOException { - ByteArrayOutputStream bytes = writeJunitXmlReport(testCase, new ByteArrayOutputStream()); + ByteArrayOutputStream bytes = writeJunitXmlReport(testCase, messageOrderer.originalOrder()); Source expected = Input.fromPath(testCase.expected).build(); Source actual = Input.fromByteArray(bytes.toByteArray()).build(); assertThat(actual).and(expected).ignoreWhitespace().areIdentical(); } + @ParameterizedTest + @MethodSource("acceptance") + void testWithSimulatedParallelExecution(TestCase testCase) throws IOException { + ByteArrayOutputStream actual = writeJunitXmlReport(testCase, messageOrderer.simulateParallelExecution()); + byte[] expected = Files.readAllBytes(testCase.expected); + assertThat(actual).and(expected).ignoreWhitespace().areIdentical(); + } + @ParameterizedTest @MethodSource("acceptance") void validateAgainstJenkins(TestCase testCase) throws IOException { - ByteArrayOutputStream bytes = writeJunitXmlReport(testCase, new ByteArrayOutputStream()); + ByteArrayOutputStream bytes = writeJunitXmlReport(testCase, messageOrderer.originalOrder()); Source actual = Input.fromByteArray(bytes.toByteArray()).build(); Source jenkinsSchema = Input.fromPath(Paths.get("../jenkins-junit.xsd")).build(); assertThat(actual).isValidAgainst(jenkinsSchema); @@ -64,7 +77,7 @@ void validateAgainstJenkins(TestCase testCase) throws IOException { @ParameterizedTest @MethodSource("acceptance") void validateAgainstSurefire(TestCase testCase) throws IOException { - ByteArrayOutputStream bytes = writeJunitXmlReport(testCase, new ByteArrayOutputStream()); + ByteArrayOutputStream bytes = writeJunitXmlReport(testCase, messageOrderer.originalOrder()); Source actual = Input.fromByteArray(bytes.toByteArray()).build(); Source surefireSchema = Input.fromPath(Paths.get("../surefire-test-report-3.0.2.xsd")).build(); @@ -87,20 +100,29 @@ void validateAgainstSurefire(TestCase testCase) throws IOException { @Disabled void updateExpectedFiles(TestCase testCase) throws IOException { try (OutputStream out = Files.newOutputStream(testCase.expected)) { - writeJunitXmlReport(testCase, out); + writeJunitXmlReport(testCase, messageOrderer.originalOrder()); } } - private static T writeJunitXmlReport(TestCase testCase, T out) throws IOException { + private static ByteArrayOutputStream writeJunitXmlReport(TestCase testCase, Consumer> orderer) throws IOException { + return writeJunitXmlReport(testCase, new ByteArrayOutputStream(), orderer); + } + private static T writeJunitXmlReport(TestCase testCase, T out, Consumer> orderer) throws IOException { + List messages = new ArrayList<>(); try (InputStream in = Files.newInputStream(testCase.source)) { try (NdjsonToMessageIterable envelopes = new NdjsonToMessageIterable(in, deserializer)) { - try (MessagesToJunitXmlWriter writer = new MessagesToJunitXmlWriter(out)) { - for (Envelope envelope : envelopes) { - writer.write(envelope); - } + for (Envelope envelope : envelopes) { + messages.add(envelope); } } } + orderer.accept(messages); + + try (MessagesToJunitXmlWriter writer = new MessagesToJunitXmlWriter(out)) { + for (Envelope envelope : messages) { + writer.write(envelope); + } + } return out; } @@ -122,18 +144,6 @@ public String toString() { return name; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - TestCase testCase = (TestCase) o; - return source.equals(testCase.source); - } - - @Override - public int hashCode() { - return Objects.hash(source); - } } } From 9e211039ef1c4003b5a8d9212ac8b4f4d89fa08c Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 28 Sep 2025 20:52:26 +0200 Subject: [PATCH 2/2] java: Write test cases in canonical order --- .../MessagesToJunitXmlWriterAcceptanceTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java b/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java index 1987a51..629b7d3 100644 --- a/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java +++ b/java/src/test/java/io/cucumber/junitxmlformatter/MessagesToJunitXmlWriterAcceptanceTest.java @@ -24,7 +24,6 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.Random; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -100,7 +99,7 @@ void validateAgainstSurefire(TestCase testCase) throws IOException { @Disabled void updateExpectedFiles(TestCase testCase) throws IOException { try (OutputStream out = Files.newOutputStream(testCase.expected)) { - writeJunitXmlReport(testCase, messageOrderer.originalOrder()); + writeJunitXmlReport(testCase, out, messageOrderer.originalOrder()); } }