r23719: ejs being case sensitive, while LDAP is not is a real pain when
[ira/wip.git] / testprogs / ejs / ldap.js
1 #!/bin/sh
2 exec smbscript "$0" ${1+"$@"}
3 /*
4         test certin LDAP behaviours
5 */
6
7 var ldb = ldb_init();
8 var gc_ldb = ldb_init();
9
10 var options = GetOptions(ARGV, 
11                 "POPT_AUTOHELP",
12                 "POPT_COMMON_SAMBA",
13                 "POPT_COMMON_CREDENTIALS");
14 if (options == undefined) {
15    println("Failed to parse options");
16    return -1;
17 }
18
19 libinclude("base.js");
20
21 if (options.ARGV.length != 1) {
22    println("Usage: ldap.js <HOST>");
23    return -1;
24 }
25
26 var host = options.ARGV[0];
27
28 function basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
29 {
30         println("Running basic tests");
31
32         ldb.del("cn=ldaptestuser,cn=users," + base_dn);
33
34         var ok = ldb.add("
35 dn: cn=ldaptestuser,cn=users," + base_dn + "
36 objectClass: user
37 objectClass: person
38 cn: LDAPtestUSER
39 ");
40         if (ok.error != 0) {
41                 ok = ldb.del("cn=ldaptestuser,cn=users," + base_dn);
42                 if (ok.error != 0) {
43                         println(ok.errstr);
44                         assert(ok.error == 0);
45                 }
46                 ok = ldb.add("
47 dn: cn=ldaptestuser,cn=users," + base_dn + "
48 objectClass: user
49 objectClass: person
50 cn: LDAPtestUSER
51 ");
52                 if (ok.error != 0) {
53                         println(ok.errstr);
54                         assert(ok.error == 0);
55                 }
56         }
57
58         var ok = ldb.add("
59 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
60 objectClass: computer
61 cn: LDAPtestCOMPUTER
62 ");
63         if (ok.error != 0) {
64                 ok = ldb.del("cn=ldaptestcomputer,cn=computers," + base_dn);
65                 if (ok.error != 0) {
66                         println(ok.errstr);
67                         assert(ok.error == 0);
68                 }
69                 ok = ldb.add("
70 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
71 objectClass: computer
72 cn: LDAPtestCOMPUTER
73 ");
74                 if (ok.error != 0) {
75                         println(ok.errstr);
76                         assert(ok.error == 0);
77                 }
78         }
79
80         var ok = ldb.add("
81 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
82 objectClass: computer
83 cn: LDAPtest2COMPUTER
84 userAccountControl: 4096
85 ");
86         if (ok.error != 0) {
87                 ok = ldb.del("cn=ldaptest2computer,cn=computers," + base_dn);
88                 if (ok.error != 0) {
89                         println(ok.errstr);
90                         assert(ok.error == 0);
91                 }
92                 ok = ldb.add("
93 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
94 objectClass: computer
95 cn: LDAPtest2COMPUTER
96 userAccountControl: 4096
97 ");
98                 if (ok.error != 0) {
99                         println(ok.errstr);
100                         assert(ok.error == 0);
101                 }
102         }
103
104         ok = ldb.add("
105 dn: cn=ldaptestuser2,cn=users," + base_dn + "
106 objectClass: person
107 objectClass: user
108 cn: LDAPtestUSER2
109 ");
110         if (ok.error != 0) {
111                 ok = ldb.del("cn=ldaptestuser2,cn=users," + base_dn);
112                 if (ok.error != 0) {
113                         println(ok.errstr);
114                         assert(ok.error == 0);
115                 }
116                 ok = ldb.add("
117 dn: cn=ldaptestuser2,cn=users," + base_dn + "
118 objectClass: person
119 objectClass: user
120 cn: LDAPtestUSER2
121 ");
122                 if (ok.error != 0) {
123                         println(ok.errstr);
124                         assert(ok.error == 0);
125                 }
126         }
127
128         ok = ldb.add("
129 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
130 objectClass: user
131 ");
132         if (ok.error != 0) {
133                 ok = ldb.del("cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn);
134                 if (ok.error != 0) {
135                         println(ok.errstr);
136                         assert(ok.error == 0);
137                 }
138         ok = ldb.add("
139 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
140 objectClass: user
141 ");
142                 if (ok.error != 0) {
143                         println(ok.errstr);
144                         assert(ok.error == 0);
145                 }
146         }
147
148         ok = ldb.add("
149 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
150 objectClass: user
151 ");
152         if (ok.error != 0) {
153                 ok = ldb.del("cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn);
154                 if (ok.error != 0) {
155                         println(ok.errstr);
156                         assert(ok.error == 0);
157                 }
158         ok = ldb.add("
159 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
160 objectClass: user
161 ");
162                 if (ok.error != 0) {
163                         println(ok.errstr);
164                         assert(ok.error == 0);
165                 }
166         }
167
168         println("Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))");
169         var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
170         if (res.error != 0 || res.msgs.length != 1) {
171                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
172                 assert(res.error == 0);
173                 assert(res.msgs.length == 1);
174         }
175
176         assert(res.msgs[0].dn == "cn=ldaptestuser,cn=users," + base_dn);
177         assert(res.msgs[0].cn == "ldaptestuser");
178         assert(res.msgs[0].name == "ldaptestuser");
179         assert(res.msgs[0].objectClass[0] == "top");
180         assert(res.msgs[0].objectClass[1] == "person");
181         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
182         assert(res.msgs[0].objectClass[3] == "user");
183         assert(res.msgs[0].objectGUID != undefined);
184         assert(res.msgs[0].whenCreated != undefined);
185         assert(res.msgs[0].objectCategory == "cn=Person,cn=Schema,cn=Configuration," + base_dn);
186         assert(res.msgs[0].sAMAccountType == 805306368);
187 //      assert(res[0].userAccountControl == 546);
188
189         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
190         var res2 = ldb.search("(&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
191         if (res2.error != 0 || res2.msgs.length != 1) {
192                 println("Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
193                 assert(res2.error == 0);
194                 assert(res2.msgs.length == 1);
195         }
196
197         assert(res.msgs[0].dn == res2.msgs[0].dn);
198
199         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))");
200         var res3 = ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
201         if (res3.error != 0) {
202                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): " + res3.errstr);
203                 assert(res3.error == 0);
204         } else if (res3.msgs.length != 1) {
205                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched " + res3.msgs.length);
206                 assert(res3.msgs.length == 1);
207         }
208
209         assert(res.msgs[0].dn == res3.msgs[0].dn);
210
211         if (gc_ldb != undefined) {
212                 println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
213                 var res3gc = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
214                 if (res3gc.error != 0) {
215                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: " + res3gc.errstr);
216                         assert(res3gc.error == 0);
217                 } else if (res3gc.msgs.length != 1) {
218                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: matched " + res3gc.msgs.length);
219                         assert(res3gc.msgs.length == 1);
220                 }
221         
222                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
223         }
224
225         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in with 'phantom root' control");
226         var attrs = new Array("cn");
227         var controls = new Array("search_options:1:2");
228         var res3control = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
229         if (res3control.error != 0 || res3control.msgs.length != 1) {
230                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
231                 assert(res3control.error == 0);
232                 assert(res3control.msgs.length == 1);
233         }
234         
235         assert(res.msgs[0].dn == res3control.msgs[0].dn);
236
237         ok = ldb.del(res.msgs[0].dn);
238         if (ok.error != 0) {
239                 println(ok.errstr);
240                 assert(ok.error == 0);
241         }
242
243         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))");
244         var res = ldb.search("(&(cn=ldaptestcomputer)(objectClass=user))");
245         if (res.error != 0 || res.msgs.length != 1) {
246                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
247                 assert(res.error == 0);
248                 assert(res.msgs.length == 1);
249         }
250
251         assert(res.msgs[0].dn == "cn=ldaptestcomputer,cn=computers," + base_dn);
252         assert(res.msgs[0].cn == "ldaptestcomputer");
253         assert(res.msgs[0].name == "ldaptestcomputer");
254         assert(res.msgs[0].objectClass[0] == "top");
255         assert(res.msgs[0].objectClass[1] == "person");
256         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
257         assert(res.msgs[0].objectClass[3] == "user");
258         assert(res.msgs[0].objectClass[4] == "computer");
259         assert(res.msgs[0].objectGUID != undefined);
260         assert(res.msgs[0].whenCreated != undefined);
261         assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
262 //      assert(res.msgs[0].sAMAccountType == 805306368);
263 //      assert(res.msgs[0].userAccountControl == 546);
264
265         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
266         var res2 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
267         if (res2.error != 0 || res2.msgs.length != 1) {
268                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
269                 assert(res2.error == 0);
270                 assert(res2.msgs.length == 1);
271         }
272
273         assert(res.msgs[0].dn == res2.msgs[0].dn);
274
275         if (gc_ldb != undefined) {
276                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
277                 var res2gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
278                 if (res2gc.error != 0 || res2gc.msgs.length != 1) {
279                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
280                         assert(res2gc.error == 0);
281                         assert(res2gc.msgs.length == 1);
282                 }
283
284                 assert(res.msgs[0].dn == res2gc.msgs[0].dn);
285         }
286
287         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
288         var res3 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
289         if (res3.error != 0 || res3.msgs.length != 1) {
290                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
291                 assert(res3.error == 0);
292                 assert(res3.msgs.length == 1);
293         }
294
295         assert(res.msgs[0].dn == res3.msgs[0].dn);
296
297         if (gc_ldb != undefined) {
298                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
299                 var res3gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
300                 if (res3gc.error != 0 || res3gc.msgs.length != 1) {
301                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
302                         assert(res3gc.error == 0);
303                         assert(res3gc.msgs.length == 1);
304                 }
305
306                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
307         }
308
309         println("Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
310         var res4 = ldb.search("(&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
311         if (res4.error != 0 || res4.msgs.length != 1) {
312                 println("Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
313                 assert(res4.error == 0);
314                 assert(res4.msgs.length == 1);
315         }
316
317         assert(res.msgs[0].dn == res4.msgs[0].dn);
318
319         println("Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
320         var res5 = ldb.search("(&(cn=ldaptestcomput*)(objectCategory=compuTER))");
321         if (res5.error != 0 || res5.msgs.length != 1) {
322                 println("Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
323                 assert(res5.error == 0);
324                 assert(res5.msgs.length == 1);
325         }
326
327         assert(res.msgs[0].dn == res5.msgs[0].dn);
328
329         println("Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))");
330         var res6 = ldb.search("(&(cn=*daptestcomputer)(objectCategory=compuTER))");
331         if (res6.error != 0 || res6.msgs.length != 1) {
332                 println("Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER))");
333                 assert(res6.error == 0);
334                 assert(res6.msgs.length == 1);
335         }
336
337         assert(res.msgs[0].dn == res6.msgs[0].dn);
338
339         ok = ldb.del(res.msgs[0].dn);
340         if (ok.error != 0) {
341                 println(ok.errstr);
342                 assert(ok.error == 0);
343         }
344
345         println("Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))");
346         var res = ldb.search("(&(cn=ldaptest2computer)(objectClass=user))");
347         if (res.error != 0 || res.msgs.length != 1) {
348                 println("Could not find (&(cn=ldaptest2computer)(objectClass=user))");
349                 assert(res.error == 0);
350                 assert(res.msgs.length == 1);
351         }
352
353         assert(res.msgs[0].dn == "cn=ldaptest2computer,cn=computers," + base_dn);
354         assert(res.msgs[0].cn == "ldaptest2computer");
355         assert(res.msgs[0].name == "ldaptest2computer");
356         assert(res.msgs[0].objectClass[0] == "top");
357         assert(res.msgs[0].objectClass[1] == "person");
358         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
359         assert(res.msgs[0].objectClass[3] == "user");
360         assert(res.msgs[0].objectClass[4] == "computer");
361         assert(res.msgs[0].objectGUID != undefined);
362         assert(res.msgs[0].whenCreated != undefined);
363         assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
364         assert(res.msgs[0].sAMAccountType == 805306369);
365 //      assert(res.msgs[0].userAccountControl == 4098);
366
367
368         println("Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))");
369         var res = ldb.search("(&(cn=ldaptestUSer2)(objectClass=user))");
370         if (res.error != 0 || res.msgs.length != 1) {
371                 println("Could not find (&(cn=ldaptestUSer2)(objectClass=user))");
372                 assert(res.error == 0);
373                 assert(res.msgs.length == 1);
374         }
375
376         assert(res.msgs[0].dn == "cn=ldaptestuser2,cn=users," + base_dn);
377         assert(res.msgs[0].cn == "ldaptestuser2");
378         assert(res.msgs[0].name == "ldaptestuser2");
379         assert(res.msgs[0].objectClass[0] == "top");
380         assert(res.msgs[0].objectClass[1] == "person");
381         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
382         assert(res.msgs[0].objectClass[3] == "user");
383         assert(res.msgs[0].objectGUID != undefined);
384         assert(res.msgs[0].whenCreated != undefined);
385
386         ok = ldb.del(res.msgs[0].dn);
387         if (ok.error != 0) {
388                 println(ok.errstr);
389                 assert(ok.error == 0);
390         }
391
392         println("Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
393         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
394
395         if (res.error != 0 || res.msgs.length != 1) {
396                 println("Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
397                 assert(res.error == 0);
398                 assert(res.msgs.length == 1);
399         }
400
401         assert(res.msgs[0].dn == "cn=ldaptestutf8user èùéìòà,cn=users," + base_dn);
402         assert(res.msgs[0].cn == "ldaptestutf8user èùéìòà");
403         assert(res.msgs[0].name == "ldaptestutf8user èùéìòà");
404         assert(res.msgs[0].objectClass[0] == "top");
405         assert(res.msgs[0].objectClass[1] == "person");
406         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
407         assert(res.msgs[0].objectClass[3] == "user");
408         assert(res.msgs[0].objectGUID != undefined);
409         assert(res.msgs[0].whenCreated != undefined);
410
411         ok = ldb.del(res.msgs[0].dn);
412         if (ok.error != 0) {
413                 println(ok.errstr);
414                 assert(ok.error == 0);
415         }
416
417         println("Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
418         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
419
420         if (res.error != 0 || res.msgs.length != 1) {
421                 println("Could not find (expect space collapse, win2k3 fails) (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
422         } else {
423                 assert(res.msgs[0].dn == "cn=ldaptestutf8user2 èùéìòà,cn=users," + base_dn);
424                 assert(res.msgs[0].cn == "ldaptestutf8user2 èùéìòà");
425         }
426
427         println("Testing that we can't get at the configuration DN from the main search base");
428         var attrs = new Array("cn");
429         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
430         assert(res.error == 0);
431         if (res.msgs.length != 0) {
432                 println("Got configuration DN " + res.msgs[0].dn + " which should not be able to be seen from main search base");
433         }
434         assert(res.msgs.length == 0);
435
436         println("Testing that we can get at the configuration DN from the main search base on the LDAP port with the 'phantom root' search_options control");
437         var attrs = new Array("cn");
438         var controls = new Array("search_options:1:2");
439         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
440         assert(res.error == 0);
441         assert(res.msgs.length > 0);
442
443         if (gc_ldb != undefined) {
444                 println("Testing that we can get at the configuration DN from the main search base on the GC port with the search_options control == 0");
445                 var attrs = new Array("cn");
446                 var controls = new Array("search_options:1:0");
447                 var res = gc_ldb.search("objectClass=crossRef", base_dn, gc_ldb.SCOPE_SUBTREE, attrs, controls);
448                 assert(res.error == 0);
449                 assert(res.msgs.length > 0);
450
451                 println("Testing that we do find configuration elements in the global catlog");
452                 var attrs = new Array("cn");
453                 var res = gc_ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
454                 assert(res.error == 0);
455                 assert (res.msgs.length > 0);
456         
457                 println("Testing that we do find configuration elements and user elements at the same time");
458                 var attrs = new Array("cn");
459                 var res = gc_ldb.search("(|(objectClass=crossRef)(objectClass=person))", base_dn, ldb.SCOPE_SUBTREE, attrs);
460                 assert(res.error == 0);
461                 assert (res.msgs.length > 0);
462
463                 println("Testing that we do find configuration elements in the global catlog, with the configuration basedn");
464                 var attrs = new Array("cn");
465                 var res = gc_ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
466                 assert(res.error == 0);
467                 assert (res.msgs.length > 0);
468         }
469
470         println("Testing that we can get at the configuration DN on the main LDAP port");
471         var attrs = new Array("cn");
472         var res = ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
473         assert(res.error == 0);
474         assert (res.msgs.length > 0);
475
476         println("Testing objectCategory canonacolisation");
477         var attrs = new Array("cn");
478         var res = ldb.search("objectCategory=ntDsDSA", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
479         assert(res.error == 0);
480         if (res.msgs.length == 0) {
481                 println("Didn't find any records with objectCategory=ntDsDSA");
482         }
483         assert(res.msgs.length != 0);
484         
485         var attrs = new Array("cn");
486         var res = ldb.search("objectCategory=CN=ntDs-DSA," + schema_dn, configuration_dn, ldb.SCOPE_SUBTREE, attrs);
487         assert(res.error == 0);
488         if (res.msgs.length == 0) {
489                 println("Didn't find any records with objectCategory=CN=ntDs-DSA," + schema_dn);
490         }
491         assert(res.msgs.length != 0);
492         
493         println("Testing objectClass attribute order on "+ base_dn);
494         var attrs = new Array("objectClass");
495         var res = ldb.search("objectClass=domain", base_dn, ldb.SCOPE_BASE, attrs);
496         assert(res.error == 0);
497         assert(res.msgs.length == 1);
498
499         assert(res.msgs[0].objectClass[0] == "top");
500         assert(res.msgs[0].objectClass[1] == "domain");
501         assert(res.msgs[0].objectClass[2] == "domainDNS");
502         
503 }
504
505 function basedn_tests(ldb, gc_ldb)
506 {
507         println("Testing for all rootDSE attributes");
508         var attrs = new Array();
509         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
510         assert(res.error == 0);
511         assert(res.msgs.length == 1);
512
513         println("Testing for highestCommittedUSN");
514         var attrs = new Array("highestCommittedUSN");
515         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
516         assert(res.error == 0);
517         assert(res.msgs.length == 1);
518         assert(res.msgs[0].highestCommittedUSN != undefined);
519         assert(res.msgs[0].highestCommittedUSN != 0);
520
521         println("Testing for netlogon via LDAP");
522         var attrs = new Array("netlogon");
523         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
524         assert(res.error == 0);
525         assert(res.msgs.length == 0);
526
527         println("Testing for netlogon and highestCommittedUSN via LDAP");
528         var attrs = new Array("netlogon", "highestCommittedUSN");
529         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
530         assert(res.error == 0);
531         assert(res.msgs.length == 0);
532 }
533
534 function find_basedn(ldb)
535 {
536     var attrs = new Array("defaultNamingContext");
537     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
538     assert(res.error == 0);
539     assert(res.msgs.length == 1);
540     return res.msgs[0].defaultNamingContext;
541 }
542
543 function find_configurationdn(ldb)
544 {
545     var attrs = new Array("configurationNamingContext");
546     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
547     assert(res.error == 0);
548     assert(res.msgs.length == 1);
549     return res.msgs[0].configurationNamingContext;
550 }
551
552 function find_schemadn(ldb)
553 {
554     var attrs = new Array("schemaNamingContext");
555     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
556     assert(res.error == 0);
557     assert(res.msgs.length == 1);
558     return res.msgs[0].schemaNamingContext;
559 }
560
561 /* use command line creds if available */
562 ldb.credentials = options.get_credentials();
563 gc_ldb.credentials = options.get_credentials();
564
565 var ok = ldb.connect("ldap://" + host);
566 var base_dn = find_basedn(ldb);
567 var configuration_dn = find_configurationdn(ldb);
568 var schema_dn = find_schemadn(ldb);
569
570 printf("baseDN: %s\n", base_dn);
571
572 var ok = gc_ldb.connect("ldap://" + host + ":3268");
573 if (!ok) {
574         gc_ldb = undefined;
575 }
576
577 basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
578
579 basedn_tests(ldb, gc_ldb)
580
581 return 0;