41 lines
		
	
	
		
			617 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			617 B
		
	
	
	
		
			Go
		
	
	
	
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
 | 
						|
}
 |