From d206d3bc9cc74d6872b5200a89abfa3b3a1da0cb Mon Sep 17 00:00:00 2001 From: Daisuke Morita Date: Fri, 6 Dec 2013 15:18:04 +0900 Subject: [PATCH] Check HTTP response headers of Swift middleware API in detail All HTTP response headers of APIs for each Swift middleware are checked their existence and format as those of Swift 'standard' API are. Change-Id: I45005861873af66a126a3ebe0b04dd84c9a26eda Closes-Bug: #1240856 --- tempest/api/object_storage/test_account_quotas.py | 2 ++ tempest/api/object_storage/test_container_acl.py | 13 +++++++++++++ tempest/api/object_storage/test_container_quotas.py | 1 + .../api/object_storage/test_container_staticweb.py | 12 ++++++++++++ tempest/api/object_storage/test_crossdomain.py | 10 ++++++++++ tempest/api/object_storage/test_healthcheck.py | 10 ++++++++++ tempest/api/object_storage/test_object_expiry.py | 3 +++ tempest/api/object_storage/test_object_formpost.py | 2 ++ tempest/api/object_storage/test_object_temp_url.py | 5 ++++- tempest/api/object_storage/test_object_version.py | 3 +++ 10 files changed, 60 insertions(+), 1 deletion(-) diff --git a/tempest/api/object_storage/test_account_quotas.py b/tempest/api/object_storage/test_account_quotas.py index b4128e21d..c1b33913d 100644 --- a/tempest/api/object_storage/test_account_quotas.py +++ b/tempest/api/object_storage/test_account_quotas.py @@ -107,6 +107,7 @@ class AccountQuotasTest(base.BaseObjectTest): object_name, data) self.assertEqual(resp["status"], "201") + self.assertHeaders(resp, 'Object', 'PUT') @testtools.skipIf(not accounts_quotas_available, "Account Quotas middleware not available") @@ -141,6 +142,7 @@ class AccountQuotasTest(base.BaseObjectTest): headers, "") self.assertEqual(resp["status"], "204") + self.assertHeaders(resp, 'Account', 'POST') @testtools.skipIf(not accounts_quotas_available, "Account Quotas middleware not available") diff --git a/tempest/api/object_storage/test_container_acl.py b/tempest/api/object_storage/test_container_acl.py index 18000b926..b2dc20f98 100644 --- a/tempest/api/object_storage/test_container_acl.py +++ b/tempest/api/object_storage/test_container_acl.py @@ -86,6 +86,7 @@ class ObjectTestACLs(base.BaseObjectTest): resp, _ = self.object_client.create_object( self.container_name, object_name, 'data') self.assertEqual(resp['status'], '201') + self.assertHeaders(resp, 'Object', 'PUT') # trying to get object with non authorized user token self.assertRaises(exceptions.Unauthorized, self.custom_object_client.get_object, @@ -100,6 +101,7 @@ class ObjectTestACLs(base.BaseObjectTest): resp, _ = self.object_client.create_object( self.container_name, object_name, 'data') self.assertEqual(resp['status'], '201') + self.assertHeaders(resp, 'Object', 'PUT') # trying to delete object with non-authorized user token self.assertRaises(exceptions.Unauthorized, self.custom_object_client.delete_object, @@ -115,11 +117,13 @@ class ObjectTestACLs(base.BaseObjectTest): self.container_name, metadata=cont_headers, metadata_prefix='') self.assertIn(int(resp_meta['status']), HTTP_SUCCESS) + self.assertHeaders(resp_meta, 'Container', 'POST') # create object object_name = data_utils.rand_name(name='Object') resp, _ = self.object_client.create_object(self.container_name, object_name, 'data') self.assertEqual(resp['status'], '201') + self.assertHeaders(resp, 'Object', 'PUT') # Trying to read the object without rights self.assertRaises(exceptions.Unauthorized, self.custom_object_client.get_object, @@ -135,6 +139,7 @@ class ObjectTestACLs(base.BaseObjectTest): self.container_name, metadata=cont_headers, metadata_prefix='') self.assertIn(int(resp_meta['status']), HTTP_SUCCESS) + self.assertHeaders(resp_meta, 'Container', 'POST') # Trying to write the object without rights object_name = data_utils.rand_name(name='Object') self.assertRaises(exceptions.Unauthorized, @@ -153,16 +158,19 @@ class ObjectTestACLs(base.BaseObjectTest): self.container_name, metadata=cont_headers, metadata_prefix='') self.assertIn(int(resp_meta['status']), HTTP_SUCCESS) + self.assertHeaders(resp_meta, 'Container', 'POST') # create object object_name = data_utils.rand_name(name='Object') resp, _ = self.object_client.create_object(self.container_name, object_name, 'data') self.assertEqual(resp['status'], '201') + self.assertHeaders(resp, 'Object', 'PUT') # Trying to read the object with rights resp, _ = self.custom_object_client.get_object( self.container_name, object_name, metadata=self.custom_headers) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, 'Object', 'GET') @attr(type='smoke') def test_write_object_with_rights(self): @@ -174,6 +182,7 @@ class ObjectTestACLs(base.BaseObjectTest): self.container_name, metadata=cont_headers, metadata_prefix='') self.assertIn(int(resp_meta['status']), HTTP_SUCCESS) + self.assertHeaders(resp_meta, 'Container', 'POST') # Trying to write the object with rights object_name = data_utils.rand_name(name='Object') resp, _ = self.custom_object_client.create_object( @@ -181,6 +190,7 @@ class ObjectTestACLs(base.BaseObjectTest): object_name, 'data', metadata=self.custom_headers) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, 'Object', 'PUT') @attr(type=['negative', 'smoke']) def test_write_object_without_write_rights(self): @@ -193,6 +203,7 @@ class ObjectTestACLs(base.BaseObjectTest): self.container_name, metadata=cont_headers, metadata_prefix='') self.assertIn(int(resp_meta['status']), HTTP_SUCCESS) + self.assertHeaders(resp_meta, 'Container', 'POST') # Trying to write the object without write rights object_name = data_utils.rand_name(name='Object') self.assertRaises(exceptions.Unauthorized, @@ -212,11 +223,13 @@ class ObjectTestACLs(base.BaseObjectTest): self.container_name, metadata=cont_headers, metadata_prefix='') self.assertIn(int(resp_meta['status']), HTTP_SUCCESS) + self.assertHeaders(resp_meta, 'Container', 'POST') # create object object_name = data_utils.rand_name(name='Object') resp, _ = self.object_client.create_object(self.container_name, object_name, 'data') self.assertEqual(resp['status'], '201') + self.assertHeaders(resp, 'Object', 'PUT') # Trying to delete the object without write rights self.assertRaises(exceptions.Unauthorized, self.custom_object_client.delete_object, diff --git a/tempest/api/object_storage/test_container_quotas.py b/tempest/api/object_storage/test_container_quotas.py index 04536fed7..c7b5e28ca 100644 --- a/tempest/api/object_storage/test_container_quotas.py +++ b/tempest/api/object_storage/test_container_quotas.py @@ -69,6 +69,7 @@ class ContainerQuotasTest(base.BaseObjectTest): resp, _ = self.object_client.create_object( self.container_name, object_name, data) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, 'Object', 'PUT') nafter = self._get_bytes_used() self.assertEqual(nbefore + len(data), nafter) diff --git a/tempest/api/object_storage/test_container_staticweb.py b/tempest/api/object_storage/test_container_staticweb.py index 1eea30a44..9f9abd8cf 100644 --- a/tempest/api/object_storage/test_container_staticweb.py +++ b/tempest/api/object_storage/test_container_staticweb.py @@ -15,6 +15,7 @@ # under the License. from tempest.api.object_storage import base +from tempest.common import custom_matchers from tempest.common.utils import data_utils from tempest import test @@ -60,6 +61,8 @@ class StaticWebTest(base.BaseObjectTest): resp, body = self.custom_account_client.request("GET", self.container_name) self.assertIn(int(resp['status']), test.HTTP_SUCCESS) + # This request is equivalent to GET object + self.assertHeaders(resp, 'Object', 'GET') self.assertEqual(body, self.object_data) # clean up before exiting @@ -82,6 +85,15 @@ class StaticWebTest(base.BaseObjectTest): resp, body = self.custom_account_client.request("GET", self.container_name) self.assertIn(int(resp['status']), test.HTTP_SUCCESS) + # The target of the request is not any Swift resource. Therefore, the + # existence of response header is checked without a custom matcher. + self.assertIn('content-length', resp) + self.assertIn('content-type', resp) + self.assertIn('x-trans-id', resp) + self.assertIn('date', resp) + # Check only the format of common headers with custom matcher + self.assertThat(resp, custom_matchers.AreAllWellFormatted()) + self.assertIn(self.object_name, body) # clean up before exiting diff --git a/tempest/api/object_storage/test_crossdomain.py b/tempest/api/object_storage/test_crossdomain.py index 0ae7e4671..51ecd16b7 100644 --- a/tempest/api/object_storage/test_crossdomain.py +++ b/tempest/api/object_storage/test_crossdomain.py @@ -18,6 +18,7 @@ from tempest.api.object_storage import base from tempest import clients +from tempest.common import custom_matchers from tempest import config from tempest.test import attr from tempest.test import HTTP_SUCCESS @@ -80,3 +81,12 @@ class CrossdomainTest(base.BaseObjectTest): self.assertIn(int(resp['status']), HTTP_SUCCESS) self.assertTrue(body.startswith(self.xml_start) and body.endswith(self.xml_end)) + + # The target of the request is not any Swift resource. Therefore, the + # existence of response header is checked without a custom matcher. + self.assertIn('content-length', resp) + self.assertIn('content-type', resp) + self.assertIn('x-trans-id', resp) + self.assertIn('date', resp) + # Check only the format of common headers with custom matcher + self.assertThat(resp, custom_matchers.AreAllWellFormatted()) diff --git a/tempest/api/object_storage/test_healthcheck.py b/tempest/api/object_storage/test_healthcheck.py index 798ea4f80..7bbdd1ed2 100644 --- a/tempest/api/object_storage/test_healthcheck.py +++ b/tempest/api/object_storage/test_healthcheck.py @@ -19,6 +19,7 @@ from tempest.api.object_storage import base from tempest import clients +from tempest.common import custom_matchers from tempest.test import attr from tempest.test import HTTP_SUCCESS @@ -63,3 +64,12 @@ class HealthcheckTest(base.BaseObjectTest): # The status is expected to be 200 self.assertIn(int(resp['status']), HTTP_SUCCESS) + + # The target of the request is not any Swift resource. Therefore, the + # existence of response header is checked without a custom matcher. + self.assertIn('content-length', resp) + self.assertIn('content-type', resp) + self.assertIn('x-trans-id', resp) + self.assertIn('date', resp) + # Check only the format of common headers with custom matcher + self.assertThat(resp, custom_matchers.AreAllWellFormatted()) diff --git a/tempest/api/object_storage/test_object_expiry.py b/tempest/api/object_storage/test_object_expiry.py index 6fc385312..4958f70d6 100644 --- a/tempest/api/object_storage/test_object_expiry.py +++ b/tempest/api/object_storage/test_object_expiry.py @@ -62,10 +62,13 @@ class ObjectExpiryTest(base.BaseObjectTest): self.object_client.list_object_metadata(self.container_name, object_name) self.assertEqual(resp['status'], '200') + self.assertHeaders(resp, 'Object', 'HEAD') self.assertIn('x-delete-at', resp) resp, body = self.object_client.get_object(self.container_name, object_name) self.assertEqual(resp['status'], '200') + self.assertHeaders(resp, 'Object', 'GET') + self.assertIn('x-delete-at', resp) # check data self.assertEqual(body, data) # sleep for over 5 seconds, so that object expires diff --git a/tempest/api/object_storage/test_object_formpost.py b/tempest/api/object_storage/test_object_formpost.py index 63393e4b7..817c8925f 100644 --- a/tempest/api/object_storage/test_object_formpost.py +++ b/tempest/api/object_storage/test_object_formpost.py @@ -109,11 +109,13 @@ class ObjectFormPostTest(base.BaseObjectTest): resp, body = self.object_client.http_obj.request(url, "POST", body, headers=headers) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, "Object", "POST") # Ensure object is available resp, body = self.object_client.get("%s/%s%s" % ( self.container_name, self.object_name, "testfile")) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, "Object", "GET") self.assertEqual(body, "hello world") @attr(type=['gate', 'negative']) diff --git a/tempest/api/object_storage/test_object_temp_url.py b/tempest/api/object_storage/test_object_temp_url.py index c8ce57af9..bb0393204 100644 --- a/tempest/api/object_storage/test_object_temp_url.py +++ b/tempest/api/object_storage/test_object_temp_url.py @@ -113,13 +113,14 @@ class ObjectTempUrlTest(base.BaseObjectTest): # trying to get object using temp url within expiry time resp, body = self.object_client.get_object_using_temp_url(url) - self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, 'Object', 'GET') self.assertEqual(body, self.data) # Testing a HEAD on this Temp URL resp, body = self.object_client.head(url) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, 'Object', 'HEAD') @attr(type='gate') def test_get_object_using_temp_url_key_2(self): @@ -157,10 +158,12 @@ class ObjectTempUrlTest(base.BaseObjectTest): url, new_data) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, 'Object', 'PUT') # Testing a HEAD on this Temp URL resp, body = self.object_client.head(url) self.assertIn(int(resp['status']), HTTP_SUCCESS) + self.assertHeaders(resp, 'Object', 'HEAD') # Validate that the content of the object has been modified url = self._get_temp_url(self.container_name, diff --git a/tempest/api/object_storage/test_object_version.py b/tempest/api/object_storage/test_object_version.py index c47e1b694..d706eef35 100644 --- a/tempest/api/object_storage/test_object_version.py +++ b/tempest/api/object_storage/test_object_version.py @@ -34,6 +34,7 @@ class ContainerTest(base.BaseObjectTest): def assertContainer(self, container, count, byte, versioned): resp, _ = self.container_client.list_container_metadata(container) self.assertEqual(resp['status'], ('204')) + self.assertHeaders(resp, 'Container', 'HEAD') header_value = resp.get('x-container-object-count', 'Missing Header') self.assertEqual(header_value, count) header_value = resp.get('x-container-bytes-used', 'Missing Header') @@ -49,6 +50,7 @@ class ContainerTest(base.BaseObjectTest): vers_container_name) self.containers.append(vers_container_name) self.assertIn(resp['status'], ('202', '201')) + self.assertHeaders(resp, 'Container', 'PUT') self.assertContainer(vers_container_name, '0', '0', 'Missing Header') base_container_name = data_utils.rand_name(name='TestBaseContainer') @@ -59,6 +61,7 @@ class ContainerTest(base.BaseObjectTest): metadata_prefix='') self.containers.append(base_container_name) self.assertIn(resp['status'], ('202', '201')) + self.assertHeaders(resp, 'Container', 'PUT') self.assertContainer(base_container_name, '0', '0', vers_container_name) object_name = data_utils.rand_name(name='TestObject')