Skip to content

Commit 5cdcc9d

Browse files
feat: [Many APIs] Add REST Interceptors which support reading metadata (#13502)
BEGIN_COMMIT_OVERRIDE feat: Add REST Interceptors which support reading metadata feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 END_COMMIT_OVERRIDE - [ ] Regenerate this pull request now. feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 PiperOrigin-RevId: 724026024 Source-Link: googleapis/googleapis@ad99638 Source-Link: googleapis/googleapis-gen@e291c4d Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXRyYWNlLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXRyYW5zbGF0ZS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvLWxpdmUtc3RyZWFtLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvLXN0aXRjaGVyLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvLXRyYW5zY29kZXIvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvaW50ZWxsaWdlbmNlLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpc2lvbi8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpc2lvbmFpLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZtLW1pZ3JhdGlvbi8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZtd2FyZWVuZ2luZS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZwYy1hY2Nlc3MvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdlYnJpc2svLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdlYnNlY3VyaXR5c2Nhbm5lci8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdvcmtmbG93cy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdvcmtzdGF0aW9ucy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWdlby10eXBlLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtYWRkcmVzc3ZhbGlkYXRpb24vLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtYXJlYWluc2lnaHRzLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtZmxlZXRlbmdpbmUtZGVsaXZlcnkvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtZmxlZXRlbmdpbmUvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent 87b5382 commit 5cdcc9d

File tree

241 files changed

+25999
-2064
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

241 files changed

+25999
-2064
lines changed

packages/google-cloud-trace/google/cloud/trace/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.15.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-trace/google/cloud/trace_v1/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.15.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-trace/google/cloud/trace_v1/services/trace_service/client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
from http import HTTPStatus
18+
import json
1719
import logging as std_logging
1820
import os
1921
import re
@@ -466,6 +468,33 @@ def _validate_universe_domain(self):
466468
# NOTE (b/349488459): universe validation is disabled until further notice.
467469
return True
468470

471+
def _add_cred_info_for_auth_errors(
472+
self, error: core_exceptions.GoogleAPICallError
473+
) -> None:
474+
"""Adds credential info string to error details for 401/403/404 errors.
475+
476+
Args:
477+
error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info.
478+
"""
479+
if error.code not in [
480+
HTTPStatus.UNAUTHORIZED,
481+
HTTPStatus.FORBIDDEN,
482+
HTTPStatus.NOT_FOUND,
483+
]:
484+
return
485+
486+
cred = self._transport._credentials
487+
488+
# get_cred_info is only available in google-auth>=2.35.0
489+
if not hasattr(cred, "get_cred_info"):
490+
return
491+
492+
# ignore the type check since pypy test fails when get_cred_info
493+
# is not available
494+
cred_info = cred.get_cred_info() # type: ignore
495+
if cred_info and hasattr(error._details, "append"):
496+
error._details.append(json.dumps(cred_info))
497+
469498
@property
470499
def api_endpoint(self):
471500
"""Return the API endpoint used by the client instance.

packages/google-cloud-trace/google/cloud/trace_v1/services/trace_service/transports/rest.py

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,33 @@ def pre_get_trace(
110110
def post_get_trace(self, response: trace.Trace) -> trace.Trace:
111111
"""Post-rpc interceptor for get_trace
112112
113-
Override in a subclass to manipulate the response
113+
DEPRECATED. Please use the `post_get_trace_with_metadata`
114+
interceptor instead.
115+
116+
Override in a subclass to read or manipulate the response
114117
after it is returned by the TraceService server but before
115-
it is returned to user code.
118+
it is returned to user code. This `post_get_trace` interceptor runs
119+
before the `post_get_trace_with_metadata` interceptor.
116120
"""
117121
return response
118122

123+
def post_get_trace_with_metadata(
124+
self, response: trace.Trace, metadata: Sequence[Tuple[str, Union[str, bytes]]]
125+
) -> Tuple[trace.Trace, Sequence[Tuple[str, Union[str, bytes]]]]:
126+
"""Post-rpc interceptor for get_trace
127+
128+
Override in a subclass to read or manipulate the response or metadata after it
129+
is returned by the TraceService server but before it is returned to user code.
130+
131+
We recommend only using this `post_get_trace_with_metadata`
132+
interceptor in new development instead of the `post_get_trace` interceptor.
133+
When both interceptors are used, this `post_get_trace_with_metadata` interceptor runs after the
134+
`post_get_trace` interceptor. The (possibly modified) response returned by
135+
`post_get_trace` will be passed to
136+
`post_get_trace_with_metadata`.
137+
"""
138+
return response, metadata
139+
119140
def pre_list_traces(
120141
self,
121142
request: trace.ListTracesRequest,
@@ -133,12 +154,35 @@ def post_list_traces(
133154
) -> trace.ListTracesResponse:
134155
"""Post-rpc interceptor for list_traces
135156
136-
Override in a subclass to manipulate the response
157+
DEPRECATED. Please use the `post_list_traces_with_metadata`
158+
interceptor instead.
159+
160+
Override in a subclass to read or manipulate the response
137161
after it is returned by the TraceService server but before
138-
it is returned to user code.
162+
it is returned to user code. This `post_list_traces` interceptor runs
163+
before the `post_list_traces_with_metadata` interceptor.
139164
"""
140165
return response
141166

167+
def post_list_traces_with_metadata(
168+
self,
169+
response: trace.ListTracesResponse,
170+
metadata: Sequence[Tuple[str, Union[str, bytes]]],
171+
) -> Tuple[trace.ListTracesResponse, Sequence[Tuple[str, Union[str, bytes]]]]:
172+
"""Post-rpc interceptor for list_traces
173+
174+
Override in a subclass to read or manipulate the response or metadata after it
175+
is returned by the TraceService server but before it is returned to user code.
176+
177+
We recommend only using this `post_list_traces_with_metadata`
178+
interceptor in new development instead of the `post_list_traces` interceptor.
179+
When both interceptors are used, this `post_list_traces_with_metadata` interceptor runs after the
180+
`post_list_traces` interceptor. The (possibly modified) response returned by
181+
`post_list_traces` will be passed to
182+
`post_list_traces_with_metadata`.
183+
"""
184+
return response, metadata
185+
142186
def pre_patch_traces(
143187
self,
144188
request: trace.PatchTracesRequest,
@@ -367,6 +411,10 @@ def __call__(
367411
json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True)
368412

369413
resp = self._interceptor.post_get_trace(resp)
414+
response_metadata = [(k, str(v)) for k, v in response.headers.items()]
415+
resp, _ = self._interceptor.post_get_trace_with_metadata(
416+
resp, response_metadata
417+
)
370418
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(
371419
logging.DEBUG
372420
): # pragma: NO COVER
@@ -512,6 +560,10 @@ def __call__(
512560
json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True)
513561

514562
resp = self._interceptor.post_list_traces(resp)
563+
response_metadata = [(k, str(v)) for k, v in response.headers.items()]
564+
resp, _ = self._interceptor.post_list_traces_with_metadata(
565+
resp, response_metadata
566+
)
515567
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(
516568
logging.DEBUG
517569
): # pragma: NO COVER

packages/google-cloud-trace/google/cloud/trace_v2/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.15.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-trace/google/cloud/trace_v2/services/trace_service/client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
from http import HTTPStatus
18+
import json
1719
import logging as std_logging
1820
import os
1921
import re
@@ -493,6 +495,33 @@ def _validate_universe_domain(self):
493495
# NOTE (b/349488459): universe validation is disabled until further notice.
494496
return True
495497

498+
def _add_cred_info_for_auth_errors(
499+
self, error: core_exceptions.GoogleAPICallError
500+
) -> None:
501+
"""Adds credential info string to error details for 401/403/404 errors.
502+
503+
Args:
504+
error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info.
505+
"""
506+
if error.code not in [
507+
HTTPStatus.UNAUTHORIZED,
508+
HTTPStatus.FORBIDDEN,
509+
HTTPStatus.NOT_FOUND,
510+
]:
511+
return
512+
513+
cred = self._transport._credentials
514+
515+
# get_cred_info is only available in google-auth>=2.35.0
516+
if not hasattr(cred, "get_cred_info"):
517+
return
518+
519+
# ignore the type check since pypy test fails when get_cred_info
520+
# is not available
521+
cred_info = cred.get_cred_info() # type: ignore
522+
if cred_info and hasattr(error._details, "append"):
523+
error._details.append(json.dumps(cred_info))
524+
496525
@property
497526
def api_endpoint(self):
498527
"""Return the API endpoint used by the client instance.

packages/google-cloud-trace/google/cloud/trace_v2/services/trace_service/transports/rest.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,33 @@ def pre_create_span(
112112
def post_create_span(self, response: trace.Span) -> trace.Span:
113113
"""Post-rpc interceptor for create_span
114114
115-
Override in a subclass to manipulate the response
115+
DEPRECATED. Please use the `post_create_span_with_metadata`
116+
interceptor instead.
117+
118+
Override in a subclass to read or manipulate the response
116119
after it is returned by the TraceService server but before
117-
it is returned to user code.
120+
it is returned to user code. This `post_create_span` interceptor runs
121+
before the `post_create_span_with_metadata` interceptor.
118122
"""
119123
return response
120124

125+
def post_create_span_with_metadata(
126+
self, response: trace.Span, metadata: Sequence[Tuple[str, Union[str, bytes]]]
127+
) -> Tuple[trace.Span, Sequence[Tuple[str, Union[str, bytes]]]]:
128+
"""Post-rpc interceptor for create_span
129+
130+
Override in a subclass to read or manipulate the response or metadata after it
131+
is returned by the TraceService server but before it is returned to user code.
132+
133+
We recommend only using this `post_create_span_with_metadata`
134+
interceptor in new development instead of the `post_create_span` interceptor.
135+
When both interceptors are used, this `post_create_span_with_metadata` interceptor runs after the
136+
`post_create_span` interceptor. The (possibly modified) response returned by
137+
`post_create_span` will be passed to
138+
`post_create_span_with_metadata`.
139+
"""
140+
return response, metadata
141+
121142

122143
@dataclasses.dataclass
123144
class TraceServiceRestStub:
@@ -476,6 +497,10 @@ def __call__(
476497
json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True)
477498

478499
resp = self._interceptor.post_create_span(resp)
500+
response_metadata = [(k, str(v)) for k, v in response.headers.items()]
501+
resp, _ = self._interceptor.post_create_span_with_metadata(
502+
resp, response_metadata
503+
)
479504
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(
480505
logging.DEBUG
481506
): # pragma: NO COVER

packages/google-cloud-trace/samples/generated_samples/snippet_metadata_google.devtools.cloudtrace.v1.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
],
99
"language": "PYTHON",
1010
"name": "google-cloud-trace",
11-
"version": "1.15.0"
11+
"version": "0.1.0"
1212
},
1313
"snippets": [
1414
{

packages/google-cloud-trace/samples/generated_samples/snippet_metadata_google.devtools.cloudtrace.v2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
],
99
"language": "PYTHON",
1010
"name": "google-cloud-trace",
11-
"version": "1.15.0"
11+
"version": "0.1.0"
1212
},
1313
"snippets": [
1414
{

packages/google-cloud-trace/tests/unit/gapic/trace_v1/test_trace_service.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@
6161
)
6262
from google.cloud.trace_v1.types import trace
6363

64+
CRED_INFO_JSON = {
65+
"credential_source": "/path/to/file",
66+
"credential_type": "service account credentials",
67+
"principal": "service-account@example.com",
68+
}
69+
CRED_INFO_STRING = json.dumps(CRED_INFO_JSON)
70+
6471

6572
async def mock_async_gen(data, chunk_size=1):
6673
for i in range(0, len(data)): # pragma: NO COVER
@@ -304,6 +311,49 @@ def test__get_universe_domain():
304311
assert str(excinfo.value) == "Universe Domain cannot be an empty string."
305312

306313

314+
@pytest.mark.parametrize(
315+
"error_code,cred_info_json,show_cred_info",
316+
[
317+
(401, CRED_INFO_JSON, True),
318+
(403, CRED_INFO_JSON, True),
319+
(404, CRED_INFO_JSON, True),
320+
(500, CRED_INFO_JSON, False),
321+
(401, None, False),
322+
(403, None, False),
323+
(404, None, False),
324+
(500, None, False),
325+
],
326+
)
327+
def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info):
328+
cred = mock.Mock(["get_cred_info"])
329+
cred.get_cred_info = mock.Mock(return_value=cred_info_json)
330+
client = TraceServiceClient(credentials=cred)
331+
client._transport._credentials = cred
332+
333+
error = core_exceptions.GoogleAPICallError("message", details=["foo"])
334+
error.code = error_code
335+
336+
client._add_cred_info_for_auth_errors(error)
337+
if show_cred_info:
338+
assert error.details == ["foo", CRED_INFO_STRING]
339+
else:
340+
assert error.details == ["foo"]
341+
342+
343+
@pytest.mark.parametrize("error_code", [401, 403, 404, 500])
344+
def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code):
345+
cred = mock.Mock([])
346+
assert not hasattr(cred, "get_cred_info")
347+
client = TraceServiceClient(credentials=cred)
348+
client._transport._credentials = cred
349+
350+
error = core_exceptions.GoogleAPICallError("message", details=[])
351+
error.code = error_code
352+
353+
client._add_cred_info_for_auth_errors(error)
354+
assert error.details == []
355+
356+
307357
@pytest.mark.parametrize(
308358
"client_class,transport_name",
309359
[
@@ -3198,10 +3248,13 @@ def test_list_traces_rest_interceptors(null_interceptor):
31983248
) as transcode, mock.patch.object(
31993249
transports.TraceServiceRestInterceptor, "post_list_traces"
32003250
) as post, mock.patch.object(
3251+
transports.TraceServiceRestInterceptor, "post_list_traces_with_metadata"
3252+
) as post_with_metadata, mock.patch.object(
32013253
transports.TraceServiceRestInterceptor, "pre_list_traces"
32023254
) as pre:
32033255
pre.assert_not_called()
32043256
post.assert_not_called()
3257+
post_with_metadata.assert_not_called()
32053258
pb_message = trace.ListTracesRequest.pb(trace.ListTracesRequest())
32063259
transcode.return_value = {
32073260
"method": "post",
@@ -3223,6 +3276,7 @@ def test_list_traces_rest_interceptors(null_interceptor):
32233276
]
32243277
pre.return_value = request, metadata
32253278
post.return_value = trace.ListTracesResponse()
3279+
post_with_metadata.return_value = trace.ListTracesResponse(), metadata
32263280

32273281
client.list_traces(
32283282
request,
@@ -3234,6 +3288,7 @@ def test_list_traces_rest_interceptors(null_interceptor):
32343288

32353289
pre.assert_called_once()
32363290
post.assert_called_once()
3291+
post_with_metadata.assert_called_once()
32373292

32383293

32393294
def test_get_trace_rest_bad_request(request_type=trace.GetTraceRequest):
@@ -3318,10 +3373,13 @@ def test_get_trace_rest_interceptors(null_interceptor):
33183373
) as transcode, mock.patch.object(
33193374
transports.TraceServiceRestInterceptor, "post_get_trace"
33203375
) as post, mock.patch.object(
3376+
transports.TraceServiceRestInterceptor, "post_get_trace_with_metadata"
3377+
) as post_with_metadata, mock.patch.object(
33213378
transports.TraceServiceRestInterceptor, "pre_get_trace"
33223379
) as pre:
33233380
pre.assert_not_called()
33243381
post.assert_not_called()
3382+
post_with_metadata.assert_not_called()
33253383
pb_message = trace.GetTraceRequest.pb(trace.GetTraceRequest())
33263384
transcode.return_value = {
33273385
"method": "post",
@@ -3343,6 +3401,7 @@ def test_get_trace_rest_interceptors(null_interceptor):
33433401
]
33443402
pre.return_value = request, metadata
33453403
post.return_value = trace.Trace()
3404+
post_with_metadata.return_value = trace.Trace(), metadata
33463405

33473406
client.get_trace(
33483407
request,
@@ -3354,6 +3413,7 @@ def test_get_trace_rest_interceptors(null_interceptor):
33543413

33553414
pre.assert_called_once()
33563415
post.assert_called_once()
3416+
post_with_metadata.assert_called_once()
33573417

33583418

33593419
def test_patch_traces_rest_bad_request(request_type=trace.PatchTracesRequest):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy