From 8b154412f0196fcf7dd54d0ccdd019f2aea54b7b Mon Sep 17 00:00:00 2001 From: Dylan Myers Date: Thu, 30 Jul 2026 09:30:35 -0400 Subject: [PATCH] chore(tests): poll flushed output in stdout test instead of sleeping (PIPE-986) Assisted-by: Claude Opus 4.8 --- output/stdout/stdout_test.go | 39 ++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/output/stdout/stdout_test.go b/output/stdout/stdout_test.go index 228482d..cc902e1 100644 --- a/output/stdout/stdout_test.go +++ b/output/stdout/stdout_test.go @@ -168,20 +168,43 @@ func TestStdoutOutput_FlushOnInterval(t *testing.T) { require.NoError(t, err) defer func() { _ = out.Stop(context.Background()) }() + // Drain the pipe concurrently into a mutex-guarded buffer so we can poll + // for the flushed data without blocking on ReadFrom (which only returns at + // EOF). The ticker fires on its own goroutine, so we wait for its effect + // rather than sleeping a fixed duration. + var ( + mu sync.Mutex + got []byte + ) + readerDone := make(chan struct{}) + go func() { + defer close(readerDone) + b := make([]byte, 1024) + for { + n, readErr := r.Read(b) + if n > 0 { + mu.Lock() + got = append(got, b[:n]...) + mu.Unlock() + } + if readErr != nil { + return + } + } + }() + err = out.Write(context.Background(), output.LogRecord{Message: "interval flush message"}) require.NoError(t, err) - // Wait long enough for the ticker to fire without calling Stop. - time.Sleep(100 * time.Millisecond) + require.Eventually(t, func() bool { + mu.Lock() + defer mu.Unlock() + return bytes.Contains(got, []byte("interval flush message")) + }, 5*time.Second, 10*time.Millisecond) w.Close() os.Stdout = oldStdout - - var buf bytes.Buffer - _, err = buf.ReadFrom(r) - require.NoError(t, err) - - assert.Contains(t, buf.String(), "interval flush message") + <-readerDone } func TestStdoutOutput_FlushOnStop(t *testing.T) {