From e6bb0d5ed299e178045b8d8897296b89b0d8ff9d Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 5 Dec 2025 20:01:48 +0100 Subject: [PATCH 1/7] Remove UniqueId.uniqueIdFormat field The `UniqueIdFormat` is a singleton instance and not part of the public API, as such is effectively constant. Tracking the format in every `UniqueId` is unnecessary and makes the larger than it needs to be. --- .../org/junit/platform/engine/UniqueId.java | 23 +++++++------------ .../junit/platform/engine/UniqueIdFormat.java | 2 +- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java index e735b61f9e8e..f720c3661f63 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java @@ -38,7 +38,7 @@ public final class UniqueId implements Cloneable, Serializable { @Serial - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 2L; private static final String ENGINE_SEGMENT_TYPE = "engine"; @@ -79,11 +79,9 @@ public static UniqueId forEngine(String engineId) { * @see #forEngine(String) */ public static UniqueId root(String segmentType, String value) { - return new UniqueId(UniqueIdFormat.getDefault(), new Segment(segmentType, value)); + return new UniqueId(new Segment(segmentType, value)); } - private final UniqueIdFormat uniqueIdFormat; - @SuppressWarnings({ "serial", "RedundantSuppression" }) // always used with serializable implementation (List.copyOf()) private final List segments; @@ -93,19 +91,14 @@ public static UniqueId root(String segmentType, String value) { // lazily computed private transient @Nullable SoftReference toString; - private UniqueId(UniqueIdFormat uniqueIdFormat, Segment segment) { - this(uniqueIdFormat, List.of(segment)); + private UniqueId(Segment segment) { + this(List.of(segment)); } /** * Initialize a {@code UniqueId} instance. - * - * @implNote A defensive copy of the segment list is not created by - * this implementation. All callers should immediately drop the reference - * to the list instance that they pass into this constructor. */ - UniqueId(UniqueIdFormat uniqueIdFormat, List segments) { - this.uniqueIdFormat = uniqueIdFormat; + UniqueId(List segments) { this.segments = List.copyOf(segments); } @@ -164,7 +157,7 @@ public UniqueId append(Segment segment) { List baseSegments = new ArrayList<>(this.segments.size() + 1); baseSegments.addAll(this.segments); baseSegments.add(segment); - return new UniqueId(this.uniqueIdFormat, baseSegments); + return new UniqueId(baseSegments); } /** @@ -215,7 +208,7 @@ public boolean hasPrefix(UniqueId potentialPrefix) { @API(status = STABLE, since = "1.5") public UniqueId removeLastSegment() { Preconditions.condition(this.segments.size() > 1, "Cannot remove last remaining segment"); - return new UniqueId(uniqueIdFormat, List.copyOf(this.segments.subList(0, this.segments.size() - 1))); + return new UniqueId(this.segments.subList(0, this.segments.size() - 1)); } /** @@ -277,7 +270,7 @@ public String toString() { SoftReference s = this.toString; String value = s == null ? null : s.get(); if (value == null) { - value = this.uniqueIdFormat.format(this); + value = UniqueIdFormat.getDefault().format(this); // this is a benign race like String#hash // we potentially read and write values from multiple threads // without a happens-before relationship diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java index 87275e54ba4d..c08dc84c91a8 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java @@ -88,7 +88,7 @@ private static String encode(char c) { UniqueId parse(String source) throws JUnitException { String[] parts = source.split(String.valueOf(this.segmentDelimiter)); List segments = Arrays.stream(parts).map(this::createSegment).toList(); - return new UniqueId(this, segments); + return new UniqueId(segments); } private Segment createSegment(String segmentString) throws JUnitException { From c489399e50a21fc28dc4eb4322c815ad03864ba1 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 6 Dec 2025 00:27:59 +0100 Subject: [PATCH 2/7] Remove Serializable from UniqueIdFormat --- .../java/org/junit/platform/engine/UniqueIdFormat.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java index c08dc84c91a8..80be4377cf95 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java @@ -12,8 +12,6 @@ import static java.util.stream.Collectors.joining; -import java.io.Serial; -import java.io.Serializable; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -33,10 +31,7 @@ * * @since 1.0 */ -class UniqueIdFormat implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; +class UniqueIdFormat { private static final UniqueIdFormat defaultFormat = new UniqueIdFormat('[', ':', ']', '/'); From 94f1cd3a9da39daa835f3ab101d11f445f843dfa Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 6 Dec 2025 14:08:47 +0100 Subject: [PATCH 3/7] Test against custom and default format separately --- .../platform/engine/UniqueIdFormatTests.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdFormatTests.java b/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdFormatTests.java index bedc9014524f..15f6ab9a42e2 100644 --- a/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdFormatTests.java +++ b/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdFormatTests.java @@ -68,11 +68,21 @@ public String getEngineUid() { return "[engine:junit-jupiter]"; } + @Override + public String getDefaultEngineUid() { + return getEngineUid(); + } + @Override public String getMethodUid() { return "[engine:junit-jupiter]/[class:MyClass]/[method:myMethod]"; } + @Override + public String getDefaultMethodUid() { + return getMethodUid(); + } + } @Nested @@ -90,11 +100,21 @@ public String getEngineUid() { return "{engine=junit-jupiter}"; } + @Override + public String getDefaultEngineUid() { + return "[engine:junit-jupiter]"; + } + @Override public String getMethodUid() { return "{engine=junit-jupiter},{class=MyClass},{method=myMethod}"; } + @Override + public String getDefaultMethodUid() { + return "[engine:junit-jupiter]/[class:MyClass]/[method:myMethod]"; + } + } // ------------------------------------------------------------------------- @@ -110,8 +130,12 @@ interface ParsingTestTrait { String getEngineUid(); + String getDefaultEngineUid(); + String getMethodUid(); + String getDefaultMethodUid(); + @Test default void parseMalformedUid() { Throwable throwable = assertThrows(JUnitException.class, () -> getFormat().parse("malformed UID")); @@ -123,7 +147,7 @@ default void parseEngineUid() { var parsedId = getFormat().parse(getEngineUid()); assertSegment(parsedId.getSegments().getFirst(), "engine", "junit-jupiter"); assertEquals(getEngineUid(), getFormat().format(parsedId)); - assertEquals(getEngineUid(), parsedId.toString()); + assertEquals(getDefaultEngineUid(), parsedId.toString()); } @Test @@ -133,7 +157,7 @@ default void parseMethodUid() { assertSegment(parsedId.getSegments().get(1), "class", "MyClass"); assertSegment(parsedId.getSegments().get(2), "method", "myMethod"); assertEquals(getMethodUid(), getFormat().format(parsedId)); - assertEquals(getMethodUid(), parsedId.toString()); + assertEquals(getDefaultMethodUid(), parsedId.toString()); } } From 8ae54f31520d29a4f809d4d3cadc4d742c463115 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 6 Dec 2025 17:47:22 +0100 Subject: [PATCH 4/7] Revert "Remove Serializable from UniqueIdFormat" This reverts commit c489399e50a21fc28dc4eb4322c815ad03864ba1. --- .../java/org/junit/platform/engine/UniqueIdFormat.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java index 80be4377cf95..c08dc84c91a8 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java @@ -12,6 +12,8 @@ import static java.util.stream.Collectors.joining; +import java.io.Serial; +import java.io.Serializable; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -31,7 +33,10 @@ * * @since 1.0 */ -class UniqueIdFormat { +class UniqueIdFormat implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; private static final UniqueIdFormat defaultFormat = new UniqueIdFormat('[', ':', ']', '/'); From c4983ac05df6408b6b4148ddd357e1559fbb3a8a Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 8 Dec 2025 03:04:26 +0100 Subject: [PATCH 5/7] Ensure backwards compatibility --- .../org/junit/platform/engine/UniqueId.java | 68 ++++++++++++++++- .../junit/platform/engine/UniqueIdTests.java | 75 +++++++++++++++++++ 2 files changed, 140 insertions(+), 3 deletions(-) diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java index f720c3661f63..5fd49bcd22be 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java @@ -12,6 +12,11 @@ import static org.apiguardian.api.API.Status.STABLE; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamClass; +import java.io.ObjectStreamField; import java.io.Serial; import java.io.Serializable; import java.lang.ref.SoftReference; @@ -38,7 +43,12 @@ public final class UniqueId implements Cloneable, Serializable { @Serial - private static final long serialVersionUID = 2L; + private static final long serialVersionUID = 1L; + + @Serial + @SuppressWarnings("UnusedVariable") + private static final ObjectStreamField[] serialPersistentFields = ObjectStreamClass.lookup( + SerializedForm.class).getFields(); private static final String ENGINE_SEGMENT_TYPE = "engine"; @@ -82,8 +92,10 @@ public static UniqueId root(String segmentType, String value) { return new UniqueId(new Segment(segmentType, value)); } - @SuppressWarnings({ "serial", "RedundantSuppression" }) // always used with serializable implementation (List.copyOf()) - private final List segments; + @SuppressWarnings({ "serial", "RedundantSuppression" }) + // always used with serializable implementation (List.copyOf()) + // This is effectively final but not technically due to late initialization when deserializing + private /* final */ List segments; // lazily computed private transient int hashCode; @@ -227,6 +239,18 @@ protected Object clone() throws CloneNotSupportedException { return super.clone(); } + @Serial + private void writeObject(ObjectOutputStream s) throws IOException { + SerializedForm serializedForm = new SerializedForm(this); + serializedForm.serialize(s); + } + + @Serial + private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException { + SerializedForm serializedForm = SerializedForm.deserialize(s); + segments = serializedForm.segments; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -354,4 +378,42 @@ public String toString() { } + /** + * Represents the serialized output of {@code UniqueId}. The fields on this + * class match the fields that {@code UniqueId} had prior to 6.1. + */ + private static final class SerializedForm implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @SuppressWarnings({ "serial", "RedundantSuppression" }) + // always used with serializable implementation (List.copyOf()) + private final List segments; + private final UniqueIdFormat uniqueIdFormat; + + SerializedForm(UniqueId uniqueId) { + this.segments = uniqueId.segments; + this.uniqueIdFormat = UniqueIdFormat.getDefault(); + } + + @SuppressWarnings("unchecked") + private SerializedForm(ObjectInputStream.GetField fields) throws IOException, ClassNotFoundException { + this.segments = (List) fields.get("segments", null); + this.uniqueIdFormat = UniqueIdFormat.getDefault(); + } + + void serialize(ObjectOutputStream s) throws IOException { + ObjectOutputStream.PutField fields = s.putFields(); + fields.put("segments", segments); + fields.put("uniqueIdFormat", uniqueIdFormat); + s.writeFields(); + } + + static SerializedForm deserialize(ObjectInputStream s) throws IOException, ClassNotFoundException { + ObjectInputStream.GetField fields = s.readFields(); + return new SerializedForm(fields); + } + } + } diff --git a/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java b/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java index 6bc5b550f217..8cc73a0f4de4 100644 --- a/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java +++ b/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java @@ -18,6 +18,12 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.platform.commons.test.PreconditionAssertions.assertPreconditionViolationFor; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Base64; import java.util.Optional; import org.junit.jupiter.api.Nested; @@ -292,6 +298,75 @@ void removesLastSegment() { } + @Nested + class Serialization { + + final UniqueId uniqueId = UniqueId.root("engine", "junit-jupiter"); + + @Test + void roundTrip() throws IOException, ClassNotFoundException { + var bytesOut = new ByteArrayOutputStream(); + var out = new ObjectOutputStream(bytesOut); + out.writeObject(uniqueId); + + var bytesIn = new ByteArrayInputStream(bytesOut.toByteArray()); + var in = new ObjectInputStream(bytesIn); + var actual = in.readObject(); + + assertEquals(uniqueId, actual); + assertEquals(uniqueId.toString(), actual.toString()); + } + + @Test + void deserializeromJunit60() throws IOException, ClassNotFoundException { + var uniqueIdFromJunit60 = Base64.getMimeDecoder().decode(""" + rO0ABXNyACJvcmcuanVuaXQucGxhdGZvcm0uZW5naW5lLlVuaXF1ZUlkAAAAAAAAAAECAAJMAAhzZWdtZW50c3QAEExqYXZhL3V0 + aWwvTGlzdDtMAA51bmlxdWVJZEZvcm1hdHQAKkxvcmcvanVuaXQvcGxhdGZvcm0vZW5naW5lL1VuaXF1ZUlkRm9ybWF0O3hwc3IA + EWphdmEudXRpbC5Db2xsU2VyV46rtjobqBEDAAFJAAN0YWd4cAAAAAF3BAAAAAFzcgAqb3JnLmp1bml0LnBsYXRmb3JtLmVuZ2lu + ZS5VbmlxdWVJZCRTZWdtZW50AAAAAAAAAAECAAJMAAR0eXBldAASTGphdmEvbGFuZy9TdHJpbmc7TAAFdmFsdWVxAH4AB3hwdAAG + ZW5naW5ldAANanVuaXQtanVwaXRlcnhzcgAob3JnLmp1bml0LnBsYXRmb3JtLmVuZ2luZS5VbmlxdWVJZEZvcm1hdAAAAAAAAAAB + AgAGQwAMY2xvc2VTZWdtZW50QwALb3BlblNlZ21lbnRDABBzZWdtZW50RGVsaW1pdGVyQwASdHlwZVZhbHVlU2VwYXJhdG9yTAAT + ZW5jb2RlZENoYXJhY3Rlck1hcHQAE0xqYXZhL3V0aWwvSGFzaE1hcDtMAA5zZWdtZW50UGF0dGVybnQAGUxqYXZhL3V0aWwvcmVn + ZXgvUGF0dGVybjt4cABdAFsALwA6c3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNo + b2xkeHA/QAAAAAAADHcIAAAAEAAAAAZzcgATamF2YS5sYW5nLkNoYXJhY3RlcjSLR9lrGiZ4AgABQwAFdmFsdWV4cAAldAADJTI1 + c3EAfgARADp0AAMlM0FzcQB+ABEAW3QAAyU1QnNxAH4AEQArdAADJTJCc3EAfgARAF10AAMlNURzcQB+ABEAL3QAAyUyRnhzcgAX + amF2YS51dGlsLnJlZ2V4LlBhdHRlcm5GZ9VrbkkCDQIAAkkABWZsYWdzTAAHcGF0dGVybnEAfgAHeHAAAAAgdAAXXFFbXEUoLisp + XFE6XEUoLispXFFdXEU="""); + + var bytesIn = new ByteArrayInputStream(uniqueIdFromJunit60); + var in = new ObjectInputStream(bytesIn); + var actual = in.readObject(); + + assertEquals(uniqueId, actual); + assertEquals(uniqueId.toString(), actual.toString()); + } + + @Test + void deserializeFromJunit60IgnoresCustomFormat() throws IOException, ClassNotFoundException { + var uniqueIdWithCustomFormatFromJunit60 = Base64.getMimeDecoder().decode(""" + rO0ABXNyACJvcmcuanVuaXQucGxhdGZvcm0uZW5naW5lLlVuaXF1ZUlkAAAAAAAAAAECAAJMAAhzZWdtZW50c3QAEExqYXZhL3V0 + aWwvTGlzdDtMAA51bmlxdWVJZEZvcm1hdHQAKkxvcmcvanVuaXQvcGxhdGZvcm0vZW5naW5lL1VuaXF1ZUlkRm9ybWF0O3hwc3IA + EWphdmEudXRpbC5Db2xsU2VyV46rtjobqBEDAAFJAAN0YWd4cAAAAAF3BAAAAAFzcgAqb3JnLmp1bml0LnBsYXRmb3JtLmVuZ2lu + ZS5VbmlxdWVJZCRTZWdtZW50AAAAAAAAAAECAAJMAAR0eXBldAASTGphdmEvbGFuZy9TdHJpbmc7TAAFdmFsdWVxAH4AB3hwdAAG + ZW5naW5ldAANanVuaXQtanVwaXRlcnhzcgAob3JnLmp1bml0LnBsYXRmb3JtLmVuZ2luZS5VbmlxdWVJZEZvcm1hdAAAAAAAAAAB + AgAGQwAMY2xvc2VTZWdtZW50QwALb3BlblNlZ21lbnRDABBzZWdtZW50RGVsaW1pdGVyQwASdHlwZVZhbHVlU2VwYXJhdG9yTAAT + ZW5jb2RlZENoYXJhY3Rlck1hcHQAE0xqYXZhL3V0aWwvSGFzaE1hcDtMAA5zZWdtZW50UGF0dGVybnQAGUxqYXZhL3V0aWwvcmVn + ZXgvUGF0dGVybjt4cAB9AHsALAA9c3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNo + b2xkeHA/QAAAAAAADHcIAAAAEAAAAAZzcgATamF2YS5sYW5nLkNoYXJhY3RlcjSLR9lrGiZ4AgABQwAFdmFsdWV4cAAldAADJTI1 + c3EAfgARAHt0AAMlN0JzcQB+ABEAK3QAAyUyQnNxAH4AEQAsdAADJTJDc3EAfgARAH10AAMlN0RzcQB+ABEAPXQAAyUzRHhzcgAX + amF2YS51dGlsLnJlZ2V4LlBhdHRlcm5GZ9VrbkkCDQIAAkkABWZsYWdzTAAHcGF0dGVybnEAfgAHeHAAAAAgdAAXXFF7XEUoLisp + XFE9XEUoLispXFF9XEU="""); + + var bytesIn = new ByteArrayInputStream(uniqueIdWithCustomFormatFromJunit60); + var in = new ObjectInputStream(bytesIn); + var actual = in.readObject(); + + assertEquals(uniqueId, actual); + assertEquals(uniqueId.toString(), actual.toString()); + } + + } + private static void assertSegment(Segment segment, String expectedType, String expectedValue) { assertEquals(expectedType, segment.getType(), "segment type"); assertEquals(expectedValue, segment.getValue(), "segment value"); From 1ddce1c16b5da1b206d875fef8a7afa050da8215 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 8 Dec 2025 03:22:00 +0100 Subject: [PATCH 6/7] Add clarifying comments --- .../org/junit/platform/engine/UniqueIdTests.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java b/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java index 8cc73a0f4de4..1f4b30781d9c 100644 --- a/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java +++ b/platform-tests/src/test/java/org/junit/platform/engine/UniqueIdTests.java @@ -318,7 +318,14 @@ void roundTrip() throws IOException, ClassNotFoundException { } @Test - void deserializeromJunit60() throws IOException, ClassNotFoundException { + void deserializeFromJunit60() throws IOException, ClassNotFoundException { + /* + Serialized representation of: + new UniqueId( + new UniqueIdFormat('[', ':', ']', '/'), + List.of(new Segment("engine", "junit-jupiter")) + ); + */ var uniqueIdFromJunit60 = Base64.getMimeDecoder().decode(""" rO0ABXNyACJvcmcuanVuaXQucGxhdGZvcm0uZW5naW5lLlVuaXF1ZUlkAAAAAAAAAAECAAJMAAhzZWdtZW50c3QAEExqYXZhL3V0 aWwvTGlzdDtMAA51bmlxdWVJZEZvcm1hdHQAKkxvcmcvanVuaXQvcGxhdGZvcm0vZW5naW5lL1VuaXF1ZUlkRm9ybWF0O3hwc3IA @@ -343,6 +350,13 @@ void deserializeromJunit60() throws IOException, ClassNotFoundException { @Test void deserializeFromJunit60IgnoresCustomFormat() throws IOException, ClassNotFoundException { + /* + Serialized representation of: + new UniqueId( + new UniqueIdFormat('{', '=', '}', ','), + List.of(new Segment("engine", "junit-jupiter")) + ); + */ var uniqueIdWithCustomFormatFromJunit60 = Base64.getMimeDecoder().decode(""" rO0ABXNyACJvcmcuanVuaXQucGxhdGZvcm0uZW5naW5lLlVuaXF1ZUlkAAAAAAAAAAECAAJMAAhzZWdtZW50c3QAEExqYXZhL3V0 aWwvTGlzdDtMAA51bmlxdWVJZEZvcm1hdHQAKkxvcmcvanVuaXQvcGxhdGZvcm0vZW5naW5lL1VuaXF1ZUlkRm9ybWF0O3hwc3IA From c8f1be002f3128c0f15f3cbe33c9ffc4f76db7fc Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 8 Dec 2025 03:37:56 +0100 Subject: [PATCH 7/7] Update release notes --- .../ROOT/partials/release-notes/release-notes-6.1.0-M2.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/modules/ROOT/partials/release-notes/release-notes-6.1.0-M2.adoc b/documentation/modules/ROOT/partials/release-notes/release-notes-6.1.0-M2.adoc index f55ef4a580f6..1a17c1ed6abe 100644 --- a/documentation/modules/ROOT/partials/release-notes/release-notes-6.1.0-M2.adoc +++ b/documentation/modules/ROOT/partials/release-notes/release-notes-6.1.0-M2.adoc @@ -25,7 +25,8 @@ repository on GitHub. [[v6.1.0-M2-junit-platform-new-features-and-improvements]] ==== New Features and Improvements -* ❓ +* The `UniqueId.uniqueIdFormat` field has been removed, reducing the size of `UniqueId` + objects. [[v6.1.0-M2-junit-jupiter]] === JUnit Jupiter @@ -48,6 +49,7 @@ repository on GitHub. `DefaultTimeZoneExtension` are now part of the JUnit Jupiter. Find examples in the xref:writing-tests/built-in-extensions.adoc#DefaultLocaleAndTimeZone[User Guide]. + [[v6.1.0-M2-junit-vintage]] === JUnit Vintage