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  }