github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/testutils/io.go (about) 1 package testutils 2 3 import ( 4 "io" 5 "os" 6 "strings" 7 ) 8 9 // CaptureStdoutAndStderr temporarily pipes os.Stdout and os.Stderr into a buffer. 10 // Imported from https://github.com/moul/u/blob/master/io.go. 11 func CaptureStdoutAndStderr() func() (string, error) { 12 r, w, err := os.Pipe() 13 if err != nil { 14 return func() (string, error) { return "", err } 15 } 16 17 done := make(chan error, 1) 18 19 oldErr := os.Stderr 20 oldOut := os.Stdout 21 os.Stderr = w 22 os.Stdout = w 23 24 var buf strings.Builder 25 go func() { 26 _, err := io.Copy(&buf, r) 27 r.Close() 28 done <- err 29 }() 30 31 closer := func() (string, error) { 32 os.Stderr = oldErr 33 os.Stdout = oldOut 34 w.Close() 35 err := <-done 36 return buf.String(), err 37 } 38 return closer 39 }