diff --git a/java-bigquery/google-cloud-bigquery/pom.xml b/java-bigquery/google-cloud-bigquery/pom.xml index 1dea6a396db7..5d6243e638bc 100644 --- a/java-bigquery/google-cloud-bigquery/pom.xml +++ b/java-bigquery/google-cloud-bigquery/pom.xml @@ -216,6 +216,11 @@ opentelemetry-sdk-trace test + + io.opentelemetry + opentelemetry-sdk-testing + test + diff --git a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java index 3968cd05e22f..30f3d4a53b2f 100644 --- a/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java +++ b/java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/spi/v2/HttpBigQueryRpcTest.java @@ -16,14 +16,149 @@ package com.google.cloud.bigquery.spi.v2; import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.LowLevelHttpRequest; +import com.google.api.client.http.LowLevelHttpResponse; +import com.google.api.client.json.Json; +import com.google.api.client.testing.http.MockHttpTransport; +import com.google.api.client.testing.http.MockLowLevelHttpRequest; +import com.google.api.client.testing.http.MockLowLevelHttpResponse; import com.google.api.services.bigquery.model.Dataset; import com.google.api.services.bigquery.model.DatasetList; import com.google.api.services.bigquery.model.DatasetReference; +import com.google.api.services.bigquery.model.Job; +import com.google.api.services.bigquery.model.JobReference; +import com.google.api.services.bigquery.model.Model; +import com.google.api.services.bigquery.model.ModelReference; +import com.google.api.services.bigquery.model.Policy; +import com.google.api.services.bigquery.model.QueryRequest; +import com.google.api.services.bigquery.model.Routine; +import com.google.api.services.bigquery.model.RoutineReference; +import com.google.api.services.bigquery.model.Table; +import com.google.api.services.bigquery.model.TableDataInsertAllRequest; +import com.google.api.services.bigquery.model.TableReference; +import com.google.cloud.NoCredentials; +import com.google.cloud.bigquery.BigQueryOptions; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; public class HttpBigQueryRpcTest { + + private static final String PROJECT_ID = "test-project"; + private static final String DATASET_ID = "test-dataset"; + private static final String TABLE_ID = "test-table"; + private static final String MODEL_ID = "test-model"; + private static final String ROUTINE_ID = "test-routine"; + private static final String JOB_ID = "test-job"; + private static final String LOCATION = "test-location"; + + private InMemorySpanExporter spanExporter; + private MockLowLevelHttpResponse mockResponse; + private String lastRequestMethod; + private String lastRequestUrl; + private MockLowLevelHttpRequest lastRequest; + private Tracer tracer; + private HttpTransport mockTransport; + + public void setUpServer() { + spanExporter = InMemorySpanExporter.create(); + SdkTracerProvider tracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(spanExporter)) + .build(); + OpenTelemetrySdk openTelemetry = + OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build(); + tracer = openTelemetry.getTracer("test-tracer"); + + mockResponse = new MockLowLevelHttpResponse(); + mockTransport = + new MockHttpTransport() { + @Override + public LowLevelHttpRequest buildRequest(String method, String url) { + lastRequestMethod = method; + lastRequestUrl = url; + lastRequest = + new MockLowLevelHttpRequest() { + @Override + public LowLevelHttpResponse execute() { + return mockResponse; + } + }; + return lastRequest; + } + }; + } + + private HttpBigQueryRpc createRpc(boolean enableTracing) { + BigQueryOptions options = + BigQueryOptions.newBuilder() + .setProjectId(PROJECT_ID) + .setCredentials(NoCredentials.getInstance()) + .setEnableOpenTelemetryTracing(enableTracing) + .setOpenTelemetryTracer(tracer) + .setTransportOptions( + BigQueryOptions.getDefaultHttpTransportOptions().toBuilder() + .setHttpTransportFactory(() -> mockTransport) + .build()) + .build(); + return new HttpBigQueryRpc(options); + } + + private void setMockResponse(String content) { + mockResponse.setStatusCode(200); + mockResponse.setContentType(Json.MEDIA_TYPE); + mockResponse.setContent(content); + } + + private void verifySpan( + String spanName, String service, String method, Map attributes) { + List spans = spanExporter.getFinishedSpanItems(); + assertThat(spans).isNotEmpty(); + SpanData rpcSpan = + spans.stream().filter(span -> span.getName().equals(spanName)).findFirst().orElse(null); + assertNotNull(rpcSpan); + assertEquals(service, rpcSpan.getAttributes().get(AttributeKey.stringKey("bq.rpc.service"))); + assertEquals(method, rpcSpan.getAttributes().get(AttributeKey.stringKey("bq.rpc.method"))); + assertEquals("http", rpcSpan.getAttributes().get(AttributeKey.stringKey("bq.rpc.system"))); + + if (attributes != null) { + for (Map.Entry entry : attributes.entrySet()) { + assertEquals( + entry.getValue(), rpcSpan.getAttributes().get(AttributeKey.stringKey(entry.getKey()))); + } + } + } + + private void verifyNoSpans() { + assertThat(spanExporter.getFinishedSpanItems()).isEmpty(); + } + + private void verifyRequest(String expectedMethod, String expectedUrlPart) { + assertNotNull(lastRequestMethod); + assertNotNull(lastRequestUrl); + assertEquals(expectedMethod, lastRequestMethod); + assertTrue( + lastRequestUrl.contains(expectedUrlPart), + "Expected URL to contain " + expectedUrlPart + " but was " + lastRequestUrl); + } + @Test public void testListToDataset() { DatasetReference datasetRef = @@ -46,4 +181,1233 @@ public void testListToDataset() { assertThat(dataset.getLabels()).containsExactly("foo", "bar"); assertThat(dataset.getLocation()).isEqualTo("test-region-1"); } + + @Nested + class TelemetryEnabled { + private HttpBigQueryRpc rpc; + + @BeforeEach + public void setUp() { + setUpServer(); + rpc = createRpc(true); + } + + @Test + public void testGetDatasetTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#dataset\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "\",\"datasetReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\"}}"); + + rpc.getDatasetSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getDataset", + "DatasetService", + "GetDataset", + Collections.singletonMap("bq.rpc.response.dataset.id", PROJECT_ID + ":" + DATASET_ID)); + } + + @Test + public void testListDatasetsTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#datasetList\",\"datasets\":[], \"nextPageToken\":\"next-page-token\"}"); + + rpc.listDatasetsSkipExceptionTranslation(PROJECT_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listDatasets", + "DatasetService", + "ListDatasets", + Collections.singletonMap("bq.rpc.next_page_token", "next-page-token")); + } + + @Test + public void testCreateDatasetTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#dataset\",\"id\":\"" + PROJECT_ID + ":" + DATASET_ID + "\"}"); + + Dataset dataset = new Dataset(); + dataset.setDatasetReference( + new DatasetReference().setProjectId(PROJECT_ID).setDatasetId(DATASET_ID)); + rpc.createSkipExceptionTranslation(dataset, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/datasets"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.createDataset", + "DatasetService", + "InsertDataset", + Collections.singletonMap("bq.rpc.response.dataset.id", PROJECT_ID + ":" + DATASET_ID)); + } + + @Test + public void testDeleteDatasetTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteDatasetSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("DELETE", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.deleteDataset", + "DatasetService", + "DeleteDataset", + null); + } + + @Test + public void testPatchDatasetTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#dataset\",\"id\":\"" + PROJECT_ID + ":" + DATASET_ID + "\"}"); + + Dataset dataset = new Dataset(); + dataset.setDatasetReference( + new DatasetReference().setProjectId(PROJECT_ID).setDatasetId(DATASET_ID)); + rpc.patchSkipExceptionTranslation(dataset, new HashMap<>()); + + verifyRequest("PATCH", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.patchDataset", + "DatasetService", + "PatchDataset", + Collections.singletonMap("bq.rpc.response.dataset.id", PROJECT_ID + ":" + DATASET_ID)); + } + + @Test + public void testGetTableTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#table\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "." + + TABLE_ID + + "\"}"); + + rpc.getTableSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID, new HashMap<>()); + + verifyRequest( + "GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getTable", + "TableService", + "GetTable", + Collections.singletonMap( + "bq.rpc.response.table.id", PROJECT_ID + ":" + DATASET_ID + "." + TABLE_ID)); + } + + @Test + public void testListTablesTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#tableList\",\"tables\":[], \"nextPageToken\":\"next-page-token\"}"); + + rpc.listTablesSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listTables", + "TableService", + "ListTables", + Collections.singletonMap("bq.rpc.next_page_token", "next-page-token")); + } + + @Test + public void testCreateTableTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#table\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "." + + TABLE_ID + + "\"}"); + + Table table = new Table(); + table.setTableReference( + new TableReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setTableId(TABLE_ID)); + rpc.createSkipExceptionTranslation(table, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.createTable", + "TableService", + "InsertTable", + Collections.singletonMap( + "bq.rpc.response.table.id", PROJECT_ID + ":" + DATASET_ID + "." + TABLE_ID)); + } + + @Test + public void testDeleteTableTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteTableSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID); + + verifyRequest( + "DELETE", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.deleteTable", "TableService", "DeleteTable", null); + } + + @Test + public void testPatchTableTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#table\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "." + + TABLE_ID + + "\"}"); + + Table table = new Table(); + table.setTableReference( + new TableReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setTableId(TABLE_ID)); + rpc.patchSkipExceptionTranslation(table, new HashMap<>()); + + verifyRequest( + "PATCH", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.patchTable", + "TableService", + "PatchTable", + Collections.singletonMap( + "bq.rpc.response.table.id", PROJECT_ID + ":" + DATASET_ID + "." + TABLE_ID)); + } + + @Test + public void testGetModelTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#model\",\"modelReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"modelId\":\"" + + MODEL_ID + + "\"}}"); + + rpc.getModelSkipExceptionTranslation(PROJECT_ID, DATASET_ID, MODEL_ID, new HashMap<>()); + + verifyRequest( + "GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models/" + MODEL_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getModel", + "ModelService", + "GetModel", + Collections.singletonMap("bq.rpc.response.model.id", MODEL_ID)); + } + + @Test + public void testListModelsTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#modelList\",\"models\":[], \"nextPageToken\":\"next-page-token\"}"); + + rpc.listModelsSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listModels", + "ModelService", + "ListModels", + Collections.singletonMap("bq.rpc.next_page_token", "next-page-token")); + } + + @Test + public void testPatchModelTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#model\",\"modelReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"modelId\":\"" + + MODEL_ID + + "\"}}"); + + Model model = new Model(); + model.setModelReference( + new ModelReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setModelId(MODEL_ID)); + rpc.patchSkipExceptionTranslation(model, new HashMap<>()); + + verifyRequest( + "PATCH", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models/" + MODEL_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.patchModel", + "ModelService", + "PatchModel", + Collections.singletonMap("bq.rpc.response.model.id", MODEL_ID)); + } + + @Test + public void testDeleteModelTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteModelSkipExceptionTranslation(PROJECT_ID, DATASET_ID, MODEL_ID); + + verifyRequest( + "DELETE", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models/" + MODEL_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.deleteModel", "ModelService", "DeleteModel", null); + } + + @Test + public void testGetRoutineTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#routine\",\"routineReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"routineId\":\"" + + ROUTINE_ID + + "\"}}"); + + rpc.getRoutineSkipExceptionTranslation(PROJECT_ID, DATASET_ID, ROUTINE_ID, new HashMap<>()); + + verifyRequest( + "GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines/" + ROUTINE_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getRoutine", + "RoutineService", + "GetRoutine", + Collections.singletonMap("bq.rpc.response.routine.id", ROUTINE_ID)); + } + + @Test + public void testListRoutinesTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#routineList\",\"routines\":[], \"nextPageToken\":\"next-page-token\"}"); + + rpc.listRoutinesSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listRoutines", + "RoutineService", + "ListRoutines", + Collections.singletonMap("bq.rpc.next_page_token", "next-page-token")); + } + + @Test + public void testCreateRoutineTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#routine\",\"routineReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"routineId\":\"" + + ROUTINE_ID + + "\"}}"); + + Routine routine = new Routine(); + routine.setRoutineReference( + new RoutineReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setRoutineId(ROUTINE_ID)); + rpc.createSkipExceptionTranslation(routine, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.createRoutine", + "RoutineService", + "InsertRoutine", + Collections.singletonMap("bq.rpc.response.routine.id", ROUTINE_ID)); + } + + @Test + public void testDeleteRoutineTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteRoutineSkipExceptionTranslation(PROJECT_ID, DATASET_ID, ROUTINE_ID); + + verifyRequest( + "DELETE", + "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines/" + ROUTINE_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listRoutines", + "RoutineService", + "ListRoutines", + null); + } + + @Test + public void testUpdateRoutineTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#routine\",\"routineReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"routineId\":\"" + + ROUTINE_ID + + "\"}}"); + + Routine routine = new Routine(); + routine.setRoutineReference( + new RoutineReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setRoutineId(ROUTINE_ID)); + rpc.updateSkipExceptionTranslation(routine, new HashMap<>()); + + verifyRequest( + "PUT", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines/" + ROUTINE_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.updateRoutine", + "RoutineService", + "UpdateRoutine", + Collections.singletonMap("bq.rpc.response.routine.id", ROUTINE_ID)); + } + + @Test + public void testInsertAllTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#tableDataInsertAllResponse\"}"); + + TableDataInsertAllRequest request = new TableDataInsertAllRequest(); + rpc.insertAllSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID, request); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + "/insertAll"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.insertAll", "TableDataService", "InsertAll", null); + } + + @Test + public void testListTableDataTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#tableDataList\",\"rows\":[]}"); + + rpc.listTableDataSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID, new HashMap<>()); + + verifyRequest( + "GET", + "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID + "/data"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listTableData", "TableDataService", "List", null); + } + + @Test + public void testListTableDataWithRowLimitTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#tableDataList\",\"rows\":[]}"); + + rpc.listTableDataWithRowLimitSkipExceptionTranslation( + PROJECT_ID, DATASET_ID, TABLE_ID, 10, null); + + verifyRequest( + "GET", + "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID + "/data"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listTableDataWithRowLimit", + "TableDataService", + "List", + null); + } + + @Test + public void testGetJobTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + rpc.getJobSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID); + Map attributes = new HashMap<>(); + attributes.put("bq.rpc.response.job.id", PROJECT_ID + ":" + JOB_ID); + attributes.put("bq.rpc.response.job.status.state", "DONE"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getJob", "JobService", "GetJob", attributes); + } + + @Test + public void testGetQueryJobTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + rpc.getQueryJobSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID); + Map attributes = new HashMap<>(); + attributes.put("bq.rpc.response.job.id", PROJECT_ID + ":" + JOB_ID); + attributes.put("bq.rpc.response.job.status.state", "DONE"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getQueryJob", "JobService", "GetJob", attributes); + } + + @Test + public void testListJobsTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#jobList\",\"jobs\":[], \"nextPageToken\":\"next-page-token\"}"); + + rpc.listJobsSkipExceptionTranslation(PROJECT_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/jobs"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.listJobs", + "JobService", + "ListJobs", + Collections.singletonMap("bq.rpc.next_page_token", "next-page-token")); + } + + @Test + public void testCreateJobTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + Job job = new Job(); + job.setJobReference(new JobReference().setProjectId(PROJECT_ID).setJobId(JOB_ID)); + rpc.createSkipExceptionTranslation(job, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/jobs"); + Map attributes = new HashMap<>(); + attributes.put("bq.rpc.response.job.id", PROJECT_ID + ":" + JOB_ID); + attributes.put("bq.rpc.response.job.status.state", "DONE"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.createJob", "JobService", "InsertJob", attributes); + } + + @Test + public void testCreateJobForQueryTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + Job job = new Job(); + job.setJobReference(new JobReference().setProjectId(PROJECT_ID).setJobId(JOB_ID)); + rpc.createJobForQuerySkipExceptionTranslation(job); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/jobs"); + Map attributes = new HashMap<>(); + attributes.put("bq.rpc.response.job.id", PROJECT_ID + ":" + JOB_ID); + attributes.put("bq.rpc.response.job.status.state", "DONE"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.createJobForQuery", + "JobService", + "InsertJob", + attributes); + } + + @Test + public void testCancelJobTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#jobCancelResponse\"}"); + + rpc.cancelSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID + "/cancel"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.cancelJob", "JobService", "CancelJob", null); + } + + @Test + public void testDeleteJobTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteJobSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION); + + verifyRequest("DELETE", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.deleteJob", "JobService", "DeleteJob", null); + } + + @Test + public void testGetQueryResultsTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#getQueryResultsResponse\"}"); + + rpc.getQueryResultsSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/queries/" + JOB_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getQueryResults", + "JobService", + "GetQueryResults", + null); + } + + @Test + public void testGetQueryResultsWithRowLimitTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#getQueryResultsResponse\"}"); + + rpc.getQueryResultsWithRowLimitSkipExceptionTranslation( + PROJECT_ID, JOB_ID, LOCATION, 10, 1000L); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/queries/" + JOB_ID); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getQueryResultsWithRowLimit", + "JobService", + "GetQueryResults", + null); + } + + @Test + public void testQueryRpcTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#queryResponse\"}"); + + rpc.queryRpcSkipExceptionTranslation(PROJECT_ID, new QueryRequest()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/queries"); + verifySpan("com.google.cloud.bigquery.BigQueryRpc.queryRpc", "JobService", "Query", null); + } + + @Test + public void testGetIamPolicyTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#policy\"}"); + + rpc.getIamPolicySkipExceptionTranslation( + "projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID, + new HashMap<>()); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + ":getIamPolicy"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.getIamPolicy", + "TableService", + "GetIamPolicy", + null); + } + + @Test + public void testSetIamPolicyTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#policy\"}"); + + rpc.setIamPolicySkipExceptionTranslation( + "projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID, + new Policy(), + new HashMap<>()); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + ":setIamPolicy"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.setIamPolicy", + "TableService", + "SetIamPolicy", + null); + } + + @Test + public void testTestIamPermissionsTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#testIamPermissionsResponse\"}"); + + rpc.testIamPermissionsSkipExceptionTranslation( + "projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID, + Arrays.asList("p1", "p2"), + new HashMap<>()); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + ":testIamPermissions"); + verifySpan( + "com.google.cloud.bigquery.BigQueryRpc.setIamPolicy", + "TableService", + "SetIamPolicy", + null); + } + } + + @Nested + class TelemetryDisabled { + private HttpBigQueryRpc rpc; + + @BeforeEach + public void setUp() { + setUpServer(); + rpc = createRpc(false); + } + + @Test + public void testGetDatasetNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#dataset\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "\",\"datasetReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\"}}"); + + rpc.getDatasetSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID); + verifyNoSpans(); + } + + @Test + public void testListDatasetsNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#datasetList\",\"datasets\":[]}"); + + rpc.listDatasetsSkipExceptionTranslation(PROJECT_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets"); + verifyNoSpans(); + } + + @Test + public void testCreateDatasetNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#dataset\",\"id\":\"" + PROJECT_ID + ":" + DATASET_ID + "\"}"); + + Dataset dataset = new Dataset(); + dataset.setDatasetReference( + new DatasetReference().setProjectId(PROJECT_ID).setDatasetId(DATASET_ID)); + rpc.createSkipExceptionTranslation(dataset, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/datasets"); + verifyNoSpans(); + } + + @Test + public void testDeleteDatasetNoTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteDatasetSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("DELETE", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID); + verifyNoSpans(); + } + + @Test + public void testPatchDatasetNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#dataset\",\"id\":\"" + PROJECT_ID + ":" + DATASET_ID + "\"}"); + + Dataset dataset = new Dataset(); + dataset.setDatasetReference( + new DatasetReference().setProjectId(PROJECT_ID).setDatasetId(DATASET_ID)); + rpc.patchSkipExceptionTranslation(dataset, new HashMap<>()); + + verifyRequest("PATCH", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID); + verifyNoSpans(); + } + + @Test + public void testGetTableNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#table\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "." + + TABLE_ID + + "\"}"); + + rpc.getTableSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID, new HashMap<>()); + + verifyRequest( + "GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID); + verifyNoSpans(); + } + + @Test + public void testListTablesNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#tableList\",\"tables\":[]}"); + + rpc.listTablesSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables"); + verifyNoSpans(); + } + + @Test + public void testCreateTableNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#table\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "." + + TABLE_ID + + "\"}"); + + Table table = new Table(); + table.setTableReference( + new TableReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setTableId(TABLE_ID)); + rpc.createSkipExceptionTranslation(table, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables"); + verifyNoSpans(); + } + + @Test + public void testDeleteTableNoTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteTableSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID); + + verifyRequest( + "DELETE", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID); + verifyNoSpans(); + } + + @Test + public void testPatchTableNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#table\",\"id\":\"" + + PROJECT_ID + + ":" + + DATASET_ID + + "." + + TABLE_ID + + "\"}"); + + Table table = new Table(); + table.setTableReference( + new TableReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setTableId(TABLE_ID)); + rpc.patchSkipExceptionTranslation(table, new HashMap<>()); + + verifyRequest( + "PATCH", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID); + verifyNoSpans(); + } + + @Test + public void testGetModelNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#model\",\"modelReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"modelId\":\"" + + MODEL_ID + + "\"}}"); + + rpc.getModelSkipExceptionTranslation(PROJECT_ID, DATASET_ID, MODEL_ID, new HashMap<>()); + + verifyRequest( + "GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models/" + MODEL_ID); + verifyNoSpans(); + } + + @Test + public void testListModelsNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#modelList\",\"models\":[]}"); + + rpc.listModelsSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models"); + verifyNoSpans(); + } + + @Test + public void testPatchModelNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#model\",\"modelReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"modelId\":\"" + + MODEL_ID + + "\"}}"); + + Model model = new Model(); + model.setModelReference( + new ModelReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setModelId(MODEL_ID)); + rpc.patchSkipExceptionTranslation(model, new HashMap<>()); + + verifyRequest( + "PATCH", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models/" + MODEL_ID); + verifyNoSpans(); + } + + @Test + public void testDeleteModelNoTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteModelSkipExceptionTranslation(PROJECT_ID, DATASET_ID, MODEL_ID); + + verifyRequest( + "DELETE", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/models/" + MODEL_ID); + verifyNoSpans(); + } + + @Test + public void testGetRoutineNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#routine\",\"routineReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"routineId\":\"" + + ROUTINE_ID + + "\"}}"); + + rpc.getRoutineSkipExceptionTranslation(PROJECT_ID, DATASET_ID, ROUTINE_ID, new HashMap<>()); + + verifyRequest( + "GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines/" + ROUTINE_ID); + verifyNoSpans(); + } + + @Test + public void testListRoutinesNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#routineList\",\"routines\":[]}"); + + rpc.listRoutinesSkipExceptionTranslation(PROJECT_ID, DATASET_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines"); + verifyNoSpans(); + } + + @Test + public void testCreateRoutineNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#routine\",\"routineReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"routineId\":\"" + + ROUTINE_ID + + "\"}}"); + + Routine routine = new Routine(); + routine.setRoutineReference( + new RoutineReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setRoutineId(ROUTINE_ID)); + rpc.createSkipExceptionTranslation(routine, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines"); + verifyNoSpans(); + } + + @Test + public void testDeleteRoutineNoTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteRoutineSkipExceptionTranslation(PROJECT_ID, DATASET_ID, ROUTINE_ID); + + verifyRequest( + "DELETE", + "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines/" + ROUTINE_ID); + verifyNoSpans(); + } + + @Test + public void testUpdateRoutineNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#routine\",\"routineReference\":{\"projectId\":\"" + + PROJECT_ID + + "\",\"datasetId\":\"" + + DATASET_ID + + "\",\"routineId\":\"" + + ROUTINE_ID + + "\"}}"); + + Routine routine = new Routine(); + routine.setRoutineReference( + new RoutineReference() + .setProjectId(PROJECT_ID) + .setDatasetId(DATASET_ID) + .setRoutineId(ROUTINE_ID)); + rpc.updateSkipExceptionTranslation(routine, new HashMap<>()); + + verifyRequest( + "PUT", "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/routines/" + ROUTINE_ID); + verifyNoSpans(); + } + + @Test + public void testInsertAllNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#tableDataInsertAllResponse\"}"); + + TableDataInsertAllRequest request = new TableDataInsertAllRequest(); + rpc.insertAllSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID, request); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + "/insertAll"); + verifyNoSpans(); + } + + @Test + public void testListTableDataNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#tableDataList\",\"rows\":[]}"); + + rpc.listTableDataSkipExceptionTranslation(PROJECT_ID, DATASET_ID, TABLE_ID, new HashMap<>()); + + verifyRequest( + "GET", + "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID + "/data"); + verifyNoSpans(); + } + + @Test + public void testListTableDataWithRowLimitNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#tableDataList\",\"rows\":[]}"); + + rpc.listTableDataWithRowLimitSkipExceptionTranslation( + PROJECT_ID, DATASET_ID, TABLE_ID, 10, null); + + verifyRequest( + "GET", + "/projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID + "/data"); + verifyNoSpans(); + } + + @Test + public void testGetJobNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + rpc.getJobSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID); + verifyNoSpans(); + } + + @Test + public void testGetQueryJobNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + rpc.getQueryJobSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID); + verifyNoSpans(); + } + + @Test + public void testListJobsNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#jobList\",\"jobs\":[]}"); + + rpc.listJobsSkipExceptionTranslation(PROJECT_ID, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/jobs"); + verifyNoSpans(); + } + + @Test + public void testCreateJobNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + Job job = new Job(); + job.setJobReference(new JobReference().setProjectId(PROJECT_ID).setJobId(JOB_ID)); + rpc.createSkipExceptionTranslation(job, new HashMap<>()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/jobs"); + verifyNoSpans(); + } + + @Test + public void testCreateJobForQueryNoTelemetry() throws Exception { + setMockResponse( + "{\"kind\":\"bigquery#job\",\"id\":\"" + + PROJECT_ID + + ":" + + JOB_ID + + "\",\"status\":{\"state\":\"DONE\"}}"); + + Job job = new Job(); + job.setJobReference(new JobReference().setProjectId(PROJECT_ID).setJobId(JOB_ID)); + rpc.createJobForQuerySkipExceptionTranslation(job); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/jobs"); + verifyNoSpans(); + } + + @Test + public void testCancelJobNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#jobCancelResponse\"}"); + + rpc.cancelSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID + "/cancel"); + verifyNoSpans(); + } + + @Test + public void testDeleteJobNoTelemetry() throws Exception { + setMockResponse(""); + mockResponse.setStatusCode(204); + + rpc.deleteJobSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION); + + verifyRequest("DELETE", "/projects/" + PROJECT_ID + "/jobs/" + JOB_ID); + verifyNoSpans(); + } + + @Test + public void testGetQueryResultsNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#getQueryResultsResponse\"}"); + + rpc.getQueryResultsSkipExceptionTranslation(PROJECT_ID, JOB_ID, LOCATION, new HashMap<>()); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/queries/" + JOB_ID); + verifyNoSpans(); + } + + @Test + public void testGetQueryResultsWithRowLimitNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#getQueryResultsResponse\"}"); + + rpc.getQueryResultsWithRowLimitSkipExceptionTranslation( + PROJECT_ID, JOB_ID, LOCATION, 10, 1000L); + + verifyRequest("GET", "/projects/" + PROJECT_ID + "/queries/" + JOB_ID); + verifyNoSpans(); + } + + @Test + public void testQueryRpcNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#queryResponse\"}"); + + rpc.queryRpcSkipExceptionTranslation(PROJECT_ID, new QueryRequest()); + + verifyRequest("POST", "/projects/" + PROJECT_ID + "/queries"); + verifyNoSpans(); + } + + @Test + public void testGetIamPolicyNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#policy\"}"); + + rpc.getIamPolicySkipExceptionTranslation( + "projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID, + new HashMap<>()); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + ":getIamPolicy"); + verifyNoSpans(); + } + + @Test + public void testSetIamPolicyNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#policy\"}"); + + rpc.setIamPolicySkipExceptionTranslation( + "projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID, + new Policy(), + new HashMap<>()); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + ":setIamPolicy"); + verifyNoSpans(); + } + + @Test + public void testTestIamPermissionsNoTelemetry() throws Exception { + setMockResponse("{\"kind\":\"bigquery#testIamPermissionsResponse\"}"); + + rpc.testIamPermissionsSkipExceptionTranslation( + "projects/" + PROJECT_ID + "/datasets/" + DATASET_ID + "/tables/" + TABLE_ID, + Arrays.asList("p1", "p2"), + new HashMap<>()); + + verifyRequest( + "POST", + "/projects/" + + PROJECT_ID + + "/datasets/" + + DATASET_ID + + "/tables/" + + TABLE_ID + + ":testIamPermissions"); + verifyNoSpans(); + } + } }