Skip to content

Commit 4644e73

Browse files
committed
Fixing spanner headers consistency issue.
Previously spanner client was sending (example valuess): user-agent: google-cloud-java/0.20.0-beta grpc-java-netty/1.2.0 x-goog-api-client: google-cloud-java/0.20.0-beta After the changes (example values): user-agent: grpc-java-netty/1.2.0, x-goog-api-client: gl-java/1.8.0_112-google-v7 gccl/1.2.1, gax/1.3.1 grpc/1.2.0
1 parent 9f7344b commit 4644e73

20 files changed

Lines changed: 159 additions & 48 deletions

File tree

google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/BigQueryOptionsTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.cloud.bigquery;
1818

1919
import com.google.cloud.TransportOptions;
20+
import org.easymock.EasyMock;
2021
import org.junit.Rule;
2122
import org.junit.Test;
2223
import org.junit.rules.ExpectedException;
@@ -28,7 +29,7 @@ public class BigQueryOptionsTest {
2829
@Test
2930
public void testInvalidTransport() {
3031
thrown.expect(IllegalArgumentException.class);
31-
BigQueryOptions.newBuilder().setTransportOptions(new TransportOptions() {});
32+
BigQueryOptions.newBuilder().setTransportOptions(EasyMock.createMock(TransportOptions.class));
3233
}
3334

3435
}

google-cloud-compute/src/test/java/com/google/cloud/compute/ComputeOptionsTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.cloud.compute;
1818

1919
import com.google.cloud.TransportOptions;
20+
import org.easymock.EasyMock;
2021
import org.junit.Rule;
2122
import org.junit.Test;
2223
import org.junit.rules.ExpectedException;
@@ -29,7 +30,7 @@ public class ComputeOptionsTest {
2930
@Test
3031
public void testInvalidTransport() {
3132
thrown.expect(IllegalArgumentException.class);
32-
ComputeOptions.newBuilder().setTransportOptions(new TransportOptions() {});
33+
ComputeOptions.newBuilder().setTransportOptions(EasyMock.createMock(TransportOptions.class));
3334
}
3435

3536
}

google-cloud-core-grpc/src/main/java/com/google/cloud/grpc/GrpcTransportOptions.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import com.google.api.core.InternalApi;
2222
import com.google.api.gax.core.FixedCredentialsProvider;
2323
import com.google.api.gax.core.CredentialsProvider;
24+
import com.google.api.gax.core.GaxProperties;
2425
import com.google.api.gax.core.NoCredentialsProvider;
2526
import com.google.api.gax.grpc.ChannelProvider;
27+
import com.google.api.gax.grpc.GaxGrpcProperties;
2628
import com.google.api.gax.grpc.InstantiatingChannelProvider;
2729
import com.google.api.gax.grpc.UnaryCallSettings;
2830
import com.google.api.gax.retrying.RetrySettings;
@@ -34,6 +36,8 @@
3436
import io.grpc.internal.SharedResourceHolder.Resource;
3537
import java.io.IOException;
3638
import java.io.ObjectInputStream;
39+
import java.util.Locale;
40+
import java.util.Locale.Category;
3741
import java.util.Objects;
3842
import java.util.concurrent.ExecutorService;
3943
import java.util.concurrent.ScheduledExecutorService;
@@ -71,6 +75,16 @@ public void close(ScheduledExecutorService instance) {
7175
}
7276
};
7377

78+
public String getXGoogApiClientHeader(String libraryVersion) {
79+
return String.format(Locale.US,
80+
"gl-java/%s %s/%s gax/%s grpc/%s",
81+
firstNonNull(Runtime.class.getPackage().getImplementationVersion(), ""),
82+
ServiceOptions.getGoogApiClientLibName(),
83+
libraryVersion,
84+
GaxProperties.getGaxVersion(),
85+
GaxGrpcProperties.getGrpcVersion());
86+
}
87+
7488
/**
7589
* An interface for {@link ExecutorService} factories. Implementations of this interface can be
7690
* used to provide an user-defined executor to execute requests. Any implementation of this

google-cloud-core-grpc/src/test/java/com/google/cloud/grpc/GrpcTransportOptionsTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.cloud.grpc.GrpcTransportOptions.DefaultExecutorFactory;
2525
import com.google.cloud.grpc.GrpcTransportOptions.ExecutorFactory;
2626
import java.util.concurrent.ScheduledExecutorService;
27+
import java.util.regex.Pattern;
2728
import org.easymock.EasyMock;
2829
import org.junit.Test;
2930

@@ -70,4 +71,12 @@ public void testDefaultExecutorFactory() {
7071
ScheduledExecutorService executorService = executorFactory.get();
7172
assertSame(executorService, executorFactory.get());
7273
}
74+
75+
@Test
76+
public void testHeader() {
77+
String expectedHeaderPattern = "^gl-java/.+ gccl/0.0.0+ gax/.+ grpc/.+";
78+
assertTrue(Pattern.compile(expectedHeaderPattern)
79+
.matcher(OPTIONS.getXGoogApiClientHeader("0.0.0"))
80+
.find());
81+
}
7382
}

google-cloud-core-http/src/main/java/com/google/cloud/http/HttpTransportOptions.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.google.api.client.http.HttpRequestInitializer;
2525
import com.google.api.client.http.HttpTransport;
2626
import com.google.api.client.http.javanet.NetHttpTransport;
27-
import com.google.api.core.InternalApi;
2827
import com.google.auth.Credentials;
2928
import com.google.auth.http.HttpCredentialsAdapter;
3029
import com.google.auth.http.HttpTransportFactory;
@@ -33,6 +32,7 @@
3332
import com.google.cloud.TransportOptions;
3433
import java.io.IOException;
3534
import java.io.ObjectInputStream;
35+
import java.util.Locale;
3636
import java.util.Objects;
3737

3838
/**
@@ -163,22 +163,18 @@ public void initialize(HttpRequest httpRequest) throws IOException {
163163
}
164164

165165
HttpHeaders headers = httpRequest.getHeaders();
166-
headers.set("x-goog-api-client", getXGoogApiClientHeader(serviceOptions));
166+
headers.set(
167+
"x-goog-api-client", getXGoogApiClientHeader(serviceOptions.getLibraryVersion()));
167168
}
168169
};
169170
}
170171

171-
String getXGoogApiClientHeader(ServiceOptions<?, ?> serviceOptions) {
172-
return String.format(
172+
String getXGoogApiClientHeader(String libraryVersion) {
173+
return String.format(Locale.US,
173174
"gl-java/%s %s/%s",
174-
getJavaVersion(),
175+
firstNonNull(Runtime.class.getPackage().getImplementationVersion(), ""),
175176
ServiceOptions.getGoogApiClientLibName(),
176-
serviceOptions.getLibraryVersion());
177-
}
178-
179-
private static String getJavaVersion() {
180-
String javaVersion = Runtime.class.getPackage().getImplementationVersion();
181-
return javaVersion != null ? javaVersion : "";
177+
libraryVersion);
182178
}
183179

184180
/**

google-cloud-core-http/src/test/java/com/google/cloud/http/HttpTransportOptionsTest.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import static org.junit.Assert.assertTrue;
2323

2424
import com.google.auth.http.HttpTransportFactory;
25-
import com.google.cloud.ServiceOptions;
2625
import com.google.cloud.http.HttpTransportOptions.DefaultHttpTransportFactory;
2726
import java.util.regex.Pattern;
2827
import org.easymock.EasyMock;
@@ -65,12 +64,9 @@ public void testBaseHashCode() {
6564

6665
@Test
6766
public void testHeader() {
68-
String expectedHeaderPattern = "^gl-java/.* gccl/0.0.0";
69-
final ServiceOptions mockOptions = EasyMock.createMock(ServiceOptions.class);
70-
EasyMock.expect(mockOptions.getLibraryVersion()).andReturn("0.0.0");
71-
EasyMock.replay(mockOptions);
67+
String expectedHeaderPattern = "^gl-java/.+ gccl/0.0.0";
7268
assertTrue(Pattern.compile(expectedHeaderPattern)
73-
.matcher(OPTIONS.getXGoogApiClientHeader(mockOptions))
69+
.matcher(OPTIONS.getXGoogApiClientHeader("0.0.0"))
7470
.find());
7571
}
7672
}

google-cloud-core/src/main/java/com/google/cloud/TransportOptions.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,4 @@
2121
* An abstraction for transport-specific options, e.g. for http1.1 vs grpc.
2222
*/
2323
public interface TransportOptions extends Serializable {
24-
2524
}

google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreOptionsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,6 @@ public void testToBuilder() throws Exception {
8989
@Test
9090
public void testInvalidTransport() {
9191
thrown.expect(IllegalArgumentException.class);
92-
DatastoreOptions.newBuilder().setTransportOptions(new TransportOptions() {});
92+
DatastoreOptions.newBuilder().setTransportOptions(EasyMock.createMock(TransportOptions.class));
9393
}
9494
}

google-cloud-dns/src/test/java/com/google/cloud/dns/DnsOptionsTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.google.cloud.dns;
1818

1919
import com.google.cloud.TransportOptions;
20+
import org.easymock.EasyMock;
2021
import org.junit.Rule;
2122
import org.junit.Test;
2223
import org.junit.rules.ExpectedException;
@@ -29,7 +30,7 @@ public class DnsOptionsTest {
2930
@Test
3031
public void testInvalidTransport() {
3132
thrown.expect(IllegalArgumentException.class);
32-
DnsOptions.newBuilder().setTransportOptions(new TransportOptions() {});
33+
DnsOptions.newBuilder().setTransportOptions(EasyMock.createMock(TransportOptions.class));
3334
}
3435

3536
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright 2017 Google Inc. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
/*
18+
* EDITING INSTRUCTIONS
19+
* This file is referenced in READMEs. Any change to this file should be reflected in
20+
* the project's READMEs.
21+
*/
22+
23+
package com.google.cloud.examples.spanner.snippets;
24+
25+
import com.google.cloud.spanner.DatabaseClient;
26+
import com.google.cloud.spanner.DatabaseId;
27+
import com.google.cloud.spanner.ResultSet;
28+
import com.google.cloud.spanner.Spanner;
29+
import com.google.cloud.spanner.SpannerOptions;
30+
import com.google.cloud.spanner.Statement;
31+
32+
/**
33+
* A quick start code for Cloud Spanner. It demonstrates how to setup the Cloud Spanner client and
34+
* execute a simple query using it against an existing database.
35+
*/
36+
public class DatabaseSelect {
37+
public static void main(String... args) throws Exception {
38+
39+
if (args.length != 2) {
40+
System.err.println("Usage: QuickStartSample <instance_id> <database_id>");
41+
return;
42+
}
43+
// Instantiates a client
44+
SpannerOptions options = SpannerOptions.newBuilder().build();
45+
Spanner spanner = options.getService();
46+
47+
// Name of your instance & database.
48+
String instanceId = args[0];
49+
String databaseId = args[1];
50+
try {
51+
// Creates a database client
52+
DatabaseClient dbClient = spanner.getDatabaseClient(DatabaseId.of(
53+
options.getProjectId(), instanceId, databaseId));
54+
// Queries the database
55+
ResultSet resultSet = dbClient.singleUse().executeQuery(Statement.of("SELECT 1"));
56+
57+
System.out.println("\n\nResults:");
58+
// Prints the results
59+
while (resultSet.next()) {
60+
System.out.printf("%d\n\n", resultSet.getLong(0));
61+
}
62+
} finally {
63+
// Closes the client which will free up the resources used
64+
spanner.close();
65+
}
66+
}
67+
}

0 commit comments

Comments
 (0)