fix: JSONHandler deadlock from recursive log.Println (closes #3) #4
33
json_handler_test.go
Normal file
33
json_handler_test.go
Normal file
@ -0,0 +1,33 @@
|
||||
package simplelog
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// TestJSONHandlerDeadlock verifies that JSONHandler.Handle does not deadlock
|
||||
// when the default slog handler routes log.Println back through slog.
|
||||
// On the unfixed code this test will hang (deadlock); with the fix it completes.
|
||||
func TestJSONHandlerDeadlock(t *testing.T) {
|
||||
handler := NewJSONHandler()
|
||||
|
||||
// Set our handler as the default so log.Println routes through slog
|
||||
logger := slog.New(handler)
|
||||
slog.SetDefault(logger)
|
||||
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
// This call deadlocks on unfixed code because Handle() calls
|
||||
// log.Println() which re-enters slog → Handle() → log.Println() …
|
||||
slog.Info("test message")
|
||||
close(done)
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
// success
|
||||
case <-time.After(5 * time.Second):
|
||||
t.Fatal("JSONHandler.Handle deadlocked: timed out after 5 seconds")
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user