test044-dynlist revision 1.1.1.3
1#! /bin/sh 2## This work is part of OpenLDAP Software <http://www.openldap.org/>. 3## 4## Copyright 1998-2010 The OpenLDAP Foundation. 5## All rights reserved. 6## 7## Redistribution and use in source and binary forms, with or without 8## modification, are permitted only as authorized by the OpenLDAP 9## Public License. 10## 11## A copy of this license is available in the file LICENSE in the 12## top-level directory of the distribution or, alternatively, at 13## <http://www.OpenLDAP.org/license.html>. 14 15echo "running defines.sh" 16. $SRCDIR/scripts/defines.sh 17 18if test $DYNLIST = "dynlistno" ; then 19 echo "dynlist overlay not available, test skipped" 20 exit 0 21fi 22 23if test $BACKEND = ldif ; then 24 # dynlist+ldif fails because back-ldif lacks bi_op_compare() 25 echo "$BACKEND backend unsuitable for dynlist overlay, test skipped" 26 exit 0 27fi 28 29mkdir -p $TESTDIR $DBDIR1 30 31$SLAPPASSWD -g -n >$CONFIGPWF 32echo "rootpw `$SLAPPASSWD -T $CONFIGPWF`" >$TESTDIR/configpw.conf 33 34echo "Running slapadd to build slapd database..." 35. $CONFFILTER $BACKEND $MONITORDB < $MCONF > $ADDCONF 36$SLAPADD -f $ADDCONF -l $LDIFORDERED 37RC=$? 38if test $RC != 0 ; then 39 echo "slapadd failed ($RC)!" 40 exit $RC 41fi 42 43. $CONFFILTER $BACKEND $MONITORDB < $DYNLISTCONF > $CONF1 44 45echo "Starting slapd on TCP/IP port $PORT1..." 46$SLAPD -f $CONF1 -h $URI1 -d $LVL $TIMING > $LOG1 2>&1 & 47PID=$! 48if test $WAIT != 0 ; then 49 echo PID $PID 50 read foo 51fi 52KILLPIDS="$PID" 53 54sleep 1 55 56echo "Testing slapd searching..." 57for i in 0 1 2 3 4 5; do 58 $LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT1 \ 59 '(objectclass=*)' > /dev/null 2>&1 60 RC=$? 61 if test $RC = 0 ; then 62 break 63 fi 64 echo "Waiting 5 seconds for slapd to start..." 65 sleep 5 66done 67 68if test $RC != 0 ; then 69 echo "ldapsearch failed ($RC)!" 70 test $KILLSERVERS != no && kill -HUP $KILLPIDS 71 exit $RC 72fi 73 74cat /dev/null > $SEARCHOUT 75 76LISTDN="ou=Dynamic Lists,$BASEDN" 77echo "Adding a dynamic list..." 78$LDAPADD -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD \ 79 > $TESTOUT 2>&1 << EOMODS 80dn: $LISTDN 81objectClass: organizationalUnit 82ou: Dynamic Lists 83 84dn: cn=Dynamic List,$LISTDN 85objectClass: groupOfURLs 86cn: Dynamic List 87memberURL: ldap:///ou=People,${BASEDN}?cn,mail?sub?(objectClass=person) 88EOMODS 89 90echo "Testing list search of all attrs..." 91echo "# Testing list search of all attrs..." >> $SEARCHOUT 92$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 93 '(cn=Dynamic List)' '*' \ 94 >> $SEARCHOUT 2>&1 95RC=$? 96if test $RC != 0 ; then 97 echo "ldapsearch failed ($RC)!" 98 test $KILLSERVERS != no && kill -HUP $KILLPIDS 99 exit $RC 100fi 101 102echo "Testing list search of a listed attr..." 103echo "# Testing list search of a listed attr..." >> $SEARCHOUT 104$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 105 '(cn=Dynamic List)' mail \ 106 >> $SEARCHOUT 2>&1 107RC=$? 108if test $RC != 0 ; then 109 echo "ldapsearch failed ($RC)!" 110 test $KILLSERVERS != no && kill -HUP $KILLPIDS 111 exit $RC 112fi 113 114echo "Testing list search of a non-listed attr..." 115echo "# Testing list search of a non-listed attr..." >> $SEARCHOUT 116$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 117 '(cn=Dynamic List)' objectClass \ 118 >> $SEARCHOUT 2>&1 119RC=$? 120if test $RC != 0 ; then 121 echo "ldapsearch failed ($RC)!" 122 test $KILLSERVERS != no && kill -HUP $KILLPIDS 123 exit $RC 124fi 125 126echo "Testing list search with (critical) manageDSAit..." 127echo "# Testing list search with (critical) manageDSAit..." >> $SEARCHOUT 128$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 -MM \ 129 '(cn=Dynamic List)' '*' \ 130 >> $SEARCHOUT 2>&1 131RC=$? 132if test $RC != 0 ; then 133 echo "ldapsearch failed ($RC)!" 134 test $KILLSERVERS != no && kill -HUP $KILLPIDS 135 exit $RC 136fi 137 138echo "Testing list compare..." 139echo "# Testing list compare..." >> $SEARCHOUT 140$LDAPCOMPARE -h $LOCALHOST -p $PORT1 \ 141 "cn=Dynamic List,$LISTDN" "cn:Bjorn Jensen" \ 142 >> $SEARCHOUT 2>&1 143RC=$? 144case $RC in 1455) 146 echo "ldapcompare returned FALSE ($RC)!" 147 test $KILLSERVERS != no && kill -HUP $KILLPIDS 148 exit $RC 149 ;; 1506) 151 echo "ldapcompare returned TRUE ($RC)" 152 ;; 1530) 154 echo "ldapcompare returned success ($RC)!" 155 test $KILLSERVERS != no && kill -HUP $KILLPIDS 156 exit -1 157 ;; 158*) 159 echo "ldapcompare failed ($RC)!" 160 test $KILLSERVERS != no && kill -HUP $KILLPIDS 161 exit $RC 162 ;; 163esac 164echo "" >> $SEARCHOUT 165 166echo "Testing list compare (should return FALSE)..." 167echo "# Testing list compare (should return FALSE)..." >> $SEARCHOUT 168$LDAPCOMPARE -h $LOCALHOST -p $PORT1 \ 169 "cn=Dynamic List,$LISTDN" "cn:FALSE" \ 170 >> $SEARCHOUT 2>&1 171RC=$? 172case $RC in 1735) 174 echo "ldapcompare returned FALSE ($RC)" 175 ;; 1766) 177 echo "ldapcompare returned TRUE ($RC)!" 178 test $KILLSERVERS != no && kill -HUP $KILLPIDS 179 exit $RC 180 ;; 1810) 182 echo "ldapcompare returned success ($RC)!" 183 test $KILLSERVERS != no && kill -HUP $KILLPIDS 184 exit -1 185 ;; 186*) 187 echo "ldapcompare failed ($RC)!" 188 test $KILLSERVERS != no && kill -HUP $KILLPIDS 189 exit $RC 190 ;; 191esac 192echo "" >> $SEARCHOUT 193 194echo "Testing list compare (should return UNDEFINED)..." 195echo "# Testing list compare (should return UNDEFINED)..." >> $SEARCHOUT 196$LDAPCOMPARE -h $LOCALHOST -p $PORT1 \ 197 "cn=Dynamic List,$LISTDN" "dc:UNDEFINED" \ 198 >> $SEARCHOUT 2>&1 199RC=$? 200case $RC in 2015) 202 echo "ldapcompare returned FALSE ($RC)!" 203 test $KILLSERVERS != no && kill -HUP $KILLPIDS 204 exit $RC 205 ;; 2066) 207 echo "ldapcompare returned TRUE ($RC)!" 208 test $KILLSERVERS != no && kill -HUP $KILLPIDS 209 exit $RC 210 ;; 21116|32) 212 echo "ldapcompare returned UNDEFINED ($RC)" 213 ;; 2140) 215 echo "ldapcompare returned success ($RC)!" 216 test $KILLSERVERS != no && kill -HUP $KILLPIDS 217 exit -1 218 ;; 219*) 220 echo "ldapcompare failed ($RC)" 221 ;; 222esac 223echo "" >> $SEARCHOUT 224 225echo "Testing list compare with manageDSAit..." 226echo "# Testing list compare with manageDSAit..." >> $SEARCHOUT 227$LDAPCOMPARE -h $LOCALHOST -p $PORT1 -MM \ 228 "cn=Dynamic List,$LISTDN" "cn:Bjorn Jensen" \ 229 >> $SEARCHOUT 2>&1 230RC=$? 231case $RC in 2325) 233 echo "ldapcompare returned FALSE ($RC)" 234 ;; 2356) 236 echo "ldapcompare returned TRUE ($RC)!" 237 test $KILLSERVERS != no && kill -HUP $KILLPIDS 238 exit $RC 239 ;; 2400) 241 echo "ldapcompare returned success ($RC)!" 242 test $KILLSERVERS != no && kill -HUP $KILLPIDS 243 exit -1 244 ;; 245*) 246 echo "ldapcompare failed ($RC)!" 247 test $KILLSERVERS != no && kill -HUP $KILLPIDS 248 exit $RC 249 ;; 250esac 251echo "" >> $SEARCHOUT 252 253echo "Reconfiguring slapd..." 254$LDAPMODIFY -x -D cn=config -h $LOCALHOST -p $PORT1 -y $CONFIGPWF > \ 255 $TESTOUT 2>&1 << EOMODS 256version: 1 257dn: olcOverlay={0}dynlist,olcDatabase={2}$BACKEND,cn=config 258changetype: modify 259delete: olcDLattrSet 260olcDLattrSet: {0} 261- 262add: olcDLattrSet 263olcDLattrSet: groupOfURLs memberURL sn:cn mail 264- 265EOMODS 266 267echo "==========================================================" >> $LOG1 268 269echo "Testing attribute mapping" 270 271echo "Testing list search of all (mapped) attrs..." 272echo "# Testing list search of all (mapped) attrs..." >> $SEARCHOUT 273$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 274 '(cn=Dynamic List)' '*' \ 275 >> $SEARCHOUT 2>&1 276RC=$? 277if test $RC != 0 ; then 278 echo "ldapsearch failed ($RC)!" 279 test $KILLSERVERS != no && kill -HUP $KILLPIDS 280 exit $RC 281fi 282 283echo "Testing list search of a (mapped) listed attr..." 284echo "# Testing list search of a (mapped) listed attr..." >> $SEARCHOUT 285$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 286 '(cn=Dynamic List)' sn \ 287 >> $SEARCHOUT 2>&1 288RC=$? 289if test $RC != 0 ; then 290 echo "ldapsearch failed ($RC)!" 291 test $KILLSERVERS != no && kill -HUP $KILLPIDS 292 exit $RC 293fi 294 295echo "Testing list search of a (n unmapped) listed attr..." 296echo "# Testing list search of a (n unmapped) listed attr..." >> $SEARCHOUT 297$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 298 '(cn=Dynamic List)' mail \ 299 >> $SEARCHOUT 2>&1 300RC=$? 301if test $RC != 0 ; then 302 echo "ldapsearch failed ($RC)!" 303 test $KILLSERVERS != no && kill -HUP $KILLPIDS 304 exit $RC 305fi 306 307echo "Testing list compare (mapped attrs) ..." 308echo "# Testing list compare (mapped attrs) ..." >> $SEARCHOUT 309$LDAPCOMPARE -h $LOCALHOST -p $PORT1 \ 310 "cn=Dynamic List,$LISTDN" "sn:Bjorn Jensen" \ 311 >> $SEARCHOUT 2>&1 312RC=$? 313case $RC in 3145) 315 echo "ldapcompare returned FALSE ($RC)!" 316 test $KILLSERVERS != no && kill -HUP $KILLPIDS 317 exit $RC 318 ;; 3196) 320 echo "ldapcompare returned TRUE ($RC)" 321 ;; 3220) 323 echo "ldapcompare returned success ($RC)!" 324 test $KILLSERVERS != no && kill -HUP $KILLPIDS 325 exit -1 326 ;; 327*) 328 echo "ldapcompare failed ($RC)!" 329 test $KILLSERVERS != no && kill -HUP $KILLPIDS 330 exit $RC 331 ;; 332esac 333echo "" >> $SEARCHOUT 334 335echo "Testing list compare (mapped attrs; should return FALSE)..." 336echo "# Testing list compare (mapped attrs; should return FALSE)..." >> $SEARCHOUT 337$LDAPCOMPARE -h $LOCALHOST -p $PORT1 \ 338 "cn=Dynamic List,$LISTDN" "sn:FALSE" \ 339 >> $SEARCHOUT 2>&1 340RC=$? 341case $RC in 3425) 343 echo "ldapcompare returned FALSE ($RC)" 344 ;; 3456) 346 echo "ldapcompare returned TRUE ($RC)!" 347 test $KILLSERVERS != no && kill -HUP $KILLPIDS 348 exit $RC 349 ;; 3500) 351 echo "ldapcompare returned success ($RC)!" 352 test $KILLSERVERS != no && kill -HUP $KILLPIDS 353 exit -1 354 ;; 355*) 356 echo "ldapcompare failed ($RC)!" 357 test $KILLSERVERS != no && kill -HUP $KILLPIDS 358 exit $RC 359 ;; 360esac 361echo "" >> $SEARCHOUT 362 363echo "Reconfiguring slapd..." 364$LDAPMODIFY -x -D cn=config -h $LOCALHOST -p $PORT1 -y $CONFIGPWF > \ 365 $TESTOUT 2>&1 << EOMODS 366version: 1 367dn: olcOverlay={0}dynlist,olcDatabase={2}$BACKEND,cn=config 368changetype: modify 369delete: olcDLattrSet 370olcDLattrSet: {0} 371- 372add: olcDLattrSet 373olcDLattrSet: groupOfURLs memberURL member 374- 375EOMODS 376 377echo "==========================================================" >> $LOG1 378 379echo "Adding a dynamic list..." 380$LDAPADD -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD \ 381 > $TESTOUT 2>&1 << EOMODS 382dn: cn=Dynamic List of Members,$LISTDN 383objectClass: groupOfURLs 384cn: Dynamic List of Members 385memberURL: ldap:///ou=People,${BASEDN}??sub?(objectClass=person) 386EOMODS 387 388echo "Testing list search of all attrs..." 389echo "# Testing list search of all attrs..." >> $SEARCHOUT 390$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 391 '(cn=Dynamic List of Members)' '*' \ 392 >> $SEARCHOUT 2>&1 393RC=$? 394if test $RC != 0 ; then 395 echo "ldapsearch failed ($RC)!" 396 test $KILLSERVERS != no && kill -HUP $KILLPIDS 397 exit $RC 398fi 399 400echo "Testing list search of a listed attr..." 401echo "# Testing list search of a listed attr..." >> $SEARCHOUT 402$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 403 '(cn=Dynamic List of Members)' member \ 404 >> $SEARCHOUT 2>&1 405RC=$? 406if test $RC != 0 ; then 407 echo "ldapsearch failed ($RC)!" 408 test $KILLSERVERS != no && kill -HUP $KILLPIDS 409 exit $RC 410fi 411 412echo "Testing list search of a non-listed attr..." 413echo "# Testing list search of a non-listed attr..." >> $SEARCHOUT 414$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 415 '(cn=Dynamic List of Members)' objectClass \ 416 >> $SEARCHOUT 2>&1 417RC=$? 418if test $RC != 0 ; then 419 echo "ldapsearch failed ($RC)!" 420 test $KILLSERVERS != no && kill -HUP $KILLPIDS 421 exit $RC 422fi 423 424echo "Testing list search with (critical) manageDSAit..." 425echo "# Testing list search with (critical) manageDSAit..." >> $SEARCHOUT 426$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 -MM \ 427 '(&(cn=Dynamic List of Members)(objectClass=groupOfURLs))' '*' \ 428 >> $SEARCHOUT 2>&1 429RC=$? 430if test $RC != 0 ; then 431 echo "ldapsearch failed ($RC)!" 432 test $KILLSERVERS != no && kill -HUP $KILLPIDS 433 exit $RC 434fi 435 436CMPDN="$BJORNSDN" 437echo "Testing list compare..." 438echo "# Testing list compare..." >> $SEARCHOUT 439$LDAPCOMPARE -h $LOCALHOST -p $PORT1 \ 440 "cn=Dynamic List of Members,$LISTDN" "member:$CMPDN" \ 441 >> $SEARCHOUT 2>&1 442RC=$? 443case $RC in 4445) 445 echo "ldapcompare returned FALSE ($RC)!" 446 test $KILLSERVERS != no && kill -HUP $KILLPIDS 447 exit $RC 448 ;; 4496) 450 echo "ldapcompare returned TRUE ($RC)" 451 ;; 4520) 453 echo "ldapcompare returned success ($RC)!" 454 test $KILLSERVERS != no && kill -HUP $KILLPIDS 455 exit -1 456 ;; 457*) 458 echo "ldapcompare failed ($RC)!" 459 test $KILLSERVERS != no && kill -HUP $KILLPIDS 460 exit $RC 461 ;; 462esac 463echo "" >> $SEARCHOUT 464 465echo "Testing list compare (should return FALSE)..." 466echo "# Testing list compare (should return FALSE)..." >> $SEARCHOUT 467$LDAPCOMPARE -h $LOCALHOST -p $PORT1 \ 468 "cn=Dynamic List of Members,$LISTDN" "member:cn=Foo Bar" \ 469 >> $SEARCHOUT 2>&1 470RC=$? 471case $RC in 4725) 473 echo "ldapcompare returned FALSE ($RC)" 474 ;; 4756) 476 echo "ldapcompare returned TRUE ($RC)!" 477 test $KILLSERVERS != no && kill -HUP $KILLPIDS 478 exit $RC 479 ;; 4800) 481 echo "ldapcompare returned success ($RC)!" 482 test $KILLSERVERS != no && kill -HUP $KILLPIDS 483 exit -1 484 ;; 485*) 486 echo "ldapcompare failed ($RC)!" 487 test $KILLSERVERS != no && kill -HUP $KILLPIDS 488 exit $RC 489 ;; 490esac 491echo "" >> $SEARCHOUT 492 493echo "Testing list compare with manageDSAit..." 494echo "# Testing list compare with manageDSAit..." >> $SEARCHOUT 495$LDAPCOMPARE -h $LOCALHOST -p $PORT1 -MM \ 496 "cn=Dynamic List,$LISTDN" "member:$CMPDN" \ 497 >> $SEARCHOUT 2>&1 498RC=$? 499case $RC in 5005) 501 echo "ldapcompare returned FALSE ($RC)" 502 ;; 5036) 504 echo "ldapcompare returned TRUE ($RC)!" 505 test $KILLSERVERS != no && kill -HUP $KILLPIDS 506 exit $RC 507 ;; 5080) 509 echo "ldapcompare returned success ($RC)!" 510 test $KILLSERVERS != no && kill -HUP $KILLPIDS 511 exit -1 512 ;; 513*) 514 echo "ldapcompare failed ($RC)!" 515 test $KILLSERVERS != no && kill -HUP $KILLPIDS 516 exit $RC 517 ;; 518esac 519echo "" >> $SEARCHOUT 520 521echo "==========================================================" >> $LOG1 522 523echo "Testing dgIdentity..." 524 525# Set ACL, require authentication to get list contents 526$LDAPMODIFY -x -D cn=config -h $LOCALHOST -p $PORT1 -y $CONFIGPWF > \ 527 $TESTOUT 2>&1 << EOMODS 528version: 1 529dn: olcDatabase={2}$BACKEND,cn=config 530changetype: modify 531add: olcAccess 532olcAccess: to dn.base="cn=Dynamic List of Members,$LISTDN" by * read 533olcAccess: to * by users read by * search 534EOMODS 535 536echo "Testing list search without dgIdentity..." 537echo "# Testing list search without dgIdentity..." >> $SEARCHOUT 538$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 539 '(cn=Dynamic List of Members)' '*' \ 540 >> $SEARCHOUT 2>&1 541RC=$? 542if test $RC != 0 ; then 543 echo "ldapsearch failed ($RC)!" 544 test $KILLSERVERS != no && kill -HUP $KILLPIDS 545 exit $RC 546fi 547 548$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD \ 549 > $TESTOUT 2>&1 << EOMODS 550dn: cn=Dynamic List of Members,$LISTDN 551changetype: modify 552add: objectClass 553objectClass: dgIdentityAux 554- 555add: dgIdentity 556dgIdentity: $CMPDN 557EOMODS 558 559echo "Testing list search with dgIdentity..." 560echo "# Testing list search with dgIdentity..." >> $SEARCHOUT 561$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 562 '(cn=Dynamic List of Members)' '*' \ 563 >> $SEARCHOUT 2>&1 564RC=$? 565if test $RC != 0 ; then 566 echo "ldapsearch failed ($RC)!" 567 test $KILLSERVERS != no && kill -HUP $KILLPIDS 568 exit $RC 569fi 570 571echo "Testing dgAuthz..." 572 573CMPDN="cn=Bjorn Jensen,ou=Information Technology Division,ou=People,$BASEDN" 574$LDAPMODIFY -v -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD \ 575 > $TESTOUT 2>&1 << EOMODS 576dn: cn=Dynamic List of Members,$LISTDN 577changetype: modify 578add: dgAuthz 579dgAuthz: dn:$BABSDN 580EOMODS 581 582echo "Testing list search with dgIdentity and dgAuthz anonymously..." 583echo "# Testing list search with dgIdentity and dgAuthz anonymously..." >> $SEARCHOUT 584$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 585 '(cn=Dynamic List of Members)' '*' \ 586 >> $SEARCHOUT 2>&1 587RC=$? 588if test $RC != 0 ; then 589 echo "ldapsearch failed ($RC)!" 590 test $KILLSERVERS != no && kill -HUP $KILLPIDS 591 exit $RC 592fi 593 594echo "Testing list search with dgIdentity and dgAuthz as the authorized identity..." 595echo "# Testing list search with dgIdentity and dgAuthz as the authorized identity..." >> $SEARCHOUT 596$LDAPSEARCH -S "" -b "$LISTDN" -h $LOCALHOST -p $PORT1 \ 597 -D "$BABSDN" -w bjensen \ 598 '(cn=Dynamic List of Members)' '*' \ 599 >> $SEARCHOUT 2>&1 600RC=$? 601if test $RC != 0 ; then 602 echo "ldapsearch failed ($RC)!" 603 test $KILLSERVERS != no && kill -HUP $KILLPIDS 604 exit $RC 605fi 606 607test $KILLSERVERS != no && kill -HUP $KILLPIDS 608 609LDIF=$DYNLISTOUT 610 611echo "Filtering ldapsearch results..." 612$LDIFFILTER < $SEARCHOUT > $SEARCHFLT 613echo "Filtering original ldif used to create database..." 614$LDIFFILTER < $LDIF > $LDIFFLT 615echo "Comparing filter output..." 616$CMP $SEARCHFLT $LDIFFLT > $CMPOUT 617 618if test $? != 0 ; then 619 echo "Comparison failed" 620 exit 1 621fi 622 623echo ">>>>> Test succeeded" 624 625test $KILLSERVERS != no && wait 626 627exit 0 628