package testutil import ( "bytes" "io" "log" "os" "sync" ) // CaptureStdout is a helper function to capture stdout. func CaptureStdout(f func()) string { reader, writer, err := os.Pipe() if err != nil { panic(err) } stdout := os.Stdout defer func() { os.Stdout = stdout log.SetOutput(os.Stderr) }() os.Stdout = writer log.SetOutput(writer) out := make(chan string) wg := new(sync.WaitGroup) wg.Add(1) go func() { var buf bytes.Buffer wg.Done() _, err = io.Copy(&buf, reader) if err != nil { panic(err) } out <- buf.String() }() wg.Wait() f() _ = writer.Close() return <-out }