github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/integration/container/kill_test.go (about) 1 package container // import "github.com/docker/docker/integration/container" 2 3 import ( 4 "context" 5 "testing" 6 "time" 7 8 "github.com/docker/docker/client" 9 "github.com/docker/docker/integration/internal/container" 10 "github.com/docker/docker/internal/test/request" 11 "gotest.tools/assert" 12 is "gotest.tools/assert/cmp" 13 "gotest.tools/poll" 14 "gotest.tools/skip" 15 ) 16 17 func TestKillContainerInvalidSignal(t *testing.T) { 18 defer setupTest(t)() 19 client := testEnv.APIClient() 20 ctx := context.Background() 21 id := container.Run(t, ctx, client) 22 23 err := client.ContainerKill(ctx, id, "0") 24 assert.Error(t, err, "Error response from daemon: Invalid signal: 0") 25 poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond)) 26 27 err = client.ContainerKill(ctx, id, "SIG42") 28 assert.Error(t, err, "Error response from daemon: Invalid signal: SIG42") 29 poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond)) 30 } 31 32 func TestKillContainer(t *testing.T) { 33 skip.If(t, testEnv.OSType == "windows", "TODO Windows: FIXME. No SIGWINCH") 34 defer setupTest(t)() 35 client := testEnv.APIClient() 36 37 testCases := []struct { 38 doc string 39 signal string 40 status string 41 }{ 42 { 43 doc: "no signal", 44 signal: "", 45 status: "exited", 46 }, 47 { 48 doc: "non killing signal", 49 signal: "SIGWINCH", 50 status: "running", 51 }, 52 { 53 doc: "killing signal", 54 signal: "SIGTERM", 55 status: "exited", 56 }, 57 } 58 59 for _, tc := range testCases { 60 tc := tc 61 t.Run(tc.doc, func(t *testing.T) { 62 ctx := context.Background() 63 id := container.Run(t, ctx, client) 64 err := client.ContainerKill(ctx, id, tc.signal) 65 assert.NilError(t, err) 66 67 poll.WaitOn(t, container.IsInState(ctx, client, id, tc.status), poll.WithDelay(100*time.Millisecond)) 68 }) 69 } 70 } 71 72 func TestKillWithStopSignalAndRestartPolicies(t *testing.T) { 73 skip.If(t, testEnv.OSType == "windows", "Windows only supports 1.25 or later") 74 defer setupTest(t)() 75 client := testEnv.APIClient() 76 77 testCases := []struct { 78 doc string 79 stopsignal string 80 status string 81 }{ 82 { 83 doc: "same-signal-disables-restart-policy", 84 stopsignal: "TERM", 85 status: "exited", 86 }, 87 { 88 doc: "different-signal-keep-restart-policy", 89 stopsignal: "CONT", 90 status: "running", 91 }, 92 } 93 94 for _, tc := range testCases { 95 tc := tc 96 t.Run(tc.doc, func(t *testing.T) { 97 ctx := context.Background() 98 id := container.Run(t, ctx, client, 99 container.WithRestartPolicy("always"), 100 func(c *container.TestContainerConfig) { 101 c.Config.StopSignal = tc.stopsignal 102 }) 103 err := client.ContainerKill(ctx, id, "TERM") 104 assert.NilError(t, err) 105 106 poll.WaitOn(t, container.IsInState(ctx, client, id, tc.status), poll.WithDelay(100*time.Millisecond)) 107 }) 108 } 109 } 110 111 func TestKillStoppedContainer(t *testing.T) { 112 skip.If(t, testEnv.OSType == "windows", "Windows only supports 1.25 or later") 113 defer setupTest(t)() 114 ctx := context.Background() 115 client := testEnv.APIClient() 116 id := container.Create(t, ctx, client) 117 err := client.ContainerKill(ctx, id, "SIGKILL") 118 assert.Assert(t, is.ErrorContains(err, "")) 119 assert.Assert(t, is.Contains(err.Error(), "is not running")) 120 } 121 122 func TestKillStoppedContainerAPIPre120(t *testing.T) { 123 skip.If(t, testEnv.OSType == "windows", "Windows only supports 1.25 or later") 124 defer setupTest(t)() 125 ctx := context.Background() 126 client := request.NewAPIClient(t, client.WithVersion("1.19")) 127 id := container.Create(t, ctx, client) 128 err := client.ContainerKill(ctx, id, "SIGKILL") 129 assert.NilError(t, err) 130 } 131 132 func TestKillDifferentUserContainer(t *testing.T) { 133 // TODO Windows: Windows does not yet support -u (Feb 2016). 134 skip.If(t, testEnv.OSType == "windows", "User containers (container.Config.User) are not yet supported on %q platform", testEnv.OSType) 135 136 defer setupTest(t)() 137 ctx := context.Background() 138 client := request.NewAPIClient(t, client.WithVersion("1.19")) 139 140 id := container.Run(t, ctx, client, func(c *container.TestContainerConfig) { 141 c.Config.User = "daemon" 142 }) 143 poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond)) 144 145 err := client.ContainerKill(ctx, id, "SIGKILL") 146 assert.NilError(t, err) 147 poll.WaitOn(t, container.IsInState(ctx, client, id, "exited"), poll.WithDelay(100*time.Millisecond)) 148 } 149 150 func TestInspectOomKilledTrue(t *testing.T) { 151 skip.If(t, testEnv.DaemonInfo.OSType == "windows" || !testEnv.DaemonInfo.MemoryLimit || !testEnv.DaemonInfo.SwapLimit) 152 153 defer setupTest(t)() 154 ctx := context.Background() 155 client := testEnv.APIClient() 156 157 cID := container.Run(t, ctx, client, container.WithCmd("sh", "-c", "x=a; while true; do x=$x$x$x$x; done"), func(c *container.TestContainerConfig) { 158 c.HostConfig.Resources.Memory = 32 * 1024 * 1024 159 }) 160 161 poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond)) 162 163 inspect, err := client.ContainerInspect(ctx, cID) 164 assert.NilError(t, err) 165 assert.Check(t, is.Equal(true, inspect.State.OOMKilled)) 166 } 167 168 func TestInspectOomKilledFalse(t *testing.T) { 169 skip.If(t, testEnv.DaemonInfo.OSType == "windows" || !testEnv.DaemonInfo.MemoryLimit || !testEnv.DaemonInfo.SwapLimit) 170 171 defer setupTest(t)() 172 ctx := context.Background() 173 client := testEnv.APIClient() 174 175 cID := container.Run(t, ctx, client, container.WithCmd("sh", "-c", "echo hello world")) 176 177 poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond)) 178 179 inspect, err := client.ContainerInspect(ctx, cID) 180 assert.NilError(t, err) 181 assert.Check(t, is.Equal(false, inspect.State.OOMKilled)) 182 }