@@ -8,6 +8,17 @@ import (
88
99func TestLogLevel (t * testing.T ) {
1010 const subsystem = "log-level-test"
11+
12+ // Save original config and restore after test
13+ originalConfig := GetConfig ()
14+ defer SetupLogging (originalConfig )
15+
16+ // Reset to a known state with error level default
17+ SetupLogging (Config {
18+ Level : LevelError ,
19+ Stderr : true ,
20+ })
21+
1122 logger := Logger (subsystem )
1223 reader := NewPipeReader ()
1324 done := make (chan struct {})
@@ -51,3 +62,131 @@ func TestLogLevel(t *testing.T) {
5162 }
5263 <- done
5364}
65+
66+ // Helper function to clear logger state between tests
67+ func clearLoggerState () {
68+ clear (loggers )
69+ clear (levels )
70+ }
71+
72+ func TestGetDefaultLevel (t * testing.T ) {
73+ originalConfig := GetConfig ()
74+ defer SetupLogging (originalConfig )
75+
76+ // Clear any state from previous tests first
77+ clearLoggerState ()
78+
79+ testCases := []LogLevel {LevelDebug , LevelInfo , LevelWarn , LevelError }
80+
81+ for _ , expected := range testCases {
82+ SetupLogging (Config {Level : expected , Stderr : true })
83+
84+ // empty string arg
85+ lvl , err := GetLogLevel ("" )
86+ if err != nil {
87+ t .Errorf ("GetLogLevel() returned error: %v" , err )
88+ } else if lvl != LevelName (expected ) {
89+ t .Errorf ("GetLogLevel() = %v, want %v" , lvl , LevelName (expected ))
90+ }
91+
92+ // explicit "*"
93+ lvl , err = GetLogLevel ("*" )
94+ if err != nil {
95+ t .Errorf (`GetLogLevel("*") returned error: %v` , err )
96+ } else if lvl != LevelName (expected ) {
97+ t .Errorf (`GetLogLevel("*") = %v, want %v` , lvl , LevelName (expected ))
98+ }
99+
100+ // empty string
101+ lvl , err = GetLogLevel ("" )
102+ if err != nil {
103+ t .Errorf (`GetLogLevel("") returned error: %v` , err )
104+ } else if lvl != LevelName (expected ) {
105+ t .Errorf (`GetLogLevel("") = %v, want %v` , lvl , LevelName (expected ))
106+ }
107+ }
108+ }
109+
110+ func TestGetAllLogLevels (t * testing.T ) {
111+ originalConfig := GetConfig ()
112+ defer SetupLogging (originalConfig )
113+
114+ // Clear any state from previous tests first
115+ clearLoggerState ()
116+
117+ SetupLogging (Config {Level : LevelWarn , Stderr : true })
118+ base := GetAllLogLevels ()
119+
120+ if len (base ) != 1 {
121+ t .Errorf ("baseline GetAllLogLevels() length = %d; want 1" , len (base ))
122+ }
123+ if base ["*" ] != LevelName (LevelWarn ) {
124+ t .Errorf ("baseline GetAllLogLevels()[\" *\" ] = %v; want %v" , base ["*" ], LevelName (LevelWarn ))
125+ }
126+
127+ expected := map [string ]LogLevel {
128+ "test1" : LevelDebug ,
129+ "test2" : LevelInfo ,
130+ "test3" : LevelWarn ,
131+ }
132+ SetupLogging (Config {
133+ Level : LevelError ,
134+ SubsystemLevels : expected ,
135+ Stderr : true ,
136+ })
137+
138+ all := GetAllLogLevels ()
139+
140+ if all ["*" ] != LevelName (LevelError ) {
141+ t .Errorf (`GetAllLogLevels()["*"] = %v; want %v` , all ["*" ], LevelName (LevelError ))
142+ }
143+ for name , want := range expected {
144+ got , ok := all [name ]
145+ if ! ok {
146+ t .Errorf ("missing key %q in GetAllLogLevels()" , name )
147+ continue
148+ }
149+ if got != LevelName (want ) {
150+ t .Errorf (`GetAllLogLevels()["%s"] = %v; want %v` , name , got , LevelName (want ))
151+ }
152+ }
153+
154+ // dynamic logger test
155+ _ = Logger ("dynamic" )
156+ if err := SetLogLevel ("dynamic" , "fatal" ); err != nil {
157+ t .Fatalf ("SetLogLevel(dynamic) failed: %v" , err )
158+ }
159+
160+ all = GetAllLogLevels ()
161+ if lvl , ok := all ["dynamic" ]; ! ok {
162+ t .Error (`missing "dynamic" key after creation` )
163+ } else if lvl != LevelName (LevelFatal ) {
164+ t .Errorf (`GetAllLogLevels()["dynamic"] = %v; want %v` , lvl , LevelName (LevelFatal ))
165+ }
166+
167+ // ensure immutability
168+ snapshot := GetAllLogLevels ()
169+ snapshot ["*" ] = LevelName (LevelDebug )
170+ snapshot ["newkey" ] = LevelName (LevelInfo )
171+
172+ // ensure original state unchanged
173+ fresh := GetAllLogLevels ()
174+ if fresh ["*" ] != LevelName (LevelError ) {
175+ t .Errorf (`immutable check failed: fresh["*"] = %v; want %v` , fresh ["*" ], LevelName (LevelError ))
176+ }
177+ if _ , exists := fresh ["newkey" ]; exists {
178+ t .Error (`immutable check failed: "newkey" should not leak into real map` )
179+ }
180+ }
181+
182+ func TestLevelName (t * testing.T ) {
183+ testLevels := []LogLevel {LevelDebug , LevelInfo , LevelWarn , LevelError }
184+ expectNames := []string {"debug" , "info" , "warn" , "error" }
185+
186+ for i := range testLevels {
187+ name := LevelName (testLevels [i ])
188+ if name != expectNames [i ] {
189+ t .Errorf ("unexpected name for level: expected %s, got %s" , expectNames [i ], name )
190+ }
191+ }
192+ }
0 commit comments