KAFKA-7776: Tests for ISO8601 in Connect value parsing (#18374)

Reviewers: Andrew Schofield <aschofield@confluent.io>
This commit is contained in:
Andrew Schofield 2025-01-16 14:26:03 +00:00 committed by GitHub
parent bf760d4ebe
commit 42fd4d1d11
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 46 additions and 24 deletions

View File

@ -29,6 +29,14 @@ import java.math.BigInteger;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat; 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.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@ -849,7 +857,10 @@ public class ValuesTest {
@Test @Test
public void shouldConvertTimeValues() { 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; long currentMillis = current.getTime() % MILLIS_PER_DAY;
// java.util.Date - just copy // java.util.Date - just copy
@ -857,18 +868,21 @@ public class ValuesTest {
assertEquals(current, t1); assertEquals(current, t1);
// java.util.Date as a Timestamp - discard the date and keep just day's milliseconds // java.util.Date as a Timestamp - discard the date and keep just day's milliseconds
t1 = Values.convertToTime(Timestamp.SCHEMA, current); java.util.Date t2 = Values.convertToTime(Timestamp.SCHEMA, current);
assertEquals(new java.util.Date(currentMillis), t1); 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 // Millis as string
java.util.Date t3 = Values.convertToTime(Time.SCHEMA, Long.toString(currentMillis)); java.util.Date t4 = Values.convertToTime(Time.SCHEMA, Long.toString(currentMillis));
assertEquals(currentMillis, t3.getTime()); assertEquals(currentMillis, t4.getTime());
// Millis as long // Millis as long
java.util.Date t4 = Values.convertToTime(Time.SCHEMA, currentMillis); java.util.Date t5 = Values.convertToTime(Time.SCHEMA, currentMillis);
assertEquals(currentMillis, t4.getTime()); assertEquals(currentMillis, t5.getTime());
} }
@Test @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 as a Timestamp - discard the day's milliseconds and keep the date
java.util.Date currentDate = new java.util.Date(current.getTime() - currentMillis); java.util.Date currentDate = new java.util.Date(current.getTime() - currentMillis);
d1 = Values.convertToDate(Timestamp.SCHEMA, currentDate); java.util.Date d2 = Values.convertToDate(Timestamp.SCHEMA, currentDate);
assertEquals(currentDate, d1); 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));
// Days as string
java.util.Date d3 = Values.convertToDate(Date.SCHEMA, Long.toString(days));
assertEquals(currentDate, d3); assertEquals(currentDate, d3);
// Days as long // Days as string
java.util.Date d4 = Values.convertToDate(Date.SCHEMA, days); java.util.Date d4 = Values.convertToDate(Date.SCHEMA, Long.toString(days));
assertEquals(currentDate, d4); assertEquals(currentDate, d4);
// Days as long
java.util.Date d5 = Values.convertToDate(Date.SCHEMA, days);
assertEquals(currentDate, d5);
} }
@Test @Test
public void shouldConvertTimestampValues() { 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; long currentMillis = current.getTime() % MILLIS_PER_DAY;
// java.util.Date - just copy // java.util.Date - just copy
@ -912,18 +931,21 @@ public class ValuesTest {
assertEquals(currentDate, ts1); assertEquals(currentDate, ts1);
// java.util.Date as a Time - discard the date and keep the day's milliseconds // java.util.Date as a Time - discard the date and keep the day's milliseconds
ts1 = Values.convertToTimestamp(Time.SCHEMA, currentMillis); java.util.Date ts2 = Values.convertToTimestamp(Time.SCHEMA, currentMillis);
assertEquals(new java.util.Date(currentMillis), ts1); 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 // Millis as string
java.util.Date ts3 = Values.convertToTimestamp(Timestamp.SCHEMA, Long.toString(current.getTime())); java.util.Date ts4 = Values.convertToTimestamp(Timestamp.SCHEMA, Long.toString(current.getTime()));
assertEquals(current, ts3); assertEquals(current, ts4);
// Millis as long // Millis as long
java.util.Date ts4 = Values.convertToTimestamp(Timestamp.SCHEMA, current.getTime()); java.util.Date ts5 = Values.convertToTimestamp(Timestamp.SCHEMA, current.getTime());
assertEquals(current, ts4); assertEquals(current, ts5);
} }
@Test @Test