term_linux_test.go 2.9 KB

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