-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathprocess_test.go
143 lines (116 loc) · 3.13 KB
/
process_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
package procs_test
import (
"bytes"
"fmt"
"os"
"os/exec"
"testing"
"github.com/ionrock/procs"
)
func newProcess() *procs.Process {
return &procs.Process{
Cmds: []*exec.Cmd{
exec.Command("echo", "foo"),
exec.Command("grep", "foo"),
},
}
}
func TestProcess(t *testing.T) {
p := newProcess()
err := p.Run()
if err != nil {
t.Fatalf("error running program: %s", err)
}
out, _ := p.Output()
if !bytes.Equal(bytes.TrimSpace(out), []byte("foo")) {
t.Errorf("wrong output: expected foo but got %s", out)
}
}
func TestProcessWithOutput(t *testing.T) {
p := newProcess()
p.OutputHandler = func(line string) string {
return fmt.Sprintf("x | %s", line)
}
err := p.Run()
if err != nil {
t.Fatalf("error running program: %s", err)
}
expected := []byte("x | foo")
out, _ := p.Output()
if !bytes.Equal(bytes.TrimSpace(out), expected) {
t.Errorf("wrong output: expected %q but got %q", expected, out)
}
}
func TestProcessStartAndWait(t *testing.T) {
p := newProcess()
p.Start()
p.Wait()
out, _ := p.Output()
expected := []byte("foo")
if !bytes.Equal(bytes.TrimSpace(out), expected) {
t.Errorf("wrong output: expected %q but got %q", expected, out)
}
}
func TestProcessStartAndWaitWithOutput(t *testing.T) {
p := newProcess()
p.OutputHandler = func(line string) string {
return fmt.Sprintf("x | %s", line)
}
p.Start()
p.Wait()
out, _ := p.Output()
expected := []byte("x | foo")
if !bytes.Equal(bytes.TrimSpace(out), expected) {
t.Errorf("wrong output: expected %q but got %q", expected, out)
}
}
func TestProcessFromString(t *testing.T) {
p := procs.NewProcess("echo 'foo'")
err := p.Run()
if err != nil {
t.Fatalf("error running program: %s", err)
}
out, _ := p.Output()
if !bytes.Equal(bytes.TrimSpace(out), []byte("foo")) {
t.Errorf("wrong output: expected foo but got %s", out)
}
}
func TestProcessFromStringWithPipe(t *testing.T) {
p := procs.NewProcess("echo 'foo' | grep foo")
err := p.Run()
if err != nil {
t.Fatalf("error running program: %s", err)
}
out, _ := p.Output()
if !bytes.Equal(bytes.TrimSpace(out), []byte("foo")) {
t.Errorf("wrong output: expected foo but got %s", out)
}
}
func TestStderrOutput(t *testing.T) {
if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
return
}
fmt.Fprintln(os.Stdout, "stdout output")
fmt.Fprintln(os.Stderr, "stderr output")
os.Exit(1)
}
func TestProcessPipeWithFailures(t *testing.T) {
// This will run a piped command with a failure part way
// through. We want to be sure we get output on stderr.
p := procs.NewProcess(fmt.Sprintf("echo 'foo' | %s -test.run=TestStderrOutput | grep foo", os.Args[0]))
p.Env = map[string]string{"GO_WANT_HELPER_PROCESS": "1"}
err := p.Run()
if err == nil {
t.Fatal("expected error running program")
}
out, _ := p.Output()
expected := []byte("") // expecting no output b/c the grep foo won't run
if !bytes.Equal(out, expected) {
t.Errorf("wrong stdout output: expected '%s' but got '%s'", expected, out)
}
errOut, _ := p.ErrOutput()
expected = []byte("stderr output")
if !bytes.Equal(bytes.TrimSpace(errOut), expected) {
t.Errorf("wrong stderr output: expected '%s' but got '%s'", expected, out)
}
}