Align the Python and EJS ldap tests.
[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=ldaptestcomputer,cn=computers," + base_dn);
33         ldb.del("cn=ldaptestcomputer3,cn=computers," + base_dn);
34         ldb.del("cn=ldaptest2computer,cn=computers," + base_dn);
35         ldb.del("cn=ldaptestuser,cn=users," + base_dn);
36         ldb.del("cn=ldaptestuser2,cn=users," + base_dn);
37         ldb.del("cn=ldaptestuser3,cn=users," + base_dn);
38         ldb.del("cn=ldaptestuser4,cn=users," + base_dn);
39         ldb.del("cn=ldaptestuser5,cn=users," + base_dn);
40         ldb.del("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn);
41         ldb.del("cn=ldaptestuser7,cn=users," + base_dn);
42         ldb.del("CN=ldaptestcontainer2," + base_dn);
43         ldb.del("cn=ldaptestgroup,cn=users," + base_dn);
44         ldb.del("cn=ldaptestgroup2,cn=users," + base_dn);
45
46         println("Testing group add with invalid member");
47         var ok = ldb.add("
48 dn: cn=ldaptestgroup,cn=uSers," + base_dn + "
49 objectclass: group
50 member: cn=ldaptestuser,cn=useRs," + base_dn + "
51 ");
52
53         if (ok.error != 32) { /* LDAP_NO_SUCH_OBJECT */
54                 println(ok.errstr);
55                 assert(ok.error == 32);
56         }
57
58         println("Testing user add");
59         var ok = ldb.add("
60 dn: cn=ldaptestuser,cn=uSers," + base_dn + "
61 objectclass: user
62 objectclass: person
63 cN: LDAPtestUSER
64 givenname: ldap
65 sn: testy
66 ");
67         if (ok.error != 0) {
68                 ok = ldb.del("cn=ldaptestuser,cn=users," + base_dn);
69                 if (ok.error != 0) {
70                         println(ok.errstr);
71                         assert(ok.error == 0);
72                 }
73                 ok = ldb.add("
74 dn: cn=ldaptestuser,cn=uSers," + base_dn + "
75 objectclass: user
76 objectclass: person
77 cN: LDAPtestUSER
78 givenname: ldap
79 sn: testy
80 ");
81                 if (ok.error != 0) {
82                         println(ok.errstr);
83                         assert(ok.error == 0);
84                 }
85         }
86
87         var ok = ldb.add("
88 dn: cn=ldaptestgroup,cn=uSers," + base_dn + "
89 objectclass: group
90 member: cn=ldaptestuser,cn=useRs," + base_dn + "
91 ");
92         if (ok.error != 0) {
93                 println(ok.errstr);
94                 assert(ok.error == 0);
95         }
96
97         var ok = ldb.add("
98 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
99 objectclass: computer
100 cN: LDAPtestCOMPUTER
101 ");
102         if (ok.error != 0) {
103                 ok = ldb.del("cn=ldaptestcomputer,cn=computers," + base_dn);
104                 if (ok.error != 0) {
105                         println(ok.errstr);
106                         assert(ok.error == 0);
107                 }
108                 ok = ldb.add("
109 dn: cn=ldaptestcomputer,cn=computers," + base_dn + "
110 objectClass: computer
111 cn: LDAPtestCOMPUTER
112 ");
113                 if (ok.error != 0) {
114                         println(ok.errstr);
115                         assert(ok.error == 0);
116                 }
117         }
118
119         if (ok.error != 0) {
120                 println(ok.errstr);
121                 assert(ok.error == 0);
122         }
123
124         var ok = ldb.add("
125 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
126 objectClass: computer
127 cn: LDAPtest2COMPUTER
128 userAccountControl: 4096
129 displayname: ldap testy
130 ");
131         if (ok.error != 0) {
132                 ok = ldb.del("cn=ldaptest2computer,cn=computers," + base_dn);
133                 if (ok.error != 0) {
134                         println(ok.errstr);
135                 //      assert(ok.error == 0);
136                 }
137                 ok = ldb.add("
138 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
139 objectClass: computer
140 cn: LDAPtest2COMPUTER
141 userAccountControl: 4096
142 displayname: ldap testy
143 ");
144                 if (ok.error != 0) {
145                         println(ok.errstr);
146                         assert(ok.error == 0);
147                 }
148         }
149
150         var ok = ldb.add("
151 dn: cn=ldaptestcomputer3,cn=computers," + base_dn + "
152 objectClass: computer
153 cn: LDAPtest2COMPUTER
154 ");
155         if (ok.error != 34) {
156                 println("Did not reject invalid RDN compared with DN: " + ok.errstr);
157                 assert(ok.error == 34);
158         }
159
160         var ok = ldb.add("
161 dn: cn=ldaptestcomputer3,cn=computers," + base_dn + "
162 objectClass: computer
163 cn: LDAPtestCOMPUTER3
164 sAMAccountType: 805306368
165 ");
166
167         if (ok.error != 53) {
168                 println("Did not reject invalid 'sAMAccountType: 805306368': " + ok.errstr);
169                 assert(ok.error == 53);
170         }
171
172         var ok = ldb.add("
173 dn: cn=ldaptestcomputer3,cn=computers," + base_dn + "
174 objectClass: computer
175 cn: LDAPtestCOMPUTER3
176 userAccountControl: 0
177 ");
178
179         if (ok.error != 53) {
180                 println("Did not reject invalid 'userAccountControl: 0': " + ok.errstr);
181                 assert(ok.error == 53);
182         }
183
184         var ok = ldb.add("
185 dn: cn=ldaptestuser7,cn=users," + base_dn + "
186 objectClass: user
187 cn: LDAPtestuser7
188 userAccountControl: 0
189 ");
190
191         if (ok.error != 53) {
192                 println("Did not reject invalid 'userAccountControl: 0': " + ok.errstr);
193                 assert(ok.error == 53);
194         }
195
196         var ok = ldb.add("
197 dn: cn=ldaptestuser7,cn=users," + base_dn + "
198 objectClass: user
199 cn: LDAPtestuser7
200 userAccountControl: 2
201 ");
202
203         if (ok.error != 0) {
204                 println("Did not accept 'userAccountControl: 2': " + ok.errstr);
205                 assert(ok.error == 0);
206         }
207
208             ldb.del("cn=ldaptestuser7,cn=users," + base_dn);
209
210         var ok = ldb.add("
211 dn: cn=ldaptestcomputer3,cn=computers," + base_dn + "
212 objectclass: computer
213 cN: LDAPtestCOMPUTER3
214 ");
215         if (ok.error != 0) {
216                 ok = ldb.del("cn=ldaptestcomputer3,cn=computers," + base_dn);
217                 if (ok.error != 0) {
218                         println(ok.errstr);
219                         assert(ok.error == 0);
220                 }
221                 ok = ldb.add("
222 dn: cn=ldaptestcomputer3,cn=computers," + base_dn + "
223 objectClass: computer
224 cn: LDAPtestCOMPUTER3
225 ");
226                 if (ok.error != 0) {
227                         println(ok.errstr);
228                         assert(ok.error == 0);
229                 }
230         }
231
232         println("Testing ldb.search for (&(cn=ldaptestcomputer3)(objectClass=user))");
233         var res = ldb.search("(&(cn=ldaptestcomputer3)(objectClass=user))");
234         if (res.error != 0 || res.msgs.length != 1) {
235                 println("Could not find (&(cn=ldaptestcomputer3)(objectClass=user))");
236                 assert(res.error == 0);
237                 assert(res.msgs.length == 1);
238         }
239
240         assert(res.msgs[0].dn == ("CN=ldaptestcomputer3,CN=Computers," + base_dn));
241         assert(res.msgs[0].cn == "ldaptestcomputer3");
242         assert(res.msgs[0].name == "ldaptestcomputer3");
243         assert(res.msgs[0].objectClass[0] == "top");
244         assert(res.msgs[0].objectClass[1] == "person");
245         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
246         assert(res.msgs[0].objectClass[3] == "user");
247         assert(res.msgs[0].objectClass[4] == "computer");
248         assert(res.msgs[0].objectGUID != undefined);
249         assert(res.msgs[0].whenCreated != undefined);
250         assert(res.msgs[0].objectCategory == ("CN=Computer,CN=Schema,CN=Configuration," + base_dn));
251         assert(res.msgs[0].primaryGroupID == 513);
252         assert(res.msgs[0].sAMAccountType == 805306368);
253         assert(res.msgs[0].userAccountControl == 546);
254
255             ldb.del(res.msgs[0].dn);
256
257             println("Testing attribute or value exists behaviour");
258             ok = ldb.modify("
259 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
260 changetype: modify
261 replace: servicePrincipalName
262 servicePrincipalName: host/ldaptest2computer
263 servicePrincipalName: host/ldaptest2computer
264 servicePrincipalName: cifs/ldaptest2computer
265 ");
266
267 //LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS
268                 if (ok.error != 20) {
269                         println("Expected error LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS, got :" + ok.errstr);
270                         assert(ok.error == 20);
271                 }
272
273             ok = ldb.modify("
274 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
275 changetype: modify
276 replace: servicePrincipalName
277 servicePrincipalName: host/ldaptest2computer
278 servicePrincipalName: cifs/ldaptest2computer
279 ");
280
281             if (ok.error != 0) {
282                     println("Failed to replace servicePrincpalName:" + ok.errstr);
283                     assert(ok.error == 20);
284             }
285
286             ok = ldb.modify("
287 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
288 changetype: modify
289 add: servicePrincipalName
290 servicePrincipalName: host/ldaptest2computer
291 ");
292
293 //LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS
294             if (ok.error != 20) {
295                     println("Expected error LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS, got :" + ok.errstr);
296                         assert(ok.error == 20);
297             }
298             
299             println("Testing ranged results");
300             ok = ldb.modify("
301 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
302 changetype: modify
303 replace: servicePrincipalName
304 ");
305             if (ok.error != 0) {
306                     println("Failed to replace servicePrincpalName:" + ok.errstr);
307                     assert(ok.error == 0);
308             }
309             
310             ok = ldb.modify("
311 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
312 changetype: modify
313 add: servicePrincipalName
314 servicePrincipalName: host/ldaptest2computer0
315 servicePrincipalName: host/ldaptest2computer1
316 servicePrincipalName: host/ldaptest2computer2
317 servicePrincipalName: host/ldaptest2computer3
318 servicePrincipalName: host/ldaptest2computer4
319 servicePrincipalName: host/ldaptest2computer5
320 servicePrincipalName: host/ldaptest2computer6
321 servicePrincipalName: host/ldaptest2computer7
322 servicePrincipalName: host/ldaptest2computer8
323 servicePrincipalName: host/ldaptest2computer9
324 servicePrincipalName: host/ldaptest2computer10
325 servicePrincipalName: host/ldaptest2computer11
326 servicePrincipalName: host/ldaptest2computer12
327 servicePrincipalName: host/ldaptest2computer13
328 servicePrincipalName: host/ldaptest2computer14
329 servicePrincipalName: host/ldaptest2computer15
330 servicePrincipalName: host/ldaptest2computer16
331 servicePrincipalName: host/ldaptest2computer17
332 servicePrincipalName: host/ldaptest2computer18
333 servicePrincipalName: host/ldaptest2computer19
334 servicePrincipalName: host/ldaptest2computer20
335 servicePrincipalName: host/ldaptest2computer21
336 servicePrincipalName: host/ldaptest2computer22
337 servicePrincipalName: host/ldaptest2computer23
338 servicePrincipalName: host/ldaptest2computer24
339 servicePrincipalName: host/ldaptest2computer25
340 servicePrincipalName: host/ldaptest2computer26
341 servicePrincipalName: host/ldaptest2computer27
342 servicePrincipalName: host/ldaptest2computer28
343 servicePrincipalName: host/ldaptest2computer29
344 ");
345
346             if (ok.error != 0) {
347                     println("Failed to replace servicePrincpalName:" + ok.errstr);
348                     assert(ok.error == 0);
349             }
350             
351             
352             var attrs = new Array("servicePrincipalName;range=0-*");
353             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
354             if (res.error != 0 || res.msgs.length != 1) {
355                     println("Could not find (cn=ldaptest2computer) for servicePrincipalName;range=0-*");
356                     assert(res.error == 0);
357                     assert(res.msgs.length == 1);
358             }
359 //          println(res.msgs[0]["servicePrincipalName;range=0-*"].length);
360             assert(res.msgs[0]["servicePrincipalName;range=0-*"].length == 30);
361
362             var attrs = new Array("servicePrincipalName;range=0-19");
363             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
364             if (res.error != 0 || res.msgs.length != 1) {
365                     println("Could not find (cn=ldaptest2computer) for servicePrincipalName;range=0-19");
366                     assert(res.error == 0);
367                     assert(res.msgs.length == 1);
368             }
369 //          println(res.msgs[0]["servicePrincipalName;range=0-19"].length);
370             assert(res.msgs[0]["servicePrincipalName;range=0-19"].length == 20);
371
372             var attrs = new Array("servicePrincipalName;range=0-30");
373             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
374             if (res.error != 0 || res.msgs.length != 1) {
375                     println("Could not find (cn=ldaptest2computer) at servicePrincipalName;range=0-19");
376                     assert(res.error == 0);
377                     assert(res.msgs.length == 1);
378             }
379             assert(res.msgs[0]["servicePrincipalName;range=0-*"].length == 30);
380
381             var attrs = new Array("servicePrincipalName;range=0-40");
382             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
383             if (res.error != 0 || res.msgs.length != 1) {
384                     println("Could not find (cn=ldaptest2computer) at servicePrincipalName;range=0-40");
385                     assert(res.error == 0);
386                     assert(res.msgs.length == 1);
387             }
388             assert(res.msgs[0]["servicePrincipalName;range=0-*"].length == 30);
389
390             var attrs = new Array("servicePrincipalName;range=30-40");
391             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
392             if (res.error != 0 || res.msgs.length != 1) {
393                     println("Could not find (cn=ldaptest2computer) at servicePrincipalName;range=30-40");
394                     assert(res.error == 0);
395                     assert(res.msgs.length == 1);
396             }
397             assert(res.msgs[0]["servicePrincipalName;range=30-*"].length == 0);
398
399             var attrs = new Array("servicePrincipalName;range=10-40");
400             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
401             if (res.error != 0 || res.msgs.length != 1) {
402                     println("Could not find (cn=ldaptest2computer) at servicePrincipalName;range=10-40");
403                     assert(res.error == 0);
404                     assert(res.msgs.length == 1);
405             }
406             assert(res.msgs[0]["servicePrincipalName;range=10-*"].length == 20);
407 //          var pos_11 = res.msgs[0]["servicePrincipalName;range=10-*"][18];
408
409             var attrs = new Array("servicePrincipalName;range=11-40");
410             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
411             if (res.error != 0 || res.msgs.length != 1) {
412                     println("Could not find (cn=ldaptest2computer) at servicePrincipalName;range=10-*");
413                     assert(res.error == 0);
414                     assert(res.msgs.length == 1);
415             }
416             assert(res.msgs[0]["servicePrincipalName;range=11-*"].length == 19);
417 //          println(res.msgs[0]["servicePrincipalName;range=11-*"][18]);
418 //          println(pos_11);
419 //          assert((res.msgs[0]["servicePrincipalName;range=11-*"][18]) == pos_11);
420
421             var attrs = new Array("servicePrincipalName;range=11-15");
422             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
423             if (res.error != 0 || res.msgs.length != 1) {
424                     println("Could not find (cn=ldaptest2computer) at servicePrincipalName;range=11-15");
425                     assert(res.error == 0);
426                     assert(res.msgs.length == 1);
427             }
428             assert(res.msgs[0]["servicePrincipalName;range=11-15"].length == 5);
429 //          assert(res.msgs[0]["servicePrincipalName;range=11-15"][4] == pos_11);
430
431             var attrs = new Array("servicePrincipalName");
432             var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
433             if (res.error != 0 || res.msgs.length != 1) {
434                     println("Could not find (cn=ldaptest2computer) at servicePrincipalName");
435                     assert(res.error == 0);
436                     assert(res.msgs.length == 1);
437             }
438 //          println(res.msgs[0]["servicePrincipalName"][18]);
439 //          println(pos_11);
440             assert(res.msgs[0]["servicePrincipalName"].length == 30);
441 //          assert(res.msgs[0]["servicePrincipalName"][18] == pos_11);
442
443             ok = ldb.add("
444 dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
445 objectClass: person
446 objectClass: user
447 cn: LDAPtestUSER2
448 givenname: testy
449 sn: ldap user2
450 ");
451         if (ok.error != 0) {
452                 ok = ldb.del("cn=ldaptestuser2,cn=users," + base_dn);
453                 if (ok.error != 0) {
454                         println(ok.errstr);
455                         assert(ok.error == 0);
456                 }
457                 ok = ldb.add("
458 dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
459 objectClass: person
460 objectClass: user
461 cn: LDAPtestUSER2
462 givenname: testy
463 sn: ldap user2
464 ");
465                 if (ok.error != 0) {
466                         println(ok.errstr);
467                         assert(ok.error == 0);
468                 }
469         }
470
471
472         println("Testing Ambigious Name Resolution");
473 // Testing ldb.search for (&(anr=ldap testy)(objectClass=user))
474         var res = ldb.search("(&(anr=ldap testy)(objectClass=user))");
475         if (res.error != 0 || res.msgs.length != 3) {
476                 println("Could not find (&(anr=ldap testy)(objectClass=user))");
477                 assert(res.error == 0);
478                 assert(res.msgs.length == 3);
479         }
480
481 // Testing ldb.search for (&(anr=testy ldap)(objectClass=user))
482         var res = ldb.search("(&(anr=testy ldap)(objectClass=user))");
483         if (res.error != 0 || res.msgs.length != 2) {
484                 println("Found only " + res.msgs.length + " for (&(anr=testy ldap)(objectClass=user))");
485                 assert(res.error == 0);
486                 assert(res.msgs.length == 2);
487         }
488
489         var res = ldb.search("(&(anr=\"testy ldap\")(objectClass=user))");
490         if (res.error != 0 || res.msgs.length != 0) {
491                 println("Found " + res.msgs.length + " for (&(anr=\"testy ldap\")(objectClass=user))");
492                 assert(res.error == 0);
493                 assert(res.msgs.length == 0);
494         }
495
496 // Testing ldb.search for (&(anr=ldap)(objectClass=user))
497         var res = ldb.search("(&(anr=ldap)(objectClass=user))");
498         if (res.error != 0 || res.msgs.length != 4) {
499                 println("Found only " + res.msgs.length + " for (&(anr=ldap)(objectClass=user))");
500                 assert(res.error == 0);
501                 assert(res.msgs.length == 4);
502         } 
503
504 // Testing ldb.search for (&(anr==ldap)(objectClass=user))
505         var res = ldb.search("(&(anr==ldap)(objectClass=user))");
506         if (res.error != 0 || res.msgs.length != 1) {
507                 println("Found only " + res.msgs.length + " for (&(anr=ldap)(objectClass=user))");
508                 println("Could not find (&(anr==ldap)(objectClass=user))");
509                 assert(res.error == 0);
510                 assert(res.msgs.length == 1);
511         }
512
513         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
514         assert(res.msgs[0].cn == "ldaptestuser");
515         assert(res.msgs[0].name == "ldaptestuser");
516
517 // Testing ldb.search for (&(anr=testy)(objectClass=user))
518         var res = ldb.search("(&(anr=testy)(objectClass=user))");
519         if (res.error != 0 || res.msgs.length != 2) {
520                 println("Found only " + res.msgs.length + " for (&(anr=testy)(objectClass=user))");
521                 assert(res.error == 0);
522                 assert(res.msgs.length == 2);
523         }
524
525 // Testing ldb.search for (&(anr=ldap testy)(objectClass=user))
526         var res = ldb.search("(&(anr=testy ldap)(objectClass=user))");
527         if (res.error != 0 || res.msgs.length != 2) {
528                 println("Found only " + res.msgs.length + " for (&(anr=ldap testy)(objectClass=user))");
529                 assert(res.error == 0);
530                 assert(res.msgs.length == 2);
531         }
532
533 // Testing ldb.search for (&(anr==ldap testy)(objectClass=user))
534         var res = ldb.search("(&(anr==testy ldap)(objectClass=user))");
535         if (res.error != 0 || res.msgs.length != 1) {
536                 println("Found only " + res.msgs.length + " for (&(anr==ldap testy)(objectClass=user))");
537                 assert(res.error == 0);
538                 assert(res.msgs.length == 1);
539         }
540
541         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
542         assert(res.msgs[0].cn == "ldaptestuser");
543         assert(res.msgs[0].name == "ldaptestuser");
544
545 // Testing ldb.search for (&(anr==testy ldap)(objectClass=user))
546         var res = ldb.search("(&(anr==testy ldap)(objectClass=user))");
547         if (res.error != 0 || res.msgs.length != 1) {
548                 println("Could not find (&(anr==testy ldap)(objectClass=user))");
549                 assert(res.error == 0);
550                 assert(res.msgs.length == 1);
551         }
552
553         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
554         assert(res.msgs[0].cn == "ldaptestuser");
555         assert(res.msgs[0].name == "ldaptestuser");
556
557         // Testing ldb.search for (&(anr=testy ldap user)(objectClass=user))
558         var res = ldb.search("(&(anr=testy ldap user)(objectClass=user))");
559         if (res.error != 0 || res.msgs.length != 1) {
560                 println("Could not find (&(anr=testy ldap user)(objectClass=user))");
561                 assert(res.error == 0);
562                 assert(res.msgs.length == 1);
563         }
564
565         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
566         assert(res.msgs[0].cn == "ldaptestuser2");
567         assert(res.msgs[0].name == "ldaptestuser2");
568
569         // Testing ldb.search for (&(anr==testy ldap user2)(objectClass=user))
570         var res = ldb.search("(&(anr==testy ldap user2)(objectClass=user))");
571         if (res.error != 0 || res.msgs.length != 1) {
572                 println("Could not find (&(anr==testy ldap user2)(objectClass=user))");
573                 assert(res.error == 0);
574                 assert(res.msgs.length == 1);
575         }
576
577         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
578         assert(res.msgs[0].cn == "ldaptestuser2");
579         assert(res.msgs[0].name == "ldaptestuser2");
580
581         // Testing ldb.search for (&(anr==ldap user2)(objectClass=user))
582         var res = ldb.search("(&(anr==ldap user2)(objectClass=user))");
583         if (res.error != 0 || res.msgs.length != 1) {
584                 println("Could not find (&(anr==ldap user2)(objectClass=user))");
585                 assert(res.error == 0);
586                 assert(res.msgs.length == 1);
587         }
588
589         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
590         assert(res.msgs[0].cn == "ldaptestuser2");
591         assert(res.msgs[0].name == "ldaptestuser2");
592
593         // Testing ldb.search for (&(anr==not ldap user2)(objectClass=user))
594         var res = ldb.search("(&(anr==not ldap user2)(objectClass=user))");
595         if (res.error != 0 || res.msgs.length != 0) {
596                 println("Must not find (&(anr==not ldap user2)(objectClass=user))");
597                 assert(res.error == 0);
598                 assert(res.msgs.length == 0);
599         }
600
601         // Testing ldb.search for (&(anr=not ldap user2)(objectClass=user))
602         var res = ldb.search("(&(anr=not ldap user2)(objectClass=user))");
603         if (res.error != 0 || res.msgs.length != 0) {
604                 println("Must not find (&(anr=not ldap user2)(objectClass=user))");
605                 assert(res.error == 0);
606                 assert(res.msgs.length == 0);
607         }
608
609         println("Testing Group Modifies");
610         ok = ldb.modify("
611 dn: cn=ldaptestgroup,cn=users," + base_dn + "
612 changetype: modify
613 add: member
614 member: cn=ldaptestuser2,cn=users," + base_dn + "
615 member: cn=ldaptestcomputer,cn=computers," + base_dn + "
616 ");
617
618         if (ok.error != 0) {
619                 println(ok.errstr);
620                 assert(ok.error == 0);
621         }
622
623         ok = ldb.del("cn=ldaptestuser3,cn=users," + base_dn);
624
625         println("Testing adding non-existent user to a group");
626         ok = ldb.modify("
627 dn: cn=ldaptestgroup,cn=users," + base_dn + "
628 changetype: modify
629 add: member
630 member: cn=ldaptestuser3,cn=users," + base_dn + "
631 ");
632         if (ok.error != 32) { /* LDAP_NO_SUCH_OBJECT */
633                 println(ok.errstr);
634                 assert(ok.error == 32);
635         }
636
637         println("Testing Renames");
638
639         ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
640         if (ok.error != 0) {
641                 println("Could not rename cn=ldaptestuser2,cn=users," + base_dn + " into cn=ldaptestuser3,cn=users," + base_dn + ": " + ok.errstr);
642                 assert(ok.error == 0);
643         }
644
645         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
646         if (ok.error != 0) {
647                 println("Could not rename cn=ldaptestuser3,cn=users," + base_dn + " onto itself: " + ok.errstr);
648                 assert(ok.error == 0);
649         }
650
651         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestUSER3,cn=users," + base_dn);
652         if (ok.error != 0) {
653                 println("Could not rename cn=ldaptestuser3,cn=users," + base_dn + " into cn=ldaptestUSER3,cn=users," + base_dn + ": " + ok.errstr);
654                 assert(ok.error == 0);
655         }
656
657         println("Testing ldb.search for (&(cn=ldaptestuser3)(objectClass=user))");
658         var res = ldb.search("(&(cn=ldaptestuser3)(objectClass=user))");
659         if (res.error != 0 || res.msgs.length != 1) {
660                 println("Could not find (&(cn=ldaptestuser3)(objectClass=user))");
661                 assert(res.error == 0);
662                 assert(res.msgs.length == 1);
663         }
664
665         assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
666         assert(res.msgs[0].cn == "ldaptestUSER3");
667         assert(res.msgs[0].name == "ldaptestUSER3");
668
669         println("Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user))");
670         var res = ldb.search("(&(&(cn=ldaptestuser3)(userAccountControl=*))(objectClass=user))");
671         if (res.error != 0 || res.msgs.length != 1) {
672                 println("Could not find (&(cn=ldaptestuser3)(objectClass=user))");
673                 assert(res.error == 0);
674                 assert(res.msgs.length == 1);
675         }
676
677         assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
678         assert(res.msgs[0].cn == "ldaptestUSER3");
679         assert(res.msgs[0].name == "ldaptestUSER3");
680
681         println("Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user))");
682         var res = ldb.search("(&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user))");
683         if (res.error != 0 || res.msgs.length != 1) {
684                 println("Could not find (&(&(cn=ldaptestuser3)(userAccountControl=546))(objectClass=user))");
685                 assert(res.error == 0);
686                 assert(res.msgs.length == 1);
687         }
688
689         assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
690         assert(res.msgs[0].cn == "ldaptestUSER3");
691         assert(res.msgs[0].name == "ldaptestUSER3");
692
693         println("Testing ldb.search for (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user))");
694         var res = ldb.search("(&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user))");
695         if (res.error != 0 || res.msgs.length != 0) {
696                 println("Should not find (&(&(cn=ldaptestuser3)(userAccountControl=547))(objectClass=user))");
697                 assert(res.error == 0);
698                 assert(res.msgs.length == 0);
699         }
700
701 // This is a Samba special, and does not exist in real AD
702 //      println("Testing ldb.search for (dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
703 //      var res = ldb.search("(dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
704 //      if (res.error != 0 || res.msgs.length != 1) {
705 //              println("Could not find (dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
706 //              assert(res.error == 0);
707 //              assert(res.msgs.length == 1);
708 //      }
709 //      assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
710 //      assert(res.msgs[0].cn == "ldaptestUSER3");
711 //      assert(res.msgs[0].name == "ldaptestUSER3");
712
713         println("Testing ldb.search for (distinguishedName=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
714         var res = ldb.search("(distinguishedName=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
715         if (res.error != 0 || res.msgs.length != 1) {
716                 println("Could not find (dn=CN=ldaptestUSER3,CN=Users," + base_dn + ")");
717                 assert(res.error == 0);
718                 assert(res.msgs.length == 1);
719         }
720         assert(res.msgs[0].dn == ("CN=ldaptestUSER3,CN=Users," + base_dn));
721         assert(res.msgs[0].cn == "ldaptestUSER3");
722         assert(res.msgs[0].name == "ldaptestUSER3");
723
724         // ensure we cannot add it again
725         ok = ldb.add("
726 dn: cn=ldaptestuser3,cn=userS," + base_dn + "
727 objectClass: person
728 objectClass: user
729 cn: LDAPtestUSER3
730 ");
731 //LDB_ERR_ENTRY_ALREADY_EXISTS
732         if (ok.error != 68) {
733                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
734                 assert(ok.error == 68);
735         }
736
737         // rename back
738         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
739         if (ok.error != 0) {
740                 println(ok.errstr);
741                 assert(ok.error == 0);
742         }
743
744         // ensure we cannnot rename it twice
745         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser2,cn=users," + base_dn);
746 //LDB_ERR_NO_SUCH_OBJECT
747         assert(ok.error == 32);
748
749         // ensure can now use that name
750         ok = ldb.add("
751 dn: cn=ldaptestuser3,cn=users," + base_dn + "
752 objectClass: person
753 objectClass: user
754 cn: LDAPtestUSER3
755 ");
756         
757         // ensure we now cannnot rename
758         ok = ldb.rename("cn=ldaptestuser2,cn=users," + base_dn, "cn=ldaptestuser3,cn=users," + base_dn);
759 //LDB_ERR_ENTRY_ALREADY_EXISTS
760         if (ok.error != 68) {
761                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS, got: " + ok.errstr);
762                 assert(ok.error == 68);
763         }
764         assert(ok.error == 68);
765         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser3,cn=configuration," + base_dn);
766         if (ok.error != 71 && ok.error != 64) {
767                 println("expected error LDB_ERR_ENTRY_ALREADY_EXISTS or LDAP_NAMING_VIOLATION, got: " + ok.errstr);
768                 assert(ok.error == 71 || ok.error == 64);
769         }
770         assert(ok.error == 71 || ok.error == 64);
771
772         ok = ldb.rename("cn=ldaptestuser3,cn=users," + base_dn, "cn=ldaptestuser5,cn=users," + base_dn);
773         if (ok.error != 0) {
774                 println(ok.errstr);
775                 assert(ok.error == 0);
776         }
777
778         ok = ldb.del("cn=ldaptestuser5,cn=users," + base_dn);
779
780         ok = ldb.del("cn=ldaptestgroup2,cn=users," + base_dn);
781
782         ok = ldb.rename("cn=ldaptestgroup,cn=users," + base_dn, "cn=ldaptestgroup2,cn=users," + base_dn);
783         if (ok.error != 0) {
784                 println(ok.errstr);
785                 assert(ok.error == 0);
786         }
787
788         println("Testing subtree Renames");
789
790         ok = ldb.add("
791 dn: cn=ldaptestcontainer," + base_dn + "
792 objectClass: container
793 ");
794         
795         ok = ldb.add("
796 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
797 objectClass: person
798 objectClass: user
799 cn: LDAPtestUSER4
800 ");
801         if (ok.error != 0) {
802                 ok = ldb.del("cn=ldaptestuser4,cn=ldaptestcontainer," + base_dn);
803                 if (ok.error != 0) {
804                         println(ok.errstr);
805                         assert(ok.error == 0);
806                 }
807                 ok = ldb.add("
808 dn: CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "
809 objectClass: person
810 objectClass: user
811 cn: LDAPtestUSER4
812 ");
813                 if (ok.error != 0) {
814                         println(ok.errstr);
815                         assert(ok.error == 0);
816                 }
817         }
818
819         ok = ldb.modify("
820 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
821 changetype: modify
822 add: member
823 member: cn=ldaptestuser4,cn=ldaptestcontainer," + base_dn + "
824 ");
825         if (ok.error != 0) {
826                 println("Failure adding ldaptestuser4 to a group");
827                 println(ok.errstr);
828                 assert(ok.error == 0);
829         }
830         
831         println("Testing ldb.rename of cn=ldaptestcontainer," + base_dn + " to cn=ldaptestcontainer2," + base_dn);
832         ok = ldb.rename("CN=ldaptestcontainer," + base_dn, "CN=ldaptestcontainer2," + base_dn);
833         if (ok.error != 0) {
834                 println(ok.errstr);
835                 assert(ok.error == 0);
836         }
837
838         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user))");
839         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))");
840         if (res.error != 0 || res.msgs.length != 1) {
841                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user))");
842                 assert(res.error == 0);
843                 assert(res.msgs.length == 1);
844         }
845
846         println("Testing subtree ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer," + base_dn);
847         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer," + base_dn, ldb.SCOPE_SUBTREE);
848         if (res.error != 32) {
849                 println(res.errstr);
850                 assert(res.error == 32);
851         }
852
853         println("Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in (just renamed from) cn=ldaptestcontainer," + base_dn);
854         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer," + base_dn, ldb.SCOPE_ONELEVEL);
855         if (res.error != 32) {
856                 println(res.errstr);
857                 assert(res.error == 32);
858         }
859
860         println("Testing ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in renamed container");
861         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_SUBTREE);
862         if (res.error != 0 || res.msgs.length != 1) {
863                 println("Could not find (&(cn=ldaptestuser4)(objectClass=user)) under cn=ldaptestcontainer2," + base_dn);
864                 assert(res.error == 0);
865                 assert(res.msgs.length == 1);
866         }
867
868         assert(res.msgs[0].dn == ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
869         assert(strupper(res.msgs[0].memberOf[0]) == (strupper("CN=ldaptestgroup2,CN=Users," + base_dn)));
870
871         println("Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group)) in cn=users");
872         var res_group = ldb.search("(&(cn=ldaptestgroup2)(objectClass=group))", "cn=users," + base_dn, ldb.SCOPE_SUBTREE);
873         if (res_group.error != 0 || res_group.msgs.length != 1) {
874                 println("Could not find (&(cn=ldaptestgroup2)(objectClass=group)) under cn=users," + base_dn);
875                 assert(res_group.error == 0);
876                 assert(res_group.msgs.length == 1);
877         }
878
879         println("Testing ldb.search for (member=CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn + ") to check subtree renames and linked attributes");
880         var res = ldb.search("(member=CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn + ")", base_dn, ldb.SCOPE_SUBTREE);
881         if (res.error != 0 || res.msgs.length != 1) {
882                 for (i=0; i < res_group.msgs[0].member.length; i++) {
883                     println("res_group.member[" +  i + "]: " + res_group.msgs[0].member[i]);
884                 }
885
886                 println("Could not find (member=CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn + "), perhaps linked attributes are not conistant with subtree renames?");
887                 println("Testing ldb.search for (member=CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + ") to check if it just hasn't been updated");
888                 var res2 = ldb.search("(member=CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + ")", base_dn, ldb.SCOPE_SUBTREE);
889                 if (res2.error != 0 || res2.msgs.length != 1) {
890                         println("Could not find (member=CN=ldaptestuser4,CN=ldaptestcontainer," + base_dn + "), very odd, it wasn't here at all..");
891                 }
892
893                 assert(res.error == 0);
894                 assert(res.msgs.length == 1);
895         }
896
897         println("Testing ldb.rename (into itself) of cn=ldaptestcontainer2," + base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer2," + base_dn);
898         ok = ldb.rename("cn=ldaptestcontainer2," + base_dn, "cn=ldaptestcontainer,cn=ldaptestcontainer2," + base_dn);
899         if (ok.error != 53) { /* LDAP_UNWILLING_TO_PERFORM */
900                 println(ok.errstr);
901                 assert(ok.error == 53);
902         }
903
904         println("Testing ldb.rename (into non-existent container) of cn=ldaptestcontainer2," + base_dn + " to cn=ldaptestcontainer,cn=ldaptestcontainer3," + base_dn);
905         ok = ldb.rename("cn=ldaptestcontainer2," + base_dn, "cn=ldaptestcontainer,cn=ldaptestcontainer3," + base_dn);
906         if (ok.error != 53 && ok.error != 80) { /* LDAP_UNWILLING_TO_PERFORM or LDAP_OTHER*/
907                 println(ok.errstr);
908                 assert(ok.error == 53 || ok.error == 80);
909         }
910
911         println("Testing delete (should fail, not a leaf node) of renamed cn=ldaptestcontainer2," + base_dn);
912         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
913         if (ok.error != 66) { /* LDB_ERR_NOT_ALLOWED_ON_NON_LEAF */
914                 println(ok.errstr);
915                 assert(ok.error == 66);
916         }
917
918         println("Testing base ldb.search for CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn);
919         var res = ldb.search("(objectclass=*)", ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn), ldb.SCOPE_BASE);
920         if (res.error == 0 && res.count == 1) {
921                 assert(res.error == 0 && res.count == 1);
922         }
923         var res = ldb.search("(cn=ldaptestuser40)", ("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn), ldb.SCOPE_BASE);
924         if (res.error == 0 && res.count == 0) {
925                 assert(res.error == 0 && res.count == 0);
926         }
927
928         println("Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2," + base_dn);
929         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_ONELEVEL);
930         if (res.error == 0 && res.count == 0) {
931                 assert(res.error == 0 && res.count == 0);
932         }
933
934         println("Testing one-level ldb.search for (&(cn=ldaptestuser4)(objectClass=user)) in cn=ldaptestcontainer2," + base_dn);
935         var res = ldb.search("(&(cn=ldaptestuser4)(objectClass=user))", "cn=ldaptestcontainer2," + base_dn, ldb.SCOPE_SUBTREE);
936         if (res.error == 0 && res.count == 0) {
937                 assert(res.error == 0 && res.count == 0);
938         }
939
940         println("Testing delete of subtree renamed "+("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
941         ok = ldb.del(("CN=ldaptestuser4,CN=ldaptestcontainer2," + base_dn));
942         if (ok.error != 0) {
943                 println(ok.errstr);
944                 assert(ok.error == 0);
945         }
946         println("Testing delete of renamed cn=ldaptestcontainer2," + base_dn);
947         ok = ldb.del("cn=ldaptestcontainer2," + base_dn);
948         if (ok.error != 0) {
949                 println(ok.errstr);
950                 assert(ok.error == 0);
951         }
952         
953         ok = ldb.add("
954 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
955 objectClass: user
956 ");
957         if (ok.error != 0) {
958                 ok = ldb.del("cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn);
959                 if (ok.error != 0) {
960                         println(ok.errstr);
961                         assert(ok.error == 0);
962                 }
963         ok = ldb.add("
964 dn: cn=ldaptestutf8user èùéìòà ,cn=users," + base_dn + "
965 objectClass: user
966 ");
967                 if (ok.error != 0) {
968                         println(ok.errstr);
969                         assert(ok.error == 0);
970                 }
971         }
972
973         ok = ldb.add("
974 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
975 objectClass: user
976 ");
977         if (ok.error != 0) {
978                 ok = ldb.del("cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn);
979                 if (ok.error != 0) {
980                         println(ok.errstr);
981                         assert(ok.error == 0);
982                 }
983         ok = ldb.add("
984 dn: cn=ldaptestutf8user2  èùéìòà ,cn=users," + base_dn + "
985 objectClass: user
986 ");
987                 if (ok.error != 0) {
988                         println(ok.errstr);
989                         assert(ok.error == 0);
990                 }
991         }
992
993         println("Testing ldb.search for (&(cn=ldaptestuser)(objectClass=user))");
994         var res = ldb.search("(&(cn=ldaptestuser)(objectClass=user))");
995         if (res.error != 0 || res.msgs.length != 1) {
996                 println("Could not find (&(cn=ldaptestuser)(objectClass=user))");
997                 assert(res.error == 0);
998                 assert(res.msgs.length == 1);
999         }
1000
1001         assert(res.msgs[0].dn == ("CN=ldaptestuser,CN=Users," + base_dn));
1002         assert(res.msgs[0].cn == "ldaptestuser");
1003         assert(res.msgs[0].name == "ldaptestuser");
1004         assert(res.msgs[0].objectClass[0] == "top");
1005         assert(res.msgs[0].objectClass[1] == "person");
1006         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
1007         assert(res.msgs[0].objectClass[3] == "user");
1008         assert(res.msgs[0].objectGUID != undefined);
1009         assert(res.msgs[0].whenCreated != undefined);
1010         assert(res.msgs[0].objectCategory == ("CN=Person,CN=Schema,CN=Configuration," + base_dn));
1011         assert(res.msgs[0].sAMAccountType == 805306368);
1012         assert(res.msgs[0].userAccountControl == 546);
1013         assert(strupper(res.msgs[0].memberOf[0]) == strupper("CN=ldaptestgroup2,CN=Users," + base_dn));
1014         assert(res.msgs[0].memberOf.length == 1);
1015  
1016         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
1017         var res2 = ldb.search("(&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
1018         if (res2.error != 0 || res2.msgs.length != 1) {
1019                 println("Could not find (&(cn=ldaptestuser)(objectCategory=cn=person,cn=schema,cn=configuration," + base_dn + "))");
1020                 assert(res2.error == 0);
1021                 assert(res2.msgs.length == 1);
1022         }
1023
1024         assert(res.msgs[0].dn == res2.msgs[0].dn);
1025
1026         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon))");
1027         var res3 = ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
1028         if (res3.error != 0) {
1029                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): " + res3.errstr);
1030                 assert(res3.error == 0);
1031         } else if (res3.msgs.length != 1) {
1032                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)): matched " + res3.msgs.length);
1033                 assert(res3.msgs.length == 1);
1034         }
1035
1036         assert(res.msgs[0].dn == res3.msgs[0].dn);
1037
1038         if (gc_ldb != undefined) {
1039                 println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
1040                 var res3gc = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))");
1041                 if (res3gc.error != 0) {
1042                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: " + res3gc.errstr);
1043                         assert(res3gc.error == 0);
1044                 } else if (res3gc.msgs.length != 1) {
1045                         println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog: matched " + res3gc.msgs.length);
1046                         assert(res3gc.msgs.length == 1);
1047                 }
1048         
1049                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
1050         }
1051
1052         println("Testing ldb.search for (&(cn=ldaptestuser)(objectCategory=PerSon)) in with 'phantom root' control");
1053         var attrs = new Array("cn");
1054         var controls = new Array("search_options:1:2");
1055         var res3control = gc_ldb.search("(&(cn=ldaptestuser)(objectCategory=PerSon))", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1056         if (res3control.error != 0 || res3control.msgs.length != 1) {
1057                 println("Could not find (&(cn=ldaptestuser)(objectCategory=PerSon)) in Global Catalog");
1058                 assert(res3control.error == 0);
1059                 assert(res3control.msgs.length == 1);
1060         }
1061         
1062         assert(res.msgs[0].dn == res3control.msgs[0].dn);
1063
1064         ok = ldb.del(res.msgs[0].dn);
1065         if (ok.error != 0) {
1066                 println(ok.errstr);
1067                 assert(ok.error == 0);
1068         }
1069
1070         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectClass=user))");
1071         var res = ldb.search("(&(cn=ldaptestcomputer)(objectClass=user))");
1072         if (res.error != 0 || res.msgs.length != 1) {
1073                 println("Could not find (&(cn=ldaptestcomputer)(objectClass=user))");
1074                 assert(res.error == 0);
1075                 assert(res.msgs.length == 1);
1076         }
1077
1078         assert(res.msgs[0].dn == ("CN=ldaptestcomputer,CN=Computers," + base_dn));
1079         assert(res.msgs[0].cn == "ldaptestcomputer");
1080         assert(res.msgs[0].name == "ldaptestcomputer");
1081         assert(res.msgs[0].objectClass[0] == "top");
1082         assert(res.msgs[0].objectClass[1] == "person");
1083         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
1084         assert(res.msgs[0].objectClass[3] == "user");
1085         assert(res.msgs[0].objectClass[4] == "computer");
1086         assert(res.msgs[0].objectGUID != undefined);
1087         assert(res.msgs[0].whenCreated != undefined);
1088         assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
1089         assert(res.msgs[0].sAMAccountType == 805306368);
1090         assert(res.msgs[0].userAccountControl == 546);
1091
1092         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
1093         var res2 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
1094         if (res2.error != 0 || res2.msgs.length != 1) {
1095                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
1096                 assert(res2.error == 0);
1097                 assert(res2.msgs.length == 1);
1098         }
1099
1100         assert(res.msgs[0].dn == res2.msgs[0].dn);
1101
1102         if (gc_ldb != undefined) {
1103                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
1104                 var res2gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + "))");
1105                 if (res2gc.error != 0 || res2gc.msgs.length != 1) {
1106                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=cn=computer,cn=schema,cn=configuration," + base_dn + ")) in Global Catlog");
1107                         assert(res2gc.error == 0);
1108                         assert(res2gc.msgs.length == 1);
1109                 }
1110
1111                 assert(res.msgs[0].dn == res2gc.msgs[0].dn);
1112         }
1113
1114         println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
1115         var res3 = ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
1116         if (res3.error != 0 || res3.msgs.length != 1) {
1117                 println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER))");
1118                 assert(res3.error == 0);
1119                 assert(res3.msgs.length == 1);
1120         }
1121
1122         assert(res.msgs[0].dn == res3.msgs[0].dn);
1123
1124         if (gc_ldb != undefined) {
1125                 println("Testing ldb.search for (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
1126                 var res3gc = gc_ldb.search("(&(cn=ldaptestcomputer)(objectCategory=compuTER))");
1127                 if (res3gc.error != 0 || res3gc.msgs.length != 1) {
1128                         println("Could not find (&(cn=ldaptestcomputer)(objectCategory=compuTER)) in Global Catalog");
1129                         assert(res3gc.error == 0);
1130                         assert(res3gc.msgs.length == 1);
1131                 }
1132
1133                 assert(res.msgs[0].dn == res3gc.msgs[0].dn);
1134         }
1135
1136         println("Testing ldb.search for (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
1137         var res4 = ldb.search("(&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
1138         if (res4.error != 0 || res4.msgs.length != 1) {
1139                 println("Could not find (&(cn=ldaptestcomp*r)(objectCategory=compuTER))");
1140                 assert(res4.error == 0);
1141                 assert(res4.msgs.length == 1);
1142         }
1143
1144         assert(res.msgs[0].dn == res4.msgs[0].dn);
1145
1146         println("Testing ldb.search for (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
1147         var res5 = ldb.search("(&(cn=ldaptestcomput*)(objectCategory=compuTER))");
1148         if (res5.error != 0 || res5.msgs.length != 1) {
1149                 println("Could not find (&(cn=ldaptestcomput*)(objectCategory=compuTER))");
1150                 assert(res5.error == 0);
1151                 assert(res5.msgs.length == 1);
1152         }
1153
1154         assert(res.msgs[0].dn == res5.msgs[0].dn);
1155
1156         println("Testing ldb.search for (&(cn=*daptestcomputer)(objectCategory=compuTER))");
1157         var res6 = ldb.search("(&(cn=*daptestcomputer)(objectCategory=compuTER))");
1158         if (res6.error != 0 || res6.msgs.length != 1) {
1159                 println("Could not find (&(cn=*daptestcomputer)(objectCategory=compuTER))");
1160                 assert(res6.error == 0);
1161                 assert(res6.msgs.length == 1);
1162         }
1163
1164         assert(res.msgs[0].dn == res6.msgs[0].dn);
1165
1166         ok = ldb.del(res.msgs[0].dn);
1167         if (ok.error != 0) {
1168                 println(ok.errstr);
1169                 assert(ok.error == 0);
1170         }
1171
1172         println("Testing ldb.search for (&(cn=ldaptest2computer)(objectClass=user))");
1173         var res = ldb.search("(&(cn=ldaptest2computer)(objectClass=user))");
1174         if (res.error != 0 || res.msgs.length != 1) {
1175                 println("Could not find (&(cn=ldaptest2computer)(objectClass=user))");
1176                 assert(res.error == 0);
1177                 assert(res.msgs.length == 1);
1178         }
1179
1180         assert(res.msgs[0].dn == ("CN=ldaptest2computer,CN=Computers," + base_dn));
1181         assert(res.msgs[0].cn == "ldaptest2computer");
1182         assert(res.msgs[0].name == "ldaptest2computer");
1183         assert(res.msgs[0].objectClass[0] == "top");
1184         assert(res.msgs[0].objectClass[1] == "person");
1185         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
1186         assert(res.msgs[0].objectClass[3] == "user");
1187         assert(res.msgs[0].objectClass[4] == "computer");
1188         assert(res.msgs[0].objectGUID != undefined);
1189         assert(res.msgs[0].whenCreated != undefined);
1190         assert(res.msgs[0].objectCategory == "cn=Computer,cn=Schema,cn=Configuration," + base_dn);
1191         assert(res.msgs[0].sAMAccountType == 805306369);
1192         assert(res.msgs[0].userAccountControl == 4096);
1193
1194
1195         ok = ldb.del(res.msgs[0].dn);
1196         if (ok.error != 0) {
1197                 println(ok.errstr);
1198                 assert(ok.error == 0);
1199         }
1200
1201         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor", "memberOf");
1202         println("Testing ldb.search for (&(cn=ldaptestUSer2)(objectClass=user))");
1203         var res = ldb.search("(&(cn=ldaptestUSer2)(objectClass=user))", base_dn, ldb.SCOPE_SUBTREE, attrs);
1204         if (res.error != 0 || res.msgs.length != 1) {
1205                 println("Could not find (&(cn=ldaptestUSer2)(objectClass=user))");
1206                 assert(res.error == 0);
1207                 assert(res.msgs.length == 1);
1208         }
1209
1210         assert(res.msgs[0].dn == ("CN=ldaptestuser2,CN=Users," + base_dn));
1211         assert(res.msgs[0].cn == "ldaptestuser2");
1212         assert(res.msgs[0].name == "ldaptestuser2");
1213         assert(res.msgs[0].objectClass[0] == "top");
1214         assert(res.msgs[0].objectClass[1] == "person");
1215         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
1216         assert(res.msgs[0].objectClass[3] == "user");
1217         assert(res.msgs[0].objectGUID != undefined);
1218         assert(res.msgs[0].whenCreated != undefined);
1219         assert(res.msgs[0].nTSecurityDescriptor != undefined);
1220         assert(res.msgs[0].memberOf[0] == ("CN=ldaptestgroup2,CN=Users," + base_dn));
1221
1222         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor", "member");
1223         println("Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group))");
1224         var res = ldb.search("(&(cn=ldaptestgroup2)(objectClass=group))", base_dn, ldb.SCOPE_SUBTREE, attrs);
1225         if (res.error != 0 || res.msgs.length != 1) {
1226                 println("Could not find (&(cn=ldaptestgroup2)(objectClass=group))");
1227                 assert(res.error == 0);
1228                 assert(res.msgs.length == 1);
1229         }
1230
1231         assert(res.msgs[0].dn == ("CN=ldaptestgroup2,CN=Users," + base_dn));
1232         assert(res.msgs[0].cn == "ldaptestgroup2");
1233         assert(res.msgs[0].name == "ldaptestgroup2");
1234         assert(res.msgs[0].objectClass[0] == "top");
1235         assert(res.msgs[0].objectClass[1] == "group");
1236         assert(res.msgs[0].objectGUID != undefined);
1237         assert(res.msgs[0].whenCreated != undefined);
1238         assert(res.msgs[0].nTSecurityDescriptor != undefined);
1239         assert(res.msgs[0].member[0] == ("CN=ldaptestuser2,CN=Users," + base_dn));
1240         assert(res.msgs[0].member.length == 1);
1241
1242         ok = ldb.modify("
1243 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
1244 changetype: modify
1245 replace: member
1246 member: CN=ldaptestuser2,CN=Users," + base_dn + "
1247 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
1248 ");
1249         if (ok.error != 0) {
1250                 println("Failure testing replace of linked attributes");
1251                 println(ok.errstr);
1252                 assert(ok.error == 0);
1253         }
1254         
1255         println("Testing Linked attribute behaviours");
1256         ok = ldb.modify("
1257 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
1258 changetype: modify
1259 delete: member
1260 ");
1261         if (ok.error != 0) {
1262                 println("Failure testing delete of linked attributes");
1263                 println(ok.errstr);
1264                 assert(ok.error == 0);
1265         }
1266         
1267         ok = ldb.modify("
1268 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
1269 changetype: modify
1270 add: member
1271 member: CN=ldaptestuser2,CN=Users," + base_dn + "
1272 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
1273 ");
1274         if (ok.error != 0) {
1275                 println("Failure testing add of linked attributes");
1276                 println(ok.errstr);
1277                 assert(ok.error == 0);
1278         }
1279         
1280         ok = ldb.modify("
1281 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
1282 changetype: modify
1283 replace: member
1284 ");
1285         if (ok.error != 0) {
1286                 println("Failure testing replace of linked attributes");
1287                 println(ok.errstr);
1288                 assert(ok.error == 0);
1289         }
1290         
1291         ok = ldb.modify("
1292 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
1293 changetype: modify
1294 add: member
1295 member: CN=ldaptestuser2,CN=Users," + base_dn + "
1296 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
1297 ");
1298         if (ok.error != 0) {
1299                 println("Failure testing add of linked attributes");
1300                 println(ok.errstr);
1301                 assert(ok.error == 0);
1302         }
1303         
1304         ok = ldb.modify("
1305 dn: cn=ldaptestgroup2,cn=users," + base_dn + "
1306 changetype: modify
1307 delete: member
1308 member: CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn + "
1309 ");
1310         if (ok.error != 0) {
1311                 println("Failure testing replace of linked attributes");
1312                 println(ok.errstr);
1313                 assert(ok.error == 0);
1314         }
1315         
1316         var res = ldb.search("(&(cn=ldaptestgroup2)(objectClass=group))", base_dn, ldb.SCOPE_SUBTREE, attrs);
1317         if (res.error != 0 || res.msgs.length != 1) {
1318                 println("Could not find (&(cn=ldaptestgroup2)(objectClass=group))");
1319                 assert(res.error == 0);
1320                 assert(res.msgs.length == 1);
1321         }
1322
1323         assert(res.msgs[0].dn == ("CN=ldaptestgroup2,CN=Users," + base_dn));
1324         assert(res.msgs[0].member[0] == ("CN=ldaptestuser2,CN=Users," + base_dn));
1325         assert(res.msgs[0].member.length == 1);
1326
1327         ok = ldb.del(("CN=ldaptestuser2,CN=Users," + base_dn));
1328         if (ok.error != 0) {
1329                 println(ok.errstr);
1330                 assert(ok.error == 0);
1331         }
1332
1333         var attrs = new Array("cn", "name", "objectClass", "objectGUID", "whenCreated", "nTSecurityDescriptor", "member");
1334         println("Testing ldb.search for (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete");
1335         var res = ldb.search("(&(cn=ldaptestgroup2)(objectClass=group))", base_dn, ldb.SCOPE_SUBTREE, attrs);
1336         if (res.error != 0 || res.msgs.length != 1) {
1337                 println("Could not find (&(cn=ldaptestgroup2)(objectClass=group)) to check linked delete");
1338                 assert(res.error == 0);
1339                 assert(res.msgs.length == 1);
1340         }
1341
1342         assert(res.msgs[0].dn == ("CN=ldaptestgroup2,CN=Users," + base_dn));
1343         assert(res.msgs[0].member == undefined);
1344
1345         println("Testing ldb.search for (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1346         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1347
1348         if (res.error != 0 || res.msgs.length != 1) {
1349                 println("Could not find (&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1350                 assert(res.error == 0);
1351                 assert(res.msgs.length == 1);
1352         }
1353
1354         assert(res.msgs[0].dn == ("CN=ldaptestutf8user èùéìòà,CN=Users," + base_dn));
1355         assert(res.msgs[0].cn == "ldaptestutf8user èùéìòà");
1356         assert(res.msgs[0].name == "ldaptestutf8user èùéìòà");
1357         assert(res.msgs[0].objectClass[0] == "top");
1358         assert(res.msgs[0].objectClass[1] == "person");
1359         assert(res.msgs[0].objectClass[2] == "organizationalPerson");
1360         assert(res.msgs[0].objectClass[3] == "user");
1361         assert(res.msgs[0].objectGUID != undefined);
1362         assert(res.msgs[0].whenCreated != undefined);
1363
1364         ok = ldb.del(res.msgs[0].dn);
1365         if (ok.error != 0) {
1366                 println(ok.errstr);
1367                 assert(ok.error == 0);
1368         }
1369
1370         println("Testing ldb.search for (&(cn=ldaptestutf8user2*)(objectClass=user))");
1371         var res = ldb.search("(&(cn=ldaptestutf8user2*)(objectClass=user))");
1372         if (res.error != 0 || res.msgs.length != 1) {
1373                 println("Could not find (&(cn=ldaptestutf8user2*)(objectClass=user))");
1374                 assert(res.error == 0);
1375                 assert(res.msgs.length == 1);
1376         }
1377
1378         ok = ldb.del(res.msgs[0].dn);
1379         if (ok.error != 0) {
1380                 println(ok.errstr);
1381                 assert(ok.error == 0);
1382         }
1383
1384         ok = ldb.del(("CN=ldaptestgroup2,CN=Users," + base_dn))
1385         if (ok.error != 0) {
1386                 println(ok.errstr);
1387                 assert(ok.error == 0);
1388         }
1389
1390         println("Testing ldb.search for (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
1391         var res = ldb.search("(&(cn=ldaptestutf8user ÈÙÉÌÒÀ)(objectClass=user))");
1392
1393         if (res.error != 0 || res.msgs.length != 1) {
1394                 println("Could not find (expect space collapse, win2k3 fails) (&(cn=ldaptestutf8user2 ÈÙÉÌÒÀ)(objectClass=user))");
1395         } else {
1396                 assert(res.msgs[0].dn == ("cn=ldaptestutf8user2 èùéìòà,cn=users," + base_dn));
1397                 assert(res.msgs[0].cn == "ldaptestutf8user2 èùéìòà");
1398         }
1399
1400         println("Testing that we can't get at the configuration DN from the main search base");
1401         var attrs = new Array("cn");
1402         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
1403         assert(res.error == 0);
1404         if (res.msgs.length != 0) {
1405                 println("Got configuration DN " + res.msgs[0].dn + " which should not be able to be seen from main search base");
1406         }
1407         assert(res.msgs.length == 0);
1408
1409         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");
1410         var attrs = new Array("cn");
1411         var controls = new Array("search_options:1:2");
1412         var res = ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1413         assert(res.error == 0);
1414         assert(res.msgs.length > 0);
1415
1416         if (gc_ldb != undefined) {
1417                 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");
1418                 var attrs = new Array("cn");
1419                 var controls = new Array("search_options:1:0");
1420                 var res = gc_ldb.search("objectClass=crossRef", base_dn, gc_ldb.SCOPE_SUBTREE, attrs, controls);
1421                 assert(res.error == 0);
1422                 assert(res.msgs.length > 0);
1423
1424                 println("Testing that we do find configuration elements in the global catlog");
1425                 var attrs = new Array("cn");
1426                 var res = gc_ldb.search("objectClass=crossRef", base_dn, ldb.SCOPE_SUBTREE, attrs);
1427                 assert(res.error == 0);
1428                 assert (res.msgs.length > 0);
1429         
1430                 println("Testing that we do find configuration elements and user elements at the same time");
1431                 var attrs = new Array("cn");
1432                 var res = gc_ldb.search("(|(objectClass=crossRef)(objectClass=person))", base_dn, ldb.SCOPE_SUBTREE, attrs);
1433                 assert(res.error == 0);
1434                 assert (res.msgs.length > 0);
1435
1436                 println("Testing that we do find configuration elements in the global catlog, with the configuration basedn");
1437                 var attrs = new Array("cn");
1438                 var res = gc_ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1439                 assert(res.error == 0);
1440                 assert (res.msgs.length > 0);
1441         }
1442
1443         println("Testing that we can get at the configuration DN on the main LDAP port");
1444         var attrs = new Array("cn");
1445         var res = ldb.search("objectClass=crossRef", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1446         assert(res.error == 0);
1447         assert (res.msgs.length > 0);
1448
1449         println("Testing objectCategory canonacolisation");
1450         var attrs = new Array("cn");
1451         var res = ldb.search("objectCategory=ntDsDSA", configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1452         assert(res.error == 0);
1453         if (res.msgs.length == 0) {
1454                 println("Didn't find any records with objectCategory=ntDsDSA");
1455         }
1456         assert(res.msgs.length != 0);
1457         
1458         var attrs = new Array("cn");
1459         var res = ldb.search("objectCategory=CN=ntDs-DSA," + schema_dn, configuration_dn, ldb.SCOPE_SUBTREE, attrs);
1460         assert(res.error == 0);
1461         if (res.msgs.length == 0) {
1462                 println("Didn't find any records with objectCategory=CN=ntDs-DSA," + schema_dn);
1463         }
1464         assert(res.msgs.length != 0);
1465         
1466         println("Testing objectClass attribute order on "+ base_dn);
1467         var attrs = new Array("objectClass");
1468         var res = ldb.search("objectClass=domain", base_dn, ldb.SCOPE_BASE, attrs);
1469         assert(res.error == 0);
1470         assert(res.msgs.length == 1);
1471
1472         assert(res.msgs[0].objectClass[0] == "top");
1473         assert(res.msgs[0].objectClass[1] == "domain");
1474         assert(res.msgs[0].objectClass[2] == "domainDNS");
1475
1476 //  check enumeration
1477
1478         var attrs = new Array("cn");
1479         println("Testing ldb.search for objectCategory=person");
1480         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs);
1481         assert(res.error == 0);
1482         assert(res.msgs.length > 0);
1483
1484         var attrs = new Array("cn");
1485         var controls = new Array("domain_scope:1");
1486         println("Testing ldb.search for objectCategory=person with domain scope control");
1487         var res = ldb.search("objectCategory=person", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1488         assert(res.error == 0);
1489         assert(res.msgs.length > 0);
1490  
1491         var attrs = new Array("cn");
1492         println("Testing ldb.search for objectCategory=user");
1493         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs);
1494         assert(res.error == 0);
1495         assert(res.msgs.length > 0);
1496
1497         var attrs = new Array("cn");
1498         var controls = new Array("domain_scope:1");
1499         println("Testing ldb.search for objectCategory=user with domain scope control");
1500         var res = ldb.search("objectCategory=user", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1501         assert(res.error == 0);
1502         assert(res.msgs.length > 0);
1503         
1504         var attrs = new Array("cn");
1505         println("Testing ldb.search for objectCategory=group");
1506         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs);
1507         assert(res.error == 0);
1508         assert(res.msgs.length > 0);
1509
1510         var attrs = new Array("cn");
1511         var controls = new Array("domain_scope:1");
1512         println("Testing ldb.search for objectCategory=group with domain scope control");
1513         var res = ldb.search("objectCategory=group", base_dn, ldb.SCOPE_SUBTREE, attrs, controls);
1514         assert(res.error == 0);
1515         assert(res.msgs.length > 0);
1516         
1517 }
1518
1519 function basedn_tests(ldb, gc_ldb)
1520 {
1521         println("Testing for all rootDSE attributes");
1522         var attrs = new Array();
1523         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1524         assert(res.error == 0);
1525         assert(res.msgs.length == 1);
1526
1527         println("Testing for highestCommittedUSN");
1528         var attrs = new Array("highestCommittedUSN");
1529         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1530         assert(res.error == 0);
1531         assert(res.msgs.length == 1);
1532         assert(res.msgs[0].highestCommittedUSN != undefined);
1533         assert(res.msgs[0].highestCommittedUSN != 0);
1534
1535         println("Testing for netlogon via LDAP");
1536         var attrs = new Array("netlogon");
1537         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1538         assert(res.error == 0);
1539         assert(res.msgs.length == 0);
1540
1541         println("Testing for netlogon and highestCommittedUSN via LDAP");
1542         var attrs = new Array("netlogon", "highestCommittedUSN");
1543         var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1544         assert(res.error == 0);
1545         assert(res.msgs.length == 0);
1546 }
1547
1548 function find_basedn(ldb)
1549 {
1550     var attrs = new Array("defaultNamingContext");
1551     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1552     assert(res.error == 0);
1553     assert(res.msgs.length == 1);
1554     return res.msgs[0].defaultNamingContext;
1555 }
1556
1557 function find_configurationdn(ldb)
1558 {
1559     var attrs = new Array("configurationNamingContext");
1560     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1561     assert(res.error == 0);
1562     assert(res.msgs.length == 1);
1563     return res.msgs[0].configurationNamingContext;
1564 }
1565
1566 function find_schemadn(ldb)
1567 {
1568     var attrs = new Array("schemaNamingContext");
1569     var res = ldb.search("", "", ldb.SCOPE_BASE, attrs);
1570     assert(res.error == 0);
1571     assert(res.msgs.length == 1);
1572     return res.msgs[0].schemaNamingContext;
1573 }
1574
1575 /* use command line creds if available */
1576 ldb.credentials = options.get_credentials();
1577 gc_ldb.credentials = options.get_credentials();
1578
1579 var ok = ldb.connect("ldap://" + host);
1580 var base_dn = find_basedn(ldb);
1581
1582 var configuration_dn = find_configurationdn(ldb);
1583 var schema_dn = find_schemadn(ldb);
1584
1585 println("baseDN: %s\n", base_dn);
1586
1587 var ok = gc_ldb.connect("ldap://" + host + ":3268");
1588 if (!ok) {
1589         gc_ldb = undefined;
1590 }
1591
1592 basic_tests(ldb, gc_ldb, base_dn, configuration_dn, schema_dn)
1593
1594 basedn_tests(ldb, gc_ldb)
1595
1596 return 0;