Download
49 lines 1.2 KiBGoModified 2026-10-30 raw
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")
	}
}