@@ -18,11 +18,11 @@ type KanXCmdSuite struct{}
18
18
19
19
var _ = Suite (& KanXCmdSuite {})
20
20
21
- func startServer (ctx context.Context , addr string , stdout , stderr io. Writer ) error {
21
+ func startServer (ctx context.Context , addr string ) error {
22
22
rc := newRootCommand ()
23
23
rc .SetArgs ([]string {"process" , "server" , "-a" , addr })
24
- rc .SetOut (stdout )
25
- rc .SetErr (stderr )
24
+ rc .SetOut (nil )
25
+ rc .SetErr (nil )
26
26
return rc .ExecuteContext (ctx )
27
27
}
28
28
@@ -75,7 +75,7 @@ func (s *KanXCmdSuite) TestProcessClientCreate(c *C) {
75
75
ctx , can := context .WithCancel (context .Background ())
76
76
defer can ()
77
77
go func () {
78
- err := startServer (ctx , addr , nil , nil )
78
+ err := startServer (ctx , addr )
79
79
c .Assert (err , IsNil )
80
80
}()
81
81
err := waitSock (ctx , addr )
@@ -95,19 +95,20 @@ func (s *KanXCmdSuite) TestProcessClientCreate(c *C) {
95
95
c .Assert (stderr .String (), Equals , "" )
96
96
}
97
97
98
+ // TestProcessClientOutput check that output command outputs stdout and stderr to their respective FDs.
98
99
func (s * KanXCmdSuite ) TestProcessClientOutput (c * C ) {
99
100
addr := c .MkDir () + "/kanister.sock"
100
101
ctx , can := context .WithCancel (context .Background ())
101
102
defer can ()
102
103
go func () {
103
- err := startServer (ctx , addr , nil , nil )
104
+ err := startServer (ctx , addr )
104
105
c .Assert (err , IsNil )
105
106
}()
106
107
err := waitSock (ctx , addr )
107
108
c .Assert (err , IsNil )
108
109
stdout := & bytes.Buffer {}
109
110
stderr := & bytes.Buffer {}
110
- err = executeCommand (ctx , stdout , stderr , "process" , "client" , "--as-json" , "-a" , addr , "create" , "echo " , "hello world" )
111
+ err = executeCommand (ctx , stdout , stderr , "process" , "client" , "--as-json" , "-a" , addr , "create" , "-- " , "bash" , "-c" , "echo ' hello world 1' && echo 'hello world 2' 1>&2 " )
111
112
c .Assert (err , IsNil )
112
113
pr := & ProcessResult {}
113
114
err = json .Unmarshal (stdout .Bytes (), pr )
@@ -116,16 +117,97 @@ func (s *KanXCmdSuite) TestProcessClientOutput(c *C) {
116
117
// get output
117
118
err = executeCommandWithReset (ctx , stdout , stderr , "process" , "client" , "-a" , addr , "output" , pr .Pid )
118
119
c .Assert (err , IsNil )
119
- c .Assert (stdout .String (), Equals , "hello world\n " )
120
+ c .Assert (stdout .String (), Equals , "hello world 1\n " )
121
+ c .Assert (stderr .String (), Equals , "hello world 2\n " )
122
+ }
123
+
124
+ // TestProcessClientExecute_RedirectStdout checks that stdout contains JSON process metadata and process output without additional output from logging.
125
+ func (s * KanXCmdSuite ) TestProcessClientExecute_RedirectStdout (c * C ) {
126
+ addr := c .MkDir () + "/kanister.sock"
127
+ ctx , can := context .WithCancel (context .Background ())
128
+ defer can ()
129
+ go func () {
130
+ err := startServer (ctx , addr )
131
+ c .Assert (err , IsNil )
132
+ }()
133
+ err := waitSock (ctx , addr )
134
+ c .Assert (err , IsNil )
135
+ stdout := & bytes.Buffer {}
136
+ stderr := & bytes.Buffer {}
137
+ err = executeCommand (ctx , stdout , stderr , "process" , "client" , "--as-json" , "-a" , addr , "execute" , "echo" , "hello world" )
138
+ c .Assert (err , IsNil )
139
+ bs := stdout .Bytes ()
140
+ pr := & ProcessResult {}
141
+ dc := json .NewDecoder (bytes .NewReader (bs ))
142
+ err = dc .Decode (pr )
143
+ c .Assert (err , IsNil )
144
+ c .Assert (dc .More (), Equals , true )
145
+ rest := dc .InputOffset ()
146
+ c .Assert (string (bs [rest :]), Equals , "hello world\n " )
120
147
c .Assert (stderr .String (), Equals , "" )
121
148
}
122
149
150
+ // TestProcessClientExecute_RedirectStderr checks that stderr without additional output from logging.
151
+ func (s * KanXCmdSuite ) TestProcessClientExecute_RedirectStderr (c * C ) {
152
+ addr := c .MkDir () + "/kanister.sock"
153
+ ctx , can := context .WithCancel (context .Background ())
154
+ defer can ()
155
+ go func () {
156
+ err := startServer (ctx , addr )
157
+ c .Assert (err , IsNil )
158
+ }()
159
+ err := waitSock (ctx , addr )
160
+ c .Assert (err , IsNil )
161
+ stdout := & bytes.Buffer {}
162
+ stderr := & bytes.Buffer {}
163
+ err = executeCommand (ctx , stdout , stderr , "process" , "client" , "--as-json" , "-a" , addr , "execute" , "--" , "bash" , "-c" , "echo 'hello world' 1>&2" )
164
+ c .Assert (err , IsNil )
165
+ bs := stdout .Bytes ()
166
+ pr := & ProcessResult {}
167
+ dc := json .NewDecoder (bytes .NewReader (bs ))
168
+ err = dc .Decode (pr )
169
+ c .Assert (err , IsNil )
170
+ c .Assert (stderr .String (), Equals , "hello world\n " )
171
+ }
172
+
173
+ // TestProcessClientExecute_Exit1 test that non-zero exit code from the child process is reflected in the kando command.
174
+ func (s * KanXCmdSuite ) TestProcessClientExecute_Exit1 (c * C ) {
175
+ exitCode := 0
176
+ addr := c .MkDir () + "/kanister.sock"
177
+ exit = func (n int ) {
178
+ exitCode = n
179
+ }
180
+ ctx , can := context .WithCancel (context .Background ())
181
+ defer can ()
182
+ go func () {
183
+ err := startServer (ctx , addr )
184
+ c .Assert (err , IsNil )
185
+ }()
186
+ err := waitSock (ctx , addr )
187
+ c .Assert (err , IsNil )
188
+ stdout := & bytes.Buffer {}
189
+ stderr := & bytes.Buffer {}
190
+ err = executeCommand (ctx , stdout , stderr , "process" , "client" , "--as-json" , "-a" , addr , "execute" , "--" , "/bin/bash" , "-c" , "exit 1" )
191
+ c .Assert (err , NotNil )
192
+ c .Assert (err .Error (), Equals , "exit status 1" )
193
+ c .Assert (exitCode , Equals , 1 )
194
+ bs := stdout .Bytes ()
195
+ pr := & ProcessResult {}
196
+ dc := json .NewDecoder (bytes .NewReader (bs ))
197
+ err = dc .Decode (pr )
198
+ c .Assert (err , IsNil )
199
+ c .Assert (pr .Pid , Not (Equals ), "" )
200
+ c .Assert (pr .State , Equals , "PROCESS_STATE_RUNNING" )
201
+ c .Assert (string (stdout .Bytes ()[dc .InputOffset ():]), Equals , "\n " )
202
+ c .Assert (stderr .String (), Equals , "Error: exit status 1\n " )
203
+ }
204
+
123
205
func (s * KanXCmdSuite ) TestProcessClientGet (c * C ) {
124
206
addr := c .MkDir () + "/kanister.sock"
125
207
ctx , can := context .WithCancel (context .Background ())
126
208
defer can ()
127
209
go func () {
128
- err := startServer (ctx , addr , nil , nil )
210
+ err := startServer (ctx , addr )
129
211
c .Assert (err , IsNil )
130
212
}()
131
213
err := waitSock (ctx , addr )
0 commit comments