r26480: Add utility class for testing LDB code.
[idra/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_opaque(self):
56         l = ldb.Ldb("foo.tdb")
57         l.set_opaque("my_opaque", l)
58         self.assertTrue(l.get_opaque("my_opaque") is not None)
59         self.assertEquals(None, l.get_opaque("unknown"))
60
61     def test_search_scope_base(self):
62         l = ldb.Ldb("foo.tdb")
63         self.assertEquals(len(l.search(ldb.Dn(l, "dc=foo"), 
64                           ldb.SCOPE_ONELEVEL)), 0)
65
66     def test_delete(self):
67         l = ldb.Ldb("foo.tdb")
68         self.assertRaises(ldb.LdbError, lambda: l.delete(ldb.Dn(l, "dc=foo")))
69
70     def test_contains(self):
71         l = ldb.Ldb("foo.tdb")
72         self.assertFalse(ldb.Dn(l, "dc=foo") in l)
73         l = ldb.Ldb("foo.tdb")
74         m = ldb.Message()
75         m.dn = ldb.Dn(l, "dc=foo")
76         m["b"] = ["a"]
77         l.add(m)
78         try:
79             self.assertTrue(ldb.Dn(l, "dc=foo") in l)
80         finally:
81             l.delete(m.dn)
82
83     def test_get_config_basedn(self):
84         l = ldb.Ldb("foo.tdb")
85         self.assertEquals(None, l.get_config_basedn())
86
87     def test_get_root_basedn(self):
88         l = ldb.Ldb("foo.tdb")
89         self.assertEquals(None, l.get_root_basedn())
90
91     def test_get_schema_basedn(self):
92         l = ldb.Ldb("foo.tdb")
93         self.assertEquals(None, l.get_schema_basedn())
94
95     def test_get_default_basedn(self):
96         l = ldb.Ldb("foo.tdb")
97         self.assertEquals(None, l.get_default_basedn())
98
99     def test_add(self):
100         l = ldb.Ldb("foo.tdb")
101         m = ldb.Message()
102         m.dn = ldb.Dn(l, "dc=foo")
103         m["bla"] = "bla"
104         self.assertEquals(len(l.search()), 1)
105         l.add(m)
106         try:
107             self.assertEquals(len(l.search()), 2)
108         finally:
109             l.delete(ldb.Dn(l, "dc=foo"))
110
111     def test_add_dict(self):
112         l = ldb.Ldb("foo.tdb")
113         m = {"dn": ldb.Dn(l, "dc=foo"),
114              "bla": "bla"}
115         self.assertEquals(len(l.search()), 1)
116         l.add(m)
117         try:
118             self.assertEquals(len(l.search()), 2)
119         finally:
120             l.delete(ldb.Dn(l, "dc=foo"))
121
122     def test_rename(self):
123         l = ldb.Ldb("foo.tdb")
124         m = ldb.Message()
125         m.dn = ldb.Dn(l, "dc=foo")
126         m["bla"] = "bla"
127         self.assertEquals(len(l.search()), 1)
128         l.add(m)
129         try:
130             l.rename(ldb.Dn(l, "dc=foo"), ldb.Dn(l, "dc=bar"))
131             self.assertEquals(len(l.search()), 2)
132         finally:
133             l.delete(ldb.Dn(l, "dc=bar"))
134
135     def test_modify_delete(self):
136         l = ldb.Ldb("foo.tdb")
137         m = ldb.Message()
138         m.dn = ldb.Dn(l, "dc=modify")
139         m["bla"] = ["1234"]
140         l.add(m)
141         rm = l.search(m.dn)[0]
142         self.assertEquals(["1234"], list(rm["bla"]))
143         try:
144             m = ldb.Message()
145             m.dn = ldb.Dn(l, "dc=modify")
146             m["bla"] = ldb.MessageElement([], ldb.CHANGETYPE_DELETE, "bla")
147             l.modify(m)
148             rm = l.search(m.dn)[0]
149             self.assertEquals(1, len(rm))
150         finally:
151             l.delete(ldb.Dn(l, "dc=modify"))
152
153     def test_modify_add(self):
154         l = ldb.Ldb("foo.tdb")
155         m = ldb.Message()
156         m.dn = ldb.Dn(l, "dc=modify")
157         m["bla"] = ["1234"]
158         l.add(m)
159         try:
160             m = ldb.Message()
161             m.dn = ldb.Dn(l, "dc=modify")
162             m["bla"] = ldb.MessageElement(["456"], ldb.CHANGETYPE_ADD, "bla")
163             l.modify(m)
164             rm = l.search(m.dn)[0]
165             self.assertEquals(2, len(rm))
166             self.assertEquals(["1234", "456"], list(rm["bla"]))
167         finally:
168             l.delete(ldb.Dn(l, "dc=modify"))
169
170     def test_modify_modify(self):
171         l = ldb.Ldb("foo.tdb")
172         m = ldb.Message()
173         m.dn = ldb.Dn(l, "dc=modify")
174         m["bla"] = ["1234", "456"]
175         l.add(m)
176         try:
177             m = ldb.Message()
178             m.dn = ldb.Dn(l, "dc=modify")
179             m["bla"] = ldb.MessageElement(["456"], ldb.CHANGETYPE_MODIFY, "bla")
180             l.modify(m)
181             rm = l.search(m.dn)[0]
182             self.assertEquals(2, len(rm))
183             self.assertEquals(["1234"], list(rm["bla"]))
184         finally:
185             l.delete(ldb.Dn(l, "dc=modify"))
186
187     def test_transaction_commit(self):
188         l = ldb.Ldb("foo.tdb")
189         l.transaction_start()
190         m = ldb.Message(ldb.Dn(l, "dc=foo"))
191         m["foo"] = ["bar"]
192         l.add(m)
193         l.transaction_commit()
194         l.delete(m.dn)
195
196     def test_transaction_cancel(self):
197         l = ldb.Ldb("foo.tdb")
198         l.transaction_start()
199         m = ldb.Message(ldb.Dn(l, "dc=foo"))
200         m["foo"] = ["bar"]
201         l.add(m)
202         l.transaction_cancel()
203         self.assertEquals(0, len(l.search(ldb.Dn(l, "dc=foo"))))
204
205     def test_set_debug(self):
206         def my_report_fn(level, text):
207             pass
208         l = ldb.Ldb("foo.tdb")
209         l.set_debug(my_report_fn)
210
211
212 class DnTests(unittest.TestCase):
213     def setUp(self):
214         self.ldb = ldb.Ldb("foo.tdb")
215
216     def test_str(self):
217         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
218         self.assertEquals(x.__str__(), "dc=foo,bar=bloe")
219
220     def test_get_casefold(self):
221         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
222         self.assertEquals(x.get_casefold(), "DC=FOO,BAR=bloe")
223
224     def test_validate(self):
225         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
226         self.assertTrue(x.validate())
227
228     def test_parent(self):
229         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
230         self.assertEquals("bar=bloe", x.parent().__str__())
231
232     def test_compare(self):
233         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
234         y = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
235         self.assertEquals(x, y)
236         z = ldb.Dn(self.ldb, "dc=foo,bar=blie")
237         self.assertNotEquals(z, y)
238
239     def test_is_valid(self):
240         x = ldb.Dn(self.ldb, "dc=foo,dc=bloe")
241         self.assertTrue(x.is_valid())
242         x = ldb.Dn(self.ldb, "")
243         # is_valid()'s return values appears to be a side effect of 
244         # some other ldb functions. yuck.
245         # self.assertFalse(x.is_valid())
246
247     def test_is_special(self):
248         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
249         self.assertFalse(x.is_special())
250         x = ldb.Dn(self.ldb, "@FOOBAR")
251         self.assertTrue(x.is_special())
252
253     def test_check_special(self):
254         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
255         self.assertFalse(x.check_special("FOOBAR"))
256         x = ldb.Dn(self.ldb, "@FOOBAR")
257         self.assertTrue(x.check_special("@FOOBAR"))
258
259     def test_len(self):
260         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
261         self.assertEquals(2, len(x))
262         x = ldb.Dn(self.ldb, "dc=foo")
263         self.assertEquals(1, len(x))
264
265     def test_add_child(self):
266         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
267         self.assertTrue(x.add_child(ldb.Dn(self.ldb, "bla=bloe")))
268         self.assertEquals("bla=bloe,dc=foo,bar=bloe", x.__str__())
269
270     def test_add_base(self):
271         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
272         self.assertTrue(x.add_base(ldb.Dn(self.ldb, "bla=bloe")))
273         self.assertEquals("dc=foo,bar=bloe,bla=bloe", x.__str__())
274
275     def test_add(self):
276         x = ldb.Dn(self.ldb, "dc=foo")
277         y = ldb.Dn(self.ldb, "bar=bla")
278         self.assertEquals("dc=foo,bar=bla", str(y + x))
279
280     def test_parse_ldif(self):
281         msgs = self.ldb.parse_ldif("dn: foo=bar\n")
282         msg = msgs.next()
283         self.assertEquals("foo=bar", str(msg[1].dn))
284         self.assertTrue(isinstance(msg[1], ldb.Message))
285
286     def test_parse_ldif_more(self):
287         msgs = self.ldb.parse_ldif("dn: foo=bar\n\n\ndn: bar=bar")
288         msg = msgs.next()
289         self.assertEquals("foo=bar", str(msg[1].dn))
290         msg = msgs.next()
291         self.assertEquals("bar=bar", str(msg[1].dn))
292
293     def test_canonical_string(self):
294         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
295         self.assertEquals("/bloe/foo", x.canonical_str())
296
297     def test_canonical_ex_string(self):
298         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
299         self.assertEquals("/bloe\nfoo", x.canonical_ex_str())
300
301
302 class LdbMsgTests(unittest.TestCase):
303     def setUp(self):
304         self.msg = ldb.Message()
305
306     def test_init_dn(self):
307         self.msg = ldb.Message(ldb.Dn(ldb.Ldb(), "dc=foo"))
308         self.assertEquals("dc=foo", str(self.msg.dn))
309
310     def test_len(self):
311         self.assertEquals(0, len(self.msg))
312
313     def test_notpresent(self):
314         self.assertRaises(KeyError, lambda: self.msg["foo"])
315
316     def test_del(self):
317         del self.msg["foo"]
318
319     def test_add_value(self):
320         self.assertEquals(0, len(self.msg))
321         self.msg["foo"] = ["foo"]
322         self.assertEquals(1, len(self.msg))
323
324     def test_add_value_multiple(self):
325         self.assertEquals(0, len(self.msg))
326         self.msg["foo"] = ["foo", "bla"]
327         self.assertEquals(1, len(self.msg))
328         self.assertEquals(["foo", "bla"], list(self.msg["foo"]))
329
330     def test_set_value(self):
331         self.msg["foo"] = ["fool"]
332         self.assertEquals(["fool"], list(self.msg["foo"]))
333         self.msg["foo"] = ["bar"]
334         self.assertEquals(["bar"], list(self.msg["foo"]))
335
336     def test_keys(self):
337         self.msg["foo"] = ["bla"]
338         self.msg["bar"] = ["bla"]
339         self.assertEquals(["foo", "bar"], self.msg.keys())
340
341     def test_dn(self):
342         self.msg.dn = ldb.Dn(ldb.Ldb("foo.tdb"), "@BASEINFO")
343         self.assertEquals("@BASEINFO", self.msg.dn.__str__())
344
345
346 class MessageElementTests(unittest.TestCase):
347     def test_cmp_element(self):
348         x = ldb.MessageElement(["foo"])
349         y = ldb.MessageElement(["foo"])
350         z = ldb.MessageElement(["bzr"])
351         self.assertEquals(x, y)
352         self.assertNotEquals(x, z)
353
354     def test_create_iterable(self):
355         x = ldb.MessageElement(["foo"])
356         self.assertEquals(["foo"], list(x))