1515import importlib
1616from unittest import mock
1717
18+ import google .api_core .exceptions
1819from google .api_core .gapic_v1 import client_info
1920from google .auth import credentials
2021import pytest
2122
22- from google .cloud .bigquery_storage import types
23+ from google .cloud .bigquery_storage_v1 import types
2324
2425PROJECT = "my-project"
2526SERVICE_ACCOUNT_PROJECT = "project-from-credentials"
2930def 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
8783def 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+
110144def test_read_rows (mock_transport , client_under_test ):
111145 stream_name = "teststream"
112146 offset = 0
0 commit comments