python/ldb: Add __getitem__ implementation for LdbMessageElement.
[mat/samba.git] / source4 / lib / ldb / tests / python / api.py
1 #!/usr/bin/python
2 # Simple tests for the ldb python bindings.
3 # Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
4
5 import sys
6 import unittest
7
8 # Required for the standalone LDB build
9 sys.path.append("swig")
10 sys.path.append("build/lib.linux-i686-2.4")
11
12 import ldb
13
14 class NoContextTests(unittest.TestCase):
15     def test_valid_attr_name(self):
16         self.assertTrue(ldb.valid_attr_name("foo"))
17         self.assertFalse(ldb.valid_attr_name("24foo"))
18
19     def test_timestring(self):
20         self.assertEquals("19700101000000.0Z", ldb.timestring(0))
21         self.assertEquals("20071119191012.0Z", ldb.timestring(1195499412))
22
23     def test_string_to_time(self):
24         self.assertEquals(0, ldb.string_to_time("19700101000000.0Z"))
25         self.assertEquals(1195499412, ldb.string_to_time("20071119191012.0Z"))
26
27
28 class SimpleLdb(unittest.TestCase):
29     def test_connect(self):
30         ldb.Ldb("foo.tdb")
31
32     def test_connect_none(self):
33         ldb.Ldb()
34
35     def test_connect_later(self):
36         x = ldb.Ldb()
37         x.connect("foo.tdb")
38
39     def test_set_create_perms(self):
40         x = ldb.Ldb()
41         x.set_create_perms(0600)
42
43     def test_set_modules_dir(self):
44         x = ldb.Ldb()
45         x.set_modules_dir("/tmp")
46
47     def test_search(self):
48         l = ldb.Ldb("foo.tdb")
49         self.assertEquals(len(l.search()), 1)
50
51     def test_search_attrs(self):
52         l = ldb.Ldb("foo.tdb")
53         self.assertEquals(len(l.search(ldb.Dn(l, ""), ldb.SCOPE_SUBTREE, "(dc=*)", ["dc"])), 0)
54
55     def test_search_string_dn(self):
56         l = ldb.Ldb("foo.tdb")
57         self.assertEquals(len(l.search("", ldb.SCOPE_SUBTREE, "(dc=*)", ["dc"])), 0)
58
59     def test_opaque(self):
60         l = ldb.Ldb("foo.tdb")
61         l.set_opaque("my_opaque", l)
62         self.assertTrue(l.get_opaque("my_opaque") is not None)
63         self.assertEquals(None, l.get_opaque("unknown"))
64
65     def test_search_scope_base(self):
66         l = ldb.Ldb("foo.tdb")
67         self.assertEquals(len(l.search(ldb.Dn(l, "dc=foo"), 
68                           ldb.SCOPE_ONELEVEL)), 0)
69
70     def test_delete(self):
71         l = ldb.Ldb("foo.tdb")
72         self.assertRaises(ldb.LdbError, lambda: l.delete(ldb.Dn(l, "dc=foo")))
73
74     def test_contains(self):
75         l = ldb.Ldb("foo.tdb")
76         self.assertFalse(ldb.Dn(l, "dc=foo") in l)
77         l = ldb.Ldb("foo.tdb")
78         m = ldb.Message()
79         m.dn = ldb.Dn(l, "dc=foo")
80         m["b"] = ["a"]
81         l.add(m)
82         try:
83             self.assertTrue(ldb.Dn(l, "dc=foo") in l)
84         finally:
85             l.delete(m.dn)
86
87     def test_get_config_basedn(self):
88         l = ldb.Ldb("foo.tdb")
89         self.assertEquals(None, l.get_config_basedn())
90
91     def test_get_root_basedn(self):
92         l = ldb.Ldb("foo.tdb")
93         self.assertEquals(None, l.get_root_basedn())
94
95     def test_get_schema_basedn(self):
96         l = ldb.Ldb("foo.tdb")
97         self.assertEquals(None, l.get_schema_basedn())
98
99     def test_get_default_basedn(self):
100         l = ldb.Ldb("foo.tdb")
101         self.assertEquals(None, l.get_default_basedn())
102
103     def test_add(self):
104         l = ldb.Ldb("foo.tdb")
105         m = ldb.Message()
106         m.dn = ldb.Dn(l, "dc=foo")
107         m["bla"] = "bla"
108         self.assertEquals(len(l.search()), 1)
109         l.add(m)
110         try:
111             self.assertEquals(len(l.search()), 2)
112         finally:
113             l.delete(ldb.Dn(l, "dc=foo"))
114
115     def test_add_dict(self):
116         l = ldb.Ldb("foo.tdb")
117         m = {"dn": ldb.Dn(l, "dc=foo"),
118              "bla": "bla"}
119         self.assertEquals(len(l.search()), 1)
120         l.add(m)
121         try:
122             self.assertEquals(len(l.search()), 2)
123         finally:
124             l.delete(ldb.Dn(l, "dc=foo"))
125
126     def test_add_dict_string_dn(self):
127         l = ldb.Ldb("foo.tdb")
128         m = {"dn": "dc=foo", "bla": "bla"}
129         self.assertEquals(len(l.search()), 1)
130         l.add(m)
131         try:
132             self.assertEquals(len(l.search()), 2)
133         finally:
134             l.delete(ldb.Dn(l, "dc=foo"))
135
136     def test_rename(self):
137         l = ldb.Ldb("foo.tdb")
138         m = ldb.Message()
139         m.dn = ldb.Dn(l, "dc=foo")
140         m["bla"] = "bla"
141         self.assertEquals(len(l.search()), 1)
142         l.add(m)
143         try:
144             l.rename(ldb.Dn(l, "dc=foo"), ldb.Dn(l, "dc=bar"))
145             self.assertEquals(len(l.search()), 2)
146         finally:
147             l.delete(ldb.Dn(l, "dc=bar"))
148
149     def test_rename_string_dns(self):
150         l = ldb.Ldb("foo.tdb")
151         m = ldb.Message()
152         m.dn = ldb.Dn(l, "dc=foo")
153         m["bla"] = "bla"
154         self.assertEquals(len(l.search()), 1)
155         l.add(m)
156         try:
157             l.rename("dc=foo", "dc=bar")
158             self.assertEquals(len(l.search()), 2)
159         finally:
160             l.delete(ldb.Dn(l, "dc=bar"))
161
162     def test_modify_delete(self):
163         l = ldb.Ldb("foo.tdb")
164         m = ldb.Message()
165         m.dn = ldb.Dn(l, "dc=modify")
166         m["bla"] = ["1234"]
167         l.add(m)
168         rm = l.search(m.dn)[0]
169         self.assertEquals(["1234"], list(rm["bla"]))
170         try:
171             m = ldb.Message()
172             m.dn = ldb.Dn(l, "dc=modify")
173             m["bla"] = ldb.MessageElement([], ldb.CHANGETYPE_DELETE, "bla")
174             l.modify(m)
175             rm = l.search(m.dn)[0]
176             self.assertEquals(1, len(rm))
177         finally:
178             l.delete(ldb.Dn(l, "dc=modify"))
179
180     def test_modify_add(self):
181         l = ldb.Ldb("foo.tdb")
182         m = ldb.Message()
183         m.dn = ldb.Dn(l, "dc=modify")
184         m["bla"] = ["1234"]
185         l.add(m)
186         try:
187             m = ldb.Message()
188             m.dn = ldb.Dn(l, "dc=modify")
189             m["bla"] = ldb.MessageElement(["456"], ldb.CHANGETYPE_ADD, "bla")
190             l.modify(m)
191             rm = l.search(m.dn)[0]
192             self.assertEquals(2, len(rm))
193             self.assertEquals(["1234", "456"], list(rm["bla"]))
194         finally:
195             l.delete(ldb.Dn(l, "dc=modify"))
196
197     def test_modify_modify(self):
198         l = ldb.Ldb("foo.tdb")
199         m = ldb.Message()
200         m.dn = ldb.Dn(l, "dc=modify")
201         m["bla"] = ["1234", "456"]
202         l.add(m)
203         try:
204             m = ldb.Message()
205             m.dn = ldb.Dn(l, "dc=modify")
206             m["bla"] = ldb.MessageElement(["456"], ldb.CHANGETYPE_MODIFY, "bla")
207             l.modify(m)
208             rm = l.search(m.dn)[0]
209             self.assertEquals(2, len(rm))
210             self.assertEquals(["1234"], list(rm["bla"]))
211         finally:
212             l.delete(ldb.Dn(l, "dc=modify"))
213
214     def test_transaction_commit(self):
215         l = ldb.Ldb("foo.tdb")
216         l.transaction_start()
217         m = ldb.Message(ldb.Dn(l, "dc=foo"))
218         m["foo"] = ["bar"]
219         l.add(m)
220         l.transaction_commit()
221         l.delete(m.dn)
222
223     def test_transaction_cancel(self):
224         l = ldb.Ldb("foo.tdb")
225         l.transaction_start()
226         m = ldb.Message(ldb.Dn(l, "dc=foo"))
227         m["foo"] = ["bar"]
228         l.add(m)
229         l.transaction_cancel()
230         self.assertEquals(0, len(l.search(ldb.Dn(l, "dc=foo"))))
231
232     def test_set_debug(self):
233         def my_report_fn(level, text):
234             pass
235         l = ldb.Ldb("foo.tdb")
236         l.set_debug(my_report_fn)
237
238
239 class DnTests(unittest.TestCase):
240     def setUp(self):
241         self.ldb = ldb.Ldb("foo.tdb")
242
243     def test_str(self):
244         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
245         self.assertEquals(x.__str__(), "dc=foo,bar=bloe")
246
247     def test_get_casefold(self):
248         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
249         self.assertEquals(x.get_casefold(), "DC=FOO,BAR=bloe")
250
251     def test_validate(self):
252         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
253         self.assertTrue(x.validate())
254
255     def test_parent(self):
256         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
257         self.assertEquals("bar=bloe", x.parent().__str__())
258
259     def test_compare(self):
260         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
261         y = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
262         self.assertEquals(x, y)
263         z = ldb.Dn(self.ldb, "dc=foo,bar=blie")
264         self.assertNotEquals(z, y)
265
266     def test_is_valid(self):
267         x = ldb.Dn(self.ldb, "dc=foo,dc=bloe")
268         self.assertTrue(x.is_valid())
269         x = ldb.Dn(self.ldb, "")
270         # is_valid()'s return values appears to be a side effect of 
271         # some other ldb functions. yuck.
272         # self.assertFalse(x.is_valid())
273
274     def test_is_special(self):
275         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
276         self.assertFalse(x.is_special())
277         x = ldb.Dn(self.ldb, "@FOOBAR")
278         self.assertTrue(x.is_special())
279
280     def test_check_special(self):
281         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
282         self.assertFalse(x.check_special("FOOBAR"))
283         x = ldb.Dn(self.ldb, "@FOOBAR")
284         self.assertTrue(x.check_special("@FOOBAR"))
285
286     def test_len(self):
287         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
288         self.assertEquals(2, len(x))
289         x = ldb.Dn(self.ldb, "dc=foo")
290         self.assertEquals(1, len(x))
291
292     def test_add_child(self):
293         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
294         self.assertTrue(x.add_child(ldb.Dn(self.ldb, "bla=bloe")))
295         self.assertEquals("bla=bloe,dc=foo,bar=bloe", x.__str__())
296
297     def test_add_base(self):
298         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
299         self.assertTrue(x.add_base(ldb.Dn(self.ldb, "bla=bloe")))
300         self.assertEquals("dc=foo,bar=bloe,bla=bloe", x.__str__())
301
302     def test_add(self):
303         x = ldb.Dn(self.ldb, "dc=foo")
304         y = ldb.Dn(self.ldb, "bar=bla")
305         self.assertEquals("dc=foo,bar=bla", str(y + x))
306
307     def test_parse_ldif(self):
308         msgs = self.ldb.parse_ldif("dn: foo=bar\n")
309         msg = msgs.next()
310         self.assertEquals("foo=bar", str(msg[1].dn))
311         self.assertTrue(isinstance(msg[1], ldb.Message))
312
313     def test_parse_ldif_more(self):
314         msgs = self.ldb.parse_ldif("dn: foo=bar\n\n\ndn: bar=bar")
315         msg = msgs.next()
316         self.assertEquals("foo=bar", str(msg[1].dn))
317         msg = msgs.next()
318         self.assertEquals("bar=bar", str(msg[1].dn))
319
320     def test_canonical_string(self):
321         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
322         self.assertEquals("/bloe/foo", x.canonical_str())
323
324     def test_canonical_ex_string(self):
325         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
326         self.assertEquals("/bloe\nfoo", x.canonical_ex_str())
327
328
329 class LdbMsgTests(unittest.TestCase):
330     def setUp(self):
331         self.msg = ldb.Message()
332
333     def test_init_dn(self):
334         self.msg = ldb.Message(ldb.Dn(ldb.Ldb(), "dc=foo"))
335         self.assertEquals("dc=foo", str(self.msg.dn))
336
337     def test_len(self):
338         self.assertEquals(0, len(self.msg))
339
340     def test_notpresent(self):
341         self.assertRaises(KeyError, lambda: self.msg["foo"])
342
343     def test_del(self):
344         del self.msg["foo"]
345
346     def test_add_value(self):
347         self.assertEquals(0, len(self.msg))
348         self.msg["foo"] = ["foo"]
349         self.assertEquals(1, len(self.msg))
350
351     def test_add_value_multiple(self):
352         self.assertEquals(0, len(self.msg))
353         self.msg["foo"] = ["foo", "bla"]
354         self.assertEquals(1, len(self.msg))
355         self.assertEquals(["foo", "bla"], list(self.msg["foo"]))
356
357     def test_set_value(self):
358         self.msg["foo"] = ["fool"]
359         self.assertEquals(["fool"], list(self.msg["foo"]))
360         self.msg["foo"] = ["bar"]
361         self.assertEquals(["bar"], list(self.msg["foo"]))
362
363     def test_keys(self):
364         self.msg["foo"] = ["bla"]
365         self.msg["bar"] = ["bla"]
366         self.assertEquals(["foo", "bar"], self.msg.keys())
367
368     def test_dn(self):
369         self.msg.dn = ldb.Dn(ldb.Ldb("foo.tdb"), "@BASEINFO")
370         self.assertEquals("@BASEINFO", self.msg.dn.__str__())
371
372
373 class MessageElementTests(unittest.TestCase):
374     def test_cmp_element(self):
375         x = ldb.MessageElement(["foo"])
376         y = ldb.MessageElement(["foo"])
377         z = ldb.MessageElement(["bzr"])
378         self.assertEquals(x, y)
379         self.assertNotEquals(x, z)
380
381     def test_create_iterable(self):
382         x = ldb.MessageElement(["foo"])
383         self.assertEquals(["foo"], list(x))
384
385     def test_get_item(self):
386         x = ldb.MessageElement(["foo", "bar"])
387         self.assertEquals("foo", x[0])
388         self.assertEquals("bar", x[1])
389         self.assertRaises(KeyError, lambda: x[-1])
390
391 class ExampleModule:
392     name = "example"
393
394 class ModuleTests(unittest.TestCase):
395     def test_register_module(self):
396         ldb.register_module(ExampleModule())
397