From 64fd4b6e16666566aa600dfc1d311480b56d6847 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Fri, 23 Oct 2026 16:19:03 +0000 Subject: [PATCH 1/2] test(bigquery-jdbc): deflake session-abort IT and tag driver-specific ITs as advanced --- .../bigquery/jdbc/it/ITBigQueryJDBCTest.java | 19 ++++++++++++++----- .../jdbc/it/ITDatabaseMetadataTest.java | 1 + .../jdbc/it/ITJdbcTimestampPicosTest.java | 2 ++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java index 31853252d06d..f629bcef6302 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java @@ -65,6 +65,7 @@ import java.util.Properties; import java.util.Random; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; import java.util.function.BiFunction; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; @@ -3073,7 +3074,7 @@ public void testPerConnectionLoggingE2E() throws SQLException, IOException { } @Test - public void testSessionAbortedOnConnectionClose() throws SQLException { + public void testSessionAbortedOnConnectionClose() throws SQLException, InterruptedException { String sessionId; try (Connection connection = DriverManager.getConnection(session_enabled_connection_uri)) { try (Statement statement = connection.createStatement()) { @@ -3087,15 +3088,23 @@ public void testSessionAbortedOnConnectionClose() throws SQLException { // After connection is closed, the session is aborted on the BigQuery server. // Attaching to the same session_id in a new connection should fail when running a query. + // CI has observed the first query after close() still succeeding on the session, so poll with + // a deadline. The test still fails if the session remains usable for the whole deadline. String urlWithAbortedSession = connection_uri + "EnableSession=1;QueryProperties=session_id=" + sessionId + ";"; + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(60); + boolean sessionUnusable = false; try (Connection newConnection = DriverManager.getConnection(urlWithAbortedSession)) { - try (Statement statement = newConnection.createStatement()) { - SQLException ex = - assertThrows( - SQLException.class, () -> statement.execute("SELECT * FROM session_temp_table;")); + while (!sessionUnusable && System.nanoTime() < deadline) { + try (Statement statement = newConnection.createStatement()) { + statement.execute("SELECT * FROM session_temp_table;"); + Thread.sleep(2000); + } catch (SQLException expected) { + sessionUnusable = true; + } } } + assertTrue(sessionUnusable, "Session " + sessionId + " was still usable 60s after close()"); } @ParameterizedTest diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java index 34014e110018..1671bc523ddf 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java @@ -420,6 +420,7 @@ public void testMetadataResultSetsDoNotInterfere() throws SQLException { } @Test + @Tag("advanced") // Asserts this driver returns only the connection's project as a catalog. public void testDatabaseMetadataGetCatalogs() throws SQLException { Connection connection = DriverManager.getConnection(ITBase.connectionUrl); diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITJdbcTimestampPicosTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITJdbcTimestampPicosTest.java index 213bf789efc8..93b121ea4bd8 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITJdbcTimestampPicosTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITJdbcTimestampPicosTest.java @@ -441,6 +441,7 @@ public void testDatabaseMetaData_getColumns_picosEnabled() throws SQLException { */ @ParameterizedTest(name = "JVM zone {0}") @MethodSource("jvmZones") + @Tag("advanced") // Relies on this driver's TIMESTAMP parameter conversion. public void testPreparedStatement_insertRoundTrip_backendTruncatesToMicroseconds(String zone) throws SQLException { useJvmZone(zone); @@ -505,6 +506,7 @@ public void testPreparedStatement_insertRoundTrip_backendTruncatesToMicroseconds */ @ParameterizedTest(name = "JVM zone {0}, arrow={1}") @MethodSource("jvmZonesAndReadPaths") + @Tag("advanced") // Relies on this driver's TIMESTAMP parameter conversion. public void testPreparedStatement_batchInsertRoundTrip(String zone, boolean arrow) throws SQLException { useJvmZone(zone); From 69fc38e0d59b7e6deed7c5be6c6de735c760c308 Mon Sep 17 00:00:00 2001 From: Keshav Dandeva Date: Fri, 23 Oct 2026 16:32:59 +0000 Subject: [PATCH 2/2] address gemini feedback --- .../com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java index f629bcef6302..5ffefac2e0c8 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java @@ -3098,10 +3098,12 @@ public void testSessionAbortedOnConnectionClose() throws SQLException, Interrupt while (!sessionUnusable && System.nanoTime() < deadline) { try (Statement statement = newConnection.createStatement()) { statement.execute("SELECT * FROM session_temp_table;"); - Thread.sleep(2000); } catch (SQLException expected) { sessionUnusable = true; } + if (!sessionUnusable) { + Thread.sleep(2000); + } } } assertTrue(sessionUnusable, "Session " + sessionId + " was still usable 60s after close()");