@@ -18,8 +18,10 @@ package container
18
18
19
19
import (
20
20
"fmt"
21
+ "os"
21
22
"os/exec"
22
23
"runtime"
24
+ "strconv"
23
25
"strings"
24
26
"testing"
25
27
"time"
@@ -278,3 +280,80 @@ func TestTailFollowRotateLogs(t *testing.T) {
278
280
}
279
281
assert .Equal (t , true , len (tailLogs ) > linesPerFile , logRun .Stderr ())
280
282
}
283
+
284
+ func TestLogsWithStartContainer (t * testing.T ) {
285
+ testCase := nerdtest .Setup ()
286
+ testCase .Require = test .Require (test .Not (test .Windows ),
287
+ test .Not (nerdtest .Docker ))
288
+ testCase .SubTests = []* test.Case {
289
+ {
290
+ Description : "Test logs are directed correctly for container start of a interactive container" ,
291
+ Setup : func (data test.Data , helpers test.Helpers ) {
292
+ cmd := helpers .Command ("run" , "-it" , "--name" , data .Identifier (), testutil .CommonImage )
293
+ cmd .WithPseudoTTY (func (f * os.File ) error {
294
+ _ , err := f .WriteString ("echo foo\n exit\n " )
295
+ return err
296
+ })
297
+ cmd .Run (& test.Expected {
298
+ ExitCode : 0 ,
299
+ })
300
+
301
+ },
302
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
303
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
304
+ },
305
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
306
+ cmd := helpers .Command ("start" , "-a" , data .Identifier ())
307
+ cmd .WithPseudoTTY (func (f * os.File ) error {
308
+ _ , err := f .WriteString ("echo bar\n exit\n " )
309
+ return err
310
+ })
311
+ cmd .Run (& test.Expected {
312
+ ExitCode : 0 ,
313
+ })
314
+ cmd = helpers .Command ("logs" , data .Identifier ())
315
+
316
+ return cmd
317
+ },
318
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
319
+ return & test.Expected {
320
+ ExitCode : 0 ,
321
+ Output : func (stdout string , info string , t * testing.T ) {
322
+ assert .Assert (t , strings .Contains (stdout , "foo" ))
323
+ assert .Assert (t , strings .Contains (stdout , "bar" ))
324
+ },
325
+ }
326
+ },
327
+ },
328
+ {
329
+ Description : "Test logs are captured after stopping and starting a non-interactive container and continue capturing new logs" ,
330
+ Setup : func (data test.Data , helpers test.Helpers ) {
331
+ helpers .Ensure ("run" , "-d" , "--name" , data .Identifier (), testutil .CommonImage , "sh" , "-c" , "while true; do echo foo; sleep 1; done" )
332
+ },
333
+ Cleanup : func (data test.Data , helpers test.Helpers ) {
334
+ helpers .Anyhow ("rm" , "-f" , data .Identifier ())
335
+ },
336
+ Command : func (data test.Data , helpers test.Helpers ) test.TestableCommand {
337
+
338
+ helpers .Anyhow ("stop" , data .Identifier ())
339
+ initialLogs := helpers .Capture ("logs" , data .Identifier ())
340
+ initialFooCount := strings .Count (initialLogs , "foo" )
341
+ data .Set ("initialFooCount" , strconv .Itoa (initialFooCount ))
342
+ helpers .Ensure ("start" , data .Identifier ())
343
+ nerdtest .EnsureContainerStarted (helpers , data .Identifier ())
344
+ return helpers .Command ("logs" , data .Identifier ())
345
+ },
346
+ Expected : func (data test.Data , helpers test.Helpers ) * test.Expected {
347
+ return & test.Expected {
348
+ ExitCode : 0 ,
349
+ Output : func (stdout string , info string , t * testing.T ) {
350
+ finalLogsCount := strings .Count (stdout , "foo" )
351
+ initialFooCount , _ := strconv .Atoi (data .Get ("initialFooCount" ))
352
+ assert .Assert (t , finalLogsCount > initialFooCount , "Expected 'foo' count to increase after restart" , info )
353
+ },
354
+ }
355
+ },
356
+ },
357
+ }
358
+ testCase .Run (t )
359
+ }
0 commit comments