diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/reporting/ReportEntry.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/reporting/ReportEntry.java index fa40437d52cb..03753e239db5 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/reporting/ReportEntry.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/reporting/ReportEntry.java @@ -13,6 +13,7 @@ import static org.apiguardian.api.API.Status.STABLE; import java.time.LocalDateTime; +import java.time.ZonedDateTime; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; @@ -32,7 +33,7 @@ @API(status = STABLE, since = "1.0") public final class ReportEntry { - private final LocalDateTime timestamp = LocalDateTime.now(); + private final ZonedDateTime timestamp = ZonedDateTime.now(); private final Map keyValuePairs = new LinkedHashMap<>(); /** @@ -86,6 +87,17 @@ public final Map getKeyValuePairs() { * @return when this entry was created; never {@code null} */ public final LocalDateTime getTimestamp() { + return this.timestamp.toLocalDateTime(); + } + + /** + * Get the zoned timestamp for when and where this {@code ReportEntry} was created. + * + *

Can be used, for example, to order entries. + * + * @return when this entry was created; never {@code null} + */ + public final ZonedDateTime getZonedTimestamp() { return this.timestamp; } diff --git a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java index 8348e179e6ca..06827f661ecd 100644 --- a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java +++ b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java @@ -11,7 +11,7 @@ package org.junit.platform.reporting.legacy.xml; import static java.text.MessageFormat.format; -import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME; +import static java.time.format.DateTimeFormatter.ISO_ZONED_DATE_TIME; import static java.util.stream.Collectors.toList; import static org.junit.platform.commons.util.ExceptionUtils.readStackTrace; import static org.junit.platform.commons.util.StringUtils.isNotBlank; @@ -23,7 +23,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.text.NumberFormat; -import java.time.LocalDateTime; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; @@ -116,7 +116,7 @@ private void writeSuiteAttributes(TestIdentifier testIdentifier, List")); - writeAttributeSafely(writer, "timestamp", ISO_LOCAL_DATE_TIME.format(getCurrentDateTime())); + writeAttributeSafely(writer, "timestamp", ISO_ZONED_DATE_TIME.format(getCurrentDateTime())); } private void writeTestCounts(List tests, XMLStreamWriter writer) throws XMLStreamException { @@ -236,7 +236,7 @@ private void collectReportEntries(TestIdentifier testIdentifier, List sy systemOutElementsForCapturedOutput); removeIfPresentAndAddAsSeparateElement(keyValuePairs, STDERR_REPORT_ENTRY_KEY, systemErrElements); if (!keyValuePairs.isEmpty()) { - buildReportEntryDescription(reportEntry.getTimestamp(), keyValuePairs, i + 1, + buildReportEntryDescription(reportEntry.getZonedTimestamp(), keyValuePairs, i + 1, formattedReportEntries); } } @@ -253,10 +253,10 @@ private void removeIfPresentAndAddAsSeparateElement(Map keyValue } } - private void buildReportEntryDescription(LocalDateTime timestamp, Map keyValuePairs, + private void buildReportEntryDescription(ZonedDateTime timestamp, Map keyValuePairs, int entryNumber, StringBuilder result) { result.append( - format("Report Entry #{0} (timestamp: {1})\n", entryNumber, ISO_LOCAL_DATE_TIME.format(timestamp))); + format("Report Entry #{0} (timestamp: {1})\n", entryNumber, ISO_ZONED_DATE_TIME.format(timestamp))); keyValuePairs.forEach((key, value) -> result.append(format("\t- {0}: {1}\n", key, value))); } @@ -273,8 +273,8 @@ private Optional getHostname() { } } - private LocalDateTime getCurrentDateTime() { - return LocalDateTime.now(this.reportData.getClock()).withNano(0); + private ZonedDateTime getCurrentDateTime() { + return ZonedDateTime.now(this.reportData.getClock()).withNano(0); } private String formatNonStandardAttributesAsString(TestIdentifier testIdentifier) { diff --git a/platform-tests/src/test/java/org/junit/platform/reporting/legacy/xml/LegacyXmlReportGeneratingListenerTests.java b/platform-tests/src/test/java/org/junit/platform/reporting/legacy/xml/LegacyXmlReportGeneratingListenerTests.java index 24e9d280e9e6..be7e7ac90d08 100644 --- a/platform-tests/src/test/java/org/junit/platform/reporting/legacy/xml/LegacyXmlReportGeneratingListenerTests.java +++ b/platform-tests/src/test/java/org/junit/platform/reporting/legacy/xml/LegacyXmlReportGeneratingListenerTests.java @@ -32,7 +32,6 @@ import java.time.Clock; import java.time.Duration; import java.time.Instant; -import java.time.LocalDateTime; import java.time.Year; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -317,10 +316,11 @@ void writesHostNameAndTimestamp(@TempDir Path tempDirectory) throws Exception { engine.addTest("test", () -> { }); - LocalDateTime now = LocalDateTime.parse("2016-01-28T14:02:59.123"); - ZoneId zone = ZoneId.systemDefault(); + String timestamp = "2016-01-28T14:02:59Z[Europe/London]"; + ZonedDateTime now = ZonedDateTime.parse(timestamp); + ZoneId zone = now.getZone(); - executeTests(engine, tempDirectory, Clock.fixed(ZonedDateTime.of(now, zone).toInstant(), zone)); + executeTests(engine, tempDirectory, Clock.fixed(now.toInstant(), zone)); String content = readValidXmlFile(tempDirectory.resolve("TEST-dummy.xml")); @@ -329,7 +329,7 @@ void writesHostNameAndTimestamp(@TempDir Path tempDirectory) throws Exception { .containsSubsequence( ""); // @formatter:on