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  }