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