Merge "Port object_storage tests to Py3."

This commit is contained in:
Jenkins 2017-01-19 23:39:54 +00:00 committed by Gerrit Code Review
commit 772d89b259
15 changed files with 80 additions and 69 deletions

View File

@ -121,7 +121,7 @@ class BaseObjectTest(tempest.test.BaseTestCase):
if object_name is None:
object_name = data_utils.rand_name(name='TestObject')
if data is None:
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
cls.object_client.create_object(container_name,
object_name,
data,

View File

@ -133,7 +133,7 @@ class ContainerTest(base.BaseObjectTest):
resp, object_list = self.container_client.list_container_contents(
container_name)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual(object_name, object_list.strip('\n'))
self.assertEqual([object_name], object_list)
@test.idempotent_id('4646ac2d-9bfb-4c7d-a3c5-0f527402b3df')
def test_list_container_contents_with_no_object(self):
@ -143,7 +143,7 @@ class ContainerTest(base.BaseObjectTest):
resp, object_list = self.container_client.list_container_contents(
container_name)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual('', object_list.strip('\n'))
self.assertEmpty(object_list)
@test.idempotent_id('fe323a32-57b9-4704-a996-2e68f83b09bc')
def test_list_container_contents_with_delimiter(self):
@ -157,7 +157,7 @@ class ContainerTest(base.BaseObjectTest):
container_name,
params=params)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual(object_name.split('/')[0], object_list.strip('/\n'))
self.assertEqual([object_name.split('/')[0] + '/'], object_list)
@test.idempotent_id('55b4fa5c-e12e-4ca9-8fcf-a79afe118522')
def test_list_container_contents_with_end_marker(self):
@ -170,7 +170,7 @@ class ContainerTest(base.BaseObjectTest):
container_name,
params=params)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual(object_name, object_list.strip('\n'))
self.assertEqual([object_name], object_list)
@test.idempotent_id('196f5034-6ab0-4032-9da9-a937bbb9fba9')
def test_list_container_contents_with_format_json(self):
@ -226,7 +226,7 @@ class ContainerTest(base.BaseObjectTest):
container_name,
params=params)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual(object_name, object_list.strip('\n'))
self.assertEqual([object_name], object_list)
@test.idempotent_id('c31ddc63-2a58-4f6b-b25c-94d2937e6867')
def test_list_container_contents_with_marker(self):
@ -239,7 +239,7 @@ class ContainerTest(base.BaseObjectTest):
container_name,
params=params)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual(object_name, object_list.strip('\n'))
self.assertEqual([object_name], object_list)
@test.idempotent_id('58ca6cc9-6af0-408d-aaec-2a6a7b2f0df9')
def test_list_container_contents_with_path(self):
@ -253,7 +253,7 @@ class ContainerTest(base.BaseObjectTest):
container_name,
params=params)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual(object_name, object_list.strip('\n'))
self.assertEqual([object_name], object_list)
@test.idempotent_id('77e742c7-caf2-4ec9-8aa4-f7d509a3344c')
def test_list_container_contents_with_prefix(self):
@ -267,7 +267,7 @@ class ContainerTest(base.BaseObjectTest):
container_name,
params=params)
self.assertHeaders(resp, 'Container', 'GET')
self.assertEqual(object_name, object_list.strip('\n'))
self.assertEqual([object_name], object_list)
@test.attr(type='smoke')
@test.idempotent_id('96e68f0e-19ec-4aa2-86f3-adc6a45e14dd')

View File

@ -96,7 +96,7 @@ class StaticWebTest(base.BaseObjectTest):
# Check only the format of common headers with custom matcher
self.assertThat(resp, custom_matchers.AreAllWellFormatted())
self.assertIn(self.object_name, body)
self.assertIn(self.object_name, body.decode())
# clean up before exiting
self.container_client.update_container_metadata(self.container_name,
@ -126,9 +126,9 @@ class StaticWebTest(base.BaseObjectTest):
resp, body = self.account_client.request("GET",
self.container_name,
headers={})
self.assertIn(self.object_name, body)
self.assertIn(self.object_name, body.decode())
css = '<link rel="stylesheet" type="text/css" href="listings.css" />'
self.assertIn(css, body)
self.assertIn(css, body.decode())
@test.idempotent_id('f18b4bef-212e-45e7-b3ca-59af3a465f82')
@test.requires_ext(extension='staticweb', service='object')

View File

@ -96,7 +96,7 @@ class ContainerSyncTest(base.BaseObjectTest):
cont_client[0].put(str(cont[0]), body=None, headers=headers)
# create object in container
object_name = data_utils.rand_name(name='TestSyncObject')
data = object_name[::-1] # data_utils.arbitrary_string()
data = object_name[::-1].encode() # Raw data, we need bytes
resp, _ = obj_client[0].create_object(cont[0], object_name, data)
self.objects.append(object_name)
@ -127,7 +127,7 @@ class ContainerSyncTest(base.BaseObjectTest):
for obj_client, cont in obj_clients:
for obj_name in object_lists[0]:
resp, object_content = obj_client.get_object(cont, obj_name)
self.assertEqual(object_content, obj_name[::-1])
self.assertEqual(object_content, obj_name[::-1].encode())
@test.attr(type='slow')
@decorators.skip_because(bug='1317133')

View File

@ -40,6 +40,7 @@ class CrossdomainTest(base.BaseObjectTest):
@test.requires_ext(extension='crossdomain', service='object')
def test_get_crossdomain_policy(self):
resp, body = self.account_client.get("crossdomain.xml", {})
body = body.decode()
self.assertTrue(body.startswith(self.xml_start) and
body.endswith(self.xml_end))

View File

@ -72,7 +72,9 @@ class ObjectFormPostTest(base.BaseObjectTest):
max_file_count,
expires)
signature = hmac.new(self.key, hmac_body, hashlib.sha1).hexdigest()
signature = hmac.new(
self.key.encode(), hmac_body.encode(), hashlib.sha1
).hexdigest()
fields = {'redirect': redirect,
'max_file_size': str(max_file_size),
@ -119,4 +121,4 @@ class ObjectFormPostTest(base.BaseObjectTest):
resp, body = self.object_client.get("%s/%s%s" % (
self.container_name, self.object_name, "testfile"))
self.assertHeaders(resp, "Object", "GET")
self.assertEqual(body, "hello world")
self.assertEqual(body.decode(), "hello world")

View File

@ -73,7 +73,9 @@ class ObjectFormPostNegativeTest(base.BaseObjectTest):
max_file_count,
expires)
signature = hmac.new(self.key, hmac_body, hashlib.sha1).hexdigest()
signature = hmac.new(
self.key.encode(), hmac_body.encode(), hashlib.sha1
).hexdigest()
fields = {'redirect': redirect,
'max_file_size': str(max_file_size),

View File

@ -79,12 +79,12 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object(self):
# create object
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
resp, _ = self.object_client.create_object(self.container_name,
object_name, data)
# create another object
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
resp, _ = self.object_client.create_object(self.container_name,
object_name, data)
self.assertHeaders(resp, 'Object', 'PUT')
@ -98,7 +98,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_content_disposition(self):
# create object with content_disposition
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata = {}
metadata['content-disposition'] = 'inline'
resp, _ = self.object_client.create_object(
@ -122,7 +122,7 @@ class ObjectTest(base.BaseObjectTest):
object_name = data_utils.rand_name(name='TestObject')
# put compressed string
data_before = 'x' * 2000
data_before = b'x' * 2000
data = zlib.compress(data_before)
metadata = {}
metadata['content-encoding'] = 'deflate'
@ -147,7 +147,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_etag(self):
# create object with etag
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
md5 = hashlib.md5(data).hexdigest()
metadata = {'Etag': md5}
resp, _ = self.object_client.create_object(
@ -167,7 +167,7 @@ class ObjectTest(base.BaseObjectTest):
# create object with expect_continue
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
status, _ = self.object_client.create_object_continue(
self.container_name, object_name, data)
@ -183,7 +183,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_transfer_encoding(self):
# create object with transfer_encoding
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string(1024)
data = data_utils.random_bytes(1024)
status, _, resp_headers = self.object_client.put_object_with_chunk(
container=self.container_name,
name=object_name,
@ -200,7 +200,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_x_fresh_metadata(self):
# create object with x_fresh_metadata
object_name_base = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata_1 = {'X-Object-Meta-test-meta': 'Meta'}
self.object_client.create_object(self.container_name,
object_name_base,
@ -226,7 +226,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_x_object_meta(self):
# create object with object_meta
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': 'Meta'}
resp, _ = self.object_client.create_object(
self.container_name,
@ -245,7 +245,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_x_object_metakey(self):
# create object with the blank value of metadata
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': ''}
resp, _ = self.object_client.create_object(
self.container_name,
@ -264,7 +264,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_x_remove_object_meta(self):
# create object with x_remove_object_meta
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata_add = {'X-Object-Meta-test-meta': 'Meta'}
self.object_client.create_object(self.container_name,
object_name,
@ -287,7 +287,7 @@ class ObjectTest(base.BaseObjectTest):
def test_create_object_with_x_remove_object_metakey(self):
# create object with the blank value of remove metadata
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata_add = {'X-Object-Meta-test-meta': 'Meta'}
self.object_client.create_object(self.container_name,
object_name,
@ -310,7 +310,7 @@ class ObjectTest(base.BaseObjectTest):
def test_delete_object(self):
# create object
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
resp, _ = self.object_client.create_object(self.container_name,
object_name, data)
# delete object
@ -342,7 +342,7 @@ class ObjectTest(base.BaseObjectTest):
def test_update_object_metadata_with_remove_metadata(self):
# update object metadata with remove metadata
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
create_metadata = {'X-Object-Meta-test-meta1': 'Meta1'}
self.object_client.create_object(self.container_name,
object_name,
@ -366,7 +366,7 @@ class ObjectTest(base.BaseObjectTest):
def test_update_object_metadata_with_create_and_remove_metadata(self):
# creation and deletion of metadata with one request
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
create_metadata = {'X-Object-Meta-test-meta1': 'Meta1'}
self.object_client.create_object(self.container_name,
object_name,
@ -464,7 +464,7 @@ class ObjectTest(base.BaseObjectTest):
def test_list_object_metadata(self):
# get object metadata
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': 'Meta'}
self.object_client.create_object(self.container_name,
object_name,
@ -547,7 +547,7 @@ class ObjectTest(base.BaseObjectTest):
def test_get_object_with_metadata(self):
# get object with metadata
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': 'Meta'}
self.object_client.create_object(self.container_name,
object_name,
@ -566,7 +566,7 @@ class ObjectTest(base.BaseObjectTest):
def test_get_object_with_range(self):
# get object with range
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string(100)
data = data_utils.random_bytes(100)
self.object_client.create_object(self.container_name,
object_name,
data,
@ -621,13 +621,13 @@ class ObjectTest(base.BaseObjectTest):
self.assertEqual(resp['x-object-manifest'],
'%s/%s' % (self.container_name, object_name))
self.assertEqual(''.join(data_segments), body)
self.assertEqual(''.join(data_segments), body.decode())
@test.idempotent_id('c05b4013-e4de-47af-be84-e598062b16fc')
def test_get_object_with_if_match(self):
# get object with if_match
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string(10)
data = data_utils.random_bytes(10)
create_md5 = hashlib.md5(data).hexdigest()
create_metadata = {'Etag': create_md5}
self.object_client.create_object(self.container_name,
@ -647,7 +647,7 @@ class ObjectTest(base.BaseObjectTest):
def test_get_object_with_if_modified_since(self):
# get object with if_modified_since
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
data = data_utils.random_bytes()
time_now = time.time()
self.object_client.create_object(self.container_name,
object_name,
@ -667,7 +667,7 @@ class ObjectTest(base.BaseObjectTest):
def test_get_object_with_if_none_match(self):
# get object with if_none_match
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string(10)
data = data_utils.random_bytes()
create_md5 = hashlib.md5(data).hexdigest()
create_metadata = {'Etag': create_md5}
self.object_client.create_object(self.container_name,
@ -675,7 +675,7 @@ class ObjectTest(base.BaseObjectTest):
data,
metadata=create_metadata)
list_data = data_utils.arbitrary_string(15)
list_data = data_utils.random_bytes()
list_md5 = hashlib.md5(list_data).hexdigest()
list_metadata = {'If-None-Match': list_md5}
resp, body = self.object_client.get_object(
@ -717,15 +717,13 @@ class ObjectTest(base.BaseObjectTest):
def test_copy_object_in_same_container(self):
# create source object
src_object_name = data_utils.rand_name(name='SrcObject')
src_data = data_utils.arbitrary_string(size=len(src_object_name) * 2,
base_text=src_object_name)
src_data = data_utils.random_bytes(size=len(src_object_name) * 2)
resp, _ = self.object_client.create_object(self.container_name,
src_object_name,
src_data)
# create destination object
dst_object_name = data_utils.rand_name(name='DstObject')
dst_data = data_utils.arbitrary_string(size=len(dst_object_name) * 3,
base_text=dst_object_name)
dst_data = data_utils.random_bytes(size=len(dst_object_name) * 3)
resp, _ = self.object_client.create_object(self.container_name,
dst_object_name,
dst_data)
@ -764,14 +762,12 @@ class ObjectTest(base.BaseObjectTest):
def test_copy_object_2d_way(self):
# create source object
src_object_name = data_utils.rand_name(name='SrcObject')
src_data = data_utils.arbitrary_string(size=len(src_object_name) * 2,
base_text=src_object_name)
src_data = data_utils.random_bytes(size=len(src_object_name) * 2)
resp, _ = self.object_client.create_object(self.container_name,
src_object_name, src_data)
# create destination object
dst_object_name = data_utils.rand_name(name='DstObject')
dst_data = data_utils.arbitrary_string(size=len(dst_object_name) * 3,
base_text=dst_object_name)
dst_data = data_utils.random_bytes(size=len(dst_object_name) * 3)
resp, _ = self.object_client.create_object(self.container_name,
dst_object_name, dst_data)
# copy source object to destination
@ -799,8 +795,7 @@ class ObjectTest(base.BaseObjectTest):
self.containers.append(dst_container_name)
# create object in source container
object_name = data_utils.rand_name(name='Object')
data = data_utils.arbitrary_string(size=len(object_name) * 2,
base_text=object_name)
data = data_utils.random_bytes(size=len(object_name) * 2)
resp, _ = self.object_client.create_object(src_container_name,
object_name, data)
# set object metadata
@ -933,7 +928,7 @@ class ObjectTest(base.BaseObjectTest):
# downloading the object
resp, body = self.object_client.get_object(
self.container_name, object_name)
self.assertEqual(''.join(data_segments), body)
self.assertEqual(''.join(data_segments), body.decode())
@test.idempotent_id('50d01f12-526f-4360-9ac2-75dd508d7b68')
def test_get_object_if_different(self):
@ -958,7 +953,7 @@ class ObjectTest(base.BaseObjectTest):
# local copy is different, download
local_data = "something different"
md5 = hashlib.md5(local_data).hexdigest()
md5 = hashlib.md5(local_data.encode()).hexdigest()
headers = {'If-None-Match': md5}
resp, body = self.object_client.get(url, headers=headers)
self.assertHeaders(resp, 'Object', 'GET')
@ -1002,8 +997,7 @@ class PublicObjectTest(base.BaseObjectTest):
# create object
object_name = data_utils.rand_name(name='Object')
data = data_utils.arbitrary_string(size=len(object_name),
base_text=object_name)
data = data_utils.random_bytes(size=len(object_name))
resp, _ = self.object_client.create_object(self.container_name,
object_name, data)
self.assertHeaders(resp, 'Object', 'PUT')
@ -1039,8 +1033,7 @@ class PublicObjectTest(base.BaseObjectTest):
# create object
object_name = data_utils.rand_name(name='Object')
data = data_utils.arbitrary_string(size=len(object_name) * 1,
base_text=object_name)
data = data_utils.random_bytes(size=len(object_name))
resp, _ = self.object_client.create_object(self.container_name,
object_name, data)
self.assertHeaders(resp, 'Object', 'PUT')

View File

@ -56,7 +56,7 @@ class ObjectSloTest(base.BaseObjectTest):
object_name_base_1 = object_name + '_01'
object_name_base_2 = object_name + '_02'
data_size = MIN_SEGMENT_SIZE
self.content = data_utils.arbitrary_string(data_size)
self.content = data_utils.random_bytes(data_size)
self._create_object(self.container_name,
object_name_base_1,
self.content)

View File

@ -75,7 +75,9 @@ class ObjectTempUrlTest(base.BaseObjectTest):
container, object_name)
hmac_body = '%s\n%s\n%s' % (method, expires, path)
sig = hmac.new(key, hmac_body, hashlib.sha1).hexdigest()
sig = hmac.new(
key.encode(), hmac_body.encode(), hashlib.sha1
).hexdigest()
url = "%s/%s?temp_url_sig=%s&temp_url_expires=%s" % (container,
object_name,
@ -129,9 +131,7 @@ class ObjectTempUrlTest(base.BaseObjectTest):
@test.idempotent_id('9b08dade-3571-4152-8a4f-a4f2a873a735')
@test.requires_ext(extension='tempurl', service='object')
def test_put_object_using_temp_url(self):
new_data = data_utils.arbitrary_string(
size=len(self.object_name),
base_text=data_utils.rand_name(name="random"))
new_data = data_utils.random_bytes(size=len(self.object_name))
expires = self._get_expiry_date()
url = self._get_temp_url(self.container_name,

View File

@ -80,7 +80,9 @@ class ObjectTempUrlNegativeTest(base.BaseObjectTest):
container, object_name)
hmac_body = '%s\n%s\n%s' % (method, expires, path)
sig = hmac.new(key, hmac_body, hashlib.sha1).hexdigest()
sig = hmac.new(
key.encode(), hmac_body.encode(), hashlib.sha1
).hexdigest()
url = "%s/%s?temp_url_sig=%s&temp_url_expires=%s" % (container,
object_name,

View File

@ -69,22 +69,24 @@ class ContainerTest(base.BaseObjectTest):
vers_container_name)
object_name = data_utils.rand_name(name='TestObject')
# create object
data_1 = data_utils.random_bytes()
resp, _ = self.object_client.create_object(base_container_name,
object_name, '1')
object_name, data_1)
# create 2nd version of object
data_2 = data_utils.random_bytes()
resp, _ = self.object_client.create_object(base_container_name,
object_name, '2')
object_name, data_2)
resp, body = self.object_client.get_object(base_container_name,
object_name)
self.assertEqual(body, '2')
self.assertEqual(body, data_2)
# delete object version 2
resp, _ = self.object_client.delete_object(base_container_name,
object_name)
self.assertContainer(base_container_name, '1', '1',
self.assertContainer(base_container_name, '1', '1024',
vers_container_name)
resp, body = self.object_client.get_object(base_container_name,
object_name)
self.assertEqual(body, '1')
self.assertEqual(body, data_1)
# delete object version 1
resp, _ = self.object_client.delete_object(base_container_name,
object_name)

View File

@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import six
import urllib3
@ -39,7 +40,9 @@ class ClosingHttp(urllib3.poolmanager.PoolManager):
class Response(dict):
def __init__(self, info):
for key, value in info.getheaders().items():
self[key.lower()] = value
# We assume HTTP header name to be string, not random
# bytes, thus ensure we have string keys.
self[six.u(key).lower()] = value
self.status = info.status
self['status'] = str(self.status)
self.reason = info.reason

View File

@ -1326,7 +1326,7 @@ class ObjectStorageScenarioTest(ScenarioTest):
def upload_object_to_container(self, container_name, obj_name=None):
obj_name = obj_name or data_utils.rand_name('swift-scenario-object')
obj_data = data_utils.arbitrary_string()
obj_data = data_utils.random_bytes()
self.object_client.create_object(container_name, obj_name, obj_data)
self.addCleanup(test_utils.call_and_ignore_notfound_exc,
self.object_client.delete_object,

View File

@ -140,5 +140,11 @@ class ContainerClient(rest_client.RestClient):
body = json.loads(body)
elif params and params.get('format') == 'xml':
body = etree.fromstring(body)
# Else the content-type is plain/text
else:
body = [
obj_name for obj_name in body.decode().split('\n') if obj_name
]
self.expected_success([200, 204], resp.status)
return resp, body