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.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
// Days as string
java.util.Date d3 = Values.convertToDate(Date.SCHEMA, Long.toString(days));
// 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 long
java.util.Date d4 = Values.convertToDate(Date.SCHEMA, days);
// Days as string
java.util.Date d4 = Values.convertToDate(Date.SCHEMA, Long.toString(days));
assertEquals(currentDate, d4);
// Days as long
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