The branch, master has been updated
       via  3d47fc749ae ldb:test:api_search: shift remaining setUp adds to 
class add_index
       via  45137017af3 ldb:test:api_search: remove pass-through setUp()s
       via  1871eb9d1cb ldb:test:api_search: use @unittest.skipIf for LMDB tests
       via  235c7d15ef5 ldb:test:api_search: skip LMDB tests at class level
       via  d9225d2460e ldb:test:api_search: use class method to add index
       via  f7269c2fa36 ldb:test:api_search: tidy up files in each subclass
       via  2029cd7a7b9 ldb:test:api_search: set up the database once and use 
copies
       via  98d408be865 ldb:test:api_search: use test name as db name
       via  146540a1286 ldb:test:api_search: put config options on class, not 
instance.
       via  69a00fd0d77 ldb:test:api_search: improve attribute access tests
       via  b08427d086c ldb:test:api_base: make flags method a class method
       via  8d97ce958fe ldb:test:api_base: simplify prefix selection
       via  83f3afaac42 ldb:tests:index: use abi_base
       via  0c968d374aa ldb:tests:crash: rationalise imports
       via  102660e7d19 ldb:tests:api_simple uses conventional 4 space indent
       via  b932143c8d5 ldb:tests:repack: use common api_base variables
       via  ccc732dae29 ldb:tests:api_misc: fix Control test
       via  c706021d551 ldb:tests: move api.py to api_misc
       via  081125f3b31 ldb:tests: make api_simple module
       via  565eba4120b ldb:tests: make api_add_modify module
       via  e4410ada212 ldb:tests: make api_search module
       via  6e947a20ee4 ldb:tests: make api_base module
       via  16820c883d1 ldb:tests:api.py uses .disconnect before rmdir
       via  09d9680f5ee ldb:pytest:api: remove unnecessary super() parameters
       via  b1fd6e2b073 ldb:pytest:api: remove pass-though tearDowns
       via  64e3c5cba96 ldb:py bindings: ldb.Ldb().__str__ prints connection URL
      from  25a222225db ctdb: Use str_list_add_printf() in lock_helper_args()

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 3d47fc749aef6822f11036ae3f93d11886c4f9bc
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Thu Aug 29 12:52:13 2024 +1200

    ldb:test:api_search: shift remaining setUp adds to class add_index
    
    Before:
    
    ldb.python.api_search -> 52
    ldb.python.api_search.tr -> 48
    
    After:
    
    ldb.python.api_search.tr -> 10
    ldb.python.api_search -> 9
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    
    Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org>
    Autobuild-Date(master): Tue Sep 24 10:38:03 UTC 2024 on atb-devel-224

commit 45137017af3860be31f974c711e96efa95d6b61c
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Thu Aug 29 12:39:09 2024 +1200

    ldb:test:api_search: remove pass-through setUp()s
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 1871eb9d1cbc94c2a429f7db630e4b124f49a0ed
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Thu Aug 29 12:38:27 2024 +1200

    ldb:test:api_search: use @unittest.skipIf for LMDB tests
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 235c7d15ef516685d86763229fed7803805ad272
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Thu Aug 29 12:23:55 2024 +1200

    ldb:test:api_search: skip LMDB tests at class level
    
    LMDB is not going to turn up midway through the testsuite, so we might
    as well skip the whole class
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit d9225d2460eb5887c6a16b5443c4f33d3c208aee
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sun Aug 18 11:03:54 2024 +1200

    ldb:test:api_search: use class method to add index
    
    The index attribute of these classes was a mutable object, which made
    me nervous. If a subclass were to alter the class.index (rather than
    replace it), it would affect tests in other subclasses.
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit f7269c2fa364aaa6a46d75f1df584d333ba7d13e
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Thu Aug 29 11:05:28 2024 +1200

    ldb:test:api_search: tidy up files in each subclass
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 2029cd7a7b962749607e65c0cdd20d0e4c7bb206
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 20:21:36 2024 +1200

    ldb:test:api_search: set up the database once and use copies
    
    The api_search tests are really slow, in part because we populate the
    database identically for all the individual tests. We can instead do
    it once and use copies.
    
    This makes the test several times faster.
    Comparing "make test TESTS=ldb.python":
    
    Before:
    
    TOP 10 slowest tests
    ldb.python.api_search.tr -> 415
    ldb.python.api_search -> 413
    ldb.python.api_add_modify -> 5
    ldb.python.api_add_modify.tr -> 4
    ldb.python.index.tr -> 4
    ldb.python.index -> 4
    ldb.python.api_simple.tr -> 2
    ldb.python.api_simple -> 2
    ldb.python.repack -> 2
    ldb.python.api_misc.tr -> 1
    'testonly' finished successfully (14m13.276s)
    
    After:
    
    TOP 10 slowest tests
    ldb.python.api_search.tr -> 52
    ldb.python.api_search -> 50
    ldb.python.api_add_modify -> 7
    ldb.python.api_add_modify.tr -> 7
    ldb.python.index.tr -> 4
    ldb.python.index -> 4
    ldb.python.api_simple -> 4
    ldb.python.api_simple.tr -> 2
    ldb.python.repack -> 2
    ldb.python.api_misc -> 1
    'testonly' finished successfully (2m14.505s)
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 98d408be8657c3e201141369a069a3e086f805b2
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Thu Aug 29 10:56:38 2024 +1200

    ldb:test:api_search: use test name as db name
    
    This will help enusre we are using the right DB when (in the next
    commit) we set up the database for each test via copy. It also helps
    with debugging.
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 146540a12867a50a3c2eca9752bdf8789d5dd5f0
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 20:47:39 2024 +1200

    ldb:test:api_search: put config options on class, not instance.
    
    This makes them available to class methods.
    
    In a later commit we will convert the index attribute into an
    add_index() class method, because having a mutable variable on a class
    is a slightly bad idea.
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 69a00fd0d770c9fd3f45c5b43514c2acc8f927ce
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 20:18:02 2024 +1200

    ldb:test:api_search: improve attribute access tests
    
    `list = res.msgs` tests nothing more than a bare `res.msgs`,
    and we can instead assert that the result is a list.
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit b08427d086ce3d4e9fd1bda9ed69cd367ee18904
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 20:49:23 2024 +1200

    ldb:test:api_base: make flags method a class method
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 8d97ce958fe8328d2f3c365d73fc440142c353bb
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 20:12:11 2024 +1200

    ldb:test:api_base: simplify prefix selection
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 83f3afaac42ff7d2606c380b59c94f55b377fae0
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 18:13:00 2024 +1200

    ldb:tests:index: use abi_base
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 0c968d374aa9c621a4df937f5f09d0c27d5b689c
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 18:10:33 2024 +1200

    ldb:tests:crash: rationalise imports
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 102660e7d1975f9cc3bd4c3984eae9306d03acc4
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 18:10:02 2024 +1200

    ldb:tests:api_simple uses conventional 4 space indent
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit b932143c8d56cfc6bbfff47f7db585540378671b
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 18:09:11 2024 +1200

    ldb:tests:repack: use common api_base variables
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit ccc732dae294351e7c5caeb779be70e7afbf6139
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 18:08:09 2024 +1200

    ldb:tests:api_misc: fix Control test
    
    `self.assertRaises(TypeError, ldb.Control, ldb, 1234)` is raising a
    TypeError because `ldb` is not an ldb.Ldb object, it is the ldb module.
    
    What we want to test here is that the non-string `1234` raises a
    TypeError -- the previous line tests the type of the ldb argument.
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit c706021d551f1bc9b1e09b7109cb9bfa50d18c2d
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 14:48:57 2024 +1200

    ldb:tests: move api.py to api_misc
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 081125f3b319ca8807f0f4d9b5f279ab4dacced5
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 14:46:05 2024 +1200

    ldb:tests: make api_simple module
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 565eba4120bccbd0a50ccb04653d6b386315f676
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 14:42:24 2024 +1200

    ldb:tests: make api_add_modify module
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit e4410ada21292a5652228d1b692a1aeb38d182c8
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 14:41:18 2024 +1200

    ldb:tests: make api_search module
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 6e947a20ee4a2a30aa63c5cea135fa34d94e330c
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 14:35:48 2024 +1200

    ldb:tests: make api_base module
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 16820c883d19572c0e25e84de4d408f2f3e16421
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Sat Aug 17 13:27:52 2024 +1200

    ldb:tests:api.py uses .disconnect before rmdir
    
    super.tearDown() was removing the tmpdir, but because self.ldb had
    the file open, the directory was not cleared.
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 09d9680f5ee25cd8db7903a2ca0a60c492b4b6cc
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Fri Aug 16 14:21:20 2024 +1200

    ldb:pytest:api: remove unnecessary super() parameters
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit b1fd6e2b07360a631ac123a595c454474f985058
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Fri Aug 16 14:06:53 2024 +1200

    ldb:pytest:api: remove pass-though tearDowns
    
    The result is exactly the same, unless we previously had the wrong
    class name in the pass-through, in which case the result is *probably*
    the same, only more correct.
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 64e3c5cba965fa8b0625a7165b98610418518818
Author: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
Date:   Mon Aug 19 12:19:22 2024 +1200

    ldb:py bindings: ldb.Ldb().__str__ prints connection URL
    
    before:  "<ldb connection>"
    after:   "<ldb connection tdb:///path/to/samdb.ldb>"
    
    Signed-off-by: Douglas Bagnall <douglas.bagn...@catalyst.net.nz>
    Reviewed-by: Andreas Schneider <a...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 lib/ldb/pyldb.c                        |    7 +-
 lib/ldb/tests/python/api.py            | 3912 --------------------------------
 lib/ldb/tests/python/api_add_modify.py |  376 +++
 lib/ldb/tests/python/api_base.py       |   43 +
 lib/ldb/tests/python/api_misc.py       | 1047 +++++++++
 lib/ldb/tests/python/api_search.py     | 1741 ++++++++++++++
 lib/ldb/tests/python/api_simple.py     |  752 ++++++
 lib/ldb/tests/python/crash.py          |    3 +-
 lib/ldb/tests/python/index.py          |   18 +-
 lib/ldb/tests/python/repack.py         |   17 +-
 selftest/tests.py                      |   35 +-
 11 files changed, 4009 insertions(+), 3942 deletions(-)
 delete mode 100755 lib/ldb/tests/python/api.py
 create mode 100644 lib/ldb/tests/python/api_add_modify.py
 create mode 100644 lib/ldb/tests/python/api_base.py
 create mode 100644 lib/ldb/tests/python/api_misc.py
 create mode 100644 lib/ldb/tests/python/api_search.py
 create mode 100644 lib/ldb/tests/python/api_simple.py


Changeset truncated at 500 lines:

diff --git a/lib/ldb/pyldb.c b/lib/ldb/pyldb.c
index 53b855990bb..bf433288206 100644
--- a/lib/ldb/pyldb.c
+++ b/lib/ldb/pyldb.c
@@ -1342,7 +1342,12 @@ static PyObject 
*py_ldb_setup_wellknown_attributes(PyLdbObject *self,
 
 static PyObject *py_ldb_repr(PyLdbObject *self)
 {
-       return PyUnicode_FromString("<ldb connection>");
+       struct ldb_context *ldb_ctx = pyldb_Ldb_AS_LDBCONTEXT(self);
+       const char *url = ldb_get_opaque(ldb_ctx, "ldb_url");
+       if (url == NULL) {
+               url = "no connection";
+       }
+       return PyUnicode_FromFormat("<ldb connection %s>", url);
 }
 
 static PyObject *py_ldb_get_root_basedn(PyLdbObject *self,
diff --git a/lib/ldb/tests/python/api.py b/lib/ldb/tests/python/api.py
deleted file mode 100755
index bdd69f07734..00000000000
--- a/lib/ldb/tests/python/api.py
+++ /dev/null
@@ -1,3912 +0,0 @@
-#!/usr/bin/env python3
-# Simple tests for the ldb python bindings.
-# Copyright (C) 2007 Jelmer Vernooij <jel...@samba.org>
-
-import os
-from unittest import TestCase
-import sys
-sys.path.insert(0, "bin/python")
-import gc
-import time
-import ldb
-import shutil
-import errno
-
-
-TDB_PREFIX = "tdb://"
-MDB_PREFIX = "mdb://"
-
-MDB_INDEX_OBJ = {
-    "dn": "@INDEXLIST",
-    "@IDXONE": [b"1"],
-    "@IDXGUID": [b"objectUUID"],
-    "@IDX_DN_GUID": [b"GUID"]
-}
-
-
-def tempdir():
-    import tempfile
-    try:
-        dir_prefix = os.path.join(os.environ["SELFTEST_PREFIX"], "tmp")
-    except KeyError:
-        dir_prefix = None
-    return tempfile.mkdtemp(dir=dir_prefix)
-
-
-class NoContextTests(TestCase):
-
-    def test_valid_attr_name(self):
-        self.assertTrue(ldb.valid_attr_name("foo"))
-        self.assertFalse(ldb.valid_attr_name("24foo"))
-
-    def test_timestring(self):
-        self.assertEqual("19700101000000.0Z", ldb.timestring(0))
-        self.assertEqual("20071119191012.0Z", ldb.timestring(1195499412))
-
-        self.assertEqual("00000101000000.0Z", ldb.timestring(-62167219200))
-        self.assertEqual("99991231235959.0Z", ldb.timestring(253402300799))
-
-        # should result with OSError EOVERFLOW from gmtime()
-        with self.assertRaises(OSError) as err:
-            ldb.timestring(-62167219201)
-        self.assertEqual(err.exception.errno, errno.EOVERFLOW)
-        with self.assertRaises(OSError) as err:
-            ldb.timestring(253402300800)
-        self.assertEqual(err.exception.errno, errno.EOVERFLOW)
-        with self.assertRaises(OSError) as err:
-            ldb.timestring(0x7fffffffffffffff)
-        self.assertEqual(err.exception.errno, errno.EOVERFLOW)
-
-    def test_string_to_time(self):
-        self.assertEqual(0, ldb.string_to_time("19700101000000.0Z"))
-        self.assertEqual(-1, ldb.string_to_time("19691231235959.0Z"))
-        self.assertEqual(1195499412, ldb.string_to_time("20071119191012.0Z"))
-
-        self.assertEqual(-62167219200, ldb.string_to_time("00000101000000.0Z"))
-        self.assertEqual(253402300799, ldb.string_to_time("99991231235959.0Z"))
-
-    def test_binary_encode(self):
-        encoded = ldb.binary_encode(b'test\\x')
-        decoded = ldb.binary_decode(encoded)
-        self.assertEqual(decoded, b'test\\x')
-
-        encoded2 = ldb.binary_encode('test\\x')
-        self.assertEqual(encoded2, encoded)
-
-
-class LdbBaseTest(TestCase):
-    def setUp(self):
-        super(LdbBaseTest, self).setUp()
-        try:
-            if self.prefix is None:
-                self.prefix = TDB_PREFIX
-        except AttributeError:
-            self.prefix = TDB_PREFIX
-
-    def tearDown(self):
-        super(LdbBaseTest, self).tearDown()
-
-    def url(self):
-        return self.prefix + self.filename
-
-    def flags(self):
-        if self.prefix == MDB_PREFIX:
-            return ldb.FLG_NOSYNC
-        else:
-            return 0
-
-
-class SimpleLdb(LdbBaseTest):
-
-    def setUp(self):
-        super(SimpleLdb, self).setUp()
-        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)
-        super(SimpleLdb, self).tearDown()
-        # Ensure the LDB is closed now, so we close the FD
-        del(self.ldb)
-
-    def test_connect(self):
-        ldb.Ldb(self.url(), flags=self.flags())
-
-    def test_connect_none(self):
-        ldb.Ldb()
-
-    def test_connect_later(self):
-        x = ldb.Ldb()
-        x.connect(self.url(), flags=self.flags())
-
-    def test_connect_twice(self):
-        url = self.url()
-        x = ldb.Ldb(url)
-        with self.assertRaises(ldb.LdbError):
-            x.connect(url, flags=self.flags())
-
-    def test_connect_twice_later(self):
-        url = self.url()
-        flags = self.flags()
-        x = ldb.Ldb()
-        x.connect(url, flags)
-        with self.assertRaises(ldb.LdbError):
-            x.connect(url, flags)
-
-    def test_connect_and_disconnect(self):
-        url = self.url()
-        flags = self.flags()
-        x = ldb.Ldb()
-        x.connect(url, flags)
-        x.disconnect()
-        x.connect(url, flags)
-        x.disconnect()
-
-    def test_repr(self):
-        x = ldb.Ldb()
-        self.assertTrue(repr(x).startswith("<ldb connection"))
-
-    def test_set_create_perms(self):
-        x = ldb.Ldb()
-        x.set_create_perms(0o600)
-
-    def test_search(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(len(l.search()), 0)
-
-    def test_search_controls(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(len(l.search(controls=["paged_results:0:5"])), 0)
-
-    def test_utf8_ldb_Dn(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        dn = ldb.Dn(l, (b'a=' + 
b'\xc4\x85\xc4\x87\xc4\x99\xc5\x82\xc5\x84\xc3\xb3\xc5\x9b\xc5\xba\xc5\xbc').decode('utf8'))
-
-    def test_utf8_encoded_ldb_Dn(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        dn_encoded_utf8 = b'a=' + 
b'\xc4\x85\xc4\x87\xc4\x99\xc5\x82\xc5\x84\xc3\xb3\xc5\x9b\xc5\xba\xc5\xbc'
-        try:
-            dn = ldb.Dn(l, dn_encoded_utf8)
-        except UnicodeDecodeError as e:
-                raise
-        except TypeError as te:
-           p3errors = ["argument 2 must be str, not bytes",
-                       "Can't convert 'bytes' object to str implicitly"]
-           self.assertIn(str(te), p3errors)
-
-    def test_search_attrs(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(len(l.search(ldb.Dn(l, ""), ldb.SCOPE_SUBTREE, 
"(dc=*)", ["dc"])), 0)
-
-    def test_search_string_dn(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(len(l.search("", ldb.SCOPE_SUBTREE, "(dc=*)", 
["dc"])), 0)
-
-    def test_search_attr_string(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertRaises(TypeError, l.search, attrs="dc")
-        self.assertRaises(TypeError, l.search, attrs=b"dc")
-
-    def test_opaque(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        l.set_opaque("my_opaque", True)
-        self.assertTrue(l.get_opaque("my_opaque") is not None)
-        self.assertEqual(None, l.get_opaque("unknown"))
-
-    def test_opaque_bool(self):
-        """Test that we can set boolean opaque values."""
-
-        db = ldb.Ldb(self.url(), flags=self.flags())
-        name = "my_opaque"
-
-        db.set_opaque(name, False)
-        self.assertEqual(False, db.get_opaque(name))
-
-        db.set_opaque(name, True)
-        self.assertEqual(True, db.get_opaque(name))
-
-    def test_opaque_int(self):
-        """Test that we can set (positive) integer opaque values."""
-
-        db = ldb.Ldb(self.url(), flags=self.flags())
-        name = "my_opaque"
-
-        db.set_opaque(name, 0)
-        self.assertEqual(0, db.get_opaque(name))
-
-        db.set_opaque(name, 12345678)
-        self.assertEqual(12345678, db.get_opaque(name))
-
-        # Negative values can’t be set.
-        self.assertRaises(OverflowError, db.set_opaque, name, -99999)
-
-    def test_opaque_string(self):
-        """Test that we can set string opaque values."""
-
-        db = ldb.Ldb(self.url(), flags=self.flags())
-        name = "my_opaque"
-
-        db.set_opaque(name, "")
-        self.assertEqual("", db.get_opaque(name))
-
-        db.set_opaque(name, "foo bar")
-        self.assertEqual("foo bar", db.get_opaque(name))
-
-    def test_opaque_none(self):
-        """Test that we can set an opaque to None to effectively unset it."""
-
-        db = ldb.Ldb(self.url(), flags=self.flags())
-        name = "my_opaque"
-
-        # An opaque that has not been set is the same as None.
-        self.assertIsNone(db.get_opaque(name))
-
-        # Give the opaque a value.
-        db.set_opaque(name, 3)
-        self.assertEqual(3, db.get_opaque(name))
-
-        # Test that we can set the opaque to None to unset it.
-        db.set_opaque(name, None)
-        self.assertIsNone(db.get_opaque(name))
-
-    def test_opaque_unsupported(self):
-        """Test that trying to set unsupported values raises an error."""
-
-        db = ldb.Ldb(self.url(), flags=self.flags())
-        name = "my_opaque"
-
-        self.assertRaises(ValueError, db.set_opaque, name, [])
-        self.assertRaises(ValueError, db.set_opaque, name, ())
-        self.assertRaises(ValueError, db.set_opaque, name, 3.14)
-        self.assertRaises(ValueError, db.set_opaque, name, 3+2j)
-        self.assertRaises(ValueError, db.set_opaque, name, b'foo')
-
-    def test_search_scope_base_empty_db(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(len(l.search(ldb.Dn(l, "dc=foo1"),
-                                      ldb.SCOPE_BASE)), 0)
-
-    def test_search_scope_onelevel_empty_db(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(len(l.search(ldb.Dn(l, "dc=foo1"),
-                                      ldb.SCOPE_ONELEVEL)), 0)
-
-    def test_delete(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertRaises(ldb.LdbError, lambda: l.delete(ldb.Dn(l, "dc=foo2")))
-
-    def test_delete_w_unhandled_ctrl(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        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)
-
-    def test_contains(self):
-        name = self.url()
-        l = ldb.Ldb(name, flags=self.flags())
-        self.assertFalse(ldb.Dn(l, "dc=foo3") in l)
-        l = ldb.Ldb(name, flags=self.flags())
-        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)
-            self.assertFalse(ldb.Dn(l, "dc=foo4") in l)
-        finally:
-            l.delete(m.dn)
-
-    def test_get_config_basedn(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(None, l.get_config_basedn())
-
-    def test_get_root_basedn(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(None, l.get_root_basedn())
-
-    def test_get_schema_basedn(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(None, l.get_schema_basedn())
-
-    def test_get_default_basedn(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        self.assertEqual(None, l.get_default_basedn())
-
-    def test_add(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        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:
-            self.assertEqual(len(l.search()), 1)
-        finally:
-            l.delete(ldb.Dn(l, "dc=foo4"))
-
-    def test_search_iterator(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        s = l.search_iterator()
-        s.abandon()
-        try:
-            for me in s:
-                self.fail()
-            self.fail()
-        except RuntimeError as re:
-            pass
-        try:
-            s.abandon()
-            self.fail()
-        except RuntimeError as re:
-            pass
-        try:
-            s.result()
-            self.fail()
-        except RuntimeError as re:
-            pass
-
-        s = l.search_iterator()
-        count = 0
-        for me in s:
-            self.assertTrue(isinstance(me, ldb.Message))
-            count += 1
-        r = s.result()
-        self.assertEqual(len(r), 0)
-        self.assertEqual(count, 0)
-
-        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()
-            msgs = []
-            for me in s:
-                self.assertTrue(isinstance(me, ldb.Message))
-                count += 1
-                msgs.append(me)
-            r = s.result()
-            self.assertEqual(len(r), 0)
-            self.assertEqual(len(msgs), 1)
-            self.assertEqual(msgs[0].dn, m1.dn)
-
-            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()
-            msgs = []
-            for me in s:
-                self.assertTrue(isinstance(me, ldb.Message))
-                count += 1
-                msgs.append(me)
-            r = s.result()
-            self.assertEqual(len(r), 0)
-            self.assertEqual(len(msgs), 2)
-            if msgs[0].dn == m1.dn:
-                self.assertEqual(msgs[0].dn, m1.dn)
-                self.assertEqual(msgs[1].dn, m2.dn)
-            else:
-                self.assertEqual(msgs[0].dn, m2.dn)
-                self.assertEqual(msgs[1].dn, m1.dn)
-
-            s = l.search_iterator()
-            msgs = []
-            for me in s:
-                self.assertTrue(isinstance(me, ldb.Message))
-                count += 1
-                msgs.append(me)
-                break
-            try:
-                s.result()
-                self.fail()
-            except RuntimeError as re:
-                pass
-            for me in s:
-                self.assertTrue(isinstance(me, ldb.Message))
-                count += 1
-                msgs.append(me)
-                break
-            for me in s:
-                self.fail()
-
-            r = s.result()
-            self.assertEqual(len(r), 0)
-            self.assertEqual(len(msgs), 2)
-            if msgs[0].dn == m1.dn:
-                self.assertEqual(msgs[0].dn, m1.dn)
-                self.assertEqual(msgs[1].dn, m2.dn)
-            else:
-                self.assertEqual(msgs[0].dn, m2.dn)
-                self.assertEqual(msgs[1].dn, m1.dn)
-        finally:
-            l.delete(ldb.Dn(l, "dc=foo4"))
-            l.delete(ldb.Dn(l, "dc=foo5"))
-
-    def test_add_text(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        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:
-            self.assertEqual(len(l.search()), 1)
-        finally:
-            l.delete(ldb.Dn(l, "dc=foo4"))
-
-    def test_add_w_unhandled_ctrl(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        m = ldb.Message()
-        m.dn = ldb.Dn(l, "dc=foo4")
-        m["bla"] = b"bla"
-        self.assertEqual(len(l.search()), 0)
-        self.assertRaises(ldb.LdbError, lambda: l.add(m, 
["search_options:1:2"]))
-
-    def test_add_dict(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        m = {"dn": ldb.Dn(l, "dc=foo5"),
-             "bla": b"bla",
-             "objectUUID": b"0123456789abcdef"}
-        self.assertEqual(len(l.search()), 0)
-        l.add(m)
-        try:
-            self.assertEqual(len(l.search()), 1)
-        finally:
-            l.delete(ldb.Dn(l, "dc=foo5"))
-
-    def test_add_dict_text(self):
-        l = ldb.Ldb(self.url(), flags=self.flags())
-        m = {"dn": ldb.Dn(l, "dc=foo5"),
-             "bla": "bla",


-- 
Samba Shared Repository

Reply via email to