rename packaging => packaging4
[Samba.git] / testprogs / ejs / ldb.js
blob8c71994805b14bca6d9a93ba209b1b5c67b8e2ab
1 #!/bin/sh
2 exec smbscript "$0" ${1+"$@"}
3 /*
4         demonstrate access to ldb databases from ejs
5 */
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;
18 libinclude("base.js");
20 if (options.ARGV.length != 1) {
21    println("Usage: ldb.js <prefix>");
22    return -1;
25 prefix = options.ARGV[0];
27 function basic_tests(ldb)
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);
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);
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");
55         ok = ldb.del("cn=x,cn=test");
56         assert(ok.error == 0);
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");
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");
68         ok = ldb.modify("
69 dn: cn=x3,cn=test
70 changetype: modify
71 add: x
72 x: 7
73 ");
75         res = ldb.search("x=7");
76         assert(res.msgs.length == 1);
77         assert(res.msgs[0].x.length == 2);
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);
85         
86 function setup_modules(ldb)
88         ok = ldb.add("
89 dn: @MODULES
90 @LIST: rootdse,operational,rdn_name,partition
92 dn: @ROOTDSE
93 defaultNamingContext: cn=Test
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
106 /* Test the basic operation of the timestamps,objectguid and name_rdn
107    modules */
109 function modules_test(ldb, parttestldb) 
111         println("Running modules tests");
113         ok = ldb.add("
114 dn: @ATTRIBUTES
115 cn: CASE_INSENSITIVE
116 caseattr: CASE_INSENSITIVE
118         if (ok.error != 0) {
119                 println("Failed to add: " + ok.errstr);
120                 assert(ok.error == 0);
121         }
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");
127         ok = ldb.add("
128 dn: cn=x8,cn=PartTest
129 objectClass: foo
130 x: 8
132         if (ok.error != 0) {
133                 println("Failed to add: " + ok.errstr);
134                 assert(ok.error == 0);
135         }
137         ok = ldb.add("
138 dn: cn=x9,cn=PartTest
139 objectClass: foo
140 x: 9
141 cn: X9
143         if (ok.error != 0) {
144                 println("Failed to add: " + ok.errstr);
145                 assert(ok.error == 0);
146         }
148         ok = ldb.add("
149 dn: cn=X9,cn=PartTest
150 objectClass: foo
151 x: 9
152 cn: X9
154         if (ok.error == 0) {
155                 println("Should have failed to add cn=X9,cn=PartTest");
156                 assert(ok.error != 0);
157         }
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");
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");
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");
184         assert(res.msgs[0].objectGUID != res2.msgs[0].objectGUID);
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);
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;
200         /* Start a transaction.  We are going to abort it later, to
201          * show we clean up all partitions */
203         ok = ldb.transaction_start()
204         if (!ok) {
205                 println("Failed to start a transaction: " + ok.errstr);
206                 assert(ok.error == 0);
207         }
209         
210         ok = ldb.add("
211 dn: cn=x10,cn=parttest
212 objectClass: foo
213 x: 10
215         if (ok.error != 0) {
216                 println("Failed to add: " + ok.errstr);
217                 assert(ok.error == 0);
218         }
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);
225         ok = ldb.add("
226 dn: cn=x11,cn=sub,cn=parttest
227 objectClass: foo
228 x: 11
230         if (ok.error != 0) {
231                 println("Failed to add: " + ok.errstr);
232                 assert(ok.error == 0);
233         }
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);
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);
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");
254         ok = ldb.add("
255 dn: caseattr=XY,cn=PartTest
256 objectClass: foo
257 x: Y
259         if (ok.error != 0) {
260                 println("Failed to add: " + ok.errstr);
261                 assert(ok.error == 0);
262         }
264         ok = ldb.add("
265 dn: caseattr=XZ,cn=PartTest
266 objectClass: foo
267 x: Z
268 caseattr: XZ
270         if (ok.error != 0) {
271                 println("Failed to add: " + ok.errstr);
272                 assert(ok.error == 0);
273         }
275         ok = ldb.add("
276 dn: caseattr=xz,cn=PartTest
277 objectClass: foo
278 x: Z
279 caseattr: xz
281         if (ok.error == 0) {
282                 println("Should have failed to add caseattr=xz,cn=PartTest");
283                 assert(ok.error != 0);
284         }
286         ok = ldb.add("
287 dn: caseattr2=XZ,cn=PartTest
288 objectClass: foo
289 x: Z
290 caseattr2: XZ
292         if (ok.error != 0) {
293                 println("Failed to add: " + ok.errstr);
294                 assert(ok.error == 0);
295         }
297         ok = ldb.add("
298 dn: caseattr2=Xz,cn=PartTest
299 objectClass: foo
300 x: Z
301 caseattr2: Xz
303         if (ok.error != 0) {
304                 println("Failed to add: " + ok.errstr);
305                 assert(ok.error == 0);
306         }
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");
315         var rescount = ldb.search("(|(caseattr=*)(cn=*))", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
316         assert(rescount.msgs.length == 5); 
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         
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         }
335         /* now check it all went away */
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);
345         var attrs = new Array("*");
346         var res11 = ldb.search("x=10", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
347         assert(res11.msgs.length == 0);
349         var attrs = new Array("*");
350         var res12 = ldb.search("caseattr=*", "cn=parttest", ldb.SCOPE_DEFAULT, attrs);
351         assert(res12.msgs.length == 0);
355 sys = sys_init();
356 var dbfile = "test.ldb";
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");
364 var ok = ldb.connect("tdb://" + prefix + "/" + dbfile);
365 assert(ok);
367 basic_tests(ldb);
369 setup_modules(ldb);
370 ldb = ldb_init();
371 var ok = ldb.connect("tdb://" + prefix + "/" + dbfile);
372 assert(ok);
374 parttestldb = ldb_init();
375 var ok = parttestldb.connect("tdb://" + prefix + "/" + "testpartition.ldb");
376 assert(ok);
378 modules_test(ldb, parttestldb);
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;