From 519ca653f5002ee649916626bb928a77f0e95373 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Mon, 6 May 2024 17:38:21 +0000 Subject: [PATCH 1/6] feat: Add ApiVersion Support --- .../services/AbstractGoogleClientRequest.java | 28 ++++++++- .../AbstractGoogleClientRequestTest.java | 59 +++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java index cd6d12b65..51bf1435f 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java @@ -37,7 +37,9 @@ import com.google.api.client.http.UriTemplate; import com.google.api.client.util.GenericData; import com.google.api.client.util.Preconditions; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; +import com.google.common.base.Strings; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -62,7 +64,8 @@ public abstract class AbstractGoogleClientRequest extends GenericData { */ public static final String USER_AGENT_SUFFIX = "Google-API-Java-Client"; - private static final String API_VERSION_HEADER = "X-Goog-Api-Client"; + private static final String API_CLIENT_HEADER = "X-Goog-Api-Client"; + private static final String API_VERSION_HEADER = "X-Google-Api-Version"; /** Google client. */ private final AbstractGoogleClient abstractGoogleClient; @@ -133,7 +136,7 @@ protected AbstractGoogleClientRequest( requestHeaders.setUserAgent(USER_AGENT_SUFFIX + "/" + GoogleUtils.VERSION); } // Set the header for the Api Client version (Java and OS version) - requestHeaders.set(API_VERSION_HEADER, ApiClientVersion.DEFAULT_VERSION); + requestHeaders.set(API_CLIENT_HEADER, ApiClientVersion.DEFAULT_VERSION); } /** @@ -312,6 +315,27 @@ public AbstractGoogleClientRequest setRequestHeaders(HttpHeaders headers) { return this; } + /** + * Set the ApiVersion to be set as part of the header + * + *

ApiVersion cannot be null or empty string ("") + */ + protected void setApiVersionHeader(String apiVersion) { + Preconditions.checkState( + !Strings.isNullOrEmpty(apiVersion), "ApiVersion cannot be null or empty"); + requestHeaders.set(API_VERSION_HEADER, apiVersion); + } + + /** + * Returns the ApiVersion that is set in the header. + * + *

If ApiVersion is not set, null is returned + */ + @VisibleForTesting + String getApiVersionHeader() { + return (String) requestHeaders.get(API_VERSION_HEADER); + } + /** * Returns the HTTP headers of the last response or {@code null} before request has been executed. */ diff --git a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java index 1eefdb139..728ea3436 100644 --- a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java +++ b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java @@ -12,6 +12,8 @@ package com.google.api.client.googleapis.services; +import static org.junit.Assert.assertThrows; + import com.google.api.client.googleapis.GoogleUtils; import com.google.api.client.googleapis.services.AbstractGoogleClientRequest.ApiClientVersion; import com.google.api.client.googleapis.testing.services.MockGoogleClient; @@ -37,6 +39,7 @@ import java.io.InputStream; import java.util.Arrays; import junit.framework.TestCase; +import org.junit.function.ThrowingRunnable; /** * Tests {@link AbstractGoogleClientRequest}. @@ -242,6 +245,62 @@ public void testUserAgent() throws IOException { request.executeUnparsed(); } + public void testSetsApiVersionHeader() { + String apiVersion = "testVersion"; + HttpTransport transport = new MockHttpTransport(); + MockGoogleClient client = + new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) + .build(); + AbstractGoogleClientRequest request = + new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); + request.setApiVersionHeader(apiVersion); + assertEquals(apiVersion, request.getApiVersionHeader()); + } + + public void testDoesNotSetsApiVersionHeader() { + HttpTransport transport = new MockHttpTransport(); + MockGoogleClient client = + new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) + .build(); + AbstractGoogleClientRequest request = + new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); + assertNull(request.getApiVersionHeader()); + } + + public void testSetsNullApiVersionHeader() { + HttpTransport transport = new MockHttpTransport(); + MockGoogleClient client = + new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) + .build(); + final AbstractGoogleClientRequest request = + new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); + assertThrows( + IllegalStateException.class, + new ThrowingRunnable() { + @Override + public void run() { + request.setApiVersionHeader(null); + } + }); + } + + public void testSetsEmptyStringApiVersionHeader() { + HttpTransport transport = new MockHttpTransport(); + MockGoogleClient client = + new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) + .build(); + final AbstractGoogleClientRequest request = + new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); + assertThrows( + IllegalStateException.class, + new ThrowingRunnable() { + @Override + public void run() { + request.setApiVersionHeader(""); + } + }); + } + public void testSetsApiClientHeader() throws IOException { HttpTransport transport = new AssertHeaderTransport("X-Goog-Api-Client", "gl-java/\\d+\\.\\d+\\.\\d+.*"); From b25b5ed61a796e5de2e012072cd8bc97cc6e5fe6 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 7 May 2024 20:28:35 +0000 Subject: [PATCH 2/6] feat: Update tests --- .../services/AbstractGoogleClientRequest.java | 14 +--------- .../services/MockGoogleClientRequest.java | 25 +++++++++++++++++ .../AbstractGoogleClientRequestTest.java | 27 +++++-------------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java index 51bf1435f..2cd76fc1d 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java @@ -39,7 +39,6 @@ import com.google.api.client.util.Preconditions; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; -import com.google.common.base.Strings; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -65,7 +64,7 @@ public abstract class AbstractGoogleClientRequest extends GenericData { public static final String USER_AGENT_SUFFIX = "Google-API-Java-Client"; private static final String API_CLIENT_HEADER = "X-Goog-Api-Client"; - private static final String API_VERSION_HEADER = "X-Google-Api-Version"; + public static final String API_VERSION_HEADER = "X-Google-Api-Version"; /** Google client. */ private final AbstractGoogleClient abstractGoogleClient; @@ -315,17 +314,6 @@ public AbstractGoogleClientRequest setRequestHeaders(HttpHeaders headers) { return this; } - /** - * Set the ApiVersion to be set as part of the header - * - *

ApiVersion cannot be null or empty string ("") - */ - protected void setApiVersionHeader(String apiVersion) { - Preconditions.checkState( - !Strings.isNullOrEmpty(apiVersion), "ApiVersion cannot be null or empty"); - requestHeaders.set(API_VERSION_HEADER, apiVersion); - } - /** * Returns the ApiVersion that is set in the header. * diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java b/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java index c1cf32cc2..570527333 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java @@ -18,6 +18,7 @@ import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.UriTemplate; import com.google.api.client.util.Beta; +import com.google.common.base.Strings; /** * {@link Beta}
@@ -46,7 +47,31 @@ public MockGoogleClientRequest( String uriTemplate, HttpContent content, Class responseClass) { + this(client, method, uriTemplate, content, responseClass, null); + } + + /** + * @param client Google client + * @param method HTTP Method + * @param uriTemplate URI template for the path relative to the base URL. If it starts with a "/" + * the base path from the base URL will be stripped out. The URI template can also be a full + * URL. URI template expansion is done using {@link UriTemplate#expand(String, String, Object, + * boolean)} + * @param content HTTP content or {@code null} for none + * @param responseClass response class to parse into + * @param apiVersion ApiVersion to be passed to the header + */ + public MockGoogleClientRequest( + AbstractGoogleClient client, + String method, + String uriTemplate, + HttpContent content, + Class responseClass, + String apiVersion) { super(client, method, uriTemplate, content, responseClass); + if (!Strings.isNullOrEmpty(apiVersion)) { + getRequestHeaders().set(API_VERSION_HEADER, apiVersion); + } } @Override diff --git a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java index 728ea3436..e7c3d0215 100644 --- a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java +++ b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java @@ -12,7 +12,6 @@ package com.google.api.client.googleapis.services; -import static org.junit.Assert.assertThrows; import com.google.api.client.googleapis.GoogleUtils; import com.google.api.client.googleapis.services.AbstractGoogleClientRequest.ApiClientVersion; @@ -39,7 +38,6 @@ import java.io.InputStream; import java.util.Arrays; import junit.framework.TestCase; -import org.junit.function.ThrowingRunnable; /** * Tests {@link AbstractGoogleClientRequest}. @@ -252,8 +250,8 @@ public void testSetsApiVersionHeader() { new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) .build(); AbstractGoogleClientRequest request = - new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); - request.setApiVersionHeader(apiVersion); + new MockGoogleClientRequest<>( + client, HttpMethods.GET, URI_TEMPLATE, null, Void.class, apiVersion); assertEquals(apiVersion, request.getApiVersionHeader()); } @@ -273,15 +271,9 @@ public void testSetsNullApiVersionHeader() { new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) .build(); final AbstractGoogleClientRequest request = - new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); - assertThrows( - IllegalStateException.class, - new ThrowingRunnable() { - @Override - public void run() { - request.setApiVersionHeader(null); - } - }); + new MockGoogleClientRequest<>( + client, HttpMethods.GET, URI_TEMPLATE, null, Void.class, null); + assertNull(request.getApiVersionHeader()); } public void testSetsEmptyStringApiVersionHeader() { @@ -291,14 +283,7 @@ public void testSetsEmptyStringApiVersionHeader() { .build(); final AbstractGoogleClientRequest request = new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); - assertThrows( - IllegalStateException.class, - new ThrowingRunnable() { - @Override - public void run() { - request.setApiVersionHeader(""); - } - }); + assertNull(request.getApiVersionHeader()); } public void testSetsApiClientHeader() throws IOException { From 906a09eb4c746ae6794abb6f6180ce2a5b5ea9d2 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Tue, 7 May 2024 20:32:25 +0000 Subject: [PATCH 3/6] chore: Update test cases --- .../services/AbstractGoogleClientRequestTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java index e7c3d0215..2cd6d5a7a 100644 --- a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java +++ b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java @@ -243,7 +243,7 @@ public void testUserAgent() throws IOException { request.executeUnparsed(); } - public void testSetsApiVersionHeader() { + public void testSetsApiVersionHeader_apiVersionSet() { String apiVersion = "testVersion"; HttpTransport transport = new MockHttpTransport(); MockGoogleClient client = @@ -255,7 +255,7 @@ public void testSetsApiVersionHeader() { assertEquals(apiVersion, request.getApiVersionHeader()); } - public void testDoesNotSetsApiVersionHeader() { + public void testDoesNotSetsApiVersionHeader_noApiVersionSet() { HttpTransport transport = new MockHttpTransport(); MockGoogleClient client = new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) @@ -265,7 +265,7 @@ public void testDoesNotSetsApiVersionHeader() { assertNull(request.getApiVersionHeader()); } - public void testSetsNullApiVersionHeader() { + public void testNullApiVersionHeader_noApiVersionSet() { HttpTransport transport = new MockHttpTransport(); MockGoogleClient client = new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) @@ -276,13 +276,13 @@ public void testSetsNullApiVersionHeader() { assertNull(request.getApiVersionHeader()); } - public void testSetsEmptyStringApiVersionHeader() { + public void testEmptyStringApiVersionHeader_noApiVersionSet() { HttpTransport transport = new MockHttpTransport(); MockGoogleClient client = new MockGoogleClient.Builder(transport, ROOT_URL, SERVICE_PATH, JSON_OBJECT_PARSER, null) .build(); final AbstractGoogleClientRequest request = - new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class); + new MockGoogleClientRequest<>(client, HttpMethods.GET, URI_TEMPLATE, null, Void.class, ""); assertNull(request.getApiVersionHeader()); } From da170db59308f1a7959bf89ebda89c17f9120ea0 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 8 May 2024 19:14:41 +0000 Subject: [PATCH 4/6] chore: Fix lint issues --- .../googleapis/services/AbstractGoogleClientRequest.java | 6 +----- .../testing/services/MockGoogleClientRequest.java | 1 + .../services/AbstractGoogleClientRequestTest.java | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java index 2cd76fc1d..6d22d4957 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java @@ -314,11 +314,7 @@ public AbstractGoogleClientRequest setRequestHeaders(HttpHeaders headers) { return this; } - /** - * Returns the ApiVersion that is set in the header. - * - *

If ApiVersion is not set, null is returned - */ + /** Returns the ApiVersion set in the headers. If ApiVersion is not set, null is returned. */ @VisibleForTesting String getApiVersionHeader() { return (String) requestHeaders.get(API_VERSION_HEADER); diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java b/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java index 570527333..b3b0ad4de 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/testing/services/MockGoogleClientRequest.java @@ -69,6 +69,7 @@ public MockGoogleClientRequest( Class responseClass, String apiVersion) { super(client, method, uriTemplate, content, responseClass); + // Matches generator code: Null or Empty String is not set to the header if (!Strings.isNullOrEmpty(apiVersion)) { getRequestHeaders().set(API_VERSION_HEADER, apiVersion); } diff --git a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java index 2cd6d5a7a..79e156b34 100644 --- a/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java +++ b/google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequestTest.java @@ -12,7 +12,6 @@ package com.google.api.client.googleapis.services; - import com.google.api.client.googleapis.GoogleUtils; import com.google.api.client.googleapis.services.AbstractGoogleClientRequest.ApiClientVersion; import com.google.api.client.googleapis.testing.services.MockGoogleClient; From 5ee91bd5015d438f2ff83ff0d3e10b8710d10d2d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 8 May 2024 19:20:06 +0000 Subject: [PATCH 5/6] chore: Change constant access to protected --- .../client/googleapis/services/AbstractGoogleClientRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java index 6d22d4957..c2c8cb646 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java @@ -64,7 +64,7 @@ public abstract class AbstractGoogleClientRequest extends GenericData { public static final String USER_AGENT_SUFFIX = "Google-API-Java-Client"; private static final String API_CLIENT_HEADER = "X-Goog-Api-Client"; - public static final String API_VERSION_HEADER = "X-Google-Api-Version"; + protected static final String API_VERSION_HEADER = "X-Google-Api-Version"; /** Google client. */ private final AbstractGoogleClient abstractGoogleClient; From 1ac3ae8fbe095fe20a9c4997150ef7a33c958075 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 9 May 2024 20:15:17 +0000 Subject: [PATCH 6/6] doc: Add comment for the constant --- .../googleapis/services/AbstractGoogleClientRequest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java index c2c8cb646..f729375f1 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java @@ -64,6 +64,11 @@ public abstract class AbstractGoogleClientRequest extends GenericData { public static final String USER_AGENT_SUFFIX = "Google-API-Java-Client"; private static final String API_CLIENT_HEADER = "X-Goog-Api-Client"; + + /** + * The generated request class will pass this constant as part of the header if the RPC supports + * ApiVersion. + */ protected static final String API_VERSION_HEADER = "X-Google-Api-Version"; /** Google client. */