feat: update generation for MRD (#1730) · googleapis/python-storage@08bc708 · GitHub
Skip to content
This repository was archived by the owner on Mar 31, 2026. It is now read-only.

Commit 08bc708

Browse files
authored
feat: update generation for MRD (#1730)
Adding a support to pass `generation` in the constructor of MRD. It is done to make it compatible with the other public interfaces. Earlier, `generation_number` was exposed as the parameter which would still be valid after these changes. But using `generation` is more preferred.
1 parent 74c9ecc commit 08bc708

7 files changed

Lines changed: 95 additions & 78 deletions

File tree

google/cloud/storage/asyncio/async_multi_range_downloader.py

Lines changed: 27 additions & 11 deletions

tests/system/test_zonal.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,8 @@ async def _run():
264264

265265
event_loop.run_until_complete(_run())
266266

267-
@pytest.mark.skip(reason='Flaky test b/478129078')
267+
268+
@pytest.mark.skip(reason="Flaky test b/478129078")
268269
def test_mrd_open_with_read_handle(event_loop, grpc_client_direct):
269270
object_name = f"test_read_handl-{str(uuid.uuid4())[:4]}"
270271

tests/unit/asyncio/retry/test_reads_resumption_strategy.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727
from google.cloud._storage_v2.types.storage import BidiReadObjectRedirectedError
2828

2929
_READ_ID = 1
30-
LOGGER_NAME = (
31-
"google.cloud.storage.asyncio.retry.reads_resumption_strategy"
32-
)
30+
LOGGER_NAME = "google.cloud.storage.asyncio.retry.reads_resumption_strategy"
3331

3432

3533
class TestDownloadState(unittest.TestCase):

tests/unit/asyncio/test_async_multi_range_downloader.py

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ async def _make_mock_mrd(
4949
mock_cls_async_read_object_stream,
5050
bucket_name=_TEST_BUCKET_NAME,
5151
object_name=_TEST_OBJECT_NAME,
52-
generation_number=_TEST_GENERATION_NUMBER,
52+
generation=_TEST_GENERATION_NUMBER,
5353
read_handle=_TEST_READ_HANDLE,
5454
):
5555
mock_client = mock.MagicMock()
@@ -62,7 +62,7 @@ async def _make_mock_mrd(
6262
mock_stream.read_handle = _TEST_READ_HANDLE
6363

6464
mrd = await AsyncMultiRangeDownloader.create_mrd(
65-
mock_client, bucket_name, object_name, generation_number, read_handle
65+
mock_client, bucket_name, object_name, generation, read_handle
6666
)
6767

6868
return mrd, mock_client
@@ -89,7 +89,7 @@ async def test_create_mrd(self, mock_cls_async_read_object_stream):
8989
assert mrd.client == mock_client
9090
assert mrd.bucket_name == _TEST_BUCKET_NAME
9191
assert mrd.object_name == _TEST_OBJECT_NAME
92-
assert mrd.generation_number == _TEST_GENERATION_NUMBER
92+
assert mrd.generation == _TEST_GENERATION_NUMBER
9393
assert mrd.read_handle == _TEST_READ_HANDLE
9494
assert mrd.persisted_size == _TEST_OBJECT_SIZE
9595
assert mrd.is_stream_open
@@ -303,9 +303,7 @@ async def test_downloading_without_opening_should_throw_error(self):
303303
assert not mrd.is_stream_open
304304

305305
@mock.patch("google.cloud.storage.asyncio._utils.google_crc32c")
306-
def test_init_raises_if_crc32c_c_extension_is_missing(
307-
self, mock_google_crc32c
308-
):
306+
def test_init_raises_if_crc32c_c_extension_is_missing(self, mock_google_crc32c):
309307
mock_google_crc32c.implementation = "python"
310308
mock_client = mock.MagicMock()
311309

@@ -317,9 +315,7 @@ def test_init_raises_if_crc32c_c_extension_is_missing(
317315
)
318316

319317
@pytest.mark.asyncio
320-
@mock.patch(
321-
"google.cloud.storage.asyncio.retry.reads_resumption_strategy.Checksum"
322-
)
318+
@mock.patch("google.cloud.storage.asyncio.retry.reads_resumption_strategy.Checksum")
323319
async def test_download_ranges_raises_on_checksum_mismatch(
324320
self, mock_checksum_class
325321
):
@@ -405,3 +401,47 @@ async def close_side_effect():
405401

406402
mock_close.assert_called_once()
407403
assert not mrd.is_stream_open
404+
405+
@mock.patch(
406+
"google.cloud.storage.asyncio.async_multi_range_downloader._AsyncReadObjectStream"
407+
)
408+
@pytest.mark.asyncio
409+
async def test_create_mrd_with_generation_number(
410+
self, mock_cls_async_read_object_stream
411+
):
412+
# Arrange
413+
mock_client = mock.MagicMock()
414+
mock_client.grpc_client = mock.AsyncMock()
415+
416+
mock_stream = mock_cls_async_read_object_stream.return_value
417+
mock_stream.open = AsyncMock()
418+
mock_stream.generation_number = _TEST_GENERATION_NUMBER
419+
mock_stream.persisted_size = _TEST_OBJECT_SIZE
420+
mock_stream.read_handle = _TEST_READ_HANDLE
421+
422+
# Act
423+
mrd = await AsyncMultiRangeDownloader.create_mrd(
424+
mock_client,
425+
_TEST_BUCKET_NAME,
426+
_TEST_OBJECT_NAME,
427+
generation_number=_TEST_GENERATION_NUMBER,
428+
read_handle=_TEST_READ_HANDLE,
429+
)
430+
431+
# Assert
432+
assert mrd.generation == _TEST_GENERATION_NUMBER
433+
434+
@pytest.mark.asyncio
435+
async def test_create_mrd_with_both_generation_and_generation_number(self):
436+
# Arrange
437+
mock_client = mock.MagicMock()
438+
439+
# Act & Assert
440+
with pytest.raises(TypeError):
441+
await AsyncMultiRangeDownloader.create_mrd(
442+
mock_client,
443+
_TEST_BUCKET_NAME,
444+
_TEST_OBJECT_NAME,
445+
generation=_TEST_GENERATION_NUMBER,
446+
generation_number=_TEST_GENERATION_NUMBER,
447+
)

tests/unit/asyncio/test_async_read_object_stream.py

Lines changed: 12 additions & 36 deletions

0 commit comments

Comments
 (0)