Fixes a race condition in the kill tests where the container
would be killed but inspected before it's state changed. Fixes
this by waiting for a state change instead.
Signed-off-by: Christopher Jones <tophj@linux.vnet.ibm.com>
| ... | ... |
@@ -4,6 +4,7 @@ import ( |
| 4 | 4 |
"fmt" |
| 5 | 5 |
"net/http" |
| 6 | 6 |
"strings" |
| 7 |
+ "time" |
|
| 7 | 8 |
|
| 8 | 9 |
"github.com/docker/docker/pkg/integration/checker" |
| 9 | 10 |
"github.com/go-check/check" |
| ... | ... |
@@ -15,6 +16,7 @@ func (s *DockerSuite) TestKillContainer(c *check.C) {
|
| 15 | 15 |
c.Assert(waitRun(cleanedContainerID), check.IsNil) |
| 16 | 16 |
|
| 17 | 17 |
dockerCmd(c, "kill", cleanedContainerID) |
| 18 |
+ c.Assert(waitExited(cleanedContainerID, 10*time.Second), check.IsNil) |
|
| 18 | 19 |
|
| 19 | 20 |
out, _ = dockerCmd(c, "ps", "-q") |
| 20 | 21 |
c.Assert(out, checker.Not(checker.Contains), cleanedContainerID, check.Commentf("killed container is still running"))
|
| ... | ... |
@@ -26,6 +28,7 @@ func (s *DockerSuite) TestKillOffStoppedContainer(c *check.C) {
|
| 26 | 26 |
cleanedContainerID := strings.TrimSpace(out) |
| 27 | 27 |
|
| 28 | 28 |
dockerCmd(c, "stop", cleanedContainerID) |
| 29 |
+ c.Assert(waitExited(cleanedContainerID, 10*time.Second), check.IsNil) |
|
| 29 | 30 |
|
| 30 | 31 |
_, _, err := dockerCmdWithError("kill", "-s", "30", cleanedContainerID)
|
| 31 | 32 |
c.Assert(err, check.Not(check.IsNil), check.Commentf("Container %s is not running", cleanedContainerID))
|
| ... | ... |
@@ -39,6 +42,7 @@ func (s *DockerSuite) TestKillDifferentUserContainer(c *check.C) {
|
| 39 | 39 |
c.Assert(waitRun(cleanedContainerID), check.IsNil) |
| 40 | 40 |
|
| 41 | 41 |
dockerCmd(c, "kill", cleanedContainerID) |
| 42 |
+ c.Assert(waitExited(cleanedContainerID, 10*time.Second), check.IsNil) |
|
| 42 | 43 |
|
| 43 | 44 |
out, _ = dockerCmd(c, "ps", "-q") |
| 44 | 45 |
c.Assert(out, checker.Not(checker.Contains), cleanedContainerID, check.Commentf("killed container is still running"))
|
| ... | ... |
@@ -54,6 +58,7 @@ func (s *DockerSuite) TestKillWithSignal(c *check.C) {
|
| 54 | 54 |
c.Assert(waitRun(cid), check.IsNil) |
| 55 | 55 |
|
| 56 | 56 |
dockerCmd(c, "kill", "-s", "SIGWINCH", cid) |
| 57 |
+ time.Sleep(250 * time.Millisecond) |
|
| 57 | 58 |
|
| 58 | 59 |
running := inspectField(c, cid, "State.Running") |
| 59 | 60 |
|
| ... | ... |
@@ -67,8 +72,10 @@ func (s *DockerSuite) TestKillWithStopSignalWithSameSignalShouldDisableRestartPo |
| 67 | 67 |
cid := strings.TrimSpace(out) |
| 68 | 68 |
c.Assert(waitRun(cid), check.IsNil) |
| 69 | 69 |
|
| 70 |
- // Let's docker send a CONT signal to the container |
|
| 70 |
+ // Let docker send a TERM signal to the container |
|
| 71 |
+ // It will kill the process and disable the restart policy |
|
| 71 | 72 |
dockerCmd(c, "kill", "-s", "TERM", cid) |
| 73 |
+ c.Assert(waitExited(cid, 10*time.Second), check.IsNil) |
|
| 72 | 74 |
|
| 73 | 75 |
out, _ = dockerCmd(c, "ps", "-q") |
| 74 | 76 |
c.Assert(out, checker.Not(checker.Contains), cid, check.Commentf("killed container is still running"))
|
| ... | ... |
@@ -81,9 +88,10 @@ func (s *DockerSuite) TestKillWithStopSignalWithDifferentSignalShouldKeepRestart |
| 81 | 81 |
cid := strings.TrimSpace(out) |
| 82 | 82 |
c.Assert(waitRun(cid), check.IsNil) |
| 83 | 83 |
|
| 84 |
- // Let's docker send a TERM signal to the container |
|
| 84 |
+ // Let docker send a TERM signal to the container |
|
| 85 | 85 |
// It will kill the process, but not disable the restart policy |
| 86 | 86 |
dockerCmd(c, "kill", "-s", "TERM", cid) |
| 87 |
+ c.Assert(waitRestart(cid, 10*time.Second), check.IsNil) |
|
| 87 | 88 |
|
| 88 | 89 |
// Restart policy should still be in place, so it should be still running |
| 89 | 90 |
c.Assert(waitRun(cid), check.IsNil) |
| ... | ... |
@@ -1401,6 +1401,11 @@ func waitForContainer(contID string, args ...string) error {
|
| 1401 | 1401 |
return waitRun(contID) |
| 1402 | 1402 |
} |
| 1403 | 1403 |
|
| 1404 |
+// waitRestart will wait for the specified container to restart once |
|
| 1405 |
+func waitRestart(contID string, duration time.Duration) error {
|
|
| 1406 |
+ return waitInspect(contID, "{{.RestartCount}}", "1", duration)
|
|
| 1407 |
+} |
|
| 1408 |
+ |
|
| 1404 | 1409 |
// waitRun will wait for the specified container to be running, maximum 5 seconds. |
| 1405 | 1410 |
func waitRun(contID string) error {
|
| 1406 | 1411 |
return waitInspect(contID, "{{.State.Running}}", "true", 5*time.Second)
|