github.com/slava-ustovytski/docker@v1.8.2-rc1/integration-cli/docker_cli_wait_test.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"os/exec"
     6  	"strings"
     7  	"time"
     8  
     9  	"github.com/go-check/check"
    10  )
    11  
    12  // non-blocking wait with 0 exit code
    13  func (s *DockerSuite) TestWaitNonBlockedExitZero(c *check.C) {
    14  	out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "true")
    15  	containerID := strings.TrimSpace(out)
    16  
    17  	status := "true"
    18  	var err error
    19  	for i := 0; status != "false"; i++ {
    20  		status, err = inspectField(containerID, "State.Running")
    21  		c.Assert(err, check.IsNil)
    22  
    23  		time.Sleep(time.Second)
    24  		if i >= 60 {
    25  			c.Fatal("Container should have stopped by now")
    26  		}
    27  	}
    28  
    29  	out, _ = dockerCmd(c, "wait", containerID)
    30  	if strings.TrimSpace(out) != "0" {
    31  		c.Fatal("failed to set up container", out)
    32  	}
    33  
    34  }
    35  
    36  // blocking wait with 0 exit code
    37  func (s *DockerSuite) TestWaitBlockedExitZero(c *check.C) {
    38  	out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "trap 'exit 0' TERM; while true; do sleep 0.01; done")
    39  	containerID := strings.TrimSpace(out)
    40  
    41  	if err := waitRun(containerID); err != nil {
    42  		c.Fatal(err)
    43  	}
    44  
    45  	chWait := make(chan string)
    46  	go func() {
    47  		out, _, _ := runCommandWithOutput(exec.Command(dockerBinary, "wait", containerID))
    48  		chWait <- out
    49  	}()
    50  
    51  	time.Sleep(100 * time.Millisecond)
    52  	dockerCmd(c, "stop", containerID)
    53  
    54  	select {
    55  	case status := <-chWait:
    56  		if strings.TrimSpace(status) != "0" {
    57  			c.Fatalf("expected exit 0, got %s", status)
    58  		}
    59  	case <-time.After(2 * time.Second):
    60  		c.Fatal("timeout waiting for `docker wait` to exit")
    61  	}
    62  
    63  }
    64  
    65  // non-blocking wait with random exit code
    66  func (s *DockerSuite) TestWaitNonBlockedExitRandom(c *check.C) {
    67  	out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "exit 99")
    68  	containerID := strings.TrimSpace(out)
    69  
    70  	status := "true"
    71  	var err error
    72  	for i := 0; status != "false"; i++ {
    73  		status, err = inspectField(containerID, "State.Running")
    74  		c.Assert(err, check.IsNil)
    75  
    76  		time.Sleep(time.Second)
    77  		if i >= 60 {
    78  			c.Fatal("Container should have stopped by now")
    79  		}
    80  	}
    81  
    82  	out, _ = dockerCmd(c, "wait", containerID)
    83  	if strings.TrimSpace(out) != "99" {
    84  		c.Fatal("failed to set up container", out)
    85  	}
    86  
    87  }
    88  
    89  // blocking wait with random exit code
    90  func (s *DockerSuite) TestWaitBlockedExitRandom(c *check.C) {
    91  	out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "trap 'exit 99' TERM; while true; do sleep 0.01; done")
    92  	containerID := strings.TrimSpace(out)
    93  	if err := waitRun(containerID); err != nil {
    94  		c.Fatal(err)
    95  	}
    96  	if err := waitRun(containerID); err != nil {
    97  		c.Fatal(err)
    98  	}
    99  
   100  	chWait := make(chan error)
   101  	waitCmd := exec.Command(dockerBinary, "wait", containerID)
   102  	waitCmdOut := bytes.NewBuffer(nil)
   103  	waitCmd.Stdout = waitCmdOut
   104  	if err := waitCmd.Start(); err != nil {
   105  		c.Fatal(err)
   106  	}
   107  
   108  	go func() {
   109  		chWait <- waitCmd.Wait()
   110  	}()
   111  
   112  	dockerCmd(c, "stop", containerID)
   113  
   114  	select {
   115  	case err := <-chWait:
   116  		if err != nil {
   117  			c.Fatal(err)
   118  		}
   119  		status, err := waitCmdOut.ReadString('\n')
   120  		if err != nil {
   121  			c.Fatal(err)
   122  		}
   123  		if strings.TrimSpace(status) != "99" {
   124  			c.Fatalf("expected exit 99, got %s", status)
   125  		}
   126  	case <-time.After(2 * time.Second):
   127  		waitCmd.Process.Kill()
   128  		c.Fatal("timeout waiting for `docker wait` to exit")
   129  	}
   130  }