Skip to content
This repository was archived by the owner on Nov 12, 2025. It is now read-only.

Commit 87b8358

Browse files
committed
chore: test that ServiceUnavailable is retried
1 parent 6e2c94f commit 87b8358

2 files changed

Lines changed: 58 additions & 11 deletions

File tree

main.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
import google.cloud.bigquery_storage_v1
3+
import google.cloud.bigquery_storage_v1.types
4+
5+
readclient = google.cloud.bigquery_storage_v1.BigQueryReadClient()
6+
request = google.cloud.bigquery_storage_v1.types.CreateReadSessionRequest(
7+
parent="projects/swast-scratch",
8+
read_session=google.cloud.bigquery_storage_v1.types.ReadSession(
9+
table="projects/swast-scratch/datasets/my_dataset/tables/all_types",
10+
data_format=google.cloud.bigquery_storage_v1.types.DataFormat.ARROW,
11+
))
12+
13+
session = readclient.create_read_session(request)
Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,12 @@
1515
import importlib
1616
from unittest import mock
1717

18+
import google.api_core.exceptions
1819
from google.api_core.gapic_v1 import client_info
1920
from google.auth import credentials
2021
import pytest
2122

22-
from google.cloud.bigquery_storage import types
23+
from google.cloud.bigquery_storage_v1 import types
2324

2425
PROJECT = "my-project"
2526
SERVICE_ACCOUNT_PROJECT = "project-from-credentials"
@@ -29,20 +30,15 @@
2930
def mock_transport(monkeypatch):
3031
from google.cloud.bigquery_storage_v1.services.big_query_read import transports
3132

32-
fake_create_session_rpc = mock.Mock(name="create_read_session_rpc")
33-
fake_read_rows_rpc = mock.Mock(name="read_rows_rpc")
34-
3533
transport = mock.create_autospec(
3634
transports.grpc.BigQueryReadGrpcTransport, instance=True
3735
)
3836

3937
transport.create_read_session = mock.Mock(name="fake_create_read_session")
4038
transport.read_rows = mock.Mock(name="fake_read_rows")
41-
42-
transport._wrapped_methods = {
43-
transport.create_read_session: fake_create_session_rpc,
44-
transport.read_rows: fake_read_rows_rpc,
45-
}
39+
transports.grpc.BigQueryReadGrpcTransport._prep_wrapped_messages(
40+
transport, client_info.ClientInfo()
41+
)
4642

4743
# _credentials property for TPC support
4844
transport._credentials = ""
@@ -85,8 +81,11 @@ def __init__(self, *args, **kwargs):
8581

8682

8783
def test_create_read_session(mock_transport, client_under_test):
88-
assert client_under_test._transport is mock_transport # sanity check
84+
# validate test assumptions
85+
assert client_under_test._transport is mock_transport
8986

87+
rpc_callable = mock.Mock()
88+
mock_transport._wrapped_methods[mock_transport.create_read_session] = rpc_callable
9089
table = "projects/{}/datasets/{}/tables/{}".format(
9190
"data-project-id", "dataset_id", "table_id"
9291
)
@@ -101,12 +100,47 @@ def test_create_read_session(mock_transport, client_under_test):
101100
expected_session_arg = types.CreateReadSessionRequest(
102101
parent="projects/other-project", read_session=read_session
103102
)
104-
rpc_callable = mock_transport._wrapped_methods[mock_transport.create_read_session]
105103
rpc_callable.assert_called_once_with(
106104
expected_session_arg, metadata=mock.ANY, retry=mock.ANY, timeout=mock.ANY
107105
)
108106

109107

108+
def test_create_read_session_retries_serviceunavailable(
109+
mock_transport, client_under_test
110+
):
111+
"""Regression test for https://github.com/googleapis/python-bigquery-storage/issues/969."""
112+
# validate test assumptions
113+
assert client_under_test._transport is mock_transport
114+
115+
mock_transport.create_read_session.side_effect = [
116+
google.api_core.exceptions.ServiceUnavailable("connection reset"),
117+
google.api_core.exceptions.ServiceUnavailable("connection reset"),
118+
types.ReadSession(),
119+
]
120+
table = "projects/{}/datasets/{}/tables/{}".format(
121+
"data-project-id", "dataset_id", "table_id"
122+
)
123+
read_session = types.ReadSession()
124+
read_session.table = table
125+
126+
# with pytest.raises(google.api_core.exceptions.ServiceUnavailable):
127+
client_under_test.create_read_session(
128+
parent="projects/other-project", read_session=read_session
129+
)
130+
131+
expected_session_arg = types.CreateReadSessionRequest(
132+
parent="projects/other-project", read_session=read_session
133+
)
134+
expected_call = mock.call(expected_session_arg, metadata=mock.ANY, timeout=mock.ANY)
135+
mock_transport.create_read_session.assert_has_calls(
136+
[
137+
expected_call,
138+
expected_call,
139+
expected_call,
140+
]
141+
)
142+
143+
110144
def test_read_rows(mock_transport, client_under_test):
111145
stream_name = "teststream"
112146
offset = 0

0 commit comments

Comments
 (0)