forked from jayschwa/go-pty
/
pty_test.go
152 lines (134 loc) · 3.31 KB
/
pty_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// © 2012 Jay Weisskopf
package pty
import "bufio"
import "fmt"
import "os/exec"
import "strings"
import "testing"
// Verify Open returns sane values.
func TestOpen(t *testing.T) {
master, slaveName, err := Open()
if err != nil {
t.Error("Open returned an error")
t.Fatal(err)
}
if master == nil {
t.Error("Open returned a nil master device")
} else {
defer master.Close()
}
if slaveName == "" {
t.Error("Open returned an empty slave device path")
} else {
fmt.Printf("Slave device path: '%s'\n", slaveName)
tty, err := OpenTTY(slaveName)
if err != nil {
t.Error("OpenTTY returned an error")
t.Fatal(err)
}
if tty == nil {
t.Error("OpenTTY returned a nil slave device")
} else {
defer tty.Close()
}
}
}
// Verify OpenTTY returns an error and nil when given bad paths.
func TestOpenTTY_BadPaths(t *testing.T) {
tty, err := OpenTTY("")
if err == nil {
t.Error("OpenTTY did not return an error when given an empty path")
}
if tty != nil {
t.Error("OpenTTY returned a non-nil device when given an empty path")
}
tty, err = OpenTTY("/some/bull/shit/path")
if err == nil {
t.Error("OpenTTY did not return an error when given a fake path")
}
if tty != nil {
t.Error("OpenTTY returned a non-nil device when given a fake path")
}
tty, err = OpenTTY("/bin/cat")
if err == nil {
t.Error("OpenTTY did not return an error when given a bad path")
}
if tty != nil {
t.Error("OpenTTY returned a non-nil device when given a bad path")
}
}
// Test data flow between a couple pseudoterminal device pairs.
func TestPty_DataFlow(t *testing.T) {
}
// Verify that concurrent commands have different terminal devices.
func TestSetCmdTTY_DiffDevs(t *testing.T) {
thisTTY := "FIXME"
thatCmd := exec.Command("tty")
otherCmd := exec.Command("tty")
thatMaster, err := SetCmdTTY(thatCmd, "")
if err != nil {
t.Fatal(err)
}
if thatMaster == nil {
t.Fatal("SetCmdTTY returned a nil master device")
} else {
defer thatMaster.Close()
}
otherMaster, err := SetCmdTTY(otherCmd, "")
if err != nil {
t.Fatal(err)
}
if otherMaster == nil {
t.Fatal("SetCmdTTY returned a nil master device")
} else {
defer otherMaster.Close()
}
err = thatCmd.Start()
if err != nil {
t.Fatal(err)
}
err = otherCmd.Start()
if err != nil {
t.Fatal(err)
}
err = thatCmd.Wait()
if err != nil {
t.Fatal(err)
}
err = otherCmd.Wait()
if err != nil {
t.Fatal(err)
}
thatTTY, err := bufio.NewReader(thatMaster).ReadString(10)
if err != nil {
t.Fatal(err)
}
thatTTY = strings.TrimSpace(thatTTY)
if thatTTY == "" {
t.Error("That TTY name is empty")
} else {
fmt.Printf("That TTY: '%s'\n", thatTTY)
}
otherTTY, err := bufio.NewReader(otherMaster).ReadString(10)
if err != nil {
t.Fatal(err)
}
otherTTY = strings.TrimSpace(otherTTY)
if otherTTY == "" {
t.Error("Other TTY name is empty")
} else {
fmt.Printf("Other TTY: '%s'\n", otherTTY)
}
if thisTTY == thatTTY {
t.Error("This TTY and That TTY are the same")
}
if thisTTY == otherTTY {
t.Error("This TTY and the Other TTY are the same")
}
if thatTTY == otherTTY {
t.Error("That TTY and the Other TTY are the same")
}
}
// Verify that the slave device File is closed after a command has been started.
// Verify that SetCmdTTY returns an error when given bad paths.
// Additionally, verify that TTY allocation "leaks" do not occur.