github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/integration/container/kill_test.go (about) 1 package container 2 3 import ( 4 "context" 5 "testing" 6 "time" 7 8 containertypes "github.com/docker/docker/api/types/container" 9 "github.com/docker/docker/client" 10 "github.com/docker/docker/integration/internal/container" 11 "github.com/docker/docker/integration/internal/request" 12 "github.com/gotestyourself/gotestyourself/assert" 13 is "github.com/gotestyourself/gotestyourself/assert/cmp" 14 "github.com/gotestyourself/gotestyourself/poll" 15 "github.com/gotestyourself/gotestyourself/skip" 16 ) 17 18 func TestKillContainerInvalidSignal(t *testing.T) { 19 defer setupTest(t)() 20 client := request.NewAPIClient(t) 21 ctx := context.Background() 22 id := container.Run(t, ctx, client) 23 24 err := client.ContainerKill(ctx, id, "0") 25 assert.Error(t, err, "Error response from daemon: Invalid signal: 0") 26 poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond)) 27 28 err = client.ContainerKill(ctx, id, "SIG42") 29 assert.Error(t, err, "Error response from daemon: Invalid signal: SIG42") 30 poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond)) 31 } 32 33 func TestKillContainer(t *testing.T) { 34 defer setupTest(t)() 35 client := request.NewAPIClient(t) 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 != "linux", "Windows only supports 1.25 or later") 74 defer setupTest(t)() 75 client := request.NewAPIClient(t) 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, func(c *container.TestContainerConfig) { 99 c.Config.StopSignal = tc.stopsignal 100 c.HostConfig.RestartPolicy = containertypes.RestartPolicy{ 101 Name: "always", 102 } 103 }) 104 err := client.ContainerKill(ctx, id, "TERM") 105 assert.NilError(t, err) 106 107 poll.WaitOn(t, container.IsInState(ctx, client, id, tc.status), poll.WithDelay(100*time.Millisecond)) 108 }) 109 } 110 } 111 112 func TestKillStoppedContainer(t *testing.T) { 113 skip.If(t, testEnv.OSType != "linux") // Windows only supports 1.25 or later 114 defer setupTest(t)() 115 ctx := context.Background() 116 client := request.NewAPIClient(t) 117 id := container.Create(t, ctx, client) 118 err := client.ContainerKill(ctx, id, "SIGKILL") 119 assert.Assert(t, is.ErrorContains(err, "")) 120 assert.Assert(t, is.Contains(err.Error(), "is not running")) 121 } 122 123 func TestKillStoppedContainerAPIPre120(t *testing.T) { 124 skip.If(t, testEnv.OSType != "linux") // Windows only supports 1.25 or later 125 defer setupTest(t)() 126 ctx := context.Background() 127 client := request.NewAPIClient(t, client.WithVersion("1.19")) 128 id := container.Create(t, ctx, client) 129 err := client.ContainerKill(ctx, id, "SIGKILL") 130 assert.NilError(t, err) 131 } 132 133 func TestKillDifferentUserContainer(t *testing.T) { 134 // TODO Windows: Windows does not yet support -u (Feb 2016). 135 skip.If(t, testEnv.OSType != "linux", "User containers (container.Config.User) are not yet supported on %q platform", testEnv.OSType) 136 137 defer setupTest(t)() 138 ctx := context.Background() 139 client := request.NewAPIClient(t, client.WithVersion("1.19")) 140 141 id := container.Run(t, ctx, client, func(c *container.TestContainerConfig) { 142 c.Config.User = "daemon" 143 }) 144 poll.WaitOn(t, container.IsInState(ctx, client, id, "running"), poll.WithDelay(100*time.Millisecond)) 145 146 err := client.ContainerKill(ctx, id, "SIGKILL") 147 assert.NilError(t, err) 148 poll.WaitOn(t, container.IsInState(ctx, client, id, "exited"), poll.WithDelay(100*time.Millisecond)) 149 } 150 151 func TestInspectOomKilledTrue(t *testing.T) { 152 skip.If(t, testEnv.DaemonInfo.OSType != "linux" || !testEnv.DaemonInfo.MemoryLimit || !testEnv.DaemonInfo.SwapLimit) 153 154 defer setupTest(t)() 155 ctx := context.Background() 156 client := request.NewAPIClient(t) 157 158 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) { 159 c.HostConfig.Resources.Memory = 32 * 1024 * 1024 160 }) 161 162 poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond)) 163 164 inspect, err := client.ContainerInspect(ctx, cID) 165 assert.NilError(t, err) 166 assert.Check(t, is.Equal(true, inspect.State.OOMKilled)) 167 } 168 169 func TestInspectOomKilledFalse(t *testing.T) { 170 skip.If(t, testEnv.DaemonInfo.OSType != "linux" || !testEnv.DaemonInfo.MemoryLimit || !testEnv.DaemonInfo.SwapLimit) 171 172 defer setupTest(t)() 173 ctx := context.Background() 174 client := request.NewAPIClient(t) 175 176 cID := container.Run(t, ctx, client, container.WithCmd("sh", "-c", "echo hello world")) 177 178 poll.WaitOn(t, container.IsInState(ctx, client, cID, "exited"), poll.WithDelay(100*time.Millisecond)) 179 180 inspect, err := client.ContainerInspect(ctx, cID) 181 assert.NilError(t, err) 182 assert.Check(t, is.Equal(false, inspect.State.OOMKilled)) 183 }