diff --git a/integration-test/exec_test.go b/integration-test/exec_test.go new file mode 100644 index 0000000..5752362 --- /dev/null +++ b/integration-test/exec_test.go @@ -0,0 +1,175 @@ +package main + +import ( + "path/filepath" + "syscall" + + "github.com/docker/containerd/api/grpc/types" + "github.com/docker/docker/pkg/integration/checker" + "github.com/go-check/check" +) + +func (cs *ContainerdSuite) TestBusyboxTopExecEcho(t *check.C) { + bundleName := "busybox-top" + if err := CreateBusyboxBundle(bundleName, []string{"top"}); err != nil { + t.Fatal(err) + } + + var ( + err error + initp *containerProcess + echop *containerProcess + ) + + containerId := "top" + initp, err = cs.StartContainer(containerId, bundleName) + t.Assert(err, checker.Equals, nil) + + echop, err = cs.AddProcessToContainer(initp, "echo", "/", []string{"PATH=/bin"}, []string{"sh", "-c", "echo -n Ay Caramba! ; exit 1"}, 0, 0) + t.Assert(err, checker.Equals, nil) + + for _, evt := range []types.Event{ + { + Type: "start-container", + Id: containerId, + Status: 0, + Pid: "", + }, + { + Type: "start-process", + Id: containerId, + Status: 0, + Pid: "echo", + }, + { + Type: "exit", + Id: containerId, + Status: 1, + Pid: "echo", + }, + } { + ch := initp.GetEventsChannel() + e := <-ch + evt.Timestamp = e.Timestamp + + t.Assert(*e, checker.Equals, evt) + } + + t.Assert(echop.io.stdoutBuffer.String(), checker.Equals, "Ay Caramba!") +} + +func (cs *ContainerdSuite) TestBusyboxTopExecTop(t *check.C) { + bundleName := "busybox-top" + if err := CreateBusyboxBundle(bundleName, []string{"top"}); err != nil { + t.Fatal(err) + } + + var ( + err error + initp *containerProcess + ) + + containerId := "top" + initp, err = cs.StartContainer(containerId, bundleName) + t.Assert(err, checker.Equals, nil) + + execId := "top1" + _, err = cs.AddProcessToContainer(initp, execId, "/", []string{"PATH=/usr/bin"}, []string{"top"}, 0, 0) + t.Assert(err, checker.Equals, nil) + + for idx, evt := range []types.Event{ + { + Type: "start-container", + Id: containerId, + Status: 0, + Pid: "", + }, + { + Type: "start-process", + Id: containerId, + Status: 0, + Pid: execId, + }, + { + Type: "exit", + Id: containerId, + Status: 137, + Pid: execId, + }, + } { + ch := initp.GetEventsChannel() + e := <-ch + evt.Timestamp = e.Timestamp + t.Assert(*e, checker.Equals, evt) + if idx == 1 { + // Process Started, kill it + cs.SignalContainerProcess(containerId, "top1", uint32(syscall.SIGKILL)) + } + } + + // Container should still be running + containers, err := cs.ListRunningContainers() + if err != nil { + t.Fatal(err) + } + t.Assert(len(containers), checker.Equals, 1) + t.Assert(containers[0].Id, checker.Equals, "top") + t.Assert(containers[0].Status, checker.Equals, "running") + t.Assert(containers[0].BundlePath, check.Equals, filepath.Join(cs.cwd, GetBundle(bundleName).Path)) +} + +func (cs *ContainerdSuite) TestBusyboxTopExecTopKillInit(t *check.C) { + bundleName := "busybox-top" + if err := CreateBusyboxBundle(bundleName, []string{"top"}); err != nil { + t.Fatal(err) + } + + var ( + err error + initp *containerProcess + ) + + containerId := "top" + initp, err = cs.StartContainer(containerId, bundleName) + t.Assert(err, checker.Equals, nil) + + execId := "top1" + _, err = cs.AddProcessToContainer(initp, execId, "/", []string{"PATH=/usr/bin"}, []string{"top"}, 0, 0) + t.Assert(err, checker.Equals, nil) + + for idx, evt := range []types.Event{ + { + Type: "start-container", + Id: containerId, + Status: 0, + Pid: "", + }, + { + Type: "start-process", + Id: containerId, + Status: 0, + Pid: execId, + }, + { + Type: "exit", + Id: containerId, + Status: 137, + Pid: execId, + }, + { + Type: "exit", + Id: containerId, + Status: 143, + Pid: "init", + }, + } { + ch := initp.GetEventsChannel() + e := <-ch + evt.Timestamp = e.Timestamp + t.Assert(*e, checker.Equals, evt) + if idx == 1 { + // Process Started, kill it + cs.SignalContainerProcess(containerId, "init", uint32(syscall.SIGTERM)) + } + } +}