]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test_volume_client: rewrite test_put_object_versioned
authorRishabh Dave <ridave@redhat.com>
Fri, 21 Jun 2019 10:13:07 +0000 (15:43 +0530)
committerRishabh Dave <ridave@redhat.com>
Sat, 13 Jul 2019 06:13:03 +0000 (11:43 +0530)
The test's success depends on whether CommandFailedError exception is
raised. This manner of testing is unreliable since there's no way to
check if the exception was raised by the statement (in the embedded
Python program) the test expects to.

This implies that this test's failure may go undetected. This is primary
reason why bugs like tracker #38946 occured despite of having a test.

Fixes: http://tracker.ceph.com/issues/39510
Signed-off-by: Rishabh Dave <ridave@redhat.com>
qa/tasks/cephfs/test_volume_client.py

index 9bb9342b2f1f4adaea6ab6828841a58e2c9590c0..8558c9c755d5c970a787176c7dfacea59ff4371d 100644 (file)
@@ -36,6 +36,7 @@ class TestVolumeClient(CephFSTestCase):
 from __future__ import print_function
 from ceph_volume_client import CephFSVolumeClient, VolumePath
 from sys import version_info as sys_version_info
+from rados import OSError as rados_OSError
 import logging
 log = logging.getLogger("ceph_volume_client")
 log.addHandler(logging.StreamHandler())
@@ -976,24 +977,30 @@ vc.disconnect()
 
         # Test if put_object_versioned() crosschecks the version of the
         # given object. Being a negative test, an exception is expected.
-        with self.assertRaises(CommandFailedError):
-            self._volume_client_python(vc_mount, dedent("""
-                data, version = vc.get_object_and_version("{pool_name}", "{obj_name}")
+        expected_exception = 'rados_OSError'
+        output = self._volume_client_python(vc_mount, dedent("""
+            data, version = vc.get_object_and_version("{pool_name}", "{obj_name}")
 
-                if sys_version_info.major < 3:
-                    data = data + 'm1'
-                elif sys_version_info.major > 3:
-                    data = str.encode(data.decode('utf-8') + 'm1')
+            if sys_version_info.major < 3:
+                data = data + 'm1'
+            elif sys_version_info.major > 3:
+                data = str.encode(data.decode('utf-8') + 'm1')
 
-                vc.put_object("{pool_name}", "{obj_name}", data)
+            vc.put_object("{pool_name}", "{obj_name}", data)
 
-                if sys_version_info.major < 3:
-                    data = data + 'm2'
-                elif sys_version_info.major > 3:
-                    data = str.encode(data.decode('utf-8') + 'm2')
+            if sys_version_info.major < 3:
+                data = data + 'm2'
+            elif sys_version_info.major > 3:
+                data = str.encode(data.decode('utf-8') + 'm2')
 
+            try:
                 vc.put_object_versioned("{pool_name}", "{obj_name}", data, version)
-            """).format(pool_name=pool_name, obj_name=obj_name))
+            except {expected_exception}:
+                print('{expected_exception} raised')
+        """).format(pool_name=pool_name, obj_name=obj_name,
+                    expected_exception=expected_exception))
+        self.assertEqual(expected_exception + ' raised', output)
+
 
     def test_delete_object(self):
         vc_mount = self.mounts[1]