4
4
package pty_test
5
5
6
6
import (
7
+ "bytes"
8
+ "context"
9
+ "io"
7
10
"os/exec"
8
11
"testing"
12
+ "time"
9
13
14
+ "github.com/coder/coder/pty"
10
15
"github.com/coder/coder/pty/ptytest"
11
16
"github.com/stretchr/testify/assert"
12
17
"github.com/stretchr/testify/require"
@@ -22,31 +27,67 @@ func TestStart(t *testing.T) {
22
27
t .Parallel ()
23
28
t .Run ("Echo" , func (t * testing.T ) {
24
29
t .Parallel ()
25
- pty , ps := ptytest .Start (t , exec .Command ("cmd.exe" , "/c" , "echo" , "test" ))
26
- pty .ExpectMatch ("test" )
30
+ ptty , ps := ptytest .Start (t , exec .Command ("cmd.exe" , "/c" , "echo" , "test" ))
31
+ ptty .ExpectMatch ("test" )
27
32
err := ps .Wait ()
28
33
require .NoError (t , err )
29
- err = pty .Close ()
34
+ err = ptty .Close ()
30
35
require .NoError (t , err )
31
36
})
32
37
t .Run ("Resize" , func (t * testing.T ) {
33
38
t .Parallel ()
34
- pty , _ := ptytest .Start (t , exec .Command ("cmd.exe" ))
35
- err := pty .Resize (100 , 50 )
39
+ ptty , _ := ptytest .Start (t , exec .Command ("cmd.exe" ))
40
+ err := ptty .Resize (100 , 50 )
36
41
require .NoError (t , err )
37
- err = pty .Close ()
42
+ err = ptty .Close ()
38
43
require .NoError (t , err )
39
44
})
40
45
t .Run ("Kill" , func (t * testing.T ) {
41
46
t .Parallel ()
42
- pty , ps := ptytest .Start (t , exec .Command ("cmd.exe" ))
47
+ ptty , ps := ptytest .Start (t , exec .Command ("cmd.exe" ))
43
48
err := ps .Kill ()
44
49
assert .NoError (t , err )
45
50
err = ps .Wait ()
46
51
var exitErr * exec.ExitError
47
52
require .True (t , xerrors .As (err , & exitErr ))
48
53
assert .NotEqual (t , 0 , exitErr .ExitCode ())
49
- err = pty .Close ()
54
+ err = ptty .Close ()
50
55
require .NoError (t , err )
51
56
})
52
57
}
58
+
59
+ func Test_Start_copy (t * testing.T ) {
60
+ t .Parallel ()
61
+
62
+ ctx , cancel := context .WithTimeout (context .Background (), time .Second * 10 )
63
+ defer cancel ()
64
+
65
+ pc , cmd , err := pty .Start (exec .CommandContext (ctx , "cmd.exe" , "/c" , "echo" , "test" ))
66
+ require .NoError (t , err )
67
+ b := & bytes.Buffer {}
68
+ readDone := make (chan error )
69
+ go func () {
70
+ _ , err := io .Copy (b , pc .OutputReader ())
71
+ readDone <- err
72
+ }()
73
+
74
+ select {
75
+ case err := <- readDone :
76
+ require .NoError (t , err )
77
+ case <- ctx .Done ():
78
+ t .Error ("read timed out" )
79
+ }
80
+ assert .Equal (t , "test" , b .String ())
81
+
82
+ cmdDone := make (chan error )
83
+ go func () {
84
+ cmdDone <- cmd .Wait ()
85
+ }()
86
+
87
+ select {
88
+ case err := <- cmdDone :
89
+ require .NoError (t , err )
90
+ case <- ctx .Done ():
91
+ t .Error ("cmd.Wait() timed out" )
92
+ }
93
+ }
0 commit comments