Skip to content

Commit b2d4bed

Browse files
committed
CHore: add unit tests for context propagation and exception handling of span
1 parent 0f41919 commit b2d4bed

1 file changed

Lines changed: 69 additions & 0 deletions

File tree

java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryStatementTest.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.google.cloud.bigquery.BigQuery;
3232
import com.google.cloud.bigquery.BigQuery.QueryResultsOption;
3333
import com.google.cloud.bigquery.BigQuery.TableDataListOption;
34+
import com.google.cloud.bigquery.BigQueryException;
3435
import com.google.cloud.bigquery.BigQueryOptions;
3536
import com.google.cloud.bigquery.Field;
3637
import com.google.cloud.bigquery.FieldList;
@@ -47,6 +48,7 @@
4748
import com.google.cloud.bigquery.StandardSQLTypeName;
4849
import com.google.cloud.bigquery.TableId;
4950
import com.google.cloud.bigquery.TableResult;
51+
import com.google.cloud.bigquery.exception.BigQueryJdbcException;
5052
import com.google.cloud.bigquery.jdbc.BigQueryStatement.JobIdWrapper;
5153
import com.google.cloud.bigquery.spi.BigQueryRpcFactory;
5254
import com.google.cloud.bigquery.storage.v1.ArrowSchema;
@@ -55,6 +57,7 @@
5557
import com.google.cloud.bigquery.storage.v1.ReadSession;
5658
import com.google.common.collect.ImmutableList;
5759
import com.google.common.collect.Maps;
60+
import io.opentelemetry.api.baggage.Baggage;
5861
import io.opentelemetry.api.common.AttributeKey;
5962
import io.opentelemetry.api.trace.Span;
6063
import io.opentelemetry.api.trace.StatusCode;
@@ -753,4 +756,70 @@ public void testUseReadAPI_ZeroPageSizeDivisionByZeroSafeguard() throws SQLExcep
753756
boolean useReadApi = statement.useReadAPI(tableResult);
754757
assertThat(useReadApi).isTrue(); // ratio = 500 / 1 = 500 > 2 -> true
755758
}
759+
760+
@Test
761+
public void testExecute_registersException() throws Exception {
762+
// Mock bigquery to throw a backend exception
763+
BigQueryException expectedException = new BigQueryException(500, "Backend Error");
764+
Mockito.doThrow(expectedException)
765+
.when(bigquery)
766+
.queryWithTimeout(Mockito.any(QueryJobConfiguration.class), Mockito.any(), Mockito.any());
767+
768+
BigQueryStatement spiedStatement = Mockito.spy(bigQueryStatement);
769+
770+
// Execute and expect the exception to be propagated to JDBC
771+
Assertions.assertThrows(SQLException.class, () -> spiedStatement.executeQuery("SELECT 1"));
772+
773+
// Retrieve the exported span from OTel extension
774+
List<SpanData> spans = otelTesting.getSpans();
775+
SpanData span =
776+
OpenTelemetryTestUtility.findSpanByName(spans, "BigQueryStatement.executeQuery");
777+
778+
// Assert that the span recorded the error correctly
779+
OpenTelemetryTestUtility.assertSpanStatus(span, StatusCode.ERROR);
780+
OpenTelemetryTestUtility.assertSpanHasException(span, BigQueryJdbcException.class);
781+
}
782+
783+
@Test
784+
public void testExecute_propagatesContextAndBaggage() throws Exception {
785+
// Mock bigquery using thenAnswer to hook into the call and assert Context/Baggage
786+
Mockito.doAnswer(
787+
invocation -> {
788+
// This code runs on the execution thread during the SDK call
789+
String connectionIdBaggage =
790+
Baggage.current()
791+
.getEntryValue(BigQueryJdbcOpenTelemetry.CONNECTION_ID_BAGGAGE_KEY);
792+
assertEquals("test-connection-id", connectionIdBaggage);
793+
794+
Span currentSpan = Span.current();
795+
assertTrue(currentSpan.getSpanContext().isValid());
796+
797+
// Return a mock TableResult to allow the execution to proceed
798+
TableResult tableResultMock = mock(TableResult.class);
799+
doReturn(jobId).when(tableResultMock).getJobId();
800+
doReturn(Schema.of()).when(tableResultMock).getSchema();
801+
return tableResultMock;
802+
})
803+
.when(bigquery)
804+
.queryWithTimeout(Mockito.any(QueryJobConfiguration.class), Mockito.any(), Mockito.any());
805+
806+
BigQueryStatement spiedStatement = Mockito.spy(bigQueryStatement);
807+
808+
// Setup connection mocks to allow the statement to execute successfully
809+
doReturn(true).when(bigQueryConnection).getUseStatelessQueryMode();
810+
Job dryRunJobMock = getJobMock(null, null, StatementType.SELECT);
811+
doReturn(dryRunJobMock).when(bigquery).create(Mockito.any(JobInfo.class));
812+
813+
BigQueryJsonResultSet resultSetMock = mock(BigQueryJsonResultSet.class);
814+
doReturn(resultSetMock)
815+
.when(spiedStatement)
816+
.processJsonResultSet(Mockito.any(TableResult.class));
817+
818+
// Execute query
819+
spiedStatement.executeQuery("SELECT 1");
820+
821+
// Verify the SDK call actually occurred
822+
verify(bigquery)
823+
.queryWithTimeout(Mockito.any(QueryJobConfiguration.class), Mockito.any(), Mockito.any());
824+
}
756825
}

0 commit comments

Comments
 (0)