I have a piece of code which sets up an os.Pipe
to capture Stdout/Stderr:
https://github.com/sevagh/stdcap/blob/master/stdcap.go
// Capture executes f() and returns the captured data
func (s *stdcap) Capture(f func()) string {
s.mu.Lock()
defer s.mu.Unlock()
var old, r, w *os.File
if s.out {
old = os.Stdout
r, w, _ = os.Pipe()
os.Stdout = w
} else {
old = os.Stderr
r, w, _ = os.Pipe()
os.Stderr = w
}
f()
outC := make(chan string)
defer close(outC)
go func() {
var buf bytes.Buffer
io.Copy(&buf, r)
outC <- buf.String()
}()
w.Close()
if s.out {
os.Stdout = old
} else {
os.Stderr = old
}
return <-outC
}
Today I tried using this code with the log
package and it doesn't work.
This works:
func TestOutCapture(t *testing.T) {
sc := StdoutCapture()
out := sc.Capture(func() {
fmt.Printf("Hello world!")
})
if out != "Hello world!" {
t.Errorf("Expected \"Hello world!\", got: %s
", out)
}
}
func TestErrCapture(t *testing.T) {
sc := StderrCapture()
err := sc.Capture(func() {
fmt.Fprintf(os.Stderr, "Hello world!")
})
if err != "Hello world!" {
t.Errorf("Expected \"Hello world!\", got: %s
", err)
}
}
These don't work:
func TestLogOutCapture(t *testing.T) {
sc := StdoutCapture()
log.SetOutput(os.Stdout)
out := sc.Capture(func() {
log.Printf("Hello world!")
})
if out != "Hello world!" {
t.Errorf("Expected \"Hello world!\", got: %s
", out)
}
}
func TestLogErrCapture(t *testing.T) {
sc := StderrCapture()
log.SetOutput(os.Stderr)
err := sc.Capture(func() {
log.Printf("Hello world!")
})
if err != "Hello world!" {
t.Errorf("Expected \"Hello world!\", got: %s
", err)
}
}
Any ideas on where I can debug this? Does the Golang log
package not use os.Stdout/os.Stderr
?