Adding description for testcases - swift part1

When Tempest is used in customer site, often we are required to
provide a testcase list including testcase names and descriptions.
Now no this kind of doc is available, so we can add descriptions
with the format of doc string for every testcase, so later we
can generata such a testcase description list.

There are hundreds of testcases missing descriptions, so we can
add them gradually, and limit the modified files in one patch
for the convenience of reviewing.

Change-Id: Ib0df766d305ab2583d284d4c0aed32e7685eb595
partially-implements: blueprint testcase-description
This commit is contained in:
zhufl 2020-08-18 11:11:16 +08:00
parent 25ec807af3
commit 9b442510e7
7 changed files with 150 additions and 74 deletions

View File

@ -28,6 +28,7 @@ CONF = config.CONF
class AccountTest(base.BaseObjectTest):
"""Test account metadata and containers"""
credentials = [['operator', CONF.object_storage.operator_role],
['operator_alt', CONF.object_storage.operator_role]]
@ -54,7 +55,7 @@ class AccountTest(base.BaseObjectTest):
@decorators.attr(type='smoke')
@decorators.idempotent_id('3499406a-ae53-4f8c-b43a-133d4dc6fe3f')
def test_list_containers(self):
# list of all containers should not be empty
"""Test listing containers"""
resp, container_list = self.account_client.list_account_containers()
self.assertHeaders(resp, 'Account', 'GET')
@ -66,11 +67,10 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('884ec421-fbad-4fcc-916b-0580f2699565')
def test_list_no_containers(self):
# List request to empty account
"""Test listing containers for an account without container"""
# To test listing no containers, create new user other than
# the base user of this instance.
resp, container_list = \
self.os_operator.account_client.list_account_containers()
@ -103,7 +103,7 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('1c7efa35-e8a2-4b0b-b5ff-862c7fd83704')
def test_list_containers_with_format_json(self):
# list containers setting format parameter to 'json'
"""Test listing containers setting format parameter to 'json'"""
params = {'format': 'json'}
resp, container_list = self.account_client.list_account_containers(
params=params)
@ -115,7 +115,7 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('4477b609-1ca6-4d4b-b25d-ad3f01086089')
def test_list_containers_with_format_xml(self):
# list containers setting format parameter to 'xml'
"""Test listing containers setting format parameter to 'xml'"""
params = {'format': 'xml'}
resp, container_list = self.account_client.list_account_containers(
params=params)
@ -133,13 +133,18 @@ class AccountTest(base.BaseObjectTest):
not CONF.object_storage_feature_enabled.discoverability,
'Discoverability function is disabled')
def test_list_extensions(self):
"""Test listing capabilities"""
resp = self.capabilities_client.list_capabilities()
self.assertThat(resp, custom_matchers.AreAllWellFormatted())
@decorators.idempotent_id('5cfa4ab2-4373-48dd-a41f-a532b12b08b2')
def test_list_containers_with_limit(self):
# list containers one of them, half of them then all of them
"""Test listing containers with limit parameter
Listing containers limited to one of them, half of them, and then all
of them.
"""
for limit in (1, self.containers_count // 2,
self.containers_count):
params = {'limit': limit}
@ -151,10 +156,11 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('638f876d-6a43-482a-bbb3-0840bca101c6')
def test_list_containers_with_marker(self):
# list containers using marker param
# first expect to get 0 container as we specified last
# the container as marker
# second expect to get the bottom half of the containers
"""Test listing containers with marker parameter
First expect to get 0 container as we specified the last container
as marker, second expect to get the bottom half of the containers.
"""
params = {'marker': self.containers[-1]}
resp, container_list = \
self.account_client.list_account_containers(params=params)
@ -172,10 +178,11 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('5ca164e4-7bde-43fa-bafb-913b53b9e786')
def test_list_containers_with_end_marker(self):
# list containers using end_marker param
# first expect to get 0 container as we specified first container as
# end_marker
# second expect to get the top half of the containers
"""Test listing containers with end_marker parameter
First expect to get 0 container as we specified first container as
end_marker, second expect to get the top half of the containers
"""
params = {'end_marker': self.containers[0]}
resp, container_list = \
self.account_client.list_account_containers(params=params)
@ -190,7 +197,12 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('ac8502c2-d4e4-4f68-85a6-40befea2ef5e')
def test_list_containers_with_marker_and_end_marker(self):
# list containers combining marker and end_marker param
"""Test listing containers with marker and end_marker parameter
If we use the first container as marker, and the last container as
end_marker, then we should get all containers excluding the first one
and the last one.
"""
params = {'marker': self.containers[0],
'end_marker': self.containers[self.containers_count - 1]}
resp, container_list = self.account_client.list_account_containers(
@ -200,8 +212,10 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('f7064ae8-dbcc-48da-b594-82feef6ea5af')
def test_list_containers_with_limit_and_marker(self):
# list containers combining marker and limit param
# result are always limitated by the limit whatever the marker
"""Test listing containers combining marker and limit parameter
Result are always limited by the limit whatever the marker.
"""
for marker in random.choice(self.containers):
limit = random.randint(0, self.containers_count - 1)
params = {'marker': marker,
@ -215,6 +229,10 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('888a3f0e-7214-4806-8e50-5e0c9a69bb5e')
def test_list_containers_with_limit_and_end_marker(self):
"""Test listing containers combining end_marker and limit parameter
Result are always limited by the limit whatever the end_marker.
"""
# list containers combining limit and end_marker param
limit = random.randint(1, self.containers_count)
params = {'limit': limit,
@ -227,7 +245,11 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('8cf98d9c-e3a0-4e44-971b-c87656fdddbd')
def test_list_containers_with_limit_and_marker_and_end_marker(self):
# list containers combining limit, marker and end_marker param
"""Test listing containers combining marker and end_marker and limit
Result are always limited by the limit whatever the marker and the
end_marker.
"""
limit = random.randint(1, self.containers_count)
params = {'limit': limit,
'marker': self.containers[0],
@ -240,7 +262,7 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('365e6fc7-1cfe-463b-a37c-8bd08d47b6aa')
def test_list_containers_with_prefix(self):
# list containers that have a name that starts with a prefix
"""Test listing containers that have a name starting with a prefix"""
prefix = 'tempest-a'
params = {'prefix': prefix}
resp, container_list = self.account_client.list_account_containers(
@ -252,7 +274,7 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('b1811cff-d1ed-4c15-a52e-efd8de41cf34')
def test_list_containers_reverse_order(self):
# list containers in reverse order
"""Test listing containers in reverse order"""
_, orig_container_list = self.account_client.list_account_containers()
params = {'reverse': True}
@ -265,8 +287,7 @@ class AccountTest(base.BaseObjectTest):
@decorators.attr(type='smoke')
@decorators.idempotent_id('4894c312-6056-4587-8d6f-86ffbf861f80')
def test_list_account_metadata(self):
# list all account metadata
"""Test listing account metadata"""
# set metadata to account
metadata = {'test-account-meta1': 'Meta1',
'test-account-meta2': 'Meta2'}
@ -282,14 +303,14 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('b904c2e3-24c2-4dba-ad7d-04e90a761be5')
def test_list_no_account_metadata(self):
# list no account metadata
"""Test listing account metadata for account without metadata"""
resp, _ = self.account_client.list_account_metadata()
self.assertHeaders(resp, 'Account', 'HEAD')
self.assertNotIn('x-account-meta-', str(resp))
@decorators.idempotent_id('e2a08b5f-3115-4768-a3ee-d4287acd6c08')
def test_update_account_metadata_with_create_metadata(self):
# add metadata to account
"""Test adding metadata to account"""
metadata = {'test-account-meta1': 'Meta1'}
resp, _ = self.account_client.create_update_or_delete_account_metadata(
create_update_metadata=metadata)
@ -305,7 +326,7 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('9f60348d-c46f-4465-ae06-d51dbd470953')
def test_update_account_metadata_with_delete_metadata(self):
# delete metadata from account
"""Test deleting metadata from account"""
metadata = {'test-account-meta1': 'Meta1'}
self.account_client.create_update_or_delete_account_metadata(
create_update_metadata=metadata)
@ -318,8 +339,11 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('64fd53f3-adbd-4639-af54-436e4982dbfb')
def test_update_account_metadata_with_create_metadata_key(self):
# if the value of metadata is not set, the metadata is not
# registered at a server
"""Test adding metadata to account with empty value
Adding metadata with empty value to account, the metadata is not
registered.
"""
metadata = {'test-account-meta1': ''}
resp, _ = self.account_client.create_update_or_delete_account_metadata(
create_update_metadata=metadata)
@ -330,8 +354,11 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('d4d884d3-4696-4b85-bc98-4f57c4dd2bf1')
def test_update_account_metadata_with_delete_metadata_key(self):
# Although the value of metadata is not set, the feature of
# deleting metadata is valid
"""Test deleting metadata from account with empty value
Although the value of metadata is not set, the feature of deleting
metadata is valid, so the metadata is removed from account.
"""
metadata_1 = {'test-account-meta1': 'Meta1'}
self.account_client.create_update_or_delete_account_metadata(
create_update_metadata=metadata_1)
@ -345,7 +372,11 @@ class AccountTest(base.BaseObjectTest):
@decorators.idempotent_id('8e5fc073-59b9-42ee-984a-29ed11b2c749')
def test_update_account_metadata_with_create_and_delete_metadata(self):
# Send a request adding and deleting metadata requests simultaneously
"""Test adding and deleting metadata simultaneously
Send a request adding and deleting metadata requests simultaneously,
both adding and deleting of metadata will succeed.
"""
metadata_1 = {'test-account-meta1': 'Meta1'}
self.account_client.create_update_or_delete_account_metadata(
create_update_metadata=metadata_1)

View File

@ -33,6 +33,8 @@ CONF = config.CONF
class ContainerSyncTest(base.BaseObjectTest):
"""Test container synchronization"""
credentials = [['operator', CONF.object_storage.operator_role],
['operator_alt', CONF.object_storage.operator_role]]
@ -129,6 +131,7 @@ class ContainerSyncTest(base.BaseObjectTest):
not CONF.object_storage_feature_enabled.container_sync,
'Old-style container sync function is disabled')
def test_container_synchronization(self):
"""Test container synchronization"""
def make_headers(cont, cont_client):
# tell first container to synchronize to a second
client_proxy_ip = \

View File

@ -27,6 +27,7 @@ CONF = config.CONF
class ContainerSyncMiddlewareTest(test_container_sync.ContainerSyncTest):
"""Test containers synchronization specifying realm and cluster"""
@classmethod
def resource_setup(cls):
@ -41,6 +42,7 @@ class ContainerSyncMiddlewareTest(test_container_sync.ContainerSyncTest):
@decorators.idempotent_id('ea4645a1-d147-4976-82f7-e5a7a3065f80')
@utils.requires_ext(extension='container_sync', service='object')
def test_container_synchronization(self):
"""Test container synchronization specifying realm and cluster"""
def make_headers(cont, cont_client):
# tell first container to synchronize to a second
account_name = cont_client.base_url.split('/')[-1]

View File

@ -19,6 +19,7 @@ from tempest.lib import decorators
class CrossdomainTest(base.BaseObjectTest):
"""Test crossdomain policy"""
@classmethod
def resource_setup(cls):
@ -37,6 +38,7 @@ class CrossdomainTest(base.BaseObjectTest):
@decorators.idempotent_id('d1b8b031-b622-4010-82f9-ff78a9e915c7')
@utils.requires_ext(extension='crossdomain', service='object')
def test_get_crossdomain_policy(self):
"""Test getting crossdomain policy"""
url = self.account_client._get_base_version_url() + "crossdomain.xml"
resp, body = self.account_client.raw_request(url, "GET")
self.account_client._error_checker(resp, body)

View File

@ -21,6 +21,8 @@ from tempest.lib import exceptions as lib_exc
class ObjectExpiryTest(base.BaseObjectTest):
"""Test object expiry"""
@classmethod
def resource_setup(cls):
super(ObjectExpiryTest, cls).resource_setup()
@ -83,6 +85,7 @@ class ObjectExpiryTest(base.BaseObjectTest):
@decorators.idempotent_id('fb024a42-37f3-4ba5-9684-4f40a7910b41')
def test_get_object_after_expiry_time(self):
"""Test object is expired after x-delete-after time"""
# the 10s is important, because the get calls can take 3s each
# some times
metadata = {'X-Delete-After': '10'}
@ -90,5 +93,6 @@ class ObjectExpiryTest(base.BaseObjectTest):
@decorators.idempotent_id('e592f18d-679c-48fe-9e36-4be5f47102c5')
def test_get_object_at_expiry_time(self):
"""Test object is expired at x-delete-at time"""
metadata = {'X-Delete-At': str(int(time.time()) + 10)}
self._test_object_expiry(metadata)

View File

@ -29,6 +29,7 @@ CONF = config.CONF
class ObjectTest(base.BaseObjectTest):
"""Test storage object"""
@classmethod
def resource_setup(cls):
@ -78,6 +79,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.attr(type='smoke')
@decorators.idempotent_id('5b4ce26f-3545-46c9-a2ba-5754358a4c62')
def test_create_object(self):
"""Test creating object and checking the object's uploaded content"""
# create object
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
@ -97,7 +99,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('5daebb1d-f0d5-4dc9-b541-69672eff00b0')
def test_create_object_with_content_disposition(self):
# create object with content_disposition
"""Test creating object with content-disposition"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata = {}
@ -119,7 +121,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('605f8317-f945-4bee-ae91-013f1da8f0a0')
def test_create_object_with_content_encoding(self):
# create object with content_encoding
"""Test creating object with content-encoding"""
object_name = data_utils.rand_name(name='TestObject')
# put compressed string
@ -146,7 +148,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('73820093-0503-40b1-a478-edf0e69c7d1f')
def test_create_object_with_etag(self):
# create object with etag
"""Test creating object with Etag"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
md5 = hashlib.md5(data).hexdigest()
@ -165,8 +167,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('84dafe57-9666-4f6d-84c8-0814d37923b8')
def test_create_object_with_expect_continue(self):
# create object with expect_continue
"""Test creating object with expect_continue"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
@ -182,7 +183,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('4f84422a-e2f2-4403-b601-726a4220b54e')
def test_create_object_with_transfer_encoding(self):
# create object with transfer_encoding
"""Test creating object with transfer_encoding"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes(1024)
headers = {'Transfer-Encoding': 'chunked'}
@ -202,7 +203,10 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('0f3d62a6-47e3-4554-b0e5-1a5dc372d501')
def test_create_object_with_x_fresh_metadata(self):
# create object with x_fresh_metadata
"""Test creating object with x-fresh-metadata
The previous added metadata will be cleared.
"""
object_name_base = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata_1 = {'X-Object-Meta-test-meta': 'Meta'}
@ -228,7 +232,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('1c7ed3e4-2099-406b-b843-5301d4811baf')
def test_create_object_with_x_object_meta(self):
# create object with object_meta
"""Test creating object with x-object-meta"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': 'Meta'}
@ -247,7 +251,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('e4183917-33db-4153-85cc-4dacbb938865')
def test_create_object_with_x_object_metakey(self):
# create object with the blank value of metadata
"""Test creating object with the blank value of metadata"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': ''}
@ -266,7 +270,10 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('ce798afc-b278-45de-a5ce-2ea124b98b99')
def test_create_object_with_x_remove_object_meta(self):
# create object with x_remove_object_meta
"""Test creating object with x-remove-object-meta
The metadata will be removed from the object.
"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata_add = {'X-Object-Meta-test-meta': 'Meta'}
@ -289,7 +296,11 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('ad21e342-7916-4f9e-ab62-a1f885f2aaf9')
def test_create_object_with_x_remove_object_metakey(self):
# create object with the blank value of remove metadata
"""Test creating object with the blank value of remove metadata
Creating object with blank metadata 'X-Remove-Object-Meta-test-meta',
metadata 'x-object-meta-test-meta' will be removed from the object.
"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata_add = {'X-Object-Meta-test-meta': 'Meta'}
@ -312,7 +323,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('17738d45-03bd-4d45-9e0b-7b2f58f98687')
def test_delete_object(self):
# create object
"""Test deleting object"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
resp, _ = self.object_client.create_object(self.container_name,
@ -325,7 +336,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.attr(type='smoke')
@decorators.idempotent_id('7a94c25d-66e6-434c-9c38-97d4e2c29945')
def test_update_object_metadata(self):
# update object metadata
"""Test updating object metadata"""
object_name, _ = self.create_object(self.container_name)
metadata = {'X-Object-Meta-test-meta': 'Meta'}
@ -343,7 +354,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('48650ed0-c189-4e1e-ad6b-1d4770c6e134')
def test_update_object_metadata_with_remove_metadata(self):
# update object metadata with remove metadata
"""Test updating object metadata with remove metadata"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
create_metadata = {'X-Object-Meta-test-meta1': 'Meta1'}
@ -366,6 +377,11 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('f726174b-2ded-4708-bff7-729d12ce1f84')
def test_update_object_metadata_with_create_and_remove_metadata(self):
"""Test updating object with creation and deletion of metadata
Update object with creation and deletion of metadata with one
request, both operations will succeed.
"""
# creation and deletion of metadata with one request
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
@ -392,8 +408,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('08854588-6449-4bb7-8cca-f2e1040f5e6f')
def test_update_object_metadata_with_x_object_manifest(self):
# update object metadata with x_object_manifest
"""Test updating object metadata with x_object_manifest"""
# uploading segments
object_name, _ = self._upload_segments()
# creating a manifest file
@ -418,7 +433,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('0dbbe89c-6811-4d84-a2df-eca2bdd40c0e')
def test_update_object_metadata_with_x_object_metakey(self):
# update object metadata with a blank value of metadata
"""Test updating object metadata with a blank value of metadata"""
object_name, _ = self.create_object(self.container_name)
update_metadata = {'X-Object-Meta-test-meta': ''}
@ -436,7 +451,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('9a88dca4-b684-425b-806f-306cd0e57e42')
def test_update_object_metadata_with_x_remove_object_metakey(self):
# update object metadata with a blank value of remove metadata
"""Test updating object metadata with blank remove metadata value"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.arbitrary_string()
create_metadata = {'X-Object-Meta-test-meta': 'Meta'}
@ -460,7 +475,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.attr(type='smoke')
@decorators.idempotent_id('9a447cf6-de06-48de-8226-a8c6ed31caf2')
def test_list_object_metadata(self):
# get object metadata
"""Test listing object metadata"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': 'Meta'}
@ -478,7 +493,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('170fb90e-f5c3-4b1f-ae1b-a18810821172')
def test_list_no_object_metadata(self):
# get empty list of object metadata
"""Test listing object metadata for object without metadata"""
object_name, _ = self.create_object(self.container_name)
resp, _ = self.object_client.list_object_metadata(
@ -489,8 +504,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('23a3674c-d6de-46c3-86af-ff92bfc8a3da')
def test_list_object_metadata_with_x_object_manifest(self):
# get object metadata with x_object_manifest
"""Test getting object metadata with x_object_manifest"""
# uploading segments
object_name, _ = self._upload_segments()
# creating a manifest file
@ -530,7 +544,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.attr(type='smoke')
@decorators.idempotent_id('02610ba7-86b7-4272-9ed8-aa8d417cb3cd')
def test_get_object(self):
# retrieve object's data (in response body)
"""Test retrieving object's data (in response body)"""
# create object
object_name, data = self.create_object(self.container_name)
@ -543,7 +557,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('005f9bf6-e06d-41ec-968e-96c78e0b1d82')
def test_get_object_with_metadata(self):
# get object with metadata
"""Test getting object with metadata"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
metadata = {'X-Object-Meta-test-meta': 'Meta'}
@ -562,7 +576,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('05a1890e-7db9-4a6c-90a8-ce998a2bddfa')
def test_get_object_with_range(self):
# get object with range
"""Test getting object with range"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes(100)
self.object_client.create_object(self.container_name,
@ -580,7 +594,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('11b4515b-7ba7-4ca8-8838-357ded86fc10')
def test_get_object_with_x_object_manifest(self):
# get object with x_object_manifest
"""Test getting object with x_object_manifest"""
# uploading segments
object_name, data_segments = self._upload_segments()
@ -623,7 +637,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('c05b4013-e4de-47af-be84-e598062b16fc')
def test_get_object_with_if_match(self):
# get object with if_match
"""Test getting object with if_match"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes(10)
create_md5 = hashlib.md5(data).hexdigest()
@ -643,7 +657,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('be133639-e5d2-4313-9b1f-2d59fc054a16')
def test_get_object_with_if_modified_since(self):
# get object with if_modified_since
"""Test getting object with if_modified_since"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
time_now = time.time()
@ -663,7 +677,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('641500d5-1612-4042-a04d-01fc4528bc30')
def test_get_object_with_if_none_match(self):
# get object with if_none_match
"""Test getting object with if_none_match"""
object_name = data_utils.rand_name(name='TestObject')
data = data_utils.random_bytes()
create_md5 = hashlib.md5(data).hexdigest()
@ -685,7 +699,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('0aa1201c-10aa-467a-bee7-63cbdd463152')
def test_get_object_with_if_unmodified_since(self):
# get object with if_unmodified_since
"""Test getting object with if_unmodified_since"""
object_name, data = self.create_object(self.container_name)
time_now = time.time()
@ -700,7 +714,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('94587078-475f-48f9-a40f-389c246e31cd')
def test_get_object_with_x_newest(self):
# get object with x_newest
"""Test getting object with x_newest"""
object_name, data = self.create_object(self.container_name)
list_metadata = {'X-Newest': 'true'}
@ -713,6 +727,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('1a9ab572-1b66-4981-8c21-416e2a5e6011')
def test_copy_object_in_same_container(self):
"""Test copying object to another object in same container"""
# create source object
src_object_name = data_utils.rand_name(name='SrcObject')
src_data = data_utils.random_bytes(size=len(src_object_name) * 2)
@ -742,7 +757,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('2248abba-415d-410b-9c30-22dff9cd6e67')
def test_copy_object_to_itself(self):
# change the content type of an existing object
"""Test changing the content type of an existing object"""
# create object
object_name, _ = self.create_object(self.container_name)
@ -769,6 +784,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('06f90388-2d0e-40aa-934c-e9a8833e958a')
def test_copy_object_2d_way(self):
"""Test copying object's data to the new object using COPY"""
# create source object
src_object_name = data_utils.rand_name(name='SrcObject')
src_data = data_utils.random_bytes(size=len(src_object_name) * 2)
@ -793,6 +809,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('aa467252-44f3-472a-b5ae-5b57c3c9c147')
def test_copy_object_across_containers(self):
"""Test copying object to another container"""
# create a container to use as a source container
src_container_name = data_utils.rand_name(name='TestSourceContainer')
self.container_client.update_container(src_container_name)
@ -837,6 +854,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('5a9e2cc6-85b6-46fc-916d-0cbb7a88e5fd')
def test_copy_object_with_x_fresh_metadata(self):
"""Test copying objectwith x_fresh_metadata"""
# create source object
metadata = {'x-object-meta-src': 'src_value'}
src_object_name, data = self.create_object(self.container_name,
@ -858,6 +876,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('a28a8b99-e701-4d7e-9d84-3b66f121460b')
def test_copy_object_with_x_object_metakey(self):
"""Test copying object with x_object_metakey"""
# create source object
metadata = {'x-object-meta-src': 'src_value'}
src_obj_name, data = self.create_object(self.container_name,
@ -881,6 +900,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('edabedca-24c3-4322-9b70-d6d9f942a074')
def test_copy_object_with_x_object_meta(self):
"""Test copying object with x_object_meta"""
# create source object
metadata = {'x-object-meta-src': 'src_value'}
src_obj_name, data = self.create_object(self.container_name,
@ -904,6 +924,7 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('e3e6a64a-9f50-4955-b987-6ce6767c97fb')
def test_object_upload_in_segments(self):
"""Test uploading object in segments"""
# create object
object_name = data_utils.rand_name(name='LObject')
data = data_utils.arbitrary_string()
@ -947,10 +968,13 @@ class ObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('50d01f12-526f-4360-9ac2-75dd508d7b68')
def test_get_object_if_different(self):
# http://en.wikipedia.org/wiki/HTTP_ETag
# Make a conditional request for an object using the If-None-Match
# header, it should get downloaded only if the local file is different,
# otherwise the response code should be 304 Not Modified
"""Test getting object content only when the local file is different
http://en.wikipedia.org/wiki/HTTP_ETag
Make a conditional request for an object using the If-None-Match
header, it should get downloaded only if the local file is different,
otherwise the response code should be 304 Not Modified
"""
object_name, data = self.create_object(self.container_name)
# local copy is identical, no download
md5 = hashlib.md5(data).hexdigest()
@ -975,6 +999,7 @@ class ObjectTest(base.BaseObjectTest):
class PublicObjectTest(base.BaseObjectTest):
"""Test public storage object"""
credentials = [['operator', CONF.object_storage.operator_role],
['operator_alt', CONF.object_storage.operator_role]]
@ -1000,9 +1025,11 @@ class PublicObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('07c9cf95-c0d4-4b49-b9c8-0ef2c9b27193')
def test_access_public_container_object_without_using_creds(self):
# make container public-readable and access an object in it object
# anonymously, without using credentials
"""Test accessing public container object without using credentials
Make container public-readable and access an object in it object
anonymously, without using credentials.
"""
# update container metadata to make it publicly readable
cont_headers = {'X-Container-Read': '.r:*,.rlistings'}
resp_meta, body = (
@ -1040,8 +1067,11 @@ class PublicObjectTest(base.BaseObjectTest):
@decorators.idempotent_id('54e2a2fe-42dc-491b-8270-8e4217dd4cdc')
def test_access_public_object_with_another_user_creds(self):
# make container public-readable and access an object in it using
# another user's credentials
"""Test accessing public object with another user's credentials
Make container public-readable and access an object in it using
another user's credentials.
"""
cont_headers = {'X-Container-Read': '.r:*,.rlistings'}
resp_meta, body = (
self.container_client.create_update_or_delete_container_metadata(

View File

@ -27,6 +27,7 @@ MIN_SEGMENT_SIZE = 1024 * 1024
class ObjectSloTest(base.BaseObjectTest):
"""Test static large object"""
def setUp(self):
super(ObjectSloTest, self).setUp()
@ -108,7 +109,7 @@ class ObjectSloTest(base.BaseObjectTest):
@decorators.idempotent_id('2c3f24a6-36e8-4711-9aa2-800ee1fc7b5b')
@utils.requires_ext(extension='slo', service='object')
def test_upload_manifest(self):
# create static large object from multipart manifest
"""Test creating static large object from multipart manifest"""
manifest = self._create_manifest()
params = {'multipart-manifest': 'put'}
@ -123,7 +124,10 @@ class ObjectSloTest(base.BaseObjectTest):
@decorators.idempotent_id('e69ad766-e1aa-44a2-bdd2-bf62c09c1456')
@utils.requires_ext(extension='slo', service='object')
def test_list_large_object_metadata(self):
# list static large object metadata using multipart manifest
"""Test listing static large object metadata
List static large object metadata using multipart manifest
"""
object_name = self._create_large_object()
resp, _ = self.object_client.list_object_metadata(
@ -135,7 +139,7 @@ class ObjectSloTest(base.BaseObjectTest):
@decorators.idempotent_id('49bc49bc-dd1b-4c0f-904e-d9f10b830ee8')
@utils.requires_ext(extension='slo', service='object')
def test_retrieve_large_object(self):
# list static large object using multipart manifest
"""Test listing static large object using multipart manifest"""
object_name = self._create_large_object()
resp, body = self.object_client.get_object(
@ -150,7 +154,7 @@ class ObjectSloTest(base.BaseObjectTest):
@decorators.idempotent_id('87b6dfa1-abe9-404d-8bf0-6c3751e6aa77')
@utils.requires_ext(extension='slo', service='object')
def test_delete_large_object(self):
# delete static large object using multipart manifest
"""Test deleting static large object using multipart manifest"""
object_name = self._create_large_object()
params_del = {'multipart-manifest': 'delete'}