github.com/lazyboychen7/engine@v17.12.1-ce-rc2+incompatible/pkg/term/term_linux_test.go (about) 1 //+build linux 2 3 package term 4 5 import ( 6 "io/ioutil" 7 "os" 8 "testing" 9 10 "github.com/stretchr/testify/require" 11 ) 12 13 // RequiresRoot skips tests that require root, unless the test.root flag has 14 // been set 15 func RequiresRoot(t *testing.T) { 16 if os.Getuid() != 0 { 17 t.Skip("skipping test that requires root") 18 return 19 } 20 } 21 22 func newTtyForTest(t *testing.T) (*os.File, error) { 23 RequiresRoot(t) 24 return os.OpenFile("/dev/tty", os.O_RDWR, os.ModeDevice) 25 } 26 27 func newTempFile() (*os.File, error) { 28 return ioutil.TempFile(os.TempDir(), "temp") 29 } 30 31 func TestGetWinsize(t *testing.T) { 32 tty, err := newTtyForTest(t) 33 defer tty.Close() 34 require.NoError(t, err) 35 winSize, err := GetWinsize(tty.Fd()) 36 require.NoError(t, err) 37 require.NotNil(t, winSize) 38 require.NotNil(t, winSize.Height) 39 require.NotNil(t, winSize.Width) 40 newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y} 41 err = SetWinsize(tty.Fd(), &newSize) 42 require.NoError(t, err) 43 winSize, err = GetWinsize(tty.Fd()) 44 require.NoError(t, err) 45 require.Equal(t, *winSize, newSize) 46 } 47 48 func TestSetWinsize(t *testing.T) { 49 tty, err := newTtyForTest(t) 50 defer tty.Close() 51 require.NoError(t, err) 52 winSize, err := GetWinsize(tty.Fd()) 53 require.NoError(t, err) 54 require.NotNil(t, winSize) 55 newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y} 56 err = SetWinsize(tty.Fd(), &newSize) 57 require.NoError(t, err) 58 winSize, err = GetWinsize(tty.Fd()) 59 require.NoError(t, err) 60 require.Equal(t, *winSize, newSize) 61 } 62 63 func TestGetFdInfo(t *testing.T) { 64 tty, err := newTtyForTest(t) 65 defer tty.Close() 66 require.NoError(t, err) 67 inFd, isTerminal := GetFdInfo(tty) 68 require.Equal(t, inFd, tty.Fd()) 69 require.Equal(t, isTerminal, true) 70 tmpFile, err := newTempFile() 71 require.NoError(t, err) 72 defer tmpFile.Close() 73 inFd, isTerminal = GetFdInfo(tmpFile) 74 require.Equal(t, inFd, tmpFile.Fd()) 75 require.Equal(t, isTerminal, false) 76 } 77 78 func TestIsTerminal(t *testing.T) { 79 tty, err := newTtyForTest(t) 80 defer tty.Close() 81 require.NoError(t, err) 82 isTerminal := IsTerminal(tty.Fd()) 83 require.Equal(t, isTerminal, true) 84 tmpFile, err := newTempFile() 85 require.NoError(t, err) 86 defer tmpFile.Close() 87 isTerminal = IsTerminal(tmpFile.Fd()) 88 require.Equal(t, isTerminal, false) 89 } 90 91 func TestSaveState(t *testing.T) { 92 tty, err := newTtyForTest(t) 93 defer tty.Close() 94 require.NoError(t, err) 95 state, err := SaveState(tty.Fd()) 96 require.NoError(t, err) 97 require.NotNil(t, state) 98 tty, err = newTtyForTest(t) 99 require.NoError(t, err) 100 defer tty.Close() 101 err = RestoreTerminal(tty.Fd(), state) 102 require.NoError(t, err) 103 } 104 105 func TestDisableEcho(t *testing.T) { 106 tty, err := newTtyForTest(t) 107 defer tty.Close() 108 require.NoError(t, err) 109 state, err := SetRawTerminal(tty.Fd()) 110 defer RestoreTerminal(tty.Fd(), state) 111 require.NoError(t, err) 112 require.NotNil(t, state) 113 err = DisableEcho(tty.Fd(), state) 114 require.NoError(t, err) 115 }