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  }