Files
syft/cmd/syft/internal/ui/capture_test.go
T
2023-11-16 17:45:25 -05:00

86 lines
1.8 KiB
Go

package ui
import (
"bytes"
"io"
"os"
"testing"
"github.com/stretchr/testify/require"
)
func Test_capture(t *testing.T) {
r, w, _ := os.Pipe()
t.Logf("pipe1: %+v", w)
buf := &bytes.Buffer{}
buf2 := &bytes.Buffer{}
go func() {
// write to the main file (e.g. os.Stdout)
_, _ = w.WriteString("write1")
// capture the output to the provided buffer
restoreInitial := capture(&w, buf, 1024)
t.Logf("pipe2: %+v", w)
_, _ = w.WriteString("write2")
// capture output nested
restoreFirstCapture := capture(&w, buf2, 1024)
t.Logf("pipe3: %+v", w)
_, _ = w.WriteString("write3")
// discard file used to write the "write3"
restoreFirstCapture()
// restore should block until all output has been captured, so it's safe to read buf2 here
require.Equal(t, "write3", buf2.String())
// restore should be safe to call multiple times
restoreFirstCapture()
require.Equal(t, "write3", buf2.String())
// write again to the initial buffer
t.Logf("pipe2+: %+v", w)
_, _ = w.WriteString("write2+")
// restore the initial file (e.g. os.Stdout) and write more to it
restoreInitial()
t.Logf("pipe1+: %+v", w)
_, _ = w.WriteString("write1+")
// close the pipe to continue with the io.ReadAll, below
_ = w.Close()
}()
got, err := io.ReadAll(r)
require.NoError(t, err)
require.Equal(t, "write1write1+", string(got))
require.Equal(t, "write2write2+", buf.String())
}
func Test_captureBufSizes(t *testing.T) {
_, w, _ := os.Pipe()
buf := &bytes.Buffer{}
restore := capture(&w, buf, 200)
line := "line1\nline2\nline3"
_, err := w.WriteString(line)
require.NoError(t, err)
restore()
require.Equal(t, line, buf.String())
buf.Reset()
restore = capture(&w, buf, 2)
_, err = w.WriteString(line)
require.NoError(t, err)
restore()
require.Equal(t, line, buf.String())
}