From 1aca001faa1b6325fb9c8e5493bedcf7afb43661 Mon Sep 17 00:00:00 2001 From: Davi de Castro Reis Date: Sat, 3 Sep 2022 21:13:15 -0300 Subject: [PATCH] Differ explicit epoch from null in timestamp conversion. --- .../common/ProtobufStandardMappings.java | 12 ++++++++---- .../no/entur/abt/mapstruct/common/Timestamps.java | 3 --- .../mapstruct/ProtobufStandardMappingsTest.java | 15 +++++++++++++-- .../mapstruct/ProtobufStandardMappingsTest.java | 15 +++++++++++++-- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/support-core/src/main/java/no/entur/abt/mapstruct/common/ProtobufStandardMappings.java b/support-core/src/main/java/no/entur/abt/mapstruct/common/ProtobufStandardMappings.java index a53292c..72ea79c 100644 --- a/support-core/src/main/java/no/entur/abt/mapstruct/common/ProtobufStandardMappings.java +++ b/support-core/src/main/java/no/entur/abt/mapstruct/common/ProtobufStandardMappings.java @@ -141,6 +141,10 @@ default ByteString map(BytesValue f) { } default Instant mapToInstant(Timestamp t) { + if (t == null) { + return null; + } + Timestamp sanitized = Timestamps.sanitize(t); if (sanitized != null) { @@ -151,11 +155,11 @@ default Instant mapToInstant(Timestamp t) { } default Timestamp mapToTimestamp(Instant i) { - if (i == null || i.getEpochSecond() == 0) { + if (i == null) { return null; - } else { - Timestamp t = Timestamp.newBuilder().setSeconds(i.getEpochSecond()).setNanos(i.getNano()).build(); - return Timestamps.sanitize(t); } + + Timestamp t = Timestamp.newBuilder().setSeconds(i.getEpochSecond()).setNanos(i.getNano()).build(); + return Timestamps.sanitize(t); } } diff --git a/support-core/src/main/java/no/entur/abt/mapstruct/common/Timestamps.java b/support-core/src/main/java/no/entur/abt/mapstruct/common/Timestamps.java index cc66e2f..e5681bd 100644 --- a/support-core/src/main/java/no/entur/abt/mapstruct/common/Timestamps.java +++ b/support-core/src/main/java/no/entur/abt/mapstruct/common/Timestamps.java @@ -46,9 +46,6 @@ public class Timestamps { * Sanitize Timestamps outside legal range where possible. */ public static Timestamp sanitize(Timestamp t) { - if (t.getSeconds() == 0 && t.getNanos() == 0) { - return null; // Assuming null for epoch, cannot differentiate - } if (t.getNanos() < 0 || t.getNanos() >= NANOS_PER_SECOND) { throw new IllegalArgumentException(String.format("Timestamp is not valid. See proto definition for valid values. Seconds (%s) must be in range [-62,135,596,800, +253,402,300,799]. Nanos (%s) must be in range [0, +999,999,999].", t.getSeconds(), t.getNanos())); } diff --git a/support-lite/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java b/support-lite/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java index aa50d00..1ca7efa 100644 --- a/support-lite/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java +++ b/support-lite/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java @@ -67,8 +67,19 @@ public void testMapLocalDateToTimestampWintertime() { } @Test - public void mapToInstant_whenSecondsAndNanosIs0_thenMapToNull() { - assertNull(MAPPER.mapToInstant(Timestamp.newBuilder().build())); + public void testMapInstantToTimestampEpoch() { + Instant epoch = Instant.EPOCH; + + Timestamp timestamp = MAPPER.mapToTimestamp(epoch); + + Instant back = MAPPER.mapToInstant(timestamp); + + assertEquals(epoch, back); + } + + @Test + public void mapToInstant_whenSecondsAndNanosIsNull_thenMapToNull() { + assertNull(MAPPER.mapToInstant(null)); } @Test diff --git a/support-standard/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java b/support-standard/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java index 172854a..5cc69e1 100644 --- a/support-standard/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java +++ b/support-standard/src/test/java/no/entur/abt/mapstruct/ProtobufStandardMappingsTest.java @@ -66,10 +66,21 @@ public void testMapLocalDateToTimestampWintertime() { assertEquals(l, back); } + @Test + public void testMapInstantToTimestampEpoch() { + Instant epoch = Instant.EPOCH; + + Timestamp timestamp = MAPPER.mapToTimestamp(epoch); + + Instant back = MAPPER.mapToInstant(timestamp); + + assertEquals(epoch, back); + } + @Test - public void mapToInstant_whenSecondsAndNanosIs0_thenMapToNull() { - assertNull(MAPPER.mapToInstant(Timestamp.newBuilder().build())); + public void mapToInstant_whenSecondsAndNanosIsNull_thenMapToNull() { + assertNull(MAPPER.mapToInstant(null)); } @Test