diff --git a/google/cloud/pubsublite/internal/wire/reset_signal.py b/google/cloud/pubsublite/internal/wire/reset_signal.py index ce4fa3d5..5771a0dc 100644 --- a/google/cloud/pubsublite/internal/wire/reset_signal.py +++ b/google/cloud/pubsublite/internal/wire/reset_signal.py @@ -29,14 +29,17 @@ def is_reset_signal(error: GoogleAPICallError) -> bool: return False try: status = rpc_status.from_call(error.response) + if not status: + return False for detail in status.details: - info = ErrorInfo() - if ( - detail.Unpack(info) - and info.reason == "RESET" - and info.domain == "pubsublite.googleapis.com" - ): - return True + if detail.Is(ErrorInfo.DESCRIPTOR): + info = ErrorInfo() + if ( + detail.Unpack(info) + and info.reason == "RESET" + and info.domain == "pubsublite.googleapis.com" + ): + return True except ValueError: pass return False diff --git a/google/cloud/pubsublite/testing/test_reset_signal.py b/google/cloud/pubsublite/testing/test_reset_signal.py index 97a45c42..d0d989da 100644 --- a/google/cloud/pubsublite/testing/test_reset_signal.py +++ b/google/cloud/pubsublite/testing/test_reset_signal.py @@ -30,6 +30,13 @@ def make_call(status_pb: Status) -> grpc.Call: return mock_call +def make_call_without_metadata(status_pb: Status) -> grpc.Call: + mock_call = make_call(status_pb) + # Causes rpc_status.from_call to return None. + mock_call.trailing_metadata.return_value = None + return mock_call + + def make_reset_signal() -> GoogleAPICallError: any = Any() any.Pack(ErrorInfo(reason="RESET", domain="pubsublite.googleapis.com")) diff --git a/tests/unit/pubsublite/internal/wire/reset_signal_test.py b/tests/unit/pubsublite/internal/wire/reset_signal_test.py index 8925d525..78bd0f8b 100644 --- a/tests/unit/pubsublite/internal/wire/reset_signal_test.py +++ b/tests/unit/pubsublite/internal/wire/reset_signal_test.py @@ -17,6 +17,7 @@ from google.cloud.pubsublite.internal.wire.reset_signal import is_reset_signal from google.cloud.pubsublite.testing.test_reset_signal import ( make_call, + make_call_without_metadata, make_reset_signal, ) from google.protobuf.any_pb2 import Any @@ -39,6 +40,13 @@ async def test_missing_call(): assert not is_reset_signal(Aborted("")) +async def test_extracted_status_is_none(): + status_pb = Status(code=10, details=[]) + assert not is_reset_signal( + Aborted("", response=make_call_without_metadata(status_pb)) + ) + + async def test_wrong_reason(): any = Any() any.Pack(ErrorInfo(reason="OTHER", domain="pubsublite.googleapis.com"))