Browse code

Add test coverage to pkg/term/proxy.go

Signed-off-by: Naveed Jamil <naveed.jamil@tenpearls.com>

Naveed Jamil authored on 2017/06/05 20:57:01
Showing 3 changed files
... ...
@@ -50,6 +50,7 @@ bundle_test_unit() {
50 50
 	fi
51 51
 
52 52
 	go test -cover -ldflags "$LDFLAGS" "${BUILDFLAGS[@]}" $TESTFLAGS $pkg_list
53
+	go test -cover -ldflags "$LDFLAGS" "${BUILDFLAGS[@]}" $TESTFLAGS github.com/docker/docker/pkg/term -test.root
53 54
 }
54 55
 
55 56
 bundle_test_unit 2>&1 | tee -a "$DEST/test.log"
56 57
new file mode 100644
... ...
@@ -0,0 +1,92 @@
0
+package term
1
+
2
+import (
3
+	"bytes"
4
+	"fmt"
5
+	"reflect"
6
+	"testing"
7
+
8
+	"github.com/stretchr/testify/require"
9
+)
10
+
11
+func TestEscapeProxyRead(t *testing.T) {
12
+	escapeKeys, _ := ToBytes("DEL")
13
+	keys, _ := ToBytes("a,b,c,+")
14
+	reader := NewEscapeProxy(bytes.NewReader(keys), escapeKeys)
15
+	buf := make([]byte, len(keys))
16
+	nr, err := reader.Read(buf)
17
+	require.NoError(t, err)
18
+	require.EqualValues(t, nr, len(keys), fmt.Sprintf("nr %d should be equal to the number of %d", nr, len(keys)))
19
+	require.Equal(t, keys, buf, "keys & the read buffer should be equal")
20
+
21
+	keys, _ = ToBytes("")
22
+	reader = NewEscapeProxy(bytes.NewReader(keys), escapeKeys)
23
+	buf = make([]byte, len(keys))
24
+	nr, err = reader.Read(buf)
25
+	require.Error(t, err, "Should throw error when no keys are to read")
26
+	require.EqualValues(t, nr, 0, "nr should be zero")
27
+	require.Condition(t, func() (success bool) { return len(keys) == 0 && len(buf) == 0 }, "keys & the read buffer size should be zero")
28
+
29
+	escapeKeys, _ = ToBytes("ctrl-x,ctrl-@")
30
+	keys, _ = ToBytes("DEL")
31
+	reader = NewEscapeProxy(bytes.NewReader(keys), escapeKeys)
32
+	buf = make([]byte, len(keys))
33
+	nr, err = reader.Read(buf)
34
+	require.NoError(t, err)
35
+	require.EqualValues(t, nr, 1, fmt.Sprintf("nr %d should be equal to the number of 1", nr))
36
+	require.Equal(t, keys, buf, "keys & the read buffer should be equal")
37
+
38
+	escapeKeys, _ = ToBytes("ctrl-c")
39
+	keys, _ = ToBytes("ctrl-c")
40
+	reader = NewEscapeProxy(bytes.NewReader(keys), escapeKeys)
41
+	buf = make([]byte, len(keys))
42
+	nr, err = reader.Read(buf)
43
+	require.Condition(t, func() (success bool) {
44
+		return reflect.TypeOf(err).Name() == "EscapeError"
45
+	}, err)
46
+	require.EqualValues(t, nr, 0, "nr should be equal to 0")
47
+	require.Equal(t, keys, buf, "keys & the read buffer should be equal")
48
+
49
+	escapeKeys, _ = ToBytes("ctrl-c,ctrl-z")
50
+	keys, _ = ToBytes("ctrl-c,ctrl-z")
51
+	reader = NewEscapeProxy(bytes.NewReader(keys), escapeKeys)
52
+	buf = make([]byte, 1)
53
+	nr, err = reader.Read(buf)
54
+	require.NoError(t, err)
55
+	require.EqualValues(t, nr, 0, "nr should be equal to 0")
56
+	require.Equal(t, keys[0:1], buf, "keys & the read buffer should be equal")
57
+	nr, err = reader.Read(buf)
58
+	require.Condition(t, func() (success bool) {
59
+		return reflect.TypeOf(err).Name() == "EscapeError"
60
+	}, err)
61
+	require.EqualValues(t, nr, 0, "nr should be equal to 0")
62
+	require.Equal(t, keys[1:], buf, "keys & the read buffer should be equal")
63
+
64
+	escapeKeys, _ = ToBytes("ctrl-c,ctrl-z")
65
+	keys, _ = ToBytes("ctrl-c,DEL,+")
66
+	reader = NewEscapeProxy(bytes.NewReader(keys), escapeKeys)
67
+	buf = make([]byte, 1)
68
+	nr, err = reader.Read(buf)
69
+	require.NoError(t, err)
70
+	require.EqualValues(t, nr, 0, "nr should be equal to 0")
71
+	require.Equal(t, keys[0:1], buf, "keys & the read buffer should be equal")
72
+	buf = make([]byte, len(keys))
73
+	nr, err = reader.Read(buf)
74
+	require.NoError(t, err)
75
+	require.EqualValues(t, nr, len(keys), fmt.Sprintf("nr should be equal to %d", len(keys)))
76
+	require.Equal(t, keys, buf, "keys & the read buffer should be equal")
77
+
78
+	escapeKeys, _ = ToBytes("ctrl-c,ctrl-z")
79
+	keys, _ = ToBytes("ctrl-c,DEL")
80
+	reader = NewEscapeProxy(bytes.NewReader(keys), escapeKeys)
81
+	buf = make([]byte, 1)
82
+	nr, err = reader.Read(buf)
83
+	require.NoError(t, err)
84
+	require.EqualValues(t, nr, 0, "nr should be equal to 0")
85
+	require.Equal(t, keys[0:1], buf, "keys & the read buffer should be equal")
86
+	buf = make([]byte, len(keys))
87
+	nr, err = reader.Read(buf)
88
+	require.NoError(t, err)
89
+	require.EqualValues(t, nr, len(keys), fmt.Sprintf("nr should be equal to %d", len(keys)))
90
+	require.Equal(t, keys, buf, "keys & the read buffer should be equal")
91
+}
0 92
new file mode 100644
... ...
@@ -0,0 +1,120 @@
0
+//+build linux
1
+
2
+package term
3
+
4
+import (
5
+	"flag"
6
+	"io/ioutil"
7
+	"os"
8
+	"testing"
9
+
10
+	"github.com/stretchr/testify/assert"
11
+	"github.com/stretchr/testify/require"
12
+)
13
+
14
+var rootEnabled bool
15
+
16
+func init() {
17
+	flag.BoolVar(&rootEnabled, "test.root", false, "enable tests that require root")
18
+}
19
+
20
+// RequiresRoot skips tests that require root, unless the test.root flag has
21
+// been set
22
+func RequiresRoot(t *testing.T) {
23
+	if !rootEnabled {
24
+		t.Skip("skipping test that requires root")
25
+		return
26
+	}
27
+	assert.Equal(t, 0, os.Getuid(), "This test must be run as root.")
28
+}
29
+
30
+func newTtyForTest(t *testing.T) (*os.File, error) {
31
+	RequiresRoot(t)
32
+	return os.OpenFile("/dev/tty", os.O_RDWR, os.ModeDevice)
33
+}
34
+
35
+func newTempFile() (*os.File, error) {
36
+	return ioutil.TempFile(os.TempDir(), "temp")
37
+}
38
+
39
+func TestGetWinsize(t *testing.T) {
40
+	tty, err := newTtyForTest(t)
41
+	defer tty.Close()
42
+	require.NoError(t, err)
43
+	winSize, err := GetWinsize(tty.Fd())
44
+	require.NoError(t, err)
45
+	require.NotNil(t, winSize)
46
+	require.NotNil(t, winSize.Height)
47
+	require.NotNil(t, winSize.Width)
48
+	newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y}
49
+	err = SetWinsize(tty.Fd(), &newSize)
50
+	require.NoError(t, err)
51
+	winSize, err = GetWinsize(tty.Fd())
52
+	require.NoError(t, err)
53
+	require.Equal(t, *winSize, newSize)
54
+}
55
+
56
+func TestSetWinsize(t *testing.T) {
57
+	tty, err := newTtyForTest(t)
58
+	defer tty.Close()
59
+	require.NoError(t, err)
60
+	winSize, err := GetWinsize(tty.Fd())
61
+	require.NoError(t, err)
62
+	require.NotNil(t, winSize)
63
+	newSize := Winsize{Width: 200, Height: 200, x: winSize.x, y: winSize.y}
64
+	err = SetWinsize(tty.Fd(), &newSize)
65
+	require.NoError(t, err)
66
+	winSize, err = GetWinsize(tty.Fd())
67
+	require.NoError(t, err)
68
+	require.Equal(t, *winSize, newSize)
69
+}
70
+
71
+func TestGetFdInfo(t *testing.T) {
72
+	tty, err := newTtyForTest(t)
73
+	defer tty.Close()
74
+	require.NoError(t, err)
75
+	inFd, isTerminal := GetFdInfo(tty)
76
+	require.Equal(t, inFd, tty.Fd())
77
+	require.Equal(t, isTerminal, true)
78
+	tmpFile, err := newTempFile()
79
+	defer tmpFile.Close()
80
+	inFd, isTerminal = GetFdInfo(tmpFile)
81
+	require.Equal(t, inFd, tmpFile.Fd())
82
+	require.Equal(t, isTerminal, false)
83
+}
84
+
85
+func TestIsTerminal(t *testing.T) {
86
+	tty, err := newTtyForTest(t)
87
+	defer tty.Close()
88
+	require.NoError(t, err)
89
+	isTerminal := IsTerminal(tty.Fd())
90
+	require.Equal(t, isTerminal, true)
91
+	tmpFile, err := newTempFile()
92
+	defer tmpFile.Close()
93
+	isTerminal = IsTerminal(tmpFile.Fd())
94
+	require.Equal(t, isTerminal, false)
95
+}
96
+
97
+func TestSaveState(t *testing.T) {
98
+	tty, err := newTtyForTest(t)
99
+	defer tty.Close()
100
+	require.NoError(t, err)
101
+	state, err := SaveState(tty.Fd())
102
+	require.NoError(t, err)
103
+	require.NotNil(t, state)
104
+	tty, err = newTtyForTest(t)
105
+	defer tty.Close()
106
+	err = RestoreTerminal(tty.Fd(), state)
107
+	require.NoError(t, err)
108
+}
109
+
110
+func TestDisableEcho(t *testing.T) {
111
+	tty, err := newTtyForTest(t)
112
+	defer tty.Close()
113
+	require.NoError(t, err)
114
+	state, err := SetRawTerminal(tty.Fd())
115
+	require.NoError(t, err)
116
+	require.NotNil(t, state)
117
+	err = DisableEcho(tty.Fd(), state)
118
+	require.NoError(t, err)
119
+}