From 3b3c23592ff6475e82233ed7b81ba7070ace1fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Fri, 13 Oct 2023 16:15:31 +0200 Subject: [PATCH] fix: always include default client lib header --- .../cloud/spanner/spi/v1/GapicSpannerRpc.java | 4 ++- .../spanner/spi/v1/GapicSpannerRpcTest.java | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java index bdf038f0be7..8499e7f4b67 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java @@ -55,6 +55,7 @@ import com.google.api.pathtemplate.PathTemplate; import com.google.cloud.RetryHelper; import com.google.cloud.RetryHelper.RetryHelperException; +import com.google.cloud.ServiceOptions; import com.google.cloud.grpc.GcpManagedChannelBuilder; import com.google.cloud.grpc.GcpManagedChannelOptions; import com.google.cloud.grpc.GcpManagedChannelOptions.GcpMetricsOptions; @@ -296,7 +297,8 @@ public GapicSpannerRpc(final SpannerOptions options) { ApiClientHeaderProvider internalHeaderProvider = internalHeaderProviderBuilder .setClientLibToken( - options.getClientLibToken(), GaxProperties.getLibraryVersion(options.getClass())) + options.getClientLibToken() + " " + ServiceOptions.getGoogApiClientLibName(), + GaxProperties.getLibraryVersion(options.getClass())) .setTransportToken( GaxGrpcProperties.getGrpcTokenName(), GaxGrpcProperties.getGrpcVersion()) .build(); diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java index d32dc518714..45945c0be08 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpcTest.java @@ -33,6 +33,7 @@ import com.google.api.gax.rpc.HeaderProvider; import com.google.auth.oauth2.AccessToken; import com.google.auth.oauth2.OAuth2Credentials; +import com.google.cloud.ServiceOptions; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.DatabaseId; import com.google.cloud.spanner.Dialect; @@ -77,6 +78,7 @@ import java.net.InetSocketAddress; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Before; @@ -181,6 +183,12 @@ public ServerCall.Listener interceptCall( String auth = headers.get(Key.of("authorization", Metadata.ASCII_STRING_MARSHALLER)); assertThat(auth).isEqualTo("Bearer " + VARIABLE_OAUTH_TOKEN); + String clientLibToken = + headers.get( + Metadata.Key.of("x-goog-api-client", Metadata.ASCII_STRING_MARSHALLER)); + assertNotNull(clientLibToken); + assertTrue( + clientLibToken.contains(ServiceOptions.getGoogApiClientLibName() + "/")); if (call.getMethodDescriptor() .equals(SpannerGrpc.getExecuteStreamingSqlMethod()) || call.getMethodDescriptor().equals(SpannerGrpc.getExecuteSqlMethod())) { @@ -575,6 +583,27 @@ public void testRouteToLeaderHeaderWithLeaderAwareRoutingDisabled() { assertFalse(isRouteToLeader); } + @Test + public void testCustomClientLibToken_alsoContainsDefaultToken() { + SpannerOptions options = + createSpannerOptions().toBuilder().setClientLibToken("pg-adapter").build(); + try (Spanner spanner = options.getService()) { + DatabaseClient databaseClient = + spanner.getDatabaseClient(DatabaseId.of("[PROJECT]", "[INSTANCE]", "[DATABASE]")); + TransactionRunner runner = databaseClient.readWriteTransaction(); + runner.run(transaction -> transaction.executeUpdate(UPDATE_FOO_STATEMENT)); + } + Key key = Key.of("x-goog-api-client", Metadata.ASCII_STRING_MARSHALLER); + assertTrue(lastSeenHeaders.containsKey(key)); + assertTrue( + lastSeenHeaders.get(key), + Objects.requireNonNull(lastSeenHeaders.get(key)).contains("pg-adapter")); + assertTrue( + lastSeenHeaders.get(key), + Objects.requireNonNull(lastSeenHeaders.get(key)) + .contains(ServiceOptions.getGoogApiClientLibName() + "/")); + } + private SpannerOptions createSpannerOptions() { String endpoint = address.getHostString() + ":" + server.getPort(); return SpannerOptions.newBuilder()