package pty import ( "bytes" "fmt" "io" "os" "testing" ) // openCloses opens a pty/tty pair and stages the closing as part of the cleanup. func openClose(t *testing.T) (pty, tty *os.File) { t.Helper() pty, tty, err := Open() if err != nil { t.Fatalf("Unexpected error from Open: %s.", err) } t.Cleanup(func() { if err := tty.Close(); err != nil { t.Errorf("Unexpected error from tty Close: %s.", err) } if err := pty.Close(); err != nil { t.Errorf("Unexpected error from pty Close: %s.", err) } }) return pty, tty } func noError(t *testing.T, err error, msg string) { t.Helper() if err != nil { t.Fatalf("%s: %s.", msg, err) } } func assert[T comparable](t *testing.T, a, b T, msg string) { t.Helper() if a != b { t.Errorf("%s: %v != %v.", msg, a, b) } } // When asserting bytes, we want to display the diff, which may contain control characters. func assertBytes(t *testing.T, a, b []byte, msg string) { t.Helper() if !bytes.Equal(a, b) { t.Errorf("%s: %v != %v.", msg, a, b) } } // Read a specific number of bytes from r, assert it didn't fail and return the bytes. func readN(t *testing.T, r io.Reader, n int, msg string) []byte { t.Helper() buf := make([]byte, n) _, err := io.ReadFull(r, buf) noError(t, err, fmt.Sprintf("%s: %s", msg, err)) return buf }