1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
From: Brian Rosmaita <rosmaita.fossdev@gmail.com>
Date: Fri, 30 Sep 2022 12:19:11 -0400
Description: OverflowError running on 32-bit systems
Change I59b1579dc9877668b82d4195431c1 added tests that mock an
input buffer, but the mocked return_value for __len__ exceeds the
allowable maximum value for an index in the CPython implementation
on 32-bit systems. Fix this by using half the value and allowing
the buffer to be called twice during the tests.
Change-Id: Iaba20c01fb4d994cd738a570197f8f6f04f22606
Closes-bug: #1991406
Origin: upstream, https://review.opendev.org/c/openstack/glance_store/+/860004
Last-Update: 2022-10-01
diff --git a/glance_store/tests/unit/test_cinder_base.py b/glance_store/tests/unit/test_cinder_base.py
index d7fca2f..712ed15 100644
--- a/glance_store/tests/unit/test_cinder_base.py
+++ b/glance_store/tests/unit/test_cinder_base.py
@@ -591,7 +591,11 @@
expected_multihash = 'fake_hash'
fakebuffer = mock.MagicMock()
- fakebuffer.__len__.return_value = expected_volume_size
+
+ # CPython implementation detail: __len__ cannot return > sys.maxsize,
+ # which on a 32-bit system is 2*units.Gi - 1
+ # https://docs.python.org/3/reference/datamodel.html#object.__len__
+ fakebuffer.__len__.return_value = units.Gi
def get_fake_hash(type, secure=False):
if type == 'md5':
@@ -603,7 +607,7 @@
expected_volume_id = str(uuid.uuid4())
expected_size = 0
image_file = mock.MagicMock(
- read=mock.MagicMock(side_effect=[fakebuffer, None]))
+ read=mock.MagicMock(side_effect=[fakebuffer, fakebuffer, None]))
fake_volume = mock.MagicMock(id=expected_volume_id, status='available',
size=1)
expected_checksum = 'fake_checksum'
@@ -667,13 +671,17 @@
expected_volume_size = 2 * units.Gi
fakebuffer = mock.MagicMock()
- fakebuffer.__len__.return_value = expected_volume_size
+
+ # CPython implementation detail: __len__ cannot return > sys.maxsize,
+ # which on a 32-bit system is 2*units.Gi - 1
+ # https://docs.python.org/3/reference/datamodel.html#object.__len__
+ fakebuffer.__len__.return_value = int(expected_volume_size / 2)
expected_image_id = str(uuid.uuid4())
expected_volume_id = str(uuid.uuid4())
expected_size = 0
image_file = mock.MagicMock(
- read=mock.MagicMock(side_effect=[fakebuffer, None]))
+ read=mock.MagicMock(side_effect=[fakebuffer, fakebuffer, None]))
fake_volume = mock.MagicMock(id=expected_volume_id, status='available',
size=1)
verifier = None
@@ -704,13 +712,17 @@
expected_volume_size = 2 * units.Gi
fakebuffer = mock.MagicMock()
- fakebuffer.__len__.return_value = expected_volume_size
+
+ # CPython implementation detail: __len__ cannot return > sys.maxsize,
+ # which on a 32-bit system is 2*units.Gi - 1
+ # https://docs.python.org/3/reference/datamodel.html#object.__len__
+ fakebuffer.__len__.return_value = int(expected_volume_size / 2)
expected_image_id = str(uuid.uuid4())
expected_volume_id = str(uuid.uuid4())
expected_size = 0
image_file = mock.MagicMock(
- read=mock.MagicMock(side_effect=[fakebuffer, None]))
+ read=mock.MagicMock(side_effect=[fakebuffer, fakebuffer, None]))
fake_volume = mock.MagicMock(
id=expected_volume_id, status='available', size=1,
delete=mock.MagicMock(side_effect=Exception()))
|