github.com/resin-io/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  }