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