From 97a82e9b2c40b404918a0fb7a5ce51be915324be Mon Sep 17 00:00:00 2001 From: clawbot Date: Sun, 8 Feb 2026 09:21:08 -0800 Subject: [PATCH] test: add deadlock regression test for JSONHandler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reproduces issue #3 — JSONHandler.Handle() calling log.Println() causes a deadlock when slog.SetDefault redirects log output back through slog. This test hangs/fails on main and should pass once #4 is merged. --- json_handler_test.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 json_handler_test.go diff --git a/json_handler_test.go b/json_handler_test.go new file mode 100644 index 0000000..9c58cf5 --- /dev/null +++ b/json_handler_test.go @@ -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") + } +}