2727_TEST_GENERATION_NUMBER = 12345
2828_TEST_OBJECT_SIZE = 1024 * 1024 # 1 MiB
2929_TEST_READ_HANDLE = b"test-read-handle"
30+ _TEST_READ_HANDLE_NEW = b"test-read-handle-new"
3031
3132
3233async def instantiate_read_obj_stream (mock_client , mock_cls_async_bidi_rpc , open = True ):
@@ -54,6 +55,30 @@ async def instantiate_read_obj_stream(mock_client, mock_cls_async_bidi_rpc, open
5455 return read_obj_stream
5556
5657
58+ async def instantiate_read_obj_stream_with_read_handle (
59+ mock_client , mock_cls_async_bidi_rpc , open = True
60+ ):
61+ """Helper to create an instance of _AsyncReadObjectStream and open it by default."""
62+ socket_like_rpc = AsyncMock ()
63+ mock_cls_async_bidi_rpc .return_value = socket_like_rpc
64+ socket_like_rpc .open = AsyncMock ()
65+
66+ recv_response = mock .MagicMock (spec = _storage_v2 .BidiReadObjectResponse )
67+ recv_response .read_handle = _TEST_READ_HANDLE_NEW
68+ socket_like_rpc .recv = AsyncMock (return_value = recv_response )
69+
70+ read_obj_stream = _AsyncReadObjectStream (
71+ client = mock_client ,
72+ bucket_name = _TEST_BUCKET_NAME ,
73+ object_name = _TEST_OBJECT_NAME ,
74+ )
75+
76+ if open :
77+ await read_obj_stream .open ()
78+
79+ return read_obj_stream
80+
81+
5782@mock .patch (
5883 "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc"
5984)
@@ -67,12 +92,6 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc):
6792 mock_client ._client ._transport ._wrapped_methods = {
6893 "bidi_read_object_rpc" : rpc_sentinel ,
6994 }
70- full_bucket_name = f"projects/_/buckets/{ _TEST_BUCKET_NAME } "
71- first_bidi_read_req = _storage_v2 .BidiReadObjectRequest (
72- read_object_spec = _storage_v2 .BidiReadObjectSpec (
73- bucket = full_bucket_name , object = _TEST_OBJECT_NAME
74- ),
75- )
7695
7796 # Act
7897 read_obj_stream = _AsyncReadObjectStream (
@@ -88,7 +107,6 @@ def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc):
88107 assert read_obj_stream .object_name == _TEST_OBJECT_NAME
89108 assert read_obj_stream .generation_number == _TEST_GENERATION_NUMBER
90109 assert read_obj_stream .read_handle == _TEST_READ_HANDLE
91- assert read_obj_stream .first_bidi_read_req == first_bidi_read_req
92110 assert read_obj_stream .rpc == rpc_sentinel
93111
94112
@@ -118,6 +136,32 @@ async def test_open(mock_client, mock_cls_async_bidi_rpc):
118136 assert read_obj_stream .is_stream_open
119137
120138
139+ @mock .patch (
140+ "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc"
141+ )
142+ @mock .patch (
143+ "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client"
144+ )
145+ @pytest .mark .asyncio
146+ async def test_open_with_read_handle (mock_client , mock_cls_async_bidi_rpc ):
147+ # arrange
148+ read_obj_stream = await instantiate_read_obj_stream_with_read_handle (
149+ mock_client , mock_cls_async_bidi_rpc , open = False
150+ )
151+
152+ # act
153+ await read_obj_stream .open ()
154+
155+ # assert
156+ read_obj_stream .socket_like_rpc .open .assert_called_once ()
157+ read_obj_stream .socket_like_rpc .recv .assert_called_once ()
158+
159+ assert read_obj_stream .generation_number is None
160+ assert read_obj_stream .persisted_size is None
161+ assert read_obj_stream .read_handle == _TEST_READ_HANDLE_NEW
162+ assert read_obj_stream .is_stream_open
163+
164+
121165@mock .patch (
122166 "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc"
123167)
0 commit comments