From 6e2fb88b19163172e4ebd0da4e85f5b5ec8e877a Mon Sep 17 00:00:00 2001 From: ruomeng Date: Mon, 10 Jun 2024 12:40:02 -0400 Subject: [PATCH] chore: Add metadata field to GoogleJsonError ErrorInfo class. --- .../googleapis/json/GoogleJsonError.java | 11 +++++++++ .../googleapis/json/GoogleJsonErrorTest.java | 23 +++++++++++++++++++ .../json/errorWithMetadataInDetails.json | 17 ++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 google-api-client/src/test/resources/com/google/api/client/googleapis/json/errorWithMetadataInDetails.json diff --git a/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java b/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java index dadd172fb..a05a1557c 100644 --- a/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java +++ b/google-api-client/src/main/java/com/google/api/client/googleapis/json/GoogleJsonError.java @@ -22,9 +22,11 @@ import com.google.api.client.util.Data; import com.google.api.client.util.Key; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.Map; /** * Data class representing the Google JSON error response content, as documented for example in parameterViolations; + @Key private Map metadata; public String getType() { return type; @@ -228,6 +231,14 @@ public List getParameterViolations() { public void setParameterViolations(List parameterViolations) { this.parameterViolations = ImmutableList.copyOf(parameterViolations); } + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = ImmutableMap.copyOf(metadata); + } } public static class ParameterViolations { diff --git a/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java b/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java index 380114aee..1dd3768a3 100644 --- a/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java +++ b/google-api-client/src/test/java/com/google/api/client/googleapis/json/GoogleJsonErrorTest.java @@ -27,8 +27,10 @@ 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.common.collect.ImmutableMap; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.Map; import junit.framework.TestCase; /** @@ -199,4 +201,25 @@ public void testParse_withReasonInDetails() throws Exception { JSON_PARSER.parse(DETAILS_ERROR), JSON_PARSER.parse(FACTORY.toString(errorResponse))); assertNotNull(errorResponse.getDetails().get(2).getReason()); } + + public void testParse_withMetadataInDetails() throws Exception { + InputStream errorContent = + GoogleJsonErrorTest.class.getResourceAsStream("errorWithMetadataInDetails.json"); + + HttpTransport transport = + new ErrorTransport( + new MockLowLevelHttpResponse() + .setContent(errorContent) + .setContentType(Json.MEDIA_TYPE) + .setStatusCode(HttpStatusCodes.STATUS_CODE_FORBIDDEN)); + HttpRequest request = + transport.createRequestFactory().buildGetRequest(HttpTesting.SIMPLE_GENERIC_URL); + request.setThrowExceptionOnExecuteError(false); + HttpResponse response = request.execute(); + com.google.api.client.googleapis.json.GoogleJsonError errorResponse = + com.google.api.client.googleapis.json.GoogleJsonError.parse(FACTORY, response); + + Map metadata = errorResponse.getDetails().get(0).getMetadata(); + assertEquals(metadata, ImmutableMap.of("service", "translate.googleapis.com")); + } } diff --git a/google-api-client/src/test/resources/com/google/api/client/googleapis/json/errorWithMetadataInDetails.json b/google-api-client/src/test/resources/com/google/api/client/googleapis/json/errorWithMetadataInDetails.json new file mode 100644 index 000000000..f143674ac --- /dev/null +++ b/google-api-client/src/test/resources/com/google/api/client/googleapis/json/errorWithMetadataInDetails.json @@ -0,0 +1,17 @@ +{ + "error": { + "code": 400, + "message": "API key not valid. Please pass a valid API key.", + "status": "INVALID_ARGUMENT", + "details": [ + { + "@type": "type.googleapis.com/google.rpc.ErrorInfo", + "reason": "API_KEY_INVALID", + "domain": "googleapis.com", + "metadata": { + "service": "translate.googleapis.com" + } + } + ] + } +} \ No newline at end of file