Skip to content

Commit 1cdc700

Browse files
authored
Merge pull request #352 from Open-J-Proxy/copilot/cherry-pick-hotfix-branch
Cherry-pick java.time test modernization (6ee9aa5) into hotfix branch
2 parents ae95fdd + 2900cfd commit 1cdc700

7 files changed

+369
-67
lines changed

ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBMultipleTypesIntegrationTest.java

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,16 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
7878
psInsert.setFloat(9, 20.20f);
7979
psInsert.setBytes(10, new byte[]{(byte) 1}); // CockroachDB BYTEA expects byte array
8080
psInsert.setBytes(11, "AAAA".getBytes()); // CockroachDB BYTEA
81-
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
82-
psInsert.setDate(12, new Date(sdf.parse("29/03/2025").getTime()));
83-
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm:ss");
84-
psInsert.setTime(13, new Time(sdfTime.parse("11:12:13").getTime()));
85-
SimpleDateFormat sdfTimestamp = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
86-
psInsert.setTimestamp(14, new Timestamp(sdfTimestamp.parse("30/03/2025 21:22:23").getTime()));
81+
82+
// Using java.time types with setObject instead of java.sql types
83+
LocalDate valDate = LocalDate.of(2025, 3, 29);
84+
psInsert.setObject(12, valDate, Types.DATE);
85+
86+
LocalTime valTime = LocalTime.of(11, 12, 13);
87+
psInsert.setObject(13, valTime, Types.TIME);
88+
89+
LocalDateTime valTimestamp = LocalDateTime.of(2025, 3, 30, 21, 22, 23);
90+
psInsert.setObject(14, valTimestamp, Types.TIMESTAMP);
8791

8892
// CockroachDB natively supported java.time types (JDBC 4.2)
8993
LocalDateTime valLocalDateTime = LocalDateTime.of(2024, 12, 1, 14, 30, 45);
@@ -133,9 +137,44 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
133137
} else {
134138
assertEquals("AAAA", new String(resultSet.getBytes(11)));
135139
}
136-
assertEquals("29/03/2025", sdf.format(resultSet.getDate(12)));
137-
assertEquals("11:12:13", sdfTime.format(resultSet.getTime(13)));
138-
assertEquals("30/03/2025 21:22:23", sdfTimestamp.format(resultSet.getTimestamp(14)));
140+
141+
// Validate columns 12, 13, 14 using getObject with java.time types
142+
Object valDateRet = resultSet.getObject(12);
143+
Object valTimeRet = resultSet.getObject(13);
144+
Object valTimestampRet = resultSet.getObject(14);
145+
146+
assertNotNull(valDateRet, "Date column should not be null");
147+
assertNotNull(valTimeRet, "Time column should not be null");
148+
assertNotNull(valTimestampRet, "Timestamp column should not be null");
149+
150+
// Validate date (column 12)
151+
if (valDateRet instanceof LocalDate) {
152+
assertEquals(valDate, valDateRet);
153+
} else if (valDateRet instanceof Date) {
154+
LocalDate retrievedDate = ((Date) valDateRet).toLocalDate();
155+
assertEquals(valDate, retrievedDate);
156+
}
157+
158+
// Validate time (column 13)
159+
if (valTimeRet instanceof LocalTime) {
160+
LocalTime retrievedTime = (LocalTime) valTimeRet;
161+
assertEquals(valTime.getHour(), retrievedTime.getHour());
162+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
163+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
164+
} else if (valTimeRet instanceof Time) {
165+
LocalTime retrievedTime = ((Time) valTimeRet).toLocalTime();
166+
assertEquals(valTime.getHour(), retrievedTime.getHour());
167+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
168+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
169+
}
170+
171+
// Validate timestamp (column 14)
172+
if (valTimestampRet instanceof LocalDateTime) {
173+
assertEquals(valTimestamp, valTimestampRet);
174+
} else if (valTimestampRet instanceof Timestamp) {
175+
LocalDateTime retrievedTimestamp = ((Timestamp) valTimestampRet).toLocalDateTime();
176+
assertEquals(valTimestamp, retrievedTimestamp);
177+
}
139178

140179
// CockroachDB natively supported java.time types - retrieve as Object to get the actual type
141180
Object valLocalDateTimeRet = resultSet.getObject(15);
@@ -213,6 +252,12 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
213252
} else {
214253
assertEquals("AAAA", new String(resultSet.getBytes("val_binary")));
215254
}
255+
256+
// SimpleDateFormat variables for validation using column names (lines 254-256)
257+
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
258+
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm:ss");
259+
SimpleDateFormat sdfTimestamp = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
260+
216261
assertEquals("29/03/2025", sdf.format(resultSet.getDate("val_date")));
217262
assertEquals("11:12:13", sdfTime.format(resultSet.getTime("val_time")));
218263
assertEquals("30/03/2025 21:22:23", sdfTimestamp.format(resultSet.getTimestamp("val_timestamp")));

ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,16 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
8787
psInsert.setFloat(9, 20.20f);
8888
psInsert.setBytes(10, new byte[]{(byte) 1}); // DB2 VARBINARY expects byte array
8989
psInsert.setBytes(11, "AAAA".getBytes(StandardCharsets.UTF_8)); // DB2 VARBINARY with UTF-8
90-
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
91-
psInsert.setDate(12, new Date(sdf.parse("29/03/2025").getTime()));
92-
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm:ss");
93-
psInsert.setTime(13, new Time(sdfTime.parse("11:12:13").getTime()));
94-
SimpleDateFormat sdfTimestamp = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
95-
psInsert.setTimestamp(14, new Timestamp(sdfTimestamp.parse("30/03/2025 21:22:23").getTime()));
90+
91+
// Using java.time types with setObject instead of java.sql types
92+
LocalDate valDate = LocalDate.of(2025, 3, 29);
93+
psInsert.setObject(12, valDate, Types.DATE);
94+
95+
LocalTime valTime = LocalTime.of(11, 12, 13);
96+
psInsert.setObject(13, valTime, Types.TIME);
97+
98+
LocalDateTime valTimestamp = LocalDateTime.of(2025, 3, 30, 21, 22, 23);
99+
psInsert.setObject(14, valTimestamp, Types.TIMESTAMP);
96100

97101
// DB2 natively supported java.time types (JDBC 4.2)
98102
LocalDateTime valLocalDateTime = LocalDateTime.of(2024, 12, 1, 14, 30, 45);
@@ -133,9 +137,44 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
133137
assertEquals(1, byteValue[0]);
134138
// DB2 VARBINARY column
135139
assertEquals("AAAA", new String(resultSet.getBytes(11), StandardCharsets.UTF_8));
136-
assertEquals("29/03/2025", sdf.format(resultSet.getDate(12)));
137-
assertEquals("11:12:13", sdfTime.format(resultSet.getTime(13)));
138-
assertEquals("30/03/2025 21:22:23", sdfTimestamp.format(resultSet.getTimestamp(14)));
140+
141+
// Validate columns 12, 13, 14 using getObject with java.time types
142+
Object valDateRet = resultSet.getObject(12);
143+
Object valTimeRet = resultSet.getObject(13);
144+
Object valTimestampRet = resultSet.getObject(14);
145+
146+
assertNotNull(valDateRet, "Date column should not be null");
147+
assertNotNull(valTimeRet, "Time column should not be null");
148+
assertNotNull(valTimestampRet, "Timestamp column should not be null");
149+
150+
// Validate date (column 12)
151+
if (valDateRet instanceof LocalDate) {
152+
assertEquals(valDate, valDateRet);
153+
} else if (valDateRet instanceof Date) {
154+
LocalDate retrievedDate = ((Date) valDateRet).toLocalDate();
155+
assertEquals(valDate, retrievedDate);
156+
}
157+
158+
// Validate time (column 13)
159+
if (valTimeRet instanceof LocalTime) {
160+
LocalTime retrievedTime = (LocalTime) valTimeRet;
161+
assertEquals(valTime.getHour(), retrievedTime.getHour());
162+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
163+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
164+
} else if (valTimeRet instanceof Time) {
165+
LocalTime retrievedTime = ((Time) valTimeRet).toLocalTime();
166+
assertEquals(valTime.getHour(), retrievedTime.getHour());
167+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
168+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
169+
}
170+
171+
// Validate timestamp (column 14)
172+
if (valTimestampRet instanceof LocalDateTime) {
173+
assertEquals(valTimestamp, valTimestampRet);
174+
} else if (valTimestampRet instanceof Timestamp) {
175+
LocalDateTime retrievedTimestamp = ((Timestamp) valTimestampRet).toLocalDateTime();
176+
assertEquals(valTimestamp, retrievedTimestamp);
177+
}
139178

140179
// DB2 natively supported java.time types - retrieve as Object to get the actual type
141180
Object valLocalDateTimeRet = resultSet.getObject(15);
@@ -194,6 +233,12 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
194233
assertEquals(1, byteValueByName.length);
195234
assertEquals(1, byteValueByName[0]);
196235
assertEquals("AAAA", new String(resultSet.getBytes("val_binary")));
236+
237+
// SimpleDateFormat variables for validation using column names (lines 232-234)
238+
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
239+
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm:ss");
240+
SimpleDateFormat sdfTimestamp = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
241+
197242
assertEquals("29/03/2025", sdf.format(resultSet.getDate("val_date")));
198243
assertEquals("11:12:13", sdfTime.format(resultSet.getTime("val_time")));
199244
assertEquals("30/03/2025 21:22:23", sdfTimestamp.format(resultSet.getTimestamp("val_timestamp")));

ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2MultipleTypesIntegrationTest.java

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,16 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
7575
psInsert.setFloat(9, 20.20f);
7676
psInsert.setByte(10, (byte) 1);
7777
psInsert.setBytes(11, "AAAA".getBytes());
78-
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
79-
psInsert.setDate(12, new Date(sdf.parse("29/03/2025").getTime()));
80-
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm:ss");
81-
psInsert.setTime(13, new Time(sdfTime.parse("11:12:13").getTime()));
82-
SimpleDateFormat sdfTimestamp = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
83-
psInsert.setTimestamp(14, new Timestamp(sdfTimestamp.parse("30/03/2025 21:22:23").getTime()));
78+
79+
// Using java.time types with setObject instead of java.sql types
80+
LocalDate valDate = LocalDate.of(2025, 3, 29);
81+
psInsert.setObject(12, valDate, Types.DATE);
82+
83+
LocalTime valTime = LocalTime.of(11, 12, 13);
84+
psInsert.setObject(13, valTime, Types.TIME);
85+
86+
LocalDateTime valTimestamp = LocalDateTime.of(2025, 3, 30, 21, 22, 23);
87+
psInsert.setObject(14, valTimestamp, Types.TIMESTAMP);
8488

8589
// Native java.time types supported by H2
8690
LocalDateTime valLocalDateTime = LocalDateTime.of(2024, 12, 1, 14, 30, 45);
@@ -121,9 +125,44 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
121125
assertEquals(20.20f+"", ""+resultSet.getFloat(9));
122126
assertEquals((byte) 1, resultSet.getByte(10));
123127
assertEquals("AAAA", new String(resultSet.getBytes(11)));
124-
assertEquals("29/03/2025", sdf.format(resultSet.getDate(12)));
125-
assertEquals("11:12:13", sdfTime.format(resultSet.getTime(13)));
126-
assertEquals("30/03/2025 21:22:23", sdfTimestamp.format(resultSet.getTimestamp(14)));
128+
129+
// Validate columns 12, 13, 14 using getObject with java.time types
130+
Object valDateRet = resultSet.getObject(12);
131+
Object valTimeRet = resultSet.getObject(13);
132+
Object valTimestampRet = resultSet.getObject(14);
133+
134+
assertNotNull(valDateRet, "Date column should not be null");
135+
assertNotNull(valTimeRet, "Time column should not be null");
136+
assertNotNull(valTimestampRet, "Timestamp column should not be null");
137+
138+
// Validate date (column 12)
139+
if (valDateRet instanceof LocalDate) {
140+
assertEquals(valDate, valDateRet);
141+
} else if (valDateRet instanceof Date) {
142+
LocalDate retrievedDate = ((Date) valDateRet).toLocalDate();
143+
assertEquals(valDate, retrievedDate);
144+
}
145+
146+
// Validate time (column 13)
147+
if (valTimeRet instanceof LocalTime) {
148+
LocalTime retrievedTime = (LocalTime) valTimeRet;
149+
assertEquals(valTime.getHour(), retrievedTime.getHour());
150+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
151+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
152+
} else if (valTimeRet instanceof Time) {
153+
LocalTime retrievedTime = ((Time) valTimeRet).toLocalTime();
154+
assertEquals(valTime.getHour(), retrievedTime.getHour());
155+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
156+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
157+
}
158+
159+
// Validate timestamp (column 14)
160+
if (valTimestampRet instanceof LocalDateTime) {
161+
assertEquals(valTimestamp, valTimestampRet);
162+
} else if (valTimestampRet instanceof Timestamp) {
163+
LocalDateTime retrievedTimestamp = ((Timestamp) valTimestampRet).toLocalDateTime();
164+
assertEquals(valTimestamp, retrievedTimestamp);
165+
}
127166

128167
// Validate java.time types - H2 should return them as native java.time types
129168
Object valLocalDateTimeRet = resultSet.getObject(15);
@@ -208,6 +247,12 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
208247
assertEquals(true, resultSet.getBoolean("val_boolean"));
209248
assertEquals((byte) 1, resultSet.getByte("val_byte"));
210249
assertEquals("AAAA", new String(resultSet.getBytes("val_binary")));
250+
251+
// SimpleDateFormat variables for validation using column names (lines 245-247)
252+
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
253+
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm:ss");
254+
SimpleDateFormat sdfTimestamp = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
255+
211256
assertEquals("29/03/2025", sdf.format(resultSet.getDate("val_date")));
212257
assertEquals("11:12:13", sdfTime.format(resultSet.getTime("val_time")));
213258
assertEquals("30/03/2025 21:22:23", sdfTimestamp.format(resultSet.getTimestamp("val_timestamp")));

ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,15 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
9090
psInsert.setByte(10, (byte) 1);
9191
psInsert.setBytes(11, "AAAA".getBytes());
9292

93-
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
94-
Date valDate = new Date(sdf.parse("2024-12-01").getTime());
95-
psInsert.setDate(12, valDate);
93+
// Using java.time types with setObject instead of java.sql types
94+
LocalDate valDate = LocalDate.of(2024, 12, 1);
95+
psInsert.setObject(12, valDate, Types.DATE);
9696

97-
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
98-
Time valTime = new Time(sdfTime.parse("10:10:10").getTime());
99-
psInsert.setTime(13, valTime);
97+
LocalTime valTime = LocalTime.of(10, 10, 10);
98+
psInsert.setObject(13, valTime, Types.TIME);
10099

101-
SimpleDateFormat sdfTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
102-
Timestamp valTimestamp = new Timestamp(sdfTimestamp.parse("2024-12-01 10:10:10").getTime());
103-
psInsert.setTimestamp(14, valTimestamp);
100+
LocalDateTime valTimestamp = LocalDateTime.of(2024, 12, 1, 10, 10, 10);
101+
psInsert.setObject(14, valTimestamp, Types.TIMESTAMP);
104102

105103
// MySQL/MariaDB natively supported java.time types (JDBC 4.2)
106104
LocalDateTime valLocalDateTime = LocalDateTime.of(2024, 12, 1, 14, 30, 45);
@@ -126,6 +124,44 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
126124
ResultSet resultSet = psSelect.executeQuery();
127125
resultSet.next();
128126

127+
// Validate columns 12, 13, 14 using getObject with java.time types
128+
Object valDateRet = resultSet.getObject(12);
129+
Object valTimeRet = resultSet.getObject(13);
130+
Object valTimestampRet = resultSet.getObject(14);
131+
132+
assertNotNull(valDateRet, "Date column should not be null");
133+
assertNotNull(valTimeRet, "Time column should not be null");
134+
assertNotNull(valTimestampRet, "Timestamp column should not be null");
135+
136+
// Validate date (column 12)
137+
if (valDateRet instanceof LocalDate) {
138+
assertEquals(valDate, valDateRet);
139+
} else if (valDateRet instanceof Date) {
140+
LocalDate retrievedDate = ((Date) valDateRet).toLocalDate();
141+
assertEquals(valDate, retrievedDate);
142+
}
143+
144+
// Validate time (column 13)
145+
if (valTimeRet instanceof LocalTime) {
146+
LocalTime retrievedTime = (LocalTime) valTimeRet;
147+
assertEquals(valTime.getHour(), retrievedTime.getHour());
148+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
149+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
150+
} else if (valTimeRet instanceof Time) {
151+
LocalTime retrievedTime = ((Time) valTimeRet).toLocalTime();
152+
assertEquals(valTime.getHour(), retrievedTime.getHour());
153+
assertEquals(valTime.getMinute(), retrievedTime.getMinute());
154+
assertEquals(valTime.getSecond(), retrievedTime.getSecond());
155+
}
156+
157+
// Validate timestamp (column 14)
158+
if (valTimestampRet instanceof LocalDateTime) {
159+
assertEquals(valTimestamp, valTimestampRet);
160+
} else if (valTimestampRet instanceof Timestamp) {
161+
LocalDateTime retrievedTimestamp = ((Timestamp) valTimestampRet).toLocalDateTime();
162+
assertEquals(valTimestamp, retrievedTimestamp);
163+
}
164+
129165
// New java.time types - retrieve as Object to get the actual type
130166
// MySQL/MariaDB natively supported java.time types - retrieve and validate
131167
Object valLocalDateTimeRet = resultSet.getObject(15);

0 commit comments

Comments
 (0)