github.com/duglin/docker@v1.13.1/integration-cli/docker_cli_service_logs_experimental_test.go (about) 1 // +build !windows 2 3 package main 4 5 import ( 6 "bufio" 7 "fmt" 8 "io" 9 "os/exec" 10 "strings" 11 12 "github.com/docker/docker/pkg/integration/checker" 13 "github.com/go-check/check" 14 ) 15 16 type logMessage struct { 17 err error 18 data []byte 19 } 20 21 func (s *DockerSwarmSuite) TestServiceLogs(c *check.C) { 22 testRequires(c, ExperimentalDaemon) 23 24 d := s.AddDaemon(c, true, true) 25 26 // we have multiple services here for detecting the goroutine issue #28915 27 services := map[string]string{ 28 "TestServiceLogs1": "hello1", 29 "TestServiceLogs2": "hello2", 30 } 31 32 for name, message := range services { 33 out, err := d.Cmd("service", "create", "--name", name, "busybox", 34 "sh", "-c", fmt.Sprintf("echo %s; tail -f /dev/null", message)) 35 c.Assert(err, checker.IsNil) 36 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 37 } 38 39 // make sure task has been deployed. 40 waitAndAssert(c, defaultReconciliationTimeout, 41 d.checkActiveContainerCount, checker.Equals, len(services)) 42 43 for name, message := range services { 44 out, err := d.Cmd("service", "logs", name) 45 c.Assert(err, checker.IsNil) 46 c.Logf("log for %q: %q", name, out) 47 c.Assert(out, checker.Contains, message) 48 } 49 } 50 51 func (s *DockerSwarmSuite) TestServiceLogsFollow(c *check.C) { 52 testRequires(c, ExperimentalDaemon) 53 54 d := s.AddDaemon(c, true, true) 55 56 name := "TestServiceLogsFollow" 57 58 out, err := d.Cmd("service", "create", "--name", name, "busybox", "sh", "-c", "while true; do echo log test; sleep 0.1; done") 59 c.Assert(err, checker.IsNil) 60 c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") 61 62 // make sure task has been deployed. 63 waitAndAssert(c, defaultReconciliationTimeout, d.checkActiveContainerCount, checker.Equals, 1) 64 65 args := []string{"service", "logs", "-f", name} 66 cmd := exec.Command(dockerBinary, d.prependHostArg(args)...) 67 r, w := io.Pipe() 68 cmd.Stdout = w 69 cmd.Stderr = w 70 c.Assert(cmd.Start(), checker.IsNil) 71 72 // Make sure pipe is written to 73 ch := make(chan *logMessage) 74 done := make(chan struct{}) 75 go func() { 76 reader := bufio.NewReader(r) 77 for { 78 msg := &logMessage{} 79 msg.data, _, msg.err = reader.ReadLine() 80 select { 81 case ch <- msg: 82 case <-done: 83 return 84 } 85 } 86 }() 87 88 for i := 0; i < 3; i++ { 89 msg := <-ch 90 c.Assert(msg.err, checker.IsNil) 91 c.Assert(string(msg.data), checker.Contains, "log test") 92 } 93 close(done) 94 95 c.Assert(cmd.Process.Kill(), checker.IsNil) 96 }