Refactor usage of custom_match tests

For some requests a check outside of custom_match was used, thus
bug #1262534 was not completely closed.

This patch refactors part of the code to use custom_match
as far as possible and also adds some more checks.

Closes-Bug: #1262534
Change-Id: Ic0760d6d91a83bdce45ae42dd3f9d05a7bc8b6b3
diff --git a/tempest/api/object_storage/test_container_services.py b/tempest/api/object_storage/test_container_services.py
index 04de072..80dace1 100644
--- a/tempest/api/object_storage/test_container_services.py
+++ b/tempest/api/object_storage/test_container_services.py
@@ -45,6 +45,7 @@
         # create a container
         container_name = data_utils.rand_name(name='TestContainer')
         resp, _ = self.container_client.create_container(container_name)
+        self.assertHeaders(resp, 'Container', 'PUT')
         self.containers.append(container_name)
         # delete container
         resp, _ = self.container_client.delete_container(container_name)
@@ -60,12 +61,14 @@
         # create a container
         container_name = data_utils.rand_name(name='TestContainer')
         resp, _ = self.container_client.create_container(container_name)
+        self.assertHeaders(resp, 'Container', 'PUT')
         self.containers.append(container_name)
         # create object
         object_name = data_utils.rand_name(name='TestObject')
         data = data_utils.arbitrary_string()
         resp, _ = self.object_client.create_object(container_name,
                                                    object_name, data)
+        self.assertHeaders(resp, 'Object', 'PUT')
         # set object metadata
         meta_key = data_utils.rand_name(name='Meta-Test-')
         meta_value = data_utils.rand_name(name='MetaValue-')
@@ -73,6 +76,7 @@
         resp, _ = self.object_client.update_object_metadata(container_name,
                                                             object_name,
                                                             orig_metadata)
+        self.assertHeaders(resp, 'Object', 'POST')
         # get container contents list
         params = {'format': 'json'}
         resp, object_list = \
@@ -93,6 +97,7 @@
         # create a container
         container_name = data_utils.rand_name(name='TestContainer')
         resp, _ = self.container_client.create_container(container_name)
+        self.assertHeaders(resp, 'Container', 'PUT')
         self.containers.append(container_name)
         # update container metadata
         metadata = {'name': 'Pictures',
diff --git a/tempest/api/object_storage/test_object_services.py b/tempest/api/object_storage/test_object_services.py
index c7fdd0e..bdd960c 100644
--- a/tempest/api/object_storage/test_object_services.py
+++ b/tempest/api/object_storage/test_object_services.py
@@ -16,7 +16,6 @@
 #    under the License.
 
 import hashlib
-import re
 
 from tempest.api.object_storage import base
 from tempest.common import custom_matchers
@@ -277,23 +276,15 @@
         resp, _ = self.object_client.list_object_metadata(
             self.container_name, object_name)
 
-        # Check only the existence of common headers with custom matcher
-        self.assertThat(resp, custom_matchers.ExistsAllResponseHeaders(
-                        'Object', 'HEAD'))
-        self.assertIn('x-object-manifest', resp)
-
         # Etag value of a large object is enclosed in double-quotations.
-        # This is a special case, therefore the formats of response headers
-        # are checked without a custom matcher.
+        # After etag quotes are checked they are removed and the response is
+        # checked if all common headers are present and well formatted
         self.assertTrue(resp['etag'].startswith('\"'))
         self.assertTrue(resp['etag'].endswith('\"'))
-        self.assertTrue(resp['etag'].strip('\"').isalnum())
-        self.assertTrue(re.match("^\d+\.?\d*\Z", resp['x-timestamp']))
-        self.assertNotEqual(len(resp['content-type']), 0)
-        self.assertTrue(re.match("^tx[0-9a-f]*-[0-9a-f]*$",
-                                 resp['x-trans-id']))
-        self.assertNotEqual(len(resp['date']), 0)
-        self.assertEqual(resp['accept-ranges'], 'bytes')
+        resp['etag'] = resp['etag'].strip('"')
+        self.assertHeaders(resp, 'Object', 'HEAD')
+
+        self.assertIn('x-object-manifest', resp)
         self.assertEqual(resp['x-object-manifest'],
                          '%s/%s/' % (self.container_name, object_name))
 
diff --git a/tempest/api/object_storage/test_object_slo.py b/tempest/api/object_storage/test_object_slo.py
index 997120a..3b0b51d 100644
--- a/tempest/api/object_storage/test_object_slo.py
+++ b/tempest/api/object_storage/test_object_slo.py
@@ -16,7 +16,6 @@
 
 import hashlib
 import json
-import re
 
 from tempest.api.object_storage import base
 from tempest.common import custom_matchers
@@ -97,29 +96,19 @@
         return object_name
 
     def _assertHeadersSLO(self, resp, method):
-        # Check the existence of common headers with custom matcher
-        self.assertThat(resp, custom_matchers.ExistsAllResponseHeaders(
-                        'Object', method))
         # When sending GET or HEAD requests to SLO the response contains
         # 'X-Static-Large-Object' header
         if method in ('GET', 'HEAD'):
             self.assertIn('x-static-large-object', resp)
+            self.assertEqual(resp['x-static-large-object'], 'True')
 
-        # Check common headers for all HTTP methods
-        self.assertTrue(re.match("^tx[0-9a-f]*-[0-9a-f]*$",
-                                 resp['x-trans-id']))
-        self.assertTrue(resp['content-length'].isdigit())
-        self.assertNotEqual(len(resp['date']), 0)
         # Etag value of a large object is enclosed in double-quotations.
+        # After etag quotes are checked they are removed and the response is
+        # checked if all common headers are present and well formatted
         self.assertTrue(resp['etag'].startswith('\"'))
         self.assertTrue(resp['etag'].endswith('\"'))
-        self.assertTrue(resp['etag'].strip('\"').isalnum())
-        # Check header formats for a specific method
-        if method in ('GET', 'HEAD'):
-            self.assertTrue(re.match("^\d+\.?\d*\Z", resp['x-timestamp']))
-            self.assertNotEqual(len(resp['content-type']), 0)
-            self.assertEqual(resp['accept-ranges'], 'bytes')
-            self.assertEqual(resp['x-static-large-object'], 'True')
+        resp['etag'] = resp['etag'].strip('"')
+        self.assertHeaders(resp, 'Object', method)
 
     @test.attr(type='gate')
     def test_upload_manifest(self):