linked_attribute tests: helper assert function for expected LdbError
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Tue, 24 Oct 2017 22:57:50 +0000 (11:57 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 25 Oct 2017 23:32:14 +0000 (01:32 +0200)
The logic involved in asserting that a function raises an LdbError with
a particular error value has shown itself to be too complicated for me
to repeat too often.

To test this function, you would want a put a test in a bit like this:

    def test_assertRaisesLdbError(self):
        for i in [1, 2, ldb.ERR_ENTRY_ALREADY_EXISTS, 999]:
            def f(*args, **kwargs):
                raise ldb.LdbError(i, 'msg %s' % i)
            self.assertRaisesLdbError(i, 'a message', f, 'la la', la='la')

            def f2(*args, **kwargs):
                raise ldb.LdbError(i + 1, 'msg %s' % i)
            def f3(*args, **kwargs):
                pass
            for f in (f2, f3):
                try:
                    self.assertRaisesLdbError(i, 'a message', f, 'la la', la='la')
                except AssertionError as e:
                    print i, e, f
                    pass
                else:
                    print i, f
                    self.fail('assertRaisesLdbError() failed to fail!')

..but a self-testing test-tester is getting a too meta to run in every
autobuild.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/dsdb/tests/python/linked_attributes.py

index 1923f68774962b238ad569a748e500d33c617fb1..d18a667c4fe892f512ce031ed1a4becb7138a930 100644 (file)
@@ -165,6 +165,26 @@ class LATests(samba.tests.TestCase):
                                 attrs=['objectGUID'])
         return str(misc.GUID(res[0]['objectGUID'][0]))
 
+    def assertRaisesLdbError(self, errcode, msg, f, *args, **kwargs):
+        """Assert a function raises a particular LdbError."""
+        try:
+            f(*args, **kwargs)
+        except ldb.LdbError as (num, msg):
+            if num != errcode:
+                lut = {v: k for k, v in vars(ldb).iteritems()
+                       if k.startswith('ERR_') and isinstance(v, int)}
+                self.fail("%s, expected "
+                          "LdbError %s, (%d) "
+                          "got %s (%d)" % (msg,
+                                           lut.get(errcode), errcode,
+                                           lut.get(num), num))
+        else:
+            lut = {v: k for k, v in vars(ldb).iteritems()
+                   if k.startswith('ERR_') and isinstance(v, int)}
+            self.fail("%s, expected "
+                      "LdbError %s, (%d) "
+                      "but we got success" % (msg, lut.get(errcode), errcode))
+
     def _test_la_backlinks(self, reveal=False):
         tag = 'backlinks'
         kwargs = {}
@@ -393,16 +413,10 @@ class LATests(samba.tests.TestCase):
         self.add_linked_attribute(g2, [u3, u1])
         self.add_linked_attribute(g3, u2)
 
-        try:
-            # adding u2 twice should be an error
-            self.add_linked_attribute(g2, [u1, u2, u3, u2])
-        except ldb.LdbError as (num, msg):
-            if num != ldb.ERR_ENTRY_ALREADY_EXISTS:
-                self.fail("adding duplicate values, expected "
-                          "ERR_ENTRY_ALREADY_EXISTS, (%d) "
-                          "got %d" % (ldb.ERR_ENTRY_ALREADY_EXISTS, num))
-        else:
-            self.fail("adding duplicate values succeed when it shouldn't")
+        self.assertRaisesLdbError(ldb.ERR_ENTRY_ALREADY_EXISTS,
+                                  "adding duplicate values",
+                                  self.add_linked_attribute, g2,
+                                  [u1, u2, u3, u2])
 
         self.assert_forward_links(g1, [u1, u2, u3, u4])
         self.assert_forward_links(g2, [u3, u1])
@@ -471,16 +485,11 @@ class LATests(samba.tests.TestCase):
         self.assert_back_links(u3, [g1])
         self.assert_back_links(u4, [])
 
-        try:
-            # adding u2 twice should be an error
-            self.replace_linked_attribute(g2, [u1, u2, u3, u2])
-        except ldb.LdbError as (num, msg):
-            if num != ldb.ERR_ENTRY_ALREADY_EXISTS:
-                self.fail("adding duplicate values, expected "
-                          "ERR_ENTRY_ALREADY_EXISTS, (%d) "
-                          "got %d" % (ldb.ERR_ENTRY_ALREADY_EXISTS, num))
-        else:
-            self.fail("replacing duplicate values succeeded when it shouldn't")
+        self.assertRaisesLdbError(ldb.ERR_ENTRY_ALREADY_EXISTS,
+                                  "replacing duplicate values",
+                                  self.replace_linked_attribute, g2,
+                                  [u1, u2, u3, u2])
+
 
     def test_la_links_replace2(self):
         users = self.add_objects(12, 'user', 'u_replace2')