This is an automated email from the ASF dual-hosted git repository.

schofielaj pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 42fd4d1d11d KAFKA-7776: Tests for ISO8601 in Connect value parsing 
(#18374)
42fd4d1d11d is described below

commit 42fd4d1d11d4729fe54b8d8473d73488b1752e2b
Author: Andrew Schofield <aschofi...@confluent.io>
AuthorDate: Thu Jan 16 14:26:03 2025 +0000

    KAFKA-7776: Tests for ISO8601 in Connect value parsing (#18374)
    
    Reviewers: Andrew Schofield <aschofi...@confluent.io>
---
 .../org/apache/kafka/connect/data/ValuesTest.java  | 68 ++++++++++++++--------
 1 file changed, 45 insertions(+), 23 deletions(-)

diff --git 
a/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java 
b/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java
index c9b6ef047e4..4c62393e3ea 100644
--- a/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java
+++ b/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java
@@ -29,6 +29,14 @@ import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -849,7 +857,10 @@ public class ValuesTest {
 
     @Test
     public void shouldConvertTimeValues() {
-        java.util.Date current = new java.util.Date();
+        LocalDateTime localTime = LocalDateTime.now();
+        LocalTime localTimeTruncated = 
localTime.toLocalTime().truncatedTo(ChronoUnit.MILLIS);
+        ZoneOffset zoneOffset = 
ZoneId.systemDefault().getRules().getOffset(localTime);
+        java.util.Date current = new 
java.util.Date(localTime.toEpochSecond(zoneOffset) * 1000);
         long currentMillis = current.getTime() % MILLIS_PER_DAY;
 
         // java.util.Date - just copy
@@ -857,18 +868,21 @@ public class ValuesTest {
         assertEquals(current, t1);
 
         // java.util.Date as a Timestamp - discard the date and keep just 
day's milliseconds
-        t1 = Values.convertToTime(Timestamp.SCHEMA, current);
-        assertEquals(new java.util.Date(currentMillis), t1);
+        java.util.Date t2 = Values.convertToTime(Timestamp.SCHEMA, current);
+        assertEquals(new java.util.Date(currentMillis), t2);
 
-        // ISO8601 strings - currently broken because tokenization breaks at 
colon
+        // ISO8601 strings - accept a string matching pattern "HH:mm:ss.SSS'Z'"
+        java.util.Date t3 = Values.convertToTime(Time.SCHEMA, 
localTime.format(DateTimeFormatter.ofPattern(Values.ISO_8601_TIME_FORMAT_PATTERN)));
+        LocalTime time3 = 
LocalDateTime.ofInstant(Instant.ofEpochMilli(t3.getTime()), 
ZoneId.systemDefault()).toLocalTime();
+        assertEquals(localTimeTruncated, time3);
 
         // Millis as string
-        java.util.Date t3 = Values.convertToTime(Time.SCHEMA, 
Long.toString(currentMillis));
-        assertEquals(currentMillis, t3.getTime());
+        java.util.Date t4 = Values.convertToTime(Time.SCHEMA, 
Long.toString(currentMillis));
+        assertEquals(currentMillis, t4.getTime());
 
         // Millis as long
-        java.util.Date t4 = Values.convertToTime(Time.SCHEMA, currentMillis);
-        assertEquals(currentMillis, t4.getTime());
+        java.util.Date t5 = Values.convertToTime(Time.SCHEMA, currentMillis);
+        assertEquals(currentMillis, t5.getTime());
     }
 
     @Test
@@ -883,23 +897,28 @@ public class ValuesTest {
 
         // java.util.Date as a Timestamp - discard the day's milliseconds and 
keep the date
         java.util.Date currentDate = new java.util.Date(current.getTime() - 
currentMillis);
-        d1 = Values.convertToDate(Timestamp.SCHEMA, currentDate);
-        assertEquals(currentDate, d1);
+        java.util.Date d2 = Values.convertToDate(Timestamp.SCHEMA, 
currentDate);
+        assertEquals(currentDate, d2);
 
-        // ISO8601 strings - currently broken because tokenization breaks at 
colon
+        // ISO8601 strings - accept a string matching pattern "yyyy-MM-dd"
+        java.util.Date d3 = Values.convertToDate(Date.SCHEMA, 
LocalDate.ofEpochDay(days).format(DateTimeFormatter.ISO_LOCAL_DATE));
+        assertEquals(currentDate, d3);
 
         // Days as string
-        java.util.Date d3 = Values.convertToDate(Date.SCHEMA, 
Long.toString(days));
-        assertEquals(currentDate, d3);
+        java.util.Date d4 = Values.convertToDate(Date.SCHEMA, 
Long.toString(days));
+        assertEquals(currentDate, d4);
 
         // Days as long
-        java.util.Date d4 = Values.convertToDate(Date.SCHEMA, days);
-        assertEquals(currentDate, d4);
+        java.util.Date d5 = Values.convertToDate(Date.SCHEMA, days);
+        assertEquals(currentDate, d5);
     }
 
     @Test
     public void shouldConvertTimestampValues() {
-        java.util.Date current = new java.util.Date();
+        LocalDateTime localTime = LocalDateTime.now();
+        LocalDateTime localTimeTruncated = 
localTime.truncatedTo(ChronoUnit.MILLIS);
+        ZoneOffset zoneOffset = 
ZoneId.systemDefault().getRules().getOffset(localTime);
+        java.util.Date current = new 
java.util.Date(localTime.toEpochSecond(zoneOffset) * 1000);
         long currentMillis = current.getTime() % MILLIS_PER_DAY;
 
         // java.util.Date - just copy
@@ -912,18 +931,21 @@ public class ValuesTest {
         assertEquals(currentDate, ts1);
 
         // java.util.Date as a Time - discard the date and keep the day's 
milliseconds
-        ts1 = Values.convertToTimestamp(Time.SCHEMA, currentMillis);
-        assertEquals(new java.util.Date(currentMillis), ts1);
+        java.util.Date ts2 = Values.convertToTimestamp(Time.SCHEMA, 
currentMillis);
+        assertEquals(new java.util.Date(currentMillis), ts2);
 
-        // ISO8601 strings - currently broken because tokenization breaks at 
colon
+        // ISO8601 strings - accept a string matching pattern 
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
+        java.util.Date ts3 = Values.convertToTime(Time.SCHEMA, 
localTime.format(DateTimeFormatter.ofPattern(Values.ISO_8601_TIMESTAMP_FORMAT_PATTERN)));
+        LocalDateTime time3 = 
LocalDateTime.ofInstant(Instant.ofEpochMilli(ts3.getTime()), 
ZoneId.systemDefault());
+        assertEquals(localTimeTruncated, time3);
 
         // Millis as string
-        java.util.Date ts3 = Values.convertToTimestamp(Timestamp.SCHEMA, 
Long.toString(current.getTime()));
-        assertEquals(current, ts3);
+        java.util.Date ts4 = Values.convertToTimestamp(Timestamp.SCHEMA, 
Long.toString(current.getTime()));
+        assertEquals(current, ts4);
 
         // Millis as long
-        java.util.Date ts4 = Values.convertToTimestamp(Timestamp.SCHEMA, 
current.getTime());
-        assertEquals(current, ts4);
+        java.util.Date ts5 = Values.convertToTimestamp(Timestamp.SCHEMA, 
current.getTime());
+        assertEquals(current, ts5);
     }
 
     @Test

Reply via email to