From: Gary Lockyer Date: Tue, 6 Mar 2018 02:30:10 +0000 (+1300) Subject: ldb: Prepare to allow tests to operate on ldb_mdb (by using the GUID index) X-Git-Tag: ldb-1.4.0~439 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a0c7f39d67d8767d9f203dd5a1dd50b49f00a95;p=thirdparty%2Fsamba.git ldb: Prepare to allow tests to operate on ldb_mdb (by using the GUID index) The LMDB backend requires the GUID index mode, so prepare for it by setting a unique objectGUID on each record. Also prepare for the index list to be optionally set as an attribute on the test object, allowing the GUID index mode to be set later when LMDB is configured. Signed-off-by: Gary Lockyer Reviewed-by: Andrew Bartlett Autobuild-User(master): Andrew Bartlett Autobuild-Date(master): Thu May 3 11:08:12 CEST 2018 on sn-devel-144 --- diff --git a/lib/ldb/tests/python/api.py b/lib/ldb/tests/python/api.py index 6a3790afa36..c5935ba3497 100755 --- a/lib/ldb/tests/python/api.py +++ b/lib/ldb/tests/python/api.py @@ -77,6 +77,10 @@ class SimpleLdb(LdbBaseTest): self.testdir = tempdir() self.filename = os.path.join(self.testdir, "test.ldb") self.ldb = ldb.Ldb(self.url(), flags=self.flags()) + try: + self.ldb.add(self.index) + except AttributeError: + pass def tearDown(self): shutil.rmtree(self.testdir) @@ -165,6 +169,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=foo1") m["b"] = [b"a"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) self.assertRaises(ldb.LdbError, lambda: l.delete(m.dn, ["search_options:1:2"])) l.delete(m.dn) @@ -177,6 +182,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=foo3") m["b"] = ["a"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) try: self.assertTrue(ldb.Dn(l, "dc=foo3") in l) @@ -205,6 +211,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=foo4") m["bla"] = b"bla" + m["objectUUID"] = b"0123456789abcdef" self.assertEqual(len(l.search()), 0) l.add(m) try: @@ -245,6 +252,7 @@ class SimpleLdb(LdbBaseTest): m1 = ldb.Message() m1.dn = ldb.Dn(l, "dc=foo4") m1["bla"] = b"bla" + m1["objectUUID"] = b"0123456789abcdef" l.add(m1) try: s = l.search_iterator() @@ -261,6 +269,7 @@ class SimpleLdb(LdbBaseTest): m2 = ldb.Message() m2.dn = ldb.Dn(l, "dc=foo5") m2["bla"] = b"bla" + m2["objectUUID"] = b"0123456789abcdee" l.add(m2) s = l.search_iterator() @@ -317,6 +326,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=foo4") m["bla"] = "bla" + m["objectUUID"] = b"0123456789abcdef" self.assertEqual(len(l.search()), 0) l.add(m) try: @@ -335,7 +345,8 @@ class SimpleLdb(LdbBaseTest): def test_add_dict(self): l = ldb.Ldb(self.url(), flags=self.flags()) m = {"dn": ldb.Dn(l, "dc=foo5"), - "bla": b"bla"} + "bla": b"bla", + "objectUUID": b"0123456789abcdef"} self.assertEqual(len(l.search()), 0) l.add(m) try: @@ -346,7 +357,8 @@ class SimpleLdb(LdbBaseTest): def test_add_dict_text(self): l = ldb.Ldb(self.url(), flags=self.flags()) m = {"dn": ldb.Dn(l, "dc=foo5"), - "bla": "bla"} + "bla": "bla", + "objectUUID": b"0123456789abcdef"} self.assertEqual(len(l.search()), 0) l.add(m) try: @@ -356,7 +368,8 @@ class SimpleLdb(LdbBaseTest): def test_add_dict_string_dn(self): l = ldb.Ldb(self.url(), flags=self.flags()) - m = {"dn": "dc=foo6", "bla": b"bla"} + m = {"dn": "dc=foo6", "bla": b"bla", + "objectUUID": b"0123456789abcdef"} self.assertEqual(len(l.search()), 0) l.add(m) try: @@ -366,7 +379,8 @@ class SimpleLdb(LdbBaseTest): def test_add_dict_bytes_dn(self): l = ldb.Ldb(self.url(), flags=self.flags()) - m = {"dn": b"dc=foo6", "bla": b"bla"} + m = {"dn": b"dc=foo6", "bla": b"bla", + "objectUUID": b"0123456789abcdef"} self.assertEqual(len(l.search()), 0) l.add(m) try: @@ -379,6 +393,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=foo7") m["bla"] = b"bla" + m["objectUUID"] = b"0123456789abcdef" self.assertEqual(len(l.search()), 0) l.add(m) try: @@ -392,6 +407,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=foo8") m["bla"] = b"bla" + m["objectUUID"] = b"0123456789abcdef" self.assertEqual(len(l.search()), 0) l.add(m) self.assertEqual(len(l.search()), 1) @@ -406,14 +422,17 @@ class SimpleLdb(LdbBaseTest): self.assertEqual(0, len(l.search())) m = ldb.Message() m.dn = ldb.Dn(l, "dc=empty") + m["objectUUID"] = b"0123456789abcdef" l.add(m) rm = l.search() self.assertEqual(1, len(rm)) - self.assertEqual(set(["dn", "distinguishedName"]), set(rm[0].keys())) + self.assertEqual(set(["dn", "distinguishedName", "objectUUID"]), + set(rm[0].keys())) rm = l.search(m.dn) self.assertEqual(1, len(rm)) - self.assertEqual(set(["dn", "distinguishedName"]), set(rm[0].keys())) + self.assertEqual(set(["dn", "distinguishedName", "objectUUID"]), + set(rm[0].keys())) rm = l.search(m.dn, attrs=["blah"]) self.assertEqual(1, len(rm)) self.assertEqual(0, len(rm[0])) @@ -423,6 +442,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=modifydelete") m["bla"] = [b"1234"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) rm = l.search(m.dn)[0] self.assertEqual([b"1234"], list(rm["bla"])) @@ -434,7 +454,8 @@ class SimpleLdb(LdbBaseTest): l.modify(m) rm = l.search(m.dn) self.assertEqual(1, len(rm)) - self.assertEqual(set(["dn", "distinguishedName"]), set(rm[0].keys())) + self.assertEqual(set(["dn", "distinguishedName", "objectUUID"]), + set(rm[0].keys())) rm = l.search(m.dn, attrs=["bla"]) self.assertEqual(1, len(rm)) self.assertEqual(0, len(rm[0])) @@ -446,6 +467,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=modifydelete") m.text["bla"] = ["1234"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) rm = l.search(m.dn)[0] self.assertEqual(["1234"], list(rm.text["bla"])) @@ -457,7 +479,8 @@ class SimpleLdb(LdbBaseTest): l.modify(m) rm = l.search(m.dn) self.assertEqual(1, len(rm)) - self.assertEqual(set(["dn", "distinguishedName"]), set(rm[0].keys())) + self.assertEqual(set(["dn", "distinguishedName", "objectUUID"]), + set(rm[0].keys())) rm = l.search(m.dn, attrs=["bla"]) self.assertEqual(1, len(rm)) self.assertEqual(0, len(rm[0])) @@ -469,6 +492,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=add") m["bla"] = [b"1234"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) try: m = ldb.Message() @@ -477,7 +501,7 @@ class SimpleLdb(LdbBaseTest): self.assertEqual(ldb.FLAG_MOD_ADD, m["bla"].flags()) l.modify(m) rm = l.search(m.dn)[0] - self.assertEqual(2, len(rm)) + self.assertEqual(3, len(rm)) self.assertEqual([b"1234", b"456"], list(rm["bla"])) finally: l.delete(ldb.Dn(l, "dc=add")) @@ -487,6 +511,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=add") m.text["bla"] = ["1234"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) try: m = ldb.Message() @@ -495,7 +520,7 @@ class SimpleLdb(LdbBaseTest): self.assertEqual(ldb.FLAG_MOD_ADD, m["bla"].flags()) l.modify(m) rm = l.search(m.dn)[0] - self.assertEqual(2, len(rm)) + self.assertEqual(3, len(rm)) self.assertEqual(["1234", "456"], list(rm.text["bla"])) finally: l.delete(ldb.Dn(l, "dc=add")) @@ -505,6 +530,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=modify2") m["bla"] = [b"1234", b"456"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) try: m = ldb.Message() @@ -513,7 +539,7 @@ class SimpleLdb(LdbBaseTest): self.assertEqual(ldb.FLAG_MOD_REPLACE, m["bla"].flags()) l.modify(m) rm = l.search(m.dn)[0] - self.assertEqual(2, len(rm)) + self.assertEqual(3, len(rm)) self.assertEqual([b"789"], list(rm["bla"])) rm = l.search(m.dn, attrs=["bla"])[0] self.assertEqual(1, len(rm)) @@ -525,6 +551,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=modify2") m.text["bla"] = ["1234", "456"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) try: m = ldb.Message() @@ -533,7 +560,7 @@ class SimpleLdb(LdbBaseTest): self.assertEqual(ldb.FLAG_MOD_REPLACE, m["bla"].flags()) l.modify(m) rm = l.search(m.dn)[0] - self.assertEqual(2, len(rm)) + self.assertEqual(3, len(rm)) self.assertEqual(["789"], list(rm.text["bla"])) rm = l.search(m.dn, attrs=["bla"])[0] self.assertEqual(1, len(rm)) @@ -545,6 +572,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=add") m["bla"] = [b"1234"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) try: m = ldb.Message() @@ -553,7 +581,7 @@ class SimpleLdb(LdbBaseTest): self.assertEqual(ldb.FLAG_MOD_ADD, m["bla"].flags()) l.modify(m) rm = l.search(m.dn)[0] - self.assertEqual(2, len(rm)) + self.assertEqual(3, len(rm)) self.assertEqual([b"1234", b"456"], list(rm["bla"])) # Now create another modify, but switch the flags before we do it @@ -571,6 +599,7 @@ class SimpleLdb(LdbBaseTest): m = ldb.Message() m.dn = ldb.Dn(l, "dc=add") m.text["bla"] = ["1234"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) try: m = ldb.Message() @@ -579,7 +608,7 @@ class SimpleLdb(LdbBaseTest): self.assertEqual(ldb.FLAG_MOD_ADD, m["bla"].flags()) l.modify(m) rm = l.search(m.dn)[0] - self.assertEqual(2, len(rm)) + self.assertEqual(3, len(rm)) self.assertEqual(["1234", "456"], list(rm.text["bla"])) # Now create another modify, but switch the flags before we do it @@ -597,6 +626,7 @@ class SimpleLdb(LdbBaseTest): l.transaction_start() m = ldb.Message(ldb.Dn(l, "dc=foo9")) m["foo"] = [b"bar"] + m["objectUUID"] = b"0123456789abcdef" l.add(m) l.transaction_commit() l.delete(m.dn) @@ -606,6 +636,7 @@ class SimpleLdb(LdbBaseTest): l.transaction_start() m = ldb.Message(ldb.Dn(l, "dc=foo10")) m["foo"] = [b"bar"] + m["objectUUID"] = b"0123456789abcdee" l.add(m) l.transaction_cancel() self.assertEqual(0, len(l.search(ldb.Dn(l, "dc=foo10")))) @@ -625,6 +656,7 @@ class SimpleLdb(LdbBaseTest): "cN" : b"LDAPtestUSER", "givenname" : b"ldap", "displayname" : b"foo\0bar", + "objectUUID" : b"0123456789abcdef" }) res = l.search(expression="(dn=dc=somedn)") self.assertEqual(b"foo\0bar", res[0]["displayname"][0]) @@ -649,6 +681,10 @@ class SearchTests(LdbBaseTest): self.l = ldb.Ldb(self.url(), flags=self.flags(), options=["modules:rdn_name"]) + try: + self.l.add(self.index) + except AttributeError: + pass self.l.add({"dn": "@ATTRIBUTES", "DC": "CASE_INSENSITIVE"}) @@ -660,7 +696,7 @@ class SearchTests(LdbBaseTest): self.l.add({"dn": "DC=SAMBA,DC=ORG", "name": b"samba.org", - "objectUUID": b"0123456789abcddf"}) + "objectUUID": b"0123456789abcdef"}) self.l.add({"dn": "OU=ADMIN,DC=SAMBA,DC=ORG", "name": b"Admins", "x": "z", "y": "a", @@ -1108,12 +1144,12 @@ class GUIDIndexedSearchTests(SearchTests): """Test searches using the index, to ensure the index doesn't break things""" def setUp(self): + self.index = {"dn": "@INDEXLIST", + "@IDXATTR": [b"x", b"y", b"ou"], + "@IDXGUID": [b"objectUUID"], + "@IDX_DN_GUID": [b"GUID"]} super(GUIDIndexedSearchTests, self).setUp() - self.l.add({"dn": "@INDEXLIST", - "@IDXATTR": [b"x", b"y", b"ou"], - "@IDXGUID": [b"objectUUID"], - "@IDX_DN_GUID": [b"GUID"]}) self.IDXGUID = True self.IDXONE = True @@ -1122,15 +1158,14 @@ class GUIDIndexedDNFilterSearchTests(SearchTests): """Test searches using the index, to ensure the index doesn't break things""" def setUp(self): + self.index = {"dn": "@INDEXLIST", + "@IDXATTR": [b"x", b"y", b"ou"], + "@IDXGUID": [b"objectUUID"], + "@IDX_DN_GUID": [b"GUID"]} super(GUIDIndexedDNFilterSearchTests, self).setUp() self.l.add({"dn": "@OPTIONS", "disallowDNFilter": "TRUE"}) self.disallowDNFilter = True - - self.l.add({"dn": "@INDEXLIST", - "@IDXATTR": [b"x", b"y", b"ou"], - "@IDXGUID": [b"objectUUID"], - "@IDX_DN_GUID": [b"GUID"]}) self.IDX = True self.IDXGUID = True @@ -1138,16 +1173,14 @@ class GUIDAndOneLevelIndexedSearchTests(SearchTests): """Test searches using the index including @IDXONE, to ensure the index doesn't break things""" def setUp(self): + self.index = {"dn": "@INDEXLIST", + "@IDXATTR": [b"x", b"y", b"ou"], + "@IDXGUID": [b"objectUUID"], + "@IDX_DN_GUID": [b"GUID"]} super(GUIDAndOneLevelIndexedSearchTests, self).setUp() self.l.add({"dn": "@OPTIONS", "disallowDNFilter": "TRUE"}) self.disallowDNFilter = True - - self.l.add({"dn": "@INDEXLIST", - "@IDXATTR": [b"x", b"y", b"ou"], - "@IDXONE": [b"1"], - "@IDXGUID": [b"objectUUID"], - "@IDX_DN_GUID": [b"GUID"]}) self.IDX = True self.IDXGUID = True self.IDXONE = True @@ -1168,6 +1201,11 @@ class AddModifyTests(LdbBaseTest): self.l = ldb.Ldb(self.url(), flags=self.flags(), options=["modules:rdn_name"]) + try: + self.l.add(self.index) + except AttributeError: + pass + self.l.add({"dn": "DC=SAMBA,DC=ORG", "name": b"samba.org", "objectUUID": b"0123456789abcdef"}) @@ -1313,10 +1351,11 @@ class IndexedAddModifyTests(AddModifyTests): """Test searches using the index, to ensure the index doesn't break things""" def setUp(self): + if not hasattr(self, 'index'): + self.index = {"dn": "@INDEXLIST", + "@IDXATTR": [b"x", b"y", b"ou", b"objectUUID"], + "@IDXONE": [b"1"]} super(IndexedAddModifyTests, self).setUp() - self.l.add({"dn": "@INDEXLIST", - "@IDXATTR": [b"x", b"y", b"ou", b"objectUUID"], - "@IDXONE": [b"1"]}) def test_duplicate_GUID(self): try: @@ -1390,14 +1429,12 @@ class GUIDIndexedAddModifyTests(IndexedAddModifyTests): """Test searches using the index, to ensure the index doesn't break things""" def setUp(self): + self.index = {"dn": "@INDEXLIST", + "@IDXATTR": [b"x", b"y", b"ou"], + "@IDXONE": [b"1"], + "@IDXGUID": [b"objectUUID"], + "@IDX_DN_GUID": [b"GUID"]} super(GUIDIndexedAddModifyTests, self).setUp() - indexlist = {"dn": "@INDEXLIST", - "@IDXATTR": [b"x", b"y", b"ou"], - "@IDXONE": [b"1"], - "@IDXGUID": [b"objectUUID"], - "@IDX_DN_GUID": [b"GUID"]} - m = ldb.Message.from_dict(self.l, indexlist, ldb.FLAG_MOD_REPLACE) - self.l.modify(m) class GUIDTransIndexedAddModifyTests(GUIDIndexedAddModifyTests): @@ -2198,19 +2235,36 @@ class LdbResultTests(LdbBaseTest): self.testdir = tempdir() self.filename = os.path.join(self.testdir, "test.ldb") self.l = ldb.Ldb(self.url(), flags=self.flags()) - self.l.add({"dn": "DC=SAMBA,DC=ORG", "name": b"samba.org"}) - self.l.add({"dn": "OU=ADMIN,DC=SAMBA,DC=ORG", "name": b"Admins"}) - self.l.add({"dn": "OU=USERS,DC=SAMBA,DC=ORG", "name": b"Users"}) - self.l.add({"dn": "OU=OU1,DC=SAMBA,DC=ORG", "name": b"OU #1"}) - self.l.add({"dn": "OU=OU2,DC=SAMBA,DC=ORG", "name": b"OU #2"}) - self.l.add({"dn": "OU=OU3,DC=SAMBA,DC=ORG", "name": b"OU #3"}) - self.l.add({"dn": "OU=OU4,DC=SAMBA,DC=ORG", "name": b"OU #4"}) - self.l.add({"dn": "OU=OU5,DC=SAMBA,DC=ORG", "name": b"OU #5"}) - self.l.add({"dn": "OU=OU6,DC=SAMBA,DC=ORG", "name": b"OU #6"}) - self.l.add({"dn": "OU=OU7,DC=SAMBA,DC=ORG", "name": b"OU #7"}) - self.l.add({"dn": "OU=OU8,DC=SAMBA,DC=ORG", "name": b"OU #8"}) - self.l.add({"dn": "OU=OU9,DC=SAMBA,DC=ORG", "name": b"OU #9"}) - self.l.add({"dn": "OU=OU10,DC=SAMBA,DC=ORG", "name": b"OU #10"}) + try: + self.l.add(self.index) + except AttributeError: + pass + self.l.add({"dn": "DC=SAMBA,DC=ORG", "name": b"samba.org", + "objectUUID": b"0123456789abcde0"}) + self.l.add({"dn": "OU=ADMIN,DC=SAMBA,DC=ORG", "name": b"Admins", + "objectUUID": b"0123456789abcde1"}) + self.l.add({"dn": "OU=USERS,DC=SAMBA,DC=ORG", "name": b"Users", + "objectUUID": b"0123456789abcde2"}) + self.l.add({"dn": "OU=OU1,DC=SAMBA,DC=ORG", "name": b"OU #1", + "objectUUID": b"0123456789abcde3"}) + self.l.add({"dn": "OU=OU2,DC=SAMBA,DC=ORG", "name": b"OU #2", + "objectUUID": b"0123456789abcde4"}) + self.l.add({"dn": "OU=OU3,DC=SAMBA,DC=ORG", "name": b"OU #3", + "objectUUID": b"0123456789abcde5"}) + self.l.add({"dn": "OU=OU4,DC=SAMBA,DC=ORG", "name": b"OU #4", + "objectUUID": b"0123456789abcde6"}) + self.l.add({"dn": "OU=OU5,DC=SAMBA,DC=ORG", "name": b"OU #5", + "objectUUID": b"0123456789abcde7"}) + self.l.add({"dn": "OU=OU6,DC=SAMBA,DC=ORG", "name": b"OU #6", + "objectUUID": b"0123456789abcde8"}) + self.l.add({"dn": "OU=OU7,DC=SAMBA,DC=ORG", "name": b"OU #7", + "objectUUID": b"0123456789abcde9"}) + self.l.add({"dn": "OU=OU8,DC=SAMBA,DC=ORG", "name": b"OU #8", + "objectUUID": b"0123456789abcdea"}) + self.l.add({"dn": "OU=OU9,DC=SAMBA,DC=ORG", "name": b"OU #9", + "objectUUID": b"0123456789abcdeb"}) + self.l.add({"dn": "OU=OU10,DC=SAMBA,DC=ORG", "name": b"OU #10", + "objectUUID": b"0123456789abcdec"}) def tearDown(self): shutil.rmtree(self.testdir) @@ -2311,7 +2365,8 @@ class LdbResultTests(LdbBaseTest): # write to it child_ldb.add({"dn": "OU=OU11,DC=SAMBA,DC=ORG", - "name": b"samba.org"}) + "name": b"samba.org", + "objectUUID": b"o123456789acbdef"}) os.write(w1, b"added") @@ -2382,7 +2437,8 @@ class LdbResultTests(LdbBaseTest): # write to it child_ldb.add({"dn": "OU=OU11,DC=SAMBA,DC=ORG", - "name": b"samba.org"}) + "name": b"samba.org", + "objectUUID": b"o123456789acbdef"}) os.write(w1, b"added")