2 # Simple tests for the ldb python API
3 # Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
6 sys.path.append("swig")
7 sys.path.append("build/lib.linux-i686-2.4")
11 class NoContextTests(unittest.TestCase):
12 def test_valid_attr_name(self):
13 self.assertTrue(ldb.valid_attr_name("foo"))
14 self.assertFalse(ldb.valid_attr_name("24foo"))
16 def test_timestring(self):
17 self.assertEquals("19700101000000.0Z", ldb.timestring(0))
18 self.assertEquals("20071119191012.0Z", ldb.timestring(1195499412))
20 def test_string_to_time(self):
21 self.assertEquals(0, ldb.string_to_time("19700101000000.0Z"))
22 self.assertEquals(1195499412, ldb.string_to_time("20071119191012.0Z"))
25 class SimpleLdb(unittest.TestCase):
26 def test_connect(self):
29 def test_connect_none(self):
32 def test_connect_later(self):
36 def test_set_create_perms(self):
38 x.set_create_perms(0600)
40 def test_set_modules_dir(self):
42 x.set_modules_dir("/tmp")
44 def test_search(self):
45 l = ldb.Ldb("foo.tdb")
46 self.assertEquals(len(l.search()), 1)
48 def test_search_attrs(self):
49 l = ldb.Ldb("foo.tdb")
50 self.assertEquals(len(l.search(ldb.Dn(l, ""), ldb.SCOPE_SUBTREE, "(dc=*)", ["dc"])), 0)
52 def test_opaque(self):
53 l = ldb.Ldb("foo.tdb")
54 l.set_opaque("my_opaque", l)
55 self.assertTrue(l.get_opaque("my_opaque") is not None)
56 self.assertEquals(None, l.get_opaque("unknown"))
58 def test_search_scope_base(self):
59 l = ldb.Ldb("foo.tdb")
60 self.assertEquals(len(l.search(ldb.Dn(l, "dc=foo"),
61 ldb.SCOPE_ONELEVEL)), 0)
63 def test_delete(self):
64 l = ldb.Ldb("foo.tdb")
65 self.assertRaises(ldb.LdbError, lambda: l.delete(ldb.Dn(l, "dc=foo")))
67 def test_contains(self):
68 l = ldb.Ldb("foo.tdb")
69 self.assertFalse(ldb.Dn(l, "dc=foo") in l)
70 l = ldb.Ldb("foo.tdb")
72 m.dn = ldb.Dn(l, "dc=foo")
76 self.assertTrue(ldb.Dn(l, "dc=foo") in l)
80 def test_get_config_basedn(self):
81 l = ldb.Ldb("foo.tdb")
82 self.assertEquals(None, l.get_config_basedn())
84 def test_get_root_basedn(self):
85 l = ldb.Ldb("foo.tdb")
86 self.assertEquals(None, l.get_root_basedn())
88 def test_get_schema_basedn(self):
89 l = ldb.Ldb("foo.tdb")
90 self.assertEquals(None, l.get_schema_basedn())
92 def test_get_default_basedn(self):
93 l = ldb.Ldb("foo.tdb")
94 self.assertEquals(None, l.get_default_basedn())
97 l = ldb.Ldb("foo.tdb")
99 m.dn = ldb.Dn(l, "dc=foo")
101 self.assertEquals(len(l.search()), 1)
104 self.assertEquals(len(l.search()), 2)
106 l.delete(ldb.Dn(l, "dc=foo"))
108 def test_add_dict(self):
109 l = ldb.Ldb("foo.tdb")
110 m = {"dn": ldb.Dn(l, "dc=foo"),
112 self.assertEquals(len(l.search()), 1)
115 self.assertEquals(len(l.search()), 2)
117 l.delete(ldb.Dn(l, "dc=foo"))
119 def test_rename(self):
120 l = ldb.Ldb("foo.tdb")
122 m.dn = ldb.Dn(l, "dc=foo")
124 self.assertEquals(len(l.search()), 1)
127 l.rename(ldb.Dn(l, "dc=foo"), ldb.Dn(l, "dc=bar"))
128 self.assertEquals(len(l.search()), 2)
130 l.delete(ldb.Dn(l, "dc=bar"))
132 def test_modify_delete(self):
133 l = ldb.Ldb("foo.tdb")
135 m.dn = ldb.Dn(l, "dc=modify")
138 rm = l.search(m.dn)[0]
139 self.assertEquals(["1234"], list(rm["bla"]))
142 m.dn = ldb.Dn(l, "dc=modify")
143 m["bla"] = ldb.MessageElement([], ldb.CHANGETYPE_DELETE, "bla")
145 rm = l.search(m.dn)[0]
146 self.assertEquals(1, len(rm))
148 l.delete(ldb.Dn(l, "dc=modify"))
150 def test_modify_add(self):
151 l = ldb.Ldb("foo.tdb")
153 m.dn = ldb.Dn(l, "dc=modify")
158 m.dn = ldb.Dn(l, "dc=modify")
159 m["bla"] = ldb.MessageElement(["456"], ldb.CHANGETYPE_ADD, "bla")
161 rm = l.search(m.dn)[0]
162 self.assertEquals(2, len(rm))
163 self.assertEquals(["1234", "456"], list(rm["bla"]))
165 l.delete(ldb.Dn(l, "dc=modify"))
167 def test_modify_modify(self):
168 l = ldb.Ldb("foo.tdb")
170 m.dn = ldb.Dn(l, "dc=modify")
171 m["bla"] = ["1234", "456"]
175 m.dn = ldb.Dn(l, "dc=modify")
176 m["bla"] = ldb.MessageElement(["456"], ldb.CHANGETYPE_MODIFY, "bla")
178 rm = l.search(m.dn)[0]
179 self.assertEquals(2, len(rm))
180 self.assertEquals(["1234"], list(rm["bla"]))
182 l.delete(ldb.Dn(l, "dc=modify"))
184 def test_transaction_commit(self):
185 l = ldb.Ldb("foo.tdb")
186 l.transaction_start()
187 m = ldb.Message(ldb.Dn(l, "dc=foo"))
190 l.transaction_commit()
193 def test_transaction_cancel(self):
194 l = ldb.Ldb("foo.tdb")
195 l.transaction_start()
196 m = ldb.Message(ldb.Dn(l, "dc=foo"))
199 l.transaction_cancel()
200 self.assertEquals(0, len(l.search(ldb.Dn(l, "dc=foo"))))
202 def test_set_debug(self):
203 def my_report_fn(level, text):
205 l = ldb.Ldb("foo.tdb")
206 l.set_debug(my_report_fn)
209 class DnTests(unittest.TestCase):
211 self.ldb = ldb.Ldb("foo.tdb")
214 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
215 self.assertEquals(x.__str__(), "dc=foo,bar=bloe")
217 def test_get_casefold(self):
218 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
219 self.assertEquals(x.get_casefold(), "DC=FOO,BAR=bloe")
221 def test_validate(self):
222 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
223 self.assertTrue(x.validate())
225 def test_parent(self):
226 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
227 self.assertEquals("bar=bloe", x.parent().__str__())
229 def test_compare(self):
230 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
231 y = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
232 self.assertEquals(x, y)
233 z = ldb.Dn(self.ldb, "dc=foo,bar=blie")
234 self.assertNotEquals(z, y)
236 def test_is_valid(self):
237 x = ldb.Dn(self.ldb, "dc=foo,dc=bloe")
238 self.assertTrue(x.is_valid())
239 x = ldb.Dn(self.ldb, "")
240 # is_valid()'s return values appears to be a side effect of
241 # some other ldb functions. yuck.
242 # self.assertFalse(x.is_valid())
244 def test_is_special(self):
245 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
246 self.assertFalse(x.is_special())
247 x = ldb.Dn(self.ldb, "@FOOBAR")
248 self.assertTrue(x.is_special())
250 def test_check_special(self):
251 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
252 self.assertFalse(x.check_special("FOOBAR"))
253 x = ldb.Dn(self.ldb, "@FOOBAR")
254 self.assertTrue(x.check_special("@FOOBAR"))
257 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
258 self.assertEquals(2, len(x))
259 x = ldb.Dn(self.ldb, "dc=foo")
260 self.assertEquals(1, len(x))
262 def test_add_child(self):
263 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
264 self.assertTrue(x.add_child(ldb.Dn(self.ldb, "bla=bloe")))
265 self.assertEquals("bla=bloe,dc=foo,bar=bloe", x.__str__())
267 def test_add_base(self):
268 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
269 self.assertTrue(x.add_base(ldb.Dn(self.ldb, "bla=bloe")))
270 self.assertEquals("dc=foo,bar=bloe,bla=bloe", x.__str__())
273 x = ldb.Dn(self.ldb, "dc=foo")
274 y = ldb.Dn(self.ldb, "bar=bla")
275 self.assertEquals("dc=foo,bar=bla", str(y + x))
277 def test_parse_ldif(self):
278 msgs = self.ldb.parse_ldif("dn: foo=bar\n")
280 self.assertEquals("foo=bar", str(msg[1].dn))
281 self.assertTrue(isinstance(msg[1], ldb.Message))
283 def test_parse_ldif_more(self):
284 msgs = self.ldb.parse_ldif("dn: foo=bar\n\n\ndn: bar=bar")
286 self.assertEquals("foo=bar", str(msg[1].dn))
288 self.assertEquals("bar=bar", str(msg[1].dn))
290 def test_canonical_string(self):
291 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
292 self.assertEquals("/bloe/foo", x.canonical_str())
294 def test_canonical_ex_string(self):
295 x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
296 self.assertEquals("/bloe\nfoo", x.canonical_ex_str())
299 class LdbMsgTests(unittest.TestCase):
301 self.msg = ldb.Message()
303 def test_init_dn(self):
304 self.msg = ldb.Message(ldb.Dn(ldb.Ldb(), "dc=foo"))
305 self.assertEquals("dc=foo", str(self.msg.dn))
308 self.assertEquals(0, len(self.msg))
310 def test_notpresent(self):
311 self.assertRaises(KeyError, lambda: self.msg["foo"])
316 def test_add_value(self):
317 self.assertEquals(0, len(self.msg))
318 self.msg["foo"] = ["foo"]
319 self.assertEquals(1, len(self.msg))
321 def test_add_value_multiple(self):
322 self.assertEquals(0, len(self.msg))
323 self.msg["foo"] = ["foo", "bla"]
324 self.assertEquals(1, len(self.msg))
325 self.assertEquals(["foo", "bla"], list(self.msg["foo"]))
327 def test_set_value(self):
328 self.msg["foo"] = ["fool"]
329 self.assertEquals(["fool"], list(self.msg["foo"]))
330 self.msg["foo"] = ["bar"]
331 self.assertEquals(["bar"], list(self.msg["foo"]))
334 self.msg["foo"] = ["bla"]
335 self.msg["bar"] = ["bla"]
336 self.assertEquals(["foo", "bar"], self.msg.keys())
339 self.msg.dn = ldb.Dn(ldb.Ldb("foo.tdb"), "@BASEINFO")
340 self.assertEquals("@BASEINFO", self.msg.dn.__str__())
343 class MessageElementTests(unittest.TestCase):
344 def test_cmp_element(self):
345 x = ldb.MessageElement(["foo"])
346 y = ldb.MessageElement(["foo"])
347 z = ldb.MessageElement(["bzr"])
348 self.assertEquals(x, y)
349 self.assertNotEquals(x, z)
351 def test_create_iterable(self):
352 x = ldb.MessageElement(["foo"])
353 self.assertEquals(["foo"], list(x))