1
16
17 package command
18
19 import (
20 "bytes"
21 "os"
22 "testing"
23
24 "github.com/stretchr/testify/require"
25 )
26
27 func TestSuccess(t *testing.T) {
28 res, err := New("echo", "hi").Run()
29 require.Nil(t, err)
30 require.True(t, res.Success())
31 require.Zero(t, res.ExitCode())
32 }
33
34 func TestSuccessPipe(t *testing.T) {
35 res, err := New("echo", "-n", "hi").
36 Pipe("cat").
37 Pipe("cat").
38 Run()
39 require.Nil(t, err)
40 require.True(t, res.Success())
41 require.Zero(t, res.ExitCode())
42 require.Equal(t, "hi", res.Output())
43 }
44
45 func TestFailurePipeWrongCommand(t *testing.T) {
46 res, err := New("echo", "-n", "hi").
47 Pipe("wrong").
48 Run()
49 require.NotNil(t, err)
50 require.Nil(t, res)
51 }
52
53 func TestFailurePipeWrongArgument(t *testing.T) {
54 res, err := New("echo", "-n", "hi").
55 Pipe("cat", "--wrong").
56 Run()
57 require.Nil(t, err)
58 require.False(t, res.Success())
59 require.Empty(t, res.Output())
60 require.NotEmpty(t, res.Error())
61 }
62
63 func TestSuccessVerbose(t *testing.T) {
64 res, err := New("echo", "hi").Verbose().Run()
65 require.Nil(t, err)
66 require.True(t, res.Success())
67 require.Zero(t, res.ExitCode())
68 }
69
70 func TestSuccessWithWorkingDir(t *testing.T) {
71 res, err := NewWithWorkDir("/", "ls", "-1").Run()
72 require.Nil(t, err)
73 require.True(t, res.Success())
74 require.Zero(t, res.ExitCode())
75 }
76
77 func TestFailureWithWrongWorkingDir(t *testing.T) {
78 res, err := NewWithWorkDir("/should/not/exist", "ls", "-1").Run()
79 require.NotNil(t, err)
80 require.Nil(t, res)
81 }
82
83 func TestSuccessSilent(t *testing.T) {
84 res, err := New("echo", "hi").RunSilent()
85 require.Nil(t, err)
86 require.True(t, res.Success())
87 }
88
89 func TestSuccessSeparated(t *testing.T) {
90 res, err := New("echo", "hi").RunSilent()
91 require.Nil(t, err)
92 require.True(t, res.Success())
93 }
94
95 func TestSuccessSingleArgument(t *testing.T) {
96 res, err := New("echo").Run()
97 require.Nil(t, err)
98 require.True(t, res.Success())
99 }
100
101 func TestSuccessNoArgument(t *testing.T) {
102 res, err := New("").Run()
103 require.NotNil(t, err)
104 require.Nil(t, res)
105 }
106
107 func TestSuccessOutput(t *testing.T) {
108 res, err := New("echo", "-n", "hello world").Run()
109 require.Nil(t, err)
110 require.Equal(t, "hello world", res.Output())
111 }
112
113 func TestSuccessOutputTrimNL(t *testing.T) {
114 res, err := New("echo", "-n", "hello world\n").Run()
115 require.Nil(t, err)
116 require.Equal(t, "hello world", res.OutputTrimNL())
117 }
118
119 func TestSuccessError(t *testing.T) {
120 res, err := New("cat", "/not/valid").Run()
121 require.Nil(t, err)
122 require.Empty(t, res.Output())
123 require.Contains(t, res.Error(), "No such file")
124 }
125
126 func TestSuccessOutputSeparated(t *testing.T) {
127 res, err := New("echo", "-n", "hello").Run()
128 require.Nil(t, err)
129 require.Equal(t, "hello", res.Output())
130 }
131
132 func TestFailureStdErr(t *testing.T) {
133 res, err := New("cat", "/not/valid").Run()
134 require.Nil(t, err)
135 require.False(t, res.Success())
136 require.Equal(t, res.ExitCode(), 1)
137 }
138
139 func TestFailureNotExisting(t *testing.T) {
140 res, err := New("/not/valid").Run()
141 require.NotNil(t, err)
142 require.Nil(t, res)
143 }
144
145 func TestSuccessExecute(t *testing.T) {
146 err := Execute("echo", "-n", "hi", "ho")
147 require.Nil(t, err)
148 }
149
150 func TestFailureExecute(t *testing.T) {
151 err := Execute("cat", "/not/invalid")
152 require.NotNil(t, err)
153 }
154
155 func TestAvailableSuccessValidCommand(t *testing.T) {
156 res := Available("echo")
157 require.True(t, res)
158 }
159
160 func TestAvailableSuccessEmptyCommands(t *testing.T) {
161 res := Available()
162 require.True(t, res)
163 }
164
165 func TestAvailableFailure(t *testing.T) {
166 res := Available("echo", "this-command-should-not-exist")
167 require.False(t, res)
168 }
169
170 func TestSuccessRunSuccess(t *testing.T) {
171 require.Nil(t, New("echo", "hi").RunSuccess())
172 }
173
174 func TestFailureRunSuccess(t *testing.T) {
175 require.NotNil(t, New("cat", "/not/available").RunSuccess())
176 }
177
178 func TestSuccessRunSilentSuccess(t *testing.T) {
179 require.Nil(t, New("echo", "hi").RunSilentSuccess())
180 }
181
182 func TestFailureRunSuccessSilent(t *testing.T) {
183 require.NotNil(t, New("cat", "/not/available").RunSilentSuccess())
184 }
185
186 func TestSuccessRunSuccessOutput(t *testing.T) {
187 res, err := New("echo", "-n", "hi").RunSuccessOutput()
188 require.Nil(t, err)
189 require.Equal(t, "hi", res.Output())
190 }
191
192 func TestFailureRunSuccessOutput(t *testing.T) {
193 res, err := New("cat", "/not/available").RunSuccessOutput()
194 require.NotNil(t, err)
195 require.Nil(t, res)
196 }
197
198 func TestSuccessRunSilentSuccessOutput(t *testing.T) {
199 res, err := New("echo", "-n", "hi").RunSilentSuccessOutput()
200 require.Nil(t, err)
201 require.Equal(t, "hi", res.Output())
202 }
203
204 func TestFailureRunSilentSuccessOutput(t *testing.T) {
205 res, err := New("cat", "/not/available").RunSilentSuccessOutput()
206 require.NotNil(t, err)
207 require.Nil(t, res)
208 }
209
210 func TestSuccessLogWriter(t *testing.T) {
211 f, err := os.CreateTemp("", "log")
212 require.Nil(t, err)
213 defer func() { require.Nil(t, os.Remove(f.Name())) }()
214
215 res, err := New("echo", "Hello World").AddWriter(f).RunSuccessOutput()
216 require.Nil(t, err)
217
218 content, err := os.ReadFile(f.Name())
219 require.Nil(t, err)
220 require.Equal(t, res.Output(), string(content))
221 }
222
223 func TestSuccessLogWriterMultiple(t *testing.T) {
224 f, err := os.CreateTemp("", "log")
225 require.Nil(t, err)
226 defer func() { require.Nil(t, os.Remove(f.Name())) }()
227 b := &bytes.Buffer{}
228
229 res, err := New("echo", "Hello World").
230 AddWriter(f).
231 AddWriter(b).
232 RunSuccessOutput()
233 require.Nil(t, err)
234
235 content, err := os.ReadFile(f.Name())
236 require.Nil(t, err)
237 require.Equal(t, res.Output(), string(content))
238 require.Equal(t, res.Output(), b.String())
239 }
240
241 func TestSuccessLogWriterSilent(t *testing.T) {
242 f, err := os.CreateTemp("", "log")
243 require.Nil(t, err)
244 defer func() { require.Nil(t, os.Remove(f.Name())) }()
245
246 err = New("echo", "Hello World").AddWriter(f).RunSilentSuccess()
247 require.Nil(t, err)
248
249 content, err := os.ReadFile(f.Name())
250 require.Nil(t, err)
251 require.Empty(t, content)
252 }
253
254 func TestSuccessLogWriterStdErr(t *testing.T) {
255 f, err := os.CreateTemp("", "log")
256 require.Nil(t, err)
257 defer func() { require.Nil(t, os.Remove(f.Name())) }()
258
259 res, err := New("bash", "-c", ">&2 echo error").
260 AddWriter(f).RunSuccessOutput()
261 require.Nil(t, err)
262
263 content, err := os.ReadFile(f.Name())
264 require.Nil(t, err)
265 require.Equal(t, res.Error(), string(content))
266 }
267
268 func TestSuccessLogWriterStdErrAndStdOut(t *testing.T) {
269 f, err := os.CreateTemp("", "log")
270 require.Nil(t, err)
271 defer func() { require.Nil(t, os.Remove(f.Name())) }()
272
273 res, err := New("bash", "-c", ">&2 echo stderr; echo stdout").
274 AddWriter(f).RunSuccessOutput()
275 require.Nil(t, err)
276
277 content, err := os.ReadFile(f.Name())
278 require.Nil(t, err)
279 require.Contains(t, string(content), res.Output())
280 require.Contains(t, string(content), res.Error())
281 }
282
283 func TestSuccessLogWriterStdErrAndStdOutOnlyStdErr(t *testing.T) {
284 f, err := os.CreateTemp("", "log")
285 require.Nil(t, err)
286 defer func() { require.Nil(t, os.Remove(f.Name())) }()
287
288 res, err := New("bash", "-c", ">&2 echo stderr; echo stdout").
289 AddErrorWriter(f).RunSuccessOutput()
290 require.Nil(t, err)
291
292 content, err := os.ReadFile(f.Name())
293 require.Nil(t, err)
294 require.Equal(t, res.Error(), string(content))
295 }
296
297 func TestSuccessLogWriterStdErrAndStdOutOnlyStdOut(t *testing.T) {
298 f, err := os.CreateTemp("", "log")
299 require.Nil(t, err)
300 defer func() { require.Nil(t, os.Remove(f.Name())) }()
301
302 res, err := New("bash", "-c", ">&2 echo stderr; echo stdout").
303 AddOutputWriter(f).RunSuccessOutput()
304 require.Nil(t, err)
305
306 content, err := os.ReadFile(f.Name())
307 require.Nil(t, err)
308 require.Equal(t, res.Output(), string(content))
309 }
310
311 func TestCommandsSuccess(t *testing.T) {
312 res, err := New("echo", "1").Verbose().
313 Add("echo", "2").Add("echo", "3").Run()
314 require.Nil(t, err)
315 require.True(t, res.Success())
316 require.Zero(t, res.ExitCode())
317 require.Contains(t, res.Output(), "1")
318 require.Contains(t, res.Output(), "2")
319 require.Contains(t, res.Output(), "3")
320 }
321
322 func TestCommandsFailure(t *testing.T) {
323 res, err := New("echo", "1").Add("wrong").Add("echo", "3").Run()
324 require.NotNil(t, err)
325 require.Nil(t, res)
326 }
327
328 func TestEnv(t *testing.T) {
329 require.Nil(t, os.Setenv("ABC", "test"))
330 require.Nil(t, os.Setenv("FOO", "test"))
331 res, err := New("sh", "-c", "echo $TEST; echo $FOO; echo $ABC").
332 Env("TEST=123").
333 Env("FOO=bar").
334 RunSuccessOutput()
335 require.Nil(t, err)
336 require.Equal(t, "123\nbar\ntest", res.OutputTrimNL())
337 }
338
339 func TestFilterStdout(t *testing.T) {
340 cmd, err := New("echo", "-n", "1 2 2 3").Filter("[25]", "0")
341 require.Nil(t, err)
342
343 res, err := cmd.Add("echo", "-n", "4 5 6 2 2").Run()
344 require.Nil(t, err)
345 require.True(t, res.Success())
346 require.Zero(t, res.ExitCode())
347 require.Equal(t, "\n1 0 0 3\n4 0 6 0 0", res.Output())
348 }
349
350 func TestFilterStderr(t *testing.T) {
351 res, err := New("bash", "-c", ">&2 echo -n my secret").Filter("secret", "***")
352 require.Nil(t, err)
353 out, err := res.RunSilentSuccessOutput()
354 require.Nil(t, err)
355 require.Equal(t, "my ***", out.Error())
356 require.Empty(t, out.Output())
357 }
358
View as plain text