1# -*- tcl -*- 2# Tests for the logger facility. 3# 4# Sourcing this file into Tcl runs the tests and generates output for errors. 5# No output means no errors were found. 6# 7# Copyright (c) 2002 by David N. Welton <davidw@dedasys.com>. 8# Copyright (c) 2004,2005 by Michael Schlenker <mic42@users.sourceforge.net>. 9 10# ------------------------------------------------------------------------- 11 12source [file join \ 13 [file dirname [file dirname [file join [pwd] [info script]]]] \ 14 devtools testutilities.tcl] 15 16testsNeedTcl 8.2 17testsNeedTcltest 1.0 18 19testing { 20 useLocal logger.tcl logger 21} 22 23# ------------------------------------------------------------------------- 24 25test logger-1.0 {init basic} { 26 set log [logger::init global] 27 ${log}::delete 28 set log 29} {::logger::tree::global} 30 31test logger-1.1 {init sub-system} { 32 set log [logger::init global::subsystem] 33 ${log}::delete 34 # cleanup the leftover global log 35 ::logger::tree::global::delete 36 set log 37} {::logger::tree::global::subsystem} 38 39test logger-1.2 {instantiate main logger and child} { 40 set log1 [logger::init global] 41 set log2 [logger::init global::subsystem] 42 ${log2}::delete 43 ${log1}::delete 44 list $log1 $log2 45} {::logger::tree::global ::logger::tree::global::subsystem} 46 47test logger-1.3 {instantiate logger with problematic name} { 48 set log [logger::init foo::logger::tree::bar] 49 set services [logger::services] 50 # direct cleanup of logger namespace 51 foreach srv $services { 52 ::logger::tree::${srv}::delete 53 } 54 set services_post [logger::services] 55 list $log [lsort $services] $services_post 56} {::logger::tree::foo::logger::tree::bar {foo foo::logger foo::logger::tree foo::logger::tree::bar} {}} 57 58test logger-1.4 {check default loglevel} { 59 set log [logger::init foo] 60 set lvl [${log}::currentloglevel] 61 ${log}::delete 62 set lvl 63} {debug} 64 65test logger-1.5 {init with empty name} { 66 catch { logger::init {} } err 67 set err 68} {Service name invalid. May not consist only of : or be empty} 69 70test logger-1.6 {init with empty name} { 71 catch { logger::init : } err 72 set err 73} {Service name invalid. May not consist only of : or be empty} 74 75test logger-1.7 {init with empty name} { 76 catch { logger::init ::: } err 77 set err 78} {Service name invalid. May not consist only of : or be empty} 79 80test logger-2.0 {delete} { 81 set log [logger::init global] 82 ${log}::delete 83 catch {set ${log}::enabled} err 84 set err 85} {can't read "::logger::tree::global::enabled": no such variable} 86 87proc dellog {ns args} { 88 lappend ::results "$ns $args" 89} 90 91test logger-2.1 {delete + callback} { 92 set ::results {} 93 set log1 [logger::init global] 94 set log2 [logger::init global::subsystem] 95 ${log1}::delproc [list dellog $log1] 96 ${log2}::delproc [list dellog $log2] 97 ${log1}::delete 98 set ::results 99} {{::logger::tree::global::subsystem } {::logger::tree::global }} 100 101test logger-2.2 {delete + complex callback} { 102 set ::results {} 103 set log1 [logger::init global] 104 set log2 [logger::init global::subsystem] 105 ${log1}::delproc [list dellog $log1 sock1] 106 ${log2}::delproc [list dellog $log2 sock2] 107 ${log1}::delete 108 set ::results 109} {{::logger::tree::global::subsystem sock2} {::logger::tree::global sock1}} 110 111test logger-2.3 {delproc introspection} { 112 set log [logger::init global] 113 ${log}::delproc [list dellog $log sock1] 114 set cmd [${log}::delproc] 115 ${log}::delete 116 set cmd 117} {dellog ::logger::tree::global sock1} 118 119test logger-2.4 {delproc with nonexisting proc} { 120 set l [logger::init global] 121 ${l}::setlevel [lindex [logger::levels] 0] 122 set code [catch {${l}::delproc ""} msg] 123 ${l}::delete 124 list $code $msg 125 126} {1 {Invalid cmd '' - does not exist}} 127 128# The tests 3.0 and 3.1 are a bit weak.. 129test logger-3.0 {log} { 130 set log [logger::init global] 131 ${log}::logproc error txt {set ::INFO $txt} 132 ${log}::error "Danger Will Robinson!" 133 ${log}::delete 134 set ::INFO 135} {Danger Will Robinson!} 136 137test logger-3.1 {log} { 138 set log [logger::init global] 139 ${log}::logproc warn txt {set ::INFO $txt} 140 ${log}::warn "Danger Will Robinson!" 141 ${log}::delete 142 set ::INFO 143} {Danger Will Robinson!} 144 145test logger-3.2 {log} { 146 set log [logger::init global] 147 ${log}::logproc info txt { 148 set ::INFO "Danger Will Robinson!" 149 } 150 ${log}::info "Alert" 151 ${log}::delete 152 set ::INFO 153} {Danger Will Robinson!} 154 155test logger-3.3 {log} { 156 set log [logger::init global] 157 ${log}::logproc warn txt {set ::INFO $txt} 158 ${log}::warn Danger Will Robinson! 159 ${log}::delete 160 set ::INFO 161} {Danger Will Robinson!} 162 163test logger-3.4 {log} { 164 set log1 [logger::init global] 165 ${log1}::logproc info txt { 166 set ::INFO "LOGGED: $txt" 167 } 168 set log2 [logger::init global::subsystem] 169 ${log1}::info boo 170 lappend retval [set ::INFO] 171 ${log2}::info BOO 172 lappend retval [set ::INFO] 173 ${log2}::delete 174 ${log1}::delete 175 set retval 176} {{LOGGED: boo} {LOGGED: BOO}} 177 178test logger-4.0 {disable} { 179 set ::INFO {no change} 180 set log [logger::init global] 181 ${log}::logproc info txt { 182 set ::INFO "Danger Will Robinson!" 183 } 184 ${log}::disable warn 185 ${log}::info "Alert" 186 ${log}::delete 187 set ::INFO 188} {no change} 189 190test logger-4.1 {disable + enable} { 191 set ::INFO {no change} 192 set log [logger::init global] 193 ${log}::logproc info txt { 194 set ::INFO "Danger Will Robinson!" 195 } 196 ${log}::disable warn 197 ${log}::enable info 198 ${log}::info "Alert" 199 ${log}::delete 200 set ::INFO 201} {Danger Will Robinson!} 202 203test logger-4.2 {disable all} { 204 set ::INFO {no change} 205 set log [logger::init global] 206 ${log}::logproc critical txt { 207 set ::INFO "Danger Will Robinson!" 208 } 209 ${log}::disable critical 210 ${log}::critical "Alert" 211 ${log}::delete 212 set ::INFO 213} {no change} 214 215test logger-4.3 {enable all} { 216 set ::INFO {no change} 217 set log [logger::init global] 218 ${log}::logproc debug txt { 219 set ::INFO "Danger Will Robinson!" 220 } 221 ${log}::enable debug 222 ${log}::debug "Alert" 223 ${log}::delete 224 set ::INFO 225} {Danger Will Robinson!} 226 227test logger-4.4 {enable bad args} { 228 set log [logger::init global] 229 catch { ${log}::enable badargs } err 230 ${log}::delete 231 set err 232} {Invalid level 'badargs' - levels are debug info notice warn error critical alert emergency} 233 234test logger-4.5 {test method inheritance} { 235 set log1 [logger::init global] 236 set log2 [logger::init global::child] 237 ${log1}::logproc notice txt { 238 set ::INFO "Danger Will Robinson!" 239 } 240 ${log2}::notice "alert" 241 ${log2}::delete 242 ${log1}::delete 243 set ::INFO 244} {Danger Will Robinson!} 245 246test logger-4.6 {disable bad args} { 247 set log [logger::init global] 248 catch { ${log}::disable badargs } err 249 ${log}::delete 250 set err 251} {Invalid level 'badargs' - levels are debug info notice warn error critical alert emergency} 252 253test logger-5.0 {setlevel command} { 254 set ::INFO "" 255 set log1 [logger::init global] 256 ${log1}::setlevel warn 257 ${log1}::logproc error txt { 258 lappend ::INFO "Error Message" 259 } 260 ${log1}::logproc warn txt { 261 lappend ::INFO "Warning Message" 262 } 263 ${log1}::logproc notice txt { 264 lappend ::INFO "Notice Message" 265 } 266 ${log1}::error "error" 267 ${log1}::warn "warn" 268 ${log1}::notice "notice" 269 ${log1}::delete 270 set ::INFO 271} {{Error Message} {Warning Message}} 272 273test logger-5.1 {setlevel, invalid level} { 274 set log [logger::init global] 275 set code [catch {${log}::setlevel badargs} msg] 276 ${log}::delete 277 list $code $msg 278} {1 {Invalid level 'badargs' - levels are debug info notice warn error critical alert emergency}} 279 280test logger-5.2 {setlevel, with children} { 281 set log1 [logger::init global] 282 ${log1}::setlevel notice 283 set log2 [logger::init global::child] 284 set ::DEBUGINFO "" 285 set ::WARNINFO "" 286 ${log1}::logproc debug txt { 287 lappend ::DEBUGINFO $txt 288 } 289 ${log1}::logproc warn txt { 290 lappend ::WARNINFO $txt 291 } 292 ${log1}::debug Parent 293 ${log1}::warn Parent 294 ${log2}::debug Child 295 ${log2}::warn Child 296 ${log1}::delete 297 list $::DEBUGINFO $::WARNINFO 298} {{} {Parent Child}} 299 300test logger-5.3 {global setlevel before logger::init} { 301 logger::setlevel error 302 set log1 [logger::init global] 303 set level [${log1}::currentloglevel] 304 ${log1}::delete 305 logger::setlevel debug 306 set level 307} {error} 308 309test logger-5.4 {global setlevel after logger::init} { 310 logger::setlevel error 311 set log1 [logger::init global] 312 set level [${log1}::currentloglevel] 313 ${log1}::delete 314 logger::setlevel debug 315 set level 316} {error} 317 318test logger-5.5 {global setlevel with wrong level} { 319 catch {logger::setlevel badargs} msg 320 set msg 321} {Invalid level 'badargs' - levels are debug info notice warn error critical alert emergency} 322 323test logger-5.6 {global setlevel before logger::init, see log} { 324 logger::setlevel error 325 set log1 [logger::init global] 326 set ::called 0 327 proc logp {txt} { 328 set ::called 1 329 } 330 ${log1}::logproc warn logp 331 set pname [${log1}::logproc warn] 332 ${log1}::warn $pname 333 ${log1}::delete 334 logger::setlevel debug 335 set result $::called 336 unset -nocomplain ::called 337 set result 338} {0} 339 340test logger-6.0 {levels command} { 341 logger::levels 342} {debug info notice warn error critical alert emergency} 343 344test logger-7.0 {currentloglevel} { 345 set result [list] 346 set log [logger::init global] 347 foreach lvl [logger::levels] { 348 ${log}::setlevel $lvl 349 lappend result [${log}::currentloglevel] 350 } 351 ${log}::delete 352 set result 353} {debug info notice warn error critical alert emergency} 354 355test logger-7.1 {currentloglevel, disable all} { 356 set log [logger::init global] 357 ${log}::disable emergency 358 set result [${log}::currentloglevel] 359 ${log}::delete 360 set result 361} {none} 362 363test logger-7.2 {currentloglevel, enable incremental} { 364 set results "" 365 set log [logger::init global] 366 ${log}::disable critical 367 ${log}::enable critical 368 lappend results [${log}::currentloglevel] 369 ${log}::enable debug 370 lappend results [${log}::currentloglevel] 371 ${log}::delete 372 set results 373} {critical debug} 374 375test logger-7.3 {currentloglevel, enable incremental} { 376 set results "" 377 set log [logger::init global] 378 ${log}::disable critical 379 ${log}::enable debug 380 lappend results [${log}::currentloglevel] 381 ${log}::enable critical 382 lappend results [${log}::currentloglevel] 383 ${log}::delete 384 set results 385} {debug debug} 386 387test logger-7.4 {currentloglevel, disable incremental} { 388 set results "" 389 set log [logger::init global] 390 ${log}::enable debug 391 lappend results [${log}::currentloglevel] 392 ${log}::disable emergency 393 lappend results [${log}::currentloglevel] 394 ${log}::disable debug 395 lappend results [${log}::currentloglevel] 396 ${log}::delete 397 set results 398} {debug none none} 399 400test logger-7.5 {currentloglevel, disable incremental} { 401 set results "" 402 set log [logger::init global] 403 ${log}::enable debug 404 lappend results [${log}::currentloglevel] 405 ${log}::disable debug 406 lappend results [${log}::currentloglevel] 407 ${log}::disable emergency 408 lappend results [${log}::currentloglevel] 409 ${log}::delete 410 set results 411} {debug info none} 412 413test logger-8.0 {logproc with existing proc, non existing proc} { 414 set log [logger::init global] 415 catch { ${log}::logproc warn NoSuchProc } msg 416 ${log}::delete 417 set msg 418} {Invalid cmd 'NoSuchProc' - does not exist} 419 420test logger-8.1 {logproc with existing proc, introspection} { 421 set log [logger::init global] 422 catch { ${log}::logproc warn } msg 423 ${log}::delete 424 set msg 425} {::logger::tree::global::warncmd} 426 427test logger-8.2 {logproc with existing proc} { 428 set ::INFO "" 429 set log [logger::init global] 430 proc errorlogproc {txt} { 431 lappend ::INFO "Error Message: $txt" 432 } 433 set msg [info commands errorlogproc] 434 ${log}::logproc error errorlogproc 435 ${log}::error "error" 436 ${log}::error "second error" 437 ${log}::delete 438 rename errorlogproc "" 439 list $msg $::INFO 440} {errorlogproc {{Error Message: error} {Error Message: second error}}} 441 442test logger-8.3 {logproc with args and body} { 443 set ::INFO "" 444 set log [logger::init global] 445 ${log}::logproc error txt {lappend ::INFO "Error Message: $txt"} 446 ${log}::error "error" 447 ${log}::error "second error" 448 ${log}::delete 449 set ::INFO 450} {{Error Message: error} {Error Message: second error}} 451 452test logger-8.4 {logproc with existing proc, survive level switching} { 453 set ::INFO "" 454 set log [logger::init global] 455 proc errorlogproc {txt} { 456 lappend ::INFO "Error Message: $txt" 457 } 458 ${log}::logproc error errorlogproc 459 ${log}::error "error" 460 ${log}::setlevel critical 461 ${log}::error "this should not be in the logfile" 462 ${log}::setlevel notice 463 ${log}::error "second error" 464 ${log}::delete 465 rename errorlogproc "" 466 set ::INFO 467} {{Error Message: error} {Error Message: second error}} 468 469test logger-8.5 {logproc with existing proc, introspection} { 470 set ::INFO "" 471 set log [logger::init global] 472 proc errorlogproc {txt} { 473 lappend ::INFO "Error Message: $txt" 474 } 475 set msg [info commands errorlogproc] 476 ${log}::logproc error errorlogproc 477 set cmd [${log}::logproc error] 478 ${log}::delete 479 rename errorlogproc "" 480 list $msg $cmd 481} {errorlogproc errorlogproc} 482 483test logger-8.6 {logproc with args and body, introspection} { 484 set ::INFO "" 485 set log [logger::init global] 486 ${log}::logproc error txt {lappend ::INFO "Error Message: $txt"} 487 set cmd [${log}::logproc error] 488 ${log}::delete 489 set cmd 490} {::logger::tree::global::errorcustomcmd} 491 492test logger-8.7 {logproc with too many args} { 493 set log [logger::init global] 494 set code [catch {${log}::logproc error too many args]} msg] 495 ${log}::delete 496 list $code $msg 497} [list 1 [subst -novariable -nocommands \ 498 "Usage: \${log}::logproc level ?cmd?\nor \${log}::logproc level argname body"]] 499 500test logger-9.0 {services subcommand} { 501 set log [logger::init global] 502 set result [logger::services] 503 ${log}::delete 504 set result 505} {global} 506 507test logger-9.1 {services subcommand, no child services} { 508 set log [logger::init global] 509 set services [${log}::services] 510 ${log}::delete 511 set services 512} {} 513 514test logger-9.2 {services subcommand, children services} { 515 set log [logger::init global] 516 set child [logger::init global::child] 517 set result [list [logger::services] [${log}::services] [${child}::services]] 518 ${log}::delete 519 set result 520} [list [list global global::child] global::child {}] 521 522test logger-10.0 {servicecmd test} { 523 set log [logger::init global] 524 set cmd [logger::servicecmd global] 525 ${log}::delete 526 list $log $cmd 527} {::logger::tree::global ::logger::tree::global} 528 529test logger-10.1 {servicecmd, nonexistent service} { 530 set code [catch {logger::servicecmd nonexistant} msg] 531 list $code $msg 532} {1 {Service "nonexistant" does not exist.}} 533 534test logger-11.0 {servicename subcommand} { 535 set log [logger::init global] 536 set name [${log}::servicename] 537 ${log}::delete 538 set name 539} {global} 540 541test logger-12.0 {import subcommand} { 542 set retval "" 543 set log [logger::init global] 544 ${log}::logproc info txt { 545 set ::INFO "LOGGED: $txt" 546 } 547 ${log}::info "Out" 548 lappend retval $::INFO 549 namespace eval ::foo { 550 logger::import global 551 info "In" 552 } 553 lappend retval $::INFO 554 ${log}::info "Out" 555 lappend retval $::INFO 556 namespace delete ::foo 557 ${log}::delete 558 set retval 559 560} {{LOGGED: Out} {LOGGED: In} {LOGGED: Out}} 561 562test logger-12.1 {import subcommand} { 563 set retval "" 564 set log [logger::init global] 565 ${log}::logproc info txt { 566 set ::INFO "LOGGED: $txt" 567 } 568 ${log}::info "Out" 569 lappend retval $::INFO 570 namespace eval ::foo { 571 logger::import -prefix log_ global 572 log_info "In" 573 } 574 lappend retval $::INFO 575 ${log}::info "Out" 576 lappend retval $::INFO 577 namespace delete ::foo 578 ${log}::delete 579 set retval 580} {{LOGGED: Out} {LOGGED: In} {LOGGED: Out}} 581 582test logger-12.2 {import subcommand} { 583 set retval "" 584 set log [logger::init global] 585 ${log}::logproc info txt { 586 set ::INFO "LOGGED: $txt" 587 } 588 ${log}::info "Out" 589 lappend retval $::INFO 590 namespace eval ::bar { } 591 namespace eval ::foo { 592 logger::import -namespace ::bar global 593 ::bar::info "In" 594 } 595 lappend retval $::INFO 596 ${log}::info "Out" 597 lappend retval $::INFO 598 namespace delete ::foo 599 namespace delete ::bar 600 ${log}::delete 601 set retval 602} {{LOGGED: Out} {LOGGED: In} {LOGGED: Out}} 603 604test logger-12.3 {import subcommand} { 605 set retval "" 606 set log [logger::init global] 607 ${log}::logproc info txt { 608 set ::INFO "LOGGED: $txt" 609 } 610 ${log}::info "Out" 611 lappend retval $::INFO 612 namespace eval ::bar { } 613 namespace eval ::foo { 614 logger::import -prefix log_ -namespace ::bar global 615 ::bar::log_info "In" 616 } 617 lappend retval $::INFO 618 ${log}::info "Out" 619 lappend retval $::INFO 620 namespace delete ::foo 621 namespace delete ::bar 622 ${log}::delete 623 set retval 624} {{LOGGED: Out} {LOGGED: In} {LOGGED: Out}} 625 626test logger-12.4 {import subcommand} { 627 set retval "" 628 set log [logger::init global] 629 ${log}::logproc info txt { 630 set ::INFO "LOGGED: $txt" 631 } 632 ${log}::info "Out" 633 lappend retval $::INFO 634 namespace eval ::foo { 635 logger::import -all global 636 info "In" 637 set ::cmds [lsort [::info commands ::foo::*]] 638 } 639 lappend retval $::INFO 640 ${log}::info "Out" 641 lappend retval $::INFO 642 namespace delete ::foo 643 ${log}::delete 644 list $retval $::cmds 645 646} {{{LOGGED: Out} {LOGGED: In} {LOGGED: Out}} {::foo::alert ::foo::critical\ 647 ::foo::currentloglevel ::foo::debug ::foo::delete ::foo::delproc\ 648 ::foo::disable ::foo::emergency ::foo::enable ::foo::error ::foo::info\ 649 ::foo::logproc ::foo::notice ::foo::servicename ::foo::services\ 650 ::foo::setlevel ::foo::trace ::foo::warn}} 651 652test logger-12.5 {import subcommand} { 653 set retval "" 654 set log [logger::init global] 655 ${log}::logproc info txt { 656 set ::INFO "LOGGED: $txt" 657 } 658 ${log}::info "Out" 659 lappend retval $::INFO 660 namespace eval ::bar { } 661 namespace eval ::foo { 662 logger::import -all -namespace ::bar global 663 ::bar::info "In" 664 set ::cmds [lsort [::info commands ::bar::*]] 665 } 666 lappend retval $::INFO 667 ${log}::info "Out" 668 lappend retval $::INFO 669 namespace delete ::foo 670 namespace delete ::bar 671 ${log}::delete 672 673 list $retval $::cmds 674 675} {{{LOGGED: Out} {LOGGED: In} {LOGGED: Out}} {::bar::alert ::bar::critical\ 676 ::bar::currentloglevel ::bar::debug ::bar::delete ::bar::delproc\ 677 ::bar::disable ::bar::emergency ::bar::enable ::bar::error ::bar::info\ 678 ::bar::logproc ::bar::notice ::bar::servicename ::bar::services\ 679 ::bar::setlevel ::bar::trace ::bar::warn}} 680 681test logger-12.6 {import subcommand} { 682 set retval "" 683 set log [logger::init global] 684 ${log}::logproc info txt { 685 set ::INFO "LOGGED: $txt" 686 } 687 ${log}::info "Out" 688 lappend retval $::INFO 689 namespace eval ::bar { 690 proc services {} {} 691 } 692 namespace eval ::foo { 693 set ::code [catch {logger::import -all -namespace ::bar global} ::msg] 694 } 695 namespace delete ::foo 696 namespace delete ::bar 697 ${log}::delete 698 699 list $::code $::msg 700 701} [list 1 "can't import command \"::bar::services\": already exists" ] 702 703test logger-12.7 {import subcommand} { 704 set retval "" 705 set log [logger::init global] 706 ${log}::logproc info txt { 707 set ::INFO "LOGGED: $txt" 708 } 709 ${log}::info "Out" 710 lappend retval $::INFO 711 namespace eval ::bar { 712 proc services {} {} 713 } 714 namespace eval ::foo { 715 set ::code [catch {logger::import -all -force -namespace ::bar global} ::msg] 716 } 717 namespace delete ::foo 718 namespace delete ::bar 719 ${log}::delete 720 721 list $::code $::msg 722 723} [list 0 "" ] 724 725test logger-12.8 {import subcommand} { 726 set retval "" 727 set log [logger::init global] 728 ${log}::logproc info txt { 729 set ::INFO "LOGGED: $txt" 730 } 731 ${log}::info "Out" 732 lappend retval $::INFO 733 namespace eval ::bar { } 734 namespace eval ::foo { 735 logger::import -all -namespace bar global 736 ::foo::bar::info "In" 737 set ::cmds [lsort [::info commands ::foo::bar::*]] 738 } 739 lappend retval $::INFO 740 ${log}::info "Out" 741 lappend retval $::INFO 742 namespace delete ::foo 743 namespace delete ::bar 744 ${log}::delete 745 746 list $retval $::cmds 747 748} {{{LOGGED: Out} {LOGGED: In} {LOGGED: Out}} {::foo::bar::alert\ 749 ::foo::bar::critical ::foo::bar::currentloglevel ::foo::bar::debug\ 750 ::foo::bar::delete ::foo::bar::delproc ::foo::bar::disable\ 751 ::foo::bar::emergency ::foo::bar::enable ::foo::bar::error\ 752 ::foo::bar::info ::foo::bar::logproc ::foo::bar::notice\ 753 ::foo::bar::servicename ::foo::bar::services\ 754 ::foo::bar::setlevel ::foo::bar::trace ::foo::bar::warn}} 755 756test logger-12.9 {import subcommand, errors} { 757 set code [catch { 758 logger::import 759 } msg] 760 list $code $msg 761} {1 {Wrong # of arguments: "logger::import ?-all? ?-force? ?-prefix prefix? ?-namespace namespace? service"}} 762 763test logger-12.10 {import subcommand, errors} { 764 set code [catch { 765 logger::import 1 2 3 4 5 6 7 8 766 } msg] 767 list $code $msg 768} {1 {Wrong # of arguments: "logger::import ?-all? ?-force? ?-prefix prefix? ?-namespace namespace? service"}} 769 770test logger-12.11 {import subcommand, errors} { 771 set code [catch { 772 logger::import -foo 1 773 } msg] 774 list $code $msg 775} {1 {Unknown argument: "-foo" : 776Usage: "logger::import ?-all? ?-force? ?-prefix prefix? ?-namespace namespace? service"}} 777 778test logger-12.12 {import subcommand, errors} { 779 set code [catch { 780 logger::import foo 781 } msg] 782 list $code $msg 783} {1 {Service "foo" does not exist.}} 784 785test logger-12.13 {import subcommand, errors} { 786 set l [logger::init global] 787 namespace eval ::foo { 788 proc debug {args} { } 789 } 790 set code [catch { 791 logger::import -namespace ::foo global 792 } msg] 793 list $code $msg 794} {1 {can't import command "::foo::debug": already exists}} 795 796test logger-13.0 {test for correct servicename, Bug 1102131} { 797 set ::INFO "" 798 set l1 [logger::init global] 799 set l2 [logger::init global::child] 800 set l3 [logger::init global::child::child] 801 ${l1}::logproc info txt { 802 variable service 803 lappend ::INFO $service $txt 804 } 805 ${l1}::info global 806 ${l2}::info global::child 807 ${l3}::info global::child::child 808 ${l1}::delete 809 set ::INFO 810} [list global global global::child global::child global::child::child global::child::child] 811 812test logger-13.1 {test for correct servicename, Bug 1102131} { 813 set ::INFO "" 814 set ::INFO2 "" 815 set l1 [logger::init global] 816 set l2 [logger::init global::child] 817 set l3 [logger::init global::child::child] 818 ${l1}::logproc info txt { 819 variable service 820 lappend ::INFO $service $txt 821 } 822 ${l2}::logproc info txt { 823 variable service 824 lappend ::INFO2 $service $txt 825 } 826 ${l1}::info global 827 ${l2}::info global::child 828 ${l3}::info global::child::child 829 ${l1}::delete 830 list $::INFO $::INFO2 831} [list [list global global] [list global::child global::child global::child::child global::child::child] ] 832 833test logger-13.2 {test for correct servicename, Bug 1102131} { 834 set ::INFO "" 835 set l1 [logger::init global] 836 set l2 [logger::init global::child] 837 set l3 [logger::init global::child::child] 838 ${l1}::logproc info txt { 839 variable service 840 lappend ::INFO $service $txt 841 } 842 namespace eval ::foo { 843 logger::import -force -all -namespace log global::child::child 844 } 845 846 ${l1}::info global 847 ${l2}::info global::child 848 foo::log::info global::child::child 849 ${l1}::delete 850 namespace delete ::foo 851 set ::INFO 852} [list global global global::child global::child global::child::child global::child::child] 853 854test logger-13.3 {test for correct servicename, Bug 1102131} { 855 set ::INFO "" 856 set l1 [logger::init global] 857 set l2 [logger::init global::child] 858 set l3 [logger::init global::child::child] 859 ${l1}::logproc info txt { 860 variable service 861 lappend ::INFO $service $txt 862 } 863 namespace eval ::foo { 864 logger::import -force -namespace log global::child::child 865 } 866 867 ${l1}::info global 868 ${l2}::info global::child 869 foo::log::info global::child::child 870 ${l1}::delete 871 namespace delete ::foo 872 set ::INFO 873} [list global global global::child global::child global::child::child global::child::child] 874 875test logger-13.4 {test for correct servicename, Bug 1102131} { 876 set ::INFO "" 877 set l1 [logger::init global] 878 set l2 [logger::init global::child] 879 set l3 [logger::init global::child::child] 880 ${l1}::logproc info txt { 881 variable service 882 lappend ::INFO $service $txt 883 } 884 namespace eval ::foo { 885 logger::import -force -all -prefix log_ -namespace log global::child::child 886 } 887 888 ${l1}::info global 889 ${l2}::info global::child 890 foo::log::log_info global::child::child 891 ${l1}::delete 892 namespace delete ::foo 893 set ::INFO 894} [list global global global::child global::child global::child::child global::child::child] 895 896test logger-13.5 {test for correct servicename, Bug 1102131} { 897 set ::INFO "" 898 set l1 [logger::init global] 899 set l2 [logger::init global::child] 900 set l3 [logger::init global::child::child] 901 ${l1}::logproc info txt { 902 variable service 903 lappend ::INFO $service $txt 904 } 905 namespace eval ::foo { 906 logger::import -force -prefix log_ -namespace log global::child::child 907 } 908 909 ${l1}::info global 910 ${l2}::info global::child 911 foo::log::log_info global::child::child 912 ${l1}::delete 913 namespace delete ::foo 914 set ::INFO 915} [list global global global::child global::child global::child::child global::child::child] 916 917test logger-13.6 {test for correct servicename, Bug 1102131} { 918 set ::INFO "" 919 set l1 [logger::init global] 920 set l2 [logger::init global::child] 921 set l3 [logger::init global::child::child] 922 ${l1}::logproc info txt { 923 variable service 924 lappend ::INFO $service $txt 925 } 926 namespace eval ::foo { 927 logger::import -force -prefix log_ global::child::child 928 } 929 930 ${l1}::info global 931 ${l2}::info global::child 932 foo::log_info global::child::child 933 ${l1}::delete 934 namespace delete ::foo 935 set ::INFO 936} [list global global global::child global::child global::child::child global::child::child] 937 938test logger-13.7 {test for correct servicename, Bug 1102131} { 939 set ::INFO "" 940 set l1 [logger::init global] 941 set l2 [logger::init global::child] 942 set l3 [logger::init global::child::child] 943 ${l1}::logproc info txt { 944 variable service 945 lappend ::INFO $service $txt 946 } 947 namespace eval ::foo { 948 logger::import -force -all -prefix log_ global::child::child 949 } 950 951 ${l1}::info global 952 ${l2}::info global::child 953 foo::log_info global::child::child 954 ${l1}::delete 955 namespace delete ::foo 956 set ::INFO 957} [list global global global::child global::child global::child::child global::child::child] 958 959test logger-13.8 {test for logproc interations with childs} { 960 set l1 [logger::init global] 961 set l2 [logger::init global::child] 962 set l3 [logger::init global::child::child] 963 964 namespace eval ::logtest { 965 proc mylogproc {args} { 966 variable len 967 lappend len [llength $args] 968 } 969 } 970 ${l1}::logproc info ::logtest::mylogproc 971 ${l1}::info global 972 ${l2}::info global::child 973 ${l3}::info global::child::child 974 ${l1}::delete 975 set len $::logtest::len 976 namespace delete ::logtest 977 set len 978} [list 1 1 1] 979 980 981 982test logger-14.1 {test for a clean call stack for logprocs} { 983 namespace eval ::logtest { 984 proc mylog {txt} { set ::logtest::stack [info level]} 985 proc dolog {logger} { 986 ${logger}::info foo 987 } 988 } 989 set l1 [logger::init global] 990 ${l1}::logproc info ::logtest::mylog 991 ::logtest::dolog $l1 992 set val $::logtest::stack 993 namespace delete ::logtest 994 ${l1}::delete 995 set val 996} 2 997 998test logger-14.2 {test for a clean call stack for logprocs} { 999 namespace eval ::logtest { 1000 proc mylog {txt} { set ::logtest::stack [list [info level 1] [info level 2]]} 1001 proc dolog {logger} { 1002 ${logger}::info foo 1003 } 1004 } 1005 set l1 [logger::init global] 1006 ${l1}::logproc info ::logtest::mylog 1007 ::logtest::dolog $l1 1008 set val $::logtest::stack 1009 namespace delete ::logtest 1010 ${l1}::delete 1011 set val 1012} {{::logtest::dolog ::logger::tree::global} {::logtest::mylog foo}} 1013 1014test logger-14.3 {test for a clean call stack for logprocs} { 1015 namespace eval ::logtest { 1016 proc mylog {txt} { set ::logtest::stack [list [info level 1] [info level 2]]} 1017 } 1018 set l1 [logger::init global] 1019 ${l1}::logproc info ::logtest::mylog 1020 namespace eval ::foo { 1021 logger::import -force -all -prefix log_ global 1022 proc dolog {logger} { 1023 log_info foo 1024 } 1025 } 1026 ::foo::dolog $l1 1027 set val $::logtest::stack 1028 namespace delete ::logtest 1029 namespace delete ::foo 1030 ${l1}::delete 1031 set val 1032} {{::foo::dolog ::logger::tree::global} {::logtest::mylog foo}} 1033 1034test logger-14.4 {test for a clean call stack for logprocs} { 1035 namespace eval ::logtest { 1036 proc mylog {txt} { set ::logtest::stack [list [info level 1] [info level 2]] 1037 set ::logtest::info [uplevel 1 set someinfo] 1038 } 1039 proc dolog {logger} { 1040 set someinfo bar 1041 ${logger}::info foo 1042 } 1043 } 1044 set l1 [logger::init global] 1045 ${l1}::logproc info ::logtest::mylog 1046 ::logtest::dolog $l1 1047 set val [list $::logtest::stack $::logtest::info] 1048 namespace delete ::logtest 1049 ${l1}::delete 1050 set val 1051} {{{::logtest::dolog ::logger::tree::global} {::logtest::mylog foo}} bar} 1052 1053 1054test logger-15.0 {test for logger levelchange callbacks} { 1055 namespace eval ::logtest { 1056 proc lvlchange {old new} { 1057 variable changes 1058 lappend changes [list $old $new] 1059 return 1060 } 1061 } 1062 set l [logger::init global] 1063 set default [list [${l}::lvlchangeproc]] 1064 ${l}::lvlchangeproc ::logtest::lvlchange 1065 lappend default [${l}::lvlchangeproc] 1066 ${l}::delete 1067 namespace delete ::logtest 1068 set default 1069} {::logger::tree::global::no-op ::logtest::lvlchange} 1070 1071test logger-15.1 {test for logger levelchange callbacks} { 1072 set l [logger::init global] 1073 set ok [catch {${l}::lvlchangeproc a b} msg] 1074 ${l}::delete 1075 list $ok $msg 1076} [list 1 {Wrong # of arguments. Usage: ${log}::lvlchangeproc ?cmd?} ] 1077 1078test logger-15.2 {test for logger levelchange callbacks} { 1079 namespace eval ::logtest { 1080 proc lvlchange {old new} { 1081 variable changes 1082 lappend changes [list $old $new] 1083 return 1084 } 1085 } 1086 set l [logger::init global] 1087 ${l}::setlevel [lindex [logger::levels] 0] 1088 ${l}::lvlchangeproc ::logtest::lvlchange 1089 set rlvl [list] 1090 foreach {lvl} [logger::levels] { 1091 ${l}::setlevel $lvl 1092 set rlvl [linsert $rlvl 0 $lvl] 1093 } 1094 foreach {lvl} $rlvl { 1095 ${l}::setlevel $lvl 1096 } 1097 set changes $::logtest::changes 1098 ${l}::delete 1099 namespace delete ::logtest 1100 set changes 1101} [list {debug info} {info notice} {notice warn} {warn error} {error critical} \ 1102 {critical alert} {alert emergency} {emergency alert} {alert critical} \ 1103 {critical error} {error warn} {warn notice} {notice info} {info debug}] 1104 1105test logger-15.3 {test for logger levelchange callbacks} { 1106 namespace eval ::logtest { 1107 proc lvlchange {old new} { 1108 variable changes 1109 lappend changes [list $old $new] 1110 return 1111 } 1112 } 1113 set l [logger::init global] 1114 ${l}::setlevel [lindex [logger::levels] 0] 1115 set lc [logger::init global::child] 1116 ${lc}::lvlchangeproc ::logtest::lvlchange 1117 set rlvl [list] 1118 foreach {lvl} [logger::levels] { 1119 ${l}::setlevel $lvl 1120 set rlvl [linsert $rlvl 0 $lvl] 1121 } 1122 foreach {lvl} $rlvl { 1123 ${l}::setlevel $lvl 1124 } 1125 set changes $::logtest::changes 1126 ${l}::delete 1127 namespace delete ::logtest 1128 set changes 1129} [list {debug info} {info notice} {notice warn} {warn error} {error critical} \ 1130 {critical alert} {alert emergency} {emergency alert} {alert critical} \ 1131 {critical error} {error warn} {warn notice} {notice info} {info debug}] 1132 1133test logger-15.4 {test for logger with empty levelchange callback} { 1134 set ::gotcalled 0 1135 proc ::debug {args} {set ::gotcalled 1} 1136 set l [logger::init global] 1137 ${l}::setlevel [lindex [logger::levels] 0] 1138 set code [catch {${l}::lvlchangeproc ""} msg] 1139 ${l}::setlevel warn 1140 ${l}::delete 1141 rename ::debug "" 1142 list $::gotcalled $code $msg 1143} {0 1 {Invalid cmd '' - does not exist}} 1144 1145test logger-15.5 {test for strange callback names, glob pattern ::*} { 1146 set ::gotcalled 0 1147 proc ::* {args} {set ::gotcalled 1} 1148 set l [logger::init global] 1149 ${l}::setlevel [lindex [logger::levels] 0] 1150 set code [catch {${l}::lvlchangeproc ::*} msg] 1151 ${l}::setlevel warn 1152 ${l}::delete 1153 rename ::* "" 1154 list $::gotcalled $code $msg 1155} {1 0 ::*} 1156 1157test logger-15.6 {test for other [] glob pattern} { 1158 set ::gotcalled 0 1159 proc ::\[info\] {args} {set ::gotcalled 1} 1160 set l [logger::init global] 1161 ${l}::setlevel [lindex [logger::levels] 0] 1162 set code [catch {${l}::lvlchangeproc {::[info]}} msg] 1163 ${l}::setlevel warn 1164 ${l}::delete 1165 rename {::[info]} "" 1166 list $::gotcalled $code $msg 1167} {1 0 {::[info]}} 1168 1169test logger-15.7 {test for spaces in commands support} { 1170 set ::gotcalled 0 1171 proc what\ a\ stupid\ proc {args} {set ::gotcalled 1} 1172 set l [logger::init global] 1173 ${l}::setlevel [lindex [logger::levels] 0] 1174 set code [catch {${l}::lvlchangeproc [list {what a stupid proc}]} msg] 1175 ${l}::setlevel warn 1176 ${l}::delete 1177 rename {what a stupid proc} "" 1178 list $::gotcalled $code $msg 1179} {1 0 {{what a stupid proc}}} 1180 1181test logger-15.8 {test for other []* glob pattern} { 1182 set ::gotcalled 0 1183 proc ::\[info\]* {args} {set ::gotcalled 1} 1184 set l [logger::init global] 1185 ${l}::setlevel [lindex [logger::levels] 0] 1186 set code [catch {${l}::lvlchangeproc {::[info]*}} msg] 1187 ${l}::setlevel warn 1188 ${l}::delete 1189 rename {::[info]*} "" 1190 list $::gotcalled $code $msg 1191} {1 0 {::[info]*}} 1192 1193test logger-15.9 {test for other []* glob pattern} { 1194 set ::gotcalled 0 1195 set l [logger::init global] 1196 ${l}::setlevel [lindex [logger::levels] 0] 1197 set code [catch {${l}::lvlchangeproc {::[info]*}} msg] 1198 ${l}::setlevel warn 1199 ${l}::delete 1200 list $::gotcalled $code $msg 1201} {0 1 {Invalid cmd '::[info]*' - does not exist}} 1202 1203test logger-15.10 {test for non normalized namespace names} { 1204 set ::gotcalled 0 1205 namespace eval ::logtest {} 1206 proc ::logtest::test {args} {set ::gotcalled 1} 1207 set l [logger::init global] 1208 ${l}::setlevel [lindex [logger::levels] 0] 1209 set code [catch {${l}::lvlchangeproc {::::logtest:::test}} msg] 1210 ${l}::setlevel warn 1211 ${l}::delete 1212 namespace delete ::logtest 1213 list $::gotcalled $code $msg 1214} {1 0 ::::logtest:::test} 1215 1216test logger-15.11 {test for non normalized namespace names} { 1217 set ::gotcalled 0 1218 namespace eval ::logtest {} 1219 set l [logger::init global] 1220 ${l}::setlevel [lindex [logger::levels] 0] 1221 set code [catch {${l}::lvlchangeproc {::::logtest:::test}} msg] 1222 ${l}::setlevel warn 1223 ${l}::delete 1224 namespace delete ::logtest 1225 list $::gotcalled $code $msg 1226} {0 1 {Invalid cmd '::::logtest:::test' - does not exist}} 1227 1228test logger-15.12 {test for namespace with glob pattern} { 1229 set ::gotcalled 0 1230 namespace eval ::logtest {} 1231 namespace eval ::logtest::* {} 1232 proc ::logtest::*::test {args} {set ::gotcalled 1} 1233 set l [logger::init global] 1234 ${l}::setlevel [lindex [logger::levels] 0] 1235 set code [catch {${l}::lvlchangeproc {::logtest::*::test}} msg] 1236 ${l}::setlevel warn 1237 ${l}::delete 1238 namespace delete ::logtest 1239 list $::gotcalled $code $msg 1240} {1 0 ::logtest::*::test} 1241 1242test logger-15.13 {test for namespace with glob pattern} { 1243 set ::gotcalled 0 1244 namespace eval ::logtest {} 1245 namespace eval ::logtest::* {} 1246 set l [logger::init global] 1247 ${l}::setlevel [lindex [logger::levels] 0] 1248 set code [catch {${l}::lvlchangeproc {::logtest::*::test}} msg] 1249 ${l}::setlevel warn 1250 ${l}::delete 1251 namespace delete ::logtest 1252 list $::gotcalled $code $msg 1253} {0 1 {Invalid cmd '::logtest::*::test' - does not exist}} 1254 1255# # ## ### ##### ######## ############# ##################### 1256## Ticket cf775f72ef - initNamespace, level inheritance. 1257 1258test logger-17.0 {initNamespace, wrong args, not enough} { 1259 catch { 1260 logger::initNamespace 1261 } msg 1262 set msg 1263} {wrong # args: should be "logger::initNamespace ns ?level?"} 1264 1265test logger-17.1 {initNamespace, wrong args, too many} { 1266 catch { 1267 logger::initNamespace ::foo error X 1268 } msg 1269 set msg 1270} {wrong # args: should be "logger::initNamespace ns ?level?"} 1271 1272test logger-17.2 {initNamespace, explicit level} { 1273 namespace eval ::foo {} 1274 logger::initNamespace ::foo error 1275 set lvl [::foo::log::currentloglevel] 1276 ::foo::log::delete 1277 namespace delete ::foo 1278 set lvl 1279} error 1280 1281test logger-17.3 {initNamespace, no parent, default log level} { 1282 namespace eval ::foo {} 1283 logger::initNamespace ::foo 1284 set lvl [::foo::log::currentloglevel] 1285 ::foo::log::delete 1286 namespace delete ::foo 1287 set lvl 1288} warn 1289 1290test logger-17.4 {initNamespace, parent, inherit log level} { 1291 namespace eval ::foo {} 1292 namespace eval ::foo::bar {} 1293 logger::initNamespace ::foo error 1294 logger::initNamespace ::foo::bar 1295 set lvl [::foo::bar::log::currentloglevel] 1296 ::foo::bar::log::delete 1297 ::foo::log::delete 1298 namespace delete ::foo 1299 set lvl 1300} error 1301 1302# # ## ### ##### ######## ############# ##################### 1303 1304testsuiteCleanup 1305return 1306