12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | package pty
import (
"strings"
"testing"
"golang.org/x/term"
)
func TestOpen(t *testing.T) {
master, slave, err := Open()
if err != nil {
t.Skip("no pseudo-terminals here: ", err)
}
defer master.Close()
defer slave.Close()
if !term.IsTerminal(int(slave.Fd())) {
t.Fatal("the slave is not a terminal")
}
if err := SetSize(master, 81, 23); err != nil {
t.Fatal(err)
}
if w, h, err := term.GetSize(int(slave.Fd())); err != nil || w != 81 || h != 23 {
t.Errorf("size %dx%d, %v", w, h, err)
}
// What the master writes, the slave reads (as typed, with the line
// discipline's echo back to the master).
if _, err := master.Write([]byte("typed\n")); err != nil {
t.Fatal(err)
}
buf := make([]byte, 64)
n, err := slave.Read(buf)
if err != nil || !strings.HasPrefix(string(buf[:n]), "typed") {
t.Errorf("the slave read %q, %v", buf[:n], err)
}
// Closing the master ends a read pending on it.
done := make(chan error)
go func() {
_, err := master.Read(make([]byte, 1024)) // the echo
for err == nil {
_, err = master.Read(make([]byte, 1024))
}
done <- err
}()
master.Close()
if err := <-done; err == nil {
t.Error("a read on a closed master succeeded")
}
}
|