fix(testutil): ensure FakeSink does not swallow logs (#25185)

`FakeSink` was silently capturing log entries without forwarding them to
`testing.TB.Log`. This made debugging test failures harder because logs
were invisible in `go test -v` output.

Store `testing.TB` in `FakeSink` and call `t.Log` on each entry, guarded
by a check to avoid logging after the test has finished.

Split out from #25012.

> 🤖 Generated with [Coder Agents](https://coder.com)
This commit is contained in:
Cian Johnston
2026-05-14 16:51:44 +01:00
committed by GitHub
parent 132fa87bf3
commit 15c958fea2
+15 -3
View File
@@ -12,21 +12,33 @@ import (
// tests can assert on what was logged. It requires a testing.TB // tests can assert on what was logged. It requires a testing.TB
// as it is only meant for use in tests. // as it is only meant for use in tests.
type FakeSink struct { type FakeSink struct {
t testing.TB
mu sync.RWMutex mu sync.RWMutex
entries []slog.SinkEntry entries []slog.SinkEntry
tDone bool
} }
// NewFakeSink returns a FakeSink ready for use. // NewFakeSink returns a FakeSink ready for use.
func NewFakeSink(_ testing.TB) *FakeSink { func NewFakeSink(t testing.TB) *FakeSink {
return &FakeSink{} fs := &FakeSink{t: t}
t.Cleanup(func() {
fs.mu.Lock()
fs.tDone = true
fs.mu.Unlock()
})
return fs
} }
// LogEntry implements slog.Sink. It appends the entry to the // LogEntry implements slog.Sink. It appends the entry to the
// internal slice. // internal slice.
func (s *FakeSink) LogEntry(_ context.Context, e slog.SinkEntry) { func (s *FakeSink) LogEntry(_ context.Context, e slog.SinkEntry) {
s.mu.Lock() s.mu.Lock()
defer s.mu.Unlock()
s.entries = append(s.entries, e) s.entries = append(s.entries, e)
shouldLog := !s.tDone
s.mu.Unlock()
if shouldLog {
s.t.Log(e.Message, e.Fields)
}
} }
// Sync implements slog.Sink. // Sync implements slog.Sink.