//+build linux package term import ( "flag" "io/ioutil" "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) var rootEnabled bool func init() { flag.BoolVar(&rootEnabled, "test.root", false, "enable tests that require root") } // RequiresRoot skips tests that require root, unless the test.root flag has // been set func RequiresRoot(t *testing.T) { if !rootEnabled { t.Skip("skipping test that requires root") return } assert.Equal(t, 0, os.Getuid(), "This test must be run as root.") } func newTtyForTest(t *testing.T) (*os.File, error) { RequiresRoot(t) return os.OpenFile("/dev/tty", os.O_RDWR, os.ModeDevice) } func newTempFile() (*os.File, error) { return ioutil.TempFile(os.TempDir(), "temp") } func TestGetWinsize(t *testing.T) { tty, err := newTtyForTest(t) defer tty.Close() require.NoError(t, err) winSize, err := GetWinsize(tty.Fd()) require.NoError(t, err) require.NotNil(t, winSize) require.NotNil(t, winSize.Height) require.NotNil(t, winSize.Width) newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y} err = SetWinsize(tty.Fd(), &newSize) require.NoError(t, err) winSize, err = GetWinsize(tty.Fd()) require.NoError(t, err) require.Equal(t, *winSize, newSize) } func TestSetWinsize(t *testing.T) { tty, err := newTtyForTest(t) defer tty.Close() require.NoError(t, err) winSize, err := GetWinsize(tty.Fd()) require.NoError(t, err) require.NotNil(t, winSize) newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y} err = SetWinsize(tty.Fd(), &newSize) require.NoError(t, err) winSize, err = GetWinsize(tty.Fd()) require.NoError(t, err) require.Equal(t, *winSize, newSize) } func TestGetFdInfo(t *testing.T) { tty, err := newTtyForTest(t) defer tty.Close() require.NoError(t, err) inFd, isTerminal := GetFdInfo(tty) require.Equal(t, inFd, tty.Fd()) require.Equal(t, isTerminal, true) tmpFile, err := newTempFile() defer tmpFile.Close() inFd, isTerminal = GetFdInfo(tmpFile) require.Equal(t, inFd, tmpFile.Fd()) require.Equal(t, isTerminal, false) } func TestIsTerminal(t *testing.T) { tty, err := newTtyForTest(t) defer tty.Close() require.NoError(t, err) isTerminal := IsTerminal(tty.Fd()) require.Equal(t, isTerminal, true) tmpFile, err := newTempFile() defer tmpFile.Close() isTerminal = IsTerminal(tmpFile.Fd()) require.Equal(t, isTerminal, false) } func TestSaveState(t *testing.T) { tty, err := newTtyForTest(t) defer tty.Close() require.NoError(t, err) state, err := SaveState(tty.Fd()) require.NoError(t, err) require.NotNil(t, state) tty, err = newTtyForTest(t) defer tty.Close() err = RestoreTerminal(tty.Fd(), state) require.NoError(t, err) } func TestDisableEcho(t *testing.T) { tty, err := newTtyForTest(t) defer tty.Close() require.NoError(t, err) state, err := SetRawTerminal(tty.Fd()) require.NoError(t, err) require.NotNil(t, state) err = DisableEcho(tty.Fd(), state) require.NoError(t, err) }