r26537: Support ldb.add({'dn': 'dc=foo,bar=bla', ...}).
[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_add_dict_string_dn(self):
123         l = ldb.Ldb("foo.tdb")
124         m = {"dn": "dc=foo", "bla": "bla"}
125         self.assertEquals(len(l.search()), 1)
126         l.add(m)
127         try:
128             self.assertEquals(len(l.search()), 2)
129         finally:
130             l.delete(ldb.Dn(l, "dc=foo"))
131
132     def test_rename(self):
133         l = ldb.Ldb("foo.tdb")
134         m = ldb.Message()
135         m.dn = ldb.Dn(l, "dc=foo")
136         m["bla"] = "bla"
137         self.assertEquals(len(l.search()), 1)
138         l.add(m)
139         try:
140             l.rename(ldb.Dn(l, "dc=foo"), ldb.Dn(l, "dc=bar"))
141             self.assertEquals(len(l.search()), 2)
142         finally:
143             l.delete(ldb.Dn(l, "dc=bar"))
144
145     def test_modify_delete(self):
146         l = ldb.Ldb("foo.tdb")
147         m = ldb.Message()
148         m.dn = ldb.Dn(l, "dc=modify")
149         m["bla"] = ["1234"]
150         l.add(m)
151         rm = l.search(m.dn)[0]
152         self.assertEquals(["1234"], list(rm["bla"]))
153         try:
154             m = ldb.Message()
155             m.dn = ldb.Dn(l, "dc=modify")
156             m["bla"] = ldb.MessageElement([], ldb.CHANGETYPE_DELETE, "bla")
157             l.modify(m)
158             rm = l.search(m.dn)[0]
159             self.assertEquals(1, len(rm))
160         finally:
161             l.delete(ldb.Dn(l, "dc=modify"))
162
163     def test_modify_add(self):
164         l = ldb.Ldb("foo.tdb")
165         m = ldb.Message()
166         m.dn = ldb.Dn(l, "dc=modify")
167         m["bla"] = ["1234"]
168         l.add(m)
169         try:
170             m = ldb.Message()
171             m.dn = ldb.Dn(l, "dc=modify")
172             m["bla"] = ldb.MessageElement(["456"], ldb.CHANGETYPE_ADD, "bla")
173             l.modify(m)
174             rm = l.search(m.dn)[0]
175             self.assertEquals(2, len(rm))
176             self.assertEquals(["1234", "456"], list(rm["bla"]))
177         finally:
178             l.delete(ldb.Dn(l, "dc=modify"))
179
180     def test_modify_modify(self):
181         l = ldb.Ldb("foo.tdb")
182         m = ldb.Message()
183         m.dn = ldb.Dn(l, "dc=modify")
184         m["bla"] = ["1234", "456"]
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_MODIFY, "bla")
190             l.modify(m)
191             rm = l.search(m.dn)[0]
192             self.assertEquals(2, len(rm))
193             self.assertEquals(["1234"], list(rm["bla"]))
194         finally:
195             l.delete(ldb.Dn(l, "dc=modify"))
196
197     def test_transaction_commit(self):
198         l = ldb.Ldb("foo.tdb")
199         l.transaction_start()
200         m = ldb.Message(ldb.Dn(l, "dc=foo"))
201         m["foo"] = ["bar"]
202         l.add(m)
203         l.transaction_commit()
204         l.delete(m.dn)
205
206     def test_transaction_cancel(self):
207         l = ldb.Ldb("foo.tdb")
208         l.transaction_start()
209         m = ldb.Message(ldb.Dn(l, "dc=foo"))
210         m["foo"] = ["bar"]
211         l.add(m)
212         l.transaction_cancel()
213         self.assertEquals(0, len(l.search(ldb.Dn(l, "dc=foo"))))
214
215     def test_set_debug(self):
216         def my_report_fn(level, text):
217             pass
218         l = ldb.Ldb("foo.tdb")
219         l.set_debug(my_report_fn)
220
221
222 class DnTests(unittest.TestCase):
223     def setUp(self):
224         self.ldb = ldb.Ldb("foo.tdb")
225
226     def test_str(self):
227         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
228         self.assertEquals(x.__str__(), "dc=foo,bar=bloe")
229
230     def test_get_casefold(self):
231         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
232         self.assertEquals(x.get_casefold(), "DC=FOO,BAR=bloe")
233
234     def test_validate(self):
235         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
236         self.assertTrue(x.validate())
237
238     def test_parent(self):
239         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
240         self.assertEquals("bar=bloe", x.parent().__str__())
241
242     def test_compare(self):
243         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
244         y = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
245         self.assertEquals(x, y)
246         z = ldb.Dn(self.ldb, "dc=foo,bar=blie")
247         self.assertNotEquals(z, y)
248
249     def test_is_valid(self):
250         x = ldb.Dn(self.ldb, "dc=foo,dc=bloe")
251         self.assertTrue(x.is_valid())
252         x = ldb.Dn(self.ldb, "")
253         # is_valid()'s return values appears to be a side effect of 
254         # some other ldb functions. yuck.
255         # self.assertFalse(x.is_valid())
256
257     def test_is_special(self):
258         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
259         self.assertFalse(x.is_special())
260         x = ldb.Dn(self.ldb, "@FOOBAR")
261         self.assertTrue(x.is_special())
262
263     def test_check_special(self):
264         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
265         self.assertFalse(x.check_special("FOOBAR"))
266         x = ldb.Dn(self.ldb, "@FOOBAR")
267         self.assertTrue(x.check_special("@FOOBAR"))
268
269     def test_len(self):
270         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
271         self.assertEquals(2, len(x))
272         x = ldb.Dn(self.ldb, "dc=foo")
273         self.assertEquals(1, len(x))
274
275     def test_add_child(self):
276         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
277         self.assertTrue(x.add_child(ldb.Dn(self.ldb, "bla=bloe")))
278         self.assertEquals("bla=bloe,dc=foo,bar=bloe", x.__str__())
279
280     def test_add_base(self):
281         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
282         self.assertTrue(x.add_base(ldb.Dn(self.ldb, "bla=bloe")))
283         self.assertEquals("dc=foo,bar=bloe,bla=bloe", x.__str__())
284
285     def test_add(self):
286         x = ldb.Dn(self.ldb, "dc=foo")
287         y = ldb.Dn(self.ldb, "bar=bla")
288         self.assertEquals("dc=foo,bar=bla", str(y + x))
289
290     def test_parse_ldif(self):
291         msgs = self.ldb.parse_ldif("dn: foo=bar\n")
292         msg = msgs.next()
293         self.assertEquals("foo=bar", str(msg[1].dn))
294         self.assertTrue(isinstance(msg[1], ldb.Message))
295
296     def test_parse_ldif_more(self):
297         msgs = self.ldb.parse_ldif("dn: foo=bar\n\n\ndn: bar=bar")
298         msg = msgs.next()
299         self.assertEquals("foo=bar", str(msg[1].dn))
300         msg = msgs.next()
301         self.assertEquals("bar=bar", str(msg[1].dn))
302
303     def test_canonical_string(self):
304         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
305         self.assertEquals("/bloe/foo", x.canonical_str())
306
307     def test_canonical_ex_string(self):
308         x = ldb.Dn(self.ldb, "dc=foo,bar=bloe")
309         self.assertEquals("/bloe\nfoo", x.canonical_ex_str())
310
311
312 class LdbMsgTests(unittest.TestCase):
313     def setUp(self):
314         self.msg = ldb.Message()
315
316     def test_init_dn(self):
317         self.msg = ldb.Message(ldb.Dn(ldb.Ldb(), "dc=foo"))
318         self.assertEquals("dc=foo", str(self.msg.dn))
319
320     def test_len(self):
321         self.assertEquals(0, len(self.msg))
322
323     def test_notpresent(self):
324         self.assertRaises(KeyError, lambda: self.msg["foo"])
325
326     def test_del(self):
327         del self.msg["foo"]
328
329     def test_add_value(self):
330         self.assertEquals(0, len(self.msg))
331         self.msg["foo"] = ["foo"]
332         self.assertEquals(1, len(self.msg))
333
334     def test_add_value_multiple(self):
335         self.assertEquals(0, len(self.msg))
336         self.msg["foo"] = ["foo", "bla"]
337         self.assertEquals(1, len(self.msg))
338         self.assertEquals(["foo", "bla"], list(self.msg["foo"]))
339
340     def test_set_value(self):
341         self.msg["foo"] = ["fool"]
342         self.assertEquals(["fool"], list(self.msg["foo"]))
343         self.msg["foo"] = ["bar"]
344         self.assertEquals(["bar"], list(self.msg["foo"]))
345
346     def test_keys(self):
347         self.msg["foo"] = ["bla"]
348         self.msg["bar"] = ["bla"]
349         self.assertEquals(["foo", "bar"], self.msg.keys())
350
351     def test_dn(self):
352         self.msg.dn = ldb.Dn(ldb.Ldb("foo.tdb"), "@BASEINFO")
353         self.assertEquals("@BASEINFO", self.msg.dn.__str__())
354
355
356 class MessageElementTests(unittest.TestCase):
357     def test_cmp_element(self):
358         x = ldb.MessageElement(["foo"])
359         y = ldb.MessageElement(["foo"])
360         z = ldb.MessageElement(["bzr"])
361         self.assertEquals(x, y)
362         self.assertNotEquals(x, z)
363
364     def test_create_iterable(self):
365         x = ldb.MessageElement(["foo"])
366         self.assertEquals(["foo"], list(x))