8c71994805b14bca6d9a93ba209b1b5c67b8e2ab
[nivanova/samba-autobuild/.git] / testprogs / ejs / ldb.js
1 #!/bin/sh
2 exec smbscript "$0" ${1+"$@"}
3 /*
4         demonstrate access to ldb databases from ejs
5 */
6
7
8 var ldb = ldb_init();
9 var sys;
10 var options = GetOptions(ARGV, 
11                 "POPT_AUTOHELP",
12                 "POPT_COMMON_SAMBA");
13 if (options == undefined) {
14    println("Failed to parse options");
15    return -1;
16 }
17
18 libinclude("base.js");
19
20 if (options.ARGV.length != 1) {
21    println("Usage: ldb.js <prefix>");
22    return -1;
23 }
24
25 prefix = options.ARGV[0];
26
27 function basic_tests(ldb)
28 {
29         println("Running basic tests");
30         ok = ldb.add("
31 dn: cn=x,cn=test
32 objectClass: foo
33 x: 3
34 ");
35         assert(ok.error == 0);
36
37         println("Testing ldb.search");
38         var res = ldb.search("(objectClass=*)");
39         assert(res.msgs[0].objectClass[0] == "foo");
40         assert(res.msgs[0].dn == "cn=x,cn=test");
41         assert(res.msgs[0].x == 3);
42
43         ok = ldb.add("
44 dn: cn=x2,cn=test
45 objectClass: foo
46 x: 4
47 ");
48         assert(ok.error == 0);
49         var attrs = new Array("x");
50         res = ldb.search("x=4", NULL, ldb.SCOPE_DEFAULT, attrs);
51         assert(res.msgs[0].x == 4);
52         assert(res.msgs[0].objectClass == undefined);
53         assert(res.msgs[0].dn == "cn=x2,cn=test");
54
55         ok = ldb.del("cn=x,cn=test");
56         assert(ok.error == 0);
57
58         ok = ldb.rename("cn=x2,cn=test", "cn=x3,cn=test");
59         assert(ok.error == 0);
60         res = ldb.search("x=4", NULL, ldb.SCOPE_DEFAULT, attrs);
61         assert(res.msgs[0].dn == "cn=x3,cn=test");
62
63         ok = ldb.rename("cn=x3,cn=test", "cn=X3,cn=test");
64         assert(ok.error == 0);
65         res = ldb.search("x=4", NULL, ldb.SCOPE_DEFAULT, attrs);
66         assert(res.msgs[0].dn == "cn=X3,cn=test");
67
68         ok = ldb.modify("
69 dn: cn=x3,cn=test
70 changetype: modify
71 add: x
72 x: 7
73 ");
74
75         res = ldb.search("x=7");
76         assert(res.msgs.length == 1);
77         assert(res.msgs[0].x.length == 2);
78
79         /* Check a few things before we add modules */
80         assert(res.msgs[0].objectGUID == undefined);
81         assert(res.msgs[0].createTimestamp == undefined);
82         assert(res.msgs[0].whenCreated == undefined);
83
84 }
85         
86 function setup_modules(ldb)
87 {
88         ok = ldb.add("
89 dn: @MODULES
90 @LIST: rootdse,operational,rdn_name,partition
91
92 dn: @ROOTDSE
93 defaultNamingContext: cn=Test
94
95 dn: @PARTITION
96 partition: cn=SideTest:" + prefix + "/" + "testside.ldb
97 partition: cn=Sub,cn=PartTest:" + prefix + "/" + "testsub.ldb
98 partition: cn=PartTest:" + prefix + "/" + "testpartition.ldb
99 partition: cn=Sub,cn=Sub,cn=PartTest:" + prefix + "/" + "testsubsub.ldb
100 replicateEntries: @ATTRIBUTES
101 replicateEntries: @INDEXLIST
102 modules: cn=PartTest:objectguid
103 ");
104 }
105
106 /* Test the basic operation of the timestamps,objectguid and name_rdn
107    modules */
108
109 function modules_test(ldb, parttestldb) 
110 {
111         println("Running modules tests");
112
113         ok = ldb.add("
114 dn: @ATTRIBUTES
115 cn: CASE_INSENSITIVE
116 caseattr: CASE_INSENSITIVE
117 ");
118         if (ok.error != 0) {
119                 println("Failed to add: " + ok.errstr);
120                 assert(ok.error == 0);
121         }
122
123         /* Confirm that the attributes were replicated */
124         var res_attrs =  parttestldb.search("cn=*", "@ATTRIBUTES",  parttestldb.SCOPE_BASE);
125         assert(res_attrs.msgs[0].cn == "CASE_INSENSITIVE");
126
127         ok = ldb.add("
128 dn: cn=x8,cn=PartTest
129 objectClass: foo
130 x: 8
131 ");
132         if (ok.error != 0) {
133                 println("Failed to add: " + ok.errstr);
134                 assert(ok.error == 0);
135         }
136
137         ok = ldb.add("
138 dn: cn=x9,cn=PartTest
139 objectClass: foo
140 x: 9
141 cn: X9
142 ");
143         if (ok.error != 0) {
144                 println("Failed to add: " + ok.errstr);
145                 assert(ok.error == 0);
146         }
147
148         ok = ldb.add("
149 dn: cn=X9,cn=PartTest
150 objectClass: foo
151 x: 9
152 cn: X9
153 ");
154         if (ok.error == 0) {
155                 println("Should have failed to add cn=X9,cn=PartTest");
156                 assert(ok.error != 0);
157         }
158
159         var res = ldb.search("x=8", "cn=PartTest", ldb.SCOPE_DEFAULT);
160         assert(res.msgs[0].objectGUID != undefined);
161         assert(res.msgs[0].uSNCreated != undefined);
162         assert(res.msgs[0].uSNChanged != undefined);
163         assert(res.msgs[0].createTimestamp == undefined);
164         assert(res.msgs[0].whenCreated != undefined);
165         assert(res.msgs[0].name == "x8");
166         assert(res.msgs[0].cn == "x8");
167
168         /* Confirm that this ended up in the correct LDB */
169         var res_otherldb =  parttestldb.search("x=8", "cn=PartTest",  parttestldb.SCOPE_DEFAULT);
170         assert(res_otherldb.msgs[0].objectGUID != undefined);
171         assert(res_otherldb.msgs[0].createTimestamp == undefined);
172         assert(res_otherldb.msgs[0].whenCreated != undefined);
173         assert(res_otherldb.msgs[0].name == "x8");
174         assert(res_otherldb.msgs[0].cn == "x8");
175
176         var attrs = new Array("*", "createTimestamp");
177         var res2 = ldb.search("x=9", "cn=PartTest", ldb.SCOPE_DEFAULT, attrs);
178         assert(res2.msgs[0].objectGUID != undefined);
179         assert(res2.msgs[0].createTimestamp != undefined);
180         assert(res2.msgs[0].whenCreated != undefined);
181         assert(res2.msgs[0].name == "x9");
182         assert(res2.msgs[0].cn == "x9");
183
184         assert(res.msgs[0].objectGUID != res2.msgs[0].objectGUID);
185
186         var attrs = new Array("*");
187         var res3 = ldb.search("", "", ldb.SCOPE_BASE, attrs);
188         assert(res3.msgs[0].cn == undefined);
189         assert(res3.msgs[0].distinguishedName == undefined);
190         assert(res3.msgs[0].name == undefined);
191         assert(res3.msgs[0].currentTime != undefined);
192         assert(res3.msgs[0].highestCommittedUSN != undefined);
193
194         assert(res3.msgs[0].namingContexts[0] == "cn=Sub,cn=Sub,cn=PartTest");
195         assert(res3.msgs[0].namingContexts[1] == "cn=Sub,cn=PartTest");
196         assert(res3.msgs[0].namingContexts[2] == "cn=PartTest");
197         assert(res3.msgs[0].namingContexts[3] == "cn=SideTest");
198         var usn = res3.msgs[0].highestCommittedUSN;
199
200         /* Start a transaction.  We are going to abort it later, to
201          * show we clean up all partitions */
202
203         ok = ldb.transaction_start()
204         if (!ok) {
205                 println("Failed to start a transaction: " + ok.errstr);
206                 assert(ok.error == 0);
207         }
208
209         
210         ok = ldb.add("
211 dn: cn=x10,cn=parttest
212 objectClass: foo
213 x: 10
214 ");
215         if (ok.error != 0) {
216                 println("Failed to add: " + ok.errstr);
217                 assert(ok.error == 0);
218         }
219
220         var attrs = new Array("highestCommittedUSN");
221         var res4 = ldb.search("", "", ldb.SCOPE_BASE, attrs);
222         var usn2 = res4.msgs[0].highestCommittedUSN;
223         assert(usn < res4.msgs[0].highestCommittedUSN);
224
225         ok = ldb.add("
226 dn: cn=x11,cn=sub,cn=parttest
227 objectClass: foo
228 x: 11
229 ");
230         if (ok.error != 0) {
231                 println("Failed to add: " + ok.errstr);
232                 assert(ok.error == 0);
233         }
234
235         var attrs = new Array("highestCommittedUSN");
236         var res5 = ldb.search("", "", ldb.SCOPE_BASE, attrs);
237         assert(usn2 < res5.msgs[0].highestCommittedUSN);
238         
239         var attrs = new Array("*", "createTimestamp");
240         var res6 = ldb.search("x=11", "cn=parttest", ldb.SCOPE_SUB, attrs);
241         assert(res6.msgs.length == 0);
242
243         var attrs = new Array("*", "createTimestamp");
244         var res7 = ldb.search("x=10", "cn=sub,cn=parttest", ldb.SCOPE_DEFAULT, attrs);
245         assert(res7.msgs.length == 0);
246
247         var res8 = ldb.search("x=11", "cn=sub,cn=parttest", ldb.SCOPE_DEFAULT, attrs);
248         
249         assert(res8.msgs[0].objectGUID == undefined); /* The objectGUID module is not loaded here */
250         assert(res8.msgs[0].uSNCreated == undefined); /* The objectGUID module is not loaded here */
251         assert(res8.msgs[0].name == "x11");
252         assert(res8.msgs[0].cn == "x11");
253
254         ok = ldb.add("
255 dn: caseattr=XY,cn=PartTest
256 objectClass: foo
257 x: Y
258 ");
259         if (ok.error != 0) {
260                 println("Failed to add: " + ok.errstr);
261                 assert(ok.error == 0);
262         }
263
264         ok = ldb.add("
265 dn: caseattr=XZ,cn=PartTest
266 objectClass: foo
267 x: Z
268 caseattr: XZ
269 ");
270         if (ok.error != 0) {
271                 println("Failed to add: " + ok.errstr);
272                 assert(ok.error == 0);
273         }
274
275         ok = ldb.add("
276 dn: caseattr=xz,cn=PartTest
277 objectClass: foo
278 x: Z
279 caseattr: xz
280 ");
281         if (ok.error == 0) {
282                 println("Should have failed to add caseattr=xz,cn=PartTest");
283                 assert(ok.error != 0);
284         }
285
286         ok = ldb.add("
287 dn: caseattr2=XZ,cn=PartTest
288 objectClass: foo
289 x: Z
290 caseattr2: XZ
291 ");
292         if (ok.error != 0) {
293                 println("Failed to add: " + ok.errstr);
294                 assert(ok.error == 0);
295         }
296
297         ok = ldb.add("
298 dn: caseattr2=Xz,cn=PartTest
299 objectClass: foo
300 x: Z
301 caseattr2: Xz
302 ");
303         if (ok.error != 0) {
304                 println("Failed to add: " + ok.errstr);
305                 assert(ok.error == 0);
306         }
307
308         var resX = ldb.search("caseattr=xz", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
309         assert(resX.msgs.length == 1); 
310         assert(resX.msgs[0].objectGUID != undefined);
311         assert(resX.msgs[0].createTimestamp != undefined);
312         assert(resX.msgs[0].whenCreated != undefined);
313         assert(resX.msgs[0].name == "XZ");
314
315         var rescount = ldb.search("(|(caseattr=*)(cn=*))", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
316         assert(rescount.msgs.length == 5); 
317
318         /* Check this attribute is *not* case sensitive */
319         var resXcount = ldb.search("caseattr=x*", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
320         assert(resXcount.msgs.length == 2); 
321         
322         /* Check that this attribute *is* case sensitive */
323         var resXcount2 = ldb.search("caseattr2=xz", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
324         assert(resXcount2.msgs.length == 0); 
325         
326
327         /* Now abort the transaction to show that even with
328          * partitions, it is aborted everywhere */
329         ok = ldb.transaction_cancel();
330         if (!ok) {
331                 println("Failed to cancel a transaction: " + ok.errstr);
332                 assert(ok);
333         }
334
335         /* now check it all went away */
336
337         var attrs = new Array("highestCommittedUSN");
338         var res9 = ldb.search("", "", ldb.SCOPE_BASE, attrs);
339         assert(usn == res9.msgs[0].highestCommittedUSN);
340         
341         var attrs = new Array("*");
342         var res10 = ldb.search("x=11", "cn=sub,cn=parttest", ldb.SCOPE_DEFAULT, attrs);
343         assert(res10.msgs.length == 0);
344
345         var attrs = new Array("*");
346         var res11 = ldb.search("x=10", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
347         assert(res11.msgs.length == 0);
348
349         var attrs = new Array("*");
350         var res12 = ldb.search("caseattr=*", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
351         assert(res12.msgs.length == 0);
352
353 }
354
355 sys = sys_init();
356 var dbfile = "test.ldb";
357
358 sys.unlink(prefix + "/" + dbfile);
359 sys.unlink(prefix + "/" + "testpartition.ldb");
360 sys.unlink(prefix + "/" + "testsub.ldb");
361 sys.unlink(prefix + "/" + "testsubsub.ldb");
362 sys.unlink(prefix + "/" + "testside.ldb");
363
364 var ok = ldb.connect("tdb://" + prefix + "/" + dbfile);
365 assert(ok);
366
367 basic_tests(ldb);
368
369 setup_modules(ldb);
370 ldb = ldb_init();
371 var ok = ldb.connect("tdb://" + prefix + "/" + dbfile);
372 assert(ok);
373
374 parttestldb = ldb_init();
375 var ok = parttestldb.connect("tdb://" + prefix + "/" + "testpartition.ldb");
376 assert(ok);
377
378 modules_test(ldb, parttestldb);
379
380 sys.unlink(prefix + "/" + dbfile);
381 sys.unlink(prefix + "/" + "testpartition.ldb");
382 sys.unlink(prefix + "/" + "testsub.ldb");
383 sys.unlink(prefix + "/" + "testsubsub.ldb");
384 sys.unlink(prefix + "/" + "testside.ldb");
385 return 0;