Port common.utils to Python 3
* CooperativeReader: buffer is a byte string, use b'' syntax and use bytes() instead of str(). * Don't compare None to int, it raises a TypeError on Python 3. * Use str[i:i+1] to get a substring from a byte string. On Python 3, str[i] now returns an integer for byte strings. * tox.ini: add glance.tests.unit.common.test_utils to Python 3.4 Change-Id: Ie678555ffd8ac48913f9bf08ac674d1c643bec29
This commit is contained in:
parent
476688080c
commit
0695c243c8
@ -153,7 +153,7 @@ class CooperativeReader(object):
|
||||
self.read = cooperative_read(fd)
|
||||
else:
|
||||
self.iterator = None
|
||||
self.buffer = ''
|
||||
self.buffer = b''
|
||||
self.position = 0
|
||||
|
||||
def read(self, length=None):
|
||||
@ -168,7 +168,7 @@ class CooperativeReader(object):
|
||||
# if no length specified but some data exists in buffer,
|
||||
# return that data and clear the buffer
|
||||
result = self.buffer[self.position:]
|
||||
self.buffer = ''
|
||||
self.buffer = b''
|
||||
self.position = 0
|
||||
return str(result)
|
||||
else:
|
||||
@ -178,11 +178,11 @@ class CooperativeReader(object):
|
||||
try:
|
||||
if self.iterator is None:
|
||||
self.iterator = self.__iter__()
|
||||
return self.iterator.next()
|
||||
return next(self.iterator)
|
||||
except StopIteration:
|
||||
return ''
|
||||
finally:
|
||||
self.buffer = ''
|
||||
self.buffer = b''
|
||||
self.position = 0
|
||||
else:
|
||||
result = bytearray()
|
||||
@ -206,13 +206,13 @@ class CooperativeReader(object):
|
||||
try:
|
||||
if self.iterator is None:
|
||||
self.iterator = self.__iter__()
|
||||
self.buffer = self.iterator.next()
|
||||
self.buffer = next(self.iterator)
|
||||
self.position = 0
|
||||
except StopIteration:
|
||||
self.buffer = ''
|
||||
self.buffer = b''
|
||||
self.position = 0
|
||||
return str(result)
|
||||
return str(result)
|
||||
return bytes(result)
|
||||
return bytes(result)
|
||||
|
||||
def __iter__(self):
|
||||
return cooperative_iter(self.fd.__iter__())
|
||||
@ -313,7 +313,7 @@ def get_image_meta_from_headers(response):
|
||||
raise exception.InvalidParameterValue(value=result[key],
|
||||
param=key,
|
||||
extra_msg=extra)
|
||||
if result[key] < 0 and result[key] is not None:
|
||||
if result[key] is not None and result[key] < 0:
|
||||
extra = _('Cannot be a negative value.')
|
||||
raise exception.InvalidParameterValue(value=result[key],
|
||||
param=key,
|
||||
|
@ -55,14 +55,16 @@ class TestUtils(test_utils.BaseTestCase):
|
||||
|
||||
def test_cooperative_reader_of_iterator(self):
|
||||
"""Ensure cooperative reader supports iterator backends too"""
|
||||
reader = utils.CooperativeReader([l * 3 for l in 'abcdefgh'])
|
||||
data = b'abcdefgh'
|
||||
data_list = [data[i:i + 1] * 3 for i in range(len(data))]
|
||||
reader = utils.CooperativeReader(data_list)
|
||||
chunks = []
|
||||
while True:
|
||||
chunks.append(reader.read(3))
|
||||
if chunks[-1] == '':
|
||||
if chunks[-1] == b'':
|
||||
break
|
||||
meat = ''.join(chunks)
|
||||
self.assertEqual('aaabbbcccdddeeefffggghhh', meat)
|
||||
meat = b''.join(chunks)
|
||||
self.assertEqual(b'aaabbbcccdddeeefffggghhh', meat)
|
||||
|
||||
def test_cooperative_reader_of_iterator_stop_iteration_err(self):
|
||||
"""Ensure cooperative reader supports iterator backends too"""
|
||||
@ -70,16 +72,17 @@ class TestUtils(test_utils.BaseTestCase):
|
||||
chunks = []
|
||||
while True:
|
||||
chunks.append(reader.read(3))
|
||||
if chunks[-1] == '':
|
||||
if chunks[-1] == b'':
|
||||
break
|
||||
meat = ''.join(chunks)
|
||||
self.assertEqual('', meat)
|
||||
meat = b''.join(chunks)
|
||||
self.assertEqual(b'', meat)
|
||||
|
||||
def _create_generator(self, chunk_size, max_iterations):
|
||||
chars = 'abc'
|
||||
chars = b'abc'
|
||||
iteration = 0
|
||||
while True:
|
||||
chunk = chars[iteration % len(chars)] * chunk_size
|
||||
index = iteration % len(chars)
|
||||
chunk = chars[index:index + 1] * chunk_size
|
||||
yield chunk
|
||||
iteration += 1
|
||||
if iteration >= max_iterations:
|
||||
@ -88,19 +91,19 @@ class TestUtils(test_utils.BaseTestCase):
|
||||
def _test_reader_chunked(self, chunk_size, read_size, max_iterations=5):
|
||||
generator = self._create_generator(chunk_size, max_iterations)
|
||||
reader = utils.CooperativeReader(generator)
|
||||
result = ''
|
||||
result = bytearray()
|
||||
while True:
|
||||
data = reader.read(read_size)
|
||||
if len(data) == 0:
|
||||
break
|
||||
self.assertLessEqual(len(data), read_size)
|
||||
result += data
|
||||
expected = ('a' * chunk_size +
|
||||
'b' * chunk_size +
|
||||
'c' * chunk_size +
|
||||
'a' * chunk_size +
|
||||
'b' * chunk_size)
|
||||
self.assertEqual(expected, result)
|
||||
expected = (b'a' * chunk_size +
|
||||
b'b' * chunk_size +
|
||||
b'c' * chunk_size +
|
||||
b'a' * chunk_size +
|
||||
b'b' * chunk_size)
|
||||
self.assertEqual(expected, bytes(result))
|
||||
|
||||
def test_cooperative_reader_preserves_size_chunk_less_then_read(self):
|
||||
self._test_reader_chunked(43, 101)
|
||||
|
1
tox.ini
1
tox.ini
@ -26,6 +26,7 @@ commands =
|
||||
glance.tests.unit.common.test_scripts \
|
||||
glance.tests.unit.common.test_semver \
|
||||
glance.tests.unit.common.test_swift_store_utils \
|
||||
glance.tests.unit.common.test_utils \
|
||||
glance.tests.unit.test_artifact_type_definition_framework \
|
||||
glance.tests.unit.test_artifacts_plugin_loader \
|
||||
glance.tests.unit.test_auth \
|
||||
|
Loading…
x
Reference in New Issue
Block a user