@@ -25,6 +25,7 @@ import (
25
25
"flag"
26
26
"net/http"
27
27
"strings"
28
+ "sync"
28
29
"testing"
29
30
"time"
30
31
@@ -139,14 +140,7 @@ func TestHealthCheckerStart(t *testing.T) {
139
140
for _ , tt := range tests {
140
141
t .Run (tt .name , func (t * testing.T ) {
141
142
// Capture logs
142
- var logBuffer bytes.Buffer
143
- flags := & flag.FlagSet {}
144
- klog .InitFlags (flags )
145
- if err := flags .Set ("v" , "5" ); err != nil {
146
- t .Fatal (err )
147
- }
148
- klog .LogToStderr (false )
149
- klog .SetOutput (& logBuffer )
143
+ logBuffer := setupLogging (t )
150
144
151
145
// Mock SdWatchdogEnabled to return a valid value
152
146
mockClient := & mockWatchdogClient {
@@ -178,3 +172,38 @@ func TestHealthCheckerStart(t *testing.T) {
178
172
})
179
173
}
180
174
}
175
+
176
+ // threadSafeBuffer is a thread-safe wrapper around bytes.Buffer.
177
+ type threadSafeBuffer struct {
178
+ buffer bytes.Buffer
179
+ mu sync.Mutex
180
+ }
181
+
182
+ func (b * threadSafeBuffer ) Write (p []byte ) (n int , err error ) {
183
+ b .mu .Lock ()
184
+ defer b .mu .Unlock ()
185
+ return b .buffer .Write (p )
186
+ }
187
+
188
+ func (b * threadSafeBuffer ) String () string {
189
+ b .mu .Lock ()
190
+ defer b .mu .Unlock ()
191
+ return b .buffer .String ()
192
+ }
193
+
194
+ // setupLogging sets up logging to capture output using a thread-safe buffer.
195
+ func setupLogging (t * testing.T ) * threadSafeBuffer {
196
+ flags := & flag.FlagSet {}
197
+ klog .InitFlags (flags )
198
+ if err := flags .Set ("v" , "5" ); err != nil {
199
+ t .Fatal (err )
200
+ }
201
+ klog .LogToStderr (false )
202
+
203
+ logBuffer := & threadSafeBuffer {}
204
+
205
+ // Set the output to the thread-safe buffer
206
+ klog .SetOutput (logBuffer )
207
+
208
+ return logBuffer
209
+ }
0 commit comments