github.com/mssola/docker@v1.8.1/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 }