github.com/docker/containerd@v0.2.9-0.20170509230648-8ef7df579710/integration-test/start_solaris_test.go (about)

     1  package main
     2  
     3  import (
     4  	"path/filepath"
     5  	"syscall"
     6  	"time"
     7  
     8  	"github.com/containerd/containerd/api/grpc/types"
     9  	"github.com/docker/docker/pkg/integration/checker"
    10  	"github.com/go-check/check"
    11  	"google.golang.org/grpc"
    12  )
    13  
    14  func (cs *ContainerdSuite) TestStartBusyboxLsSlash(t *check.C) {
    15  	expectedOutput := `bin
    16  dev
    17  etc
    18  export
    19  home
    20  lib
    21  mnt
    22  opt
    23  proc
    24  root
    25  sbin
    26  system
    27  tmp
    28  usr
    29  var
    30  `
    31  	if err := CreateSolarisBundle("busybox-ls-slash", []string{"ls", "/"}); err != nil {
    32  		t.Fatal(err)
    33  	}
    34  
    35  	c, err := cs.RunContainer("myls", "busybox-ls-slash")
    36  	if err != nil {
    37  		t.Fatal(err)
    38  	}
    39  
    40  	t.Assert(c.io.stdoutBuffer.String(), checker.Equals, expectedOutput)
    41  }
    42  
    43  func (cs *ContainerdSuite) TestStartBusyboxNoSuchFile(t *check.C) {
    44  	expectedOutput := `NoSuchFile: No such file or directory`
    45  
    46  	if err := CreateSolarisBundle("busybox-no-such-file", []string{"NoSuchFile"}); err != nil {
    47  		t.Fatal(err)
    48  	}
    49  
    50  	_, err := cs.RunContainer("NoSuchFile", "busybox-no-such-file")
    51  	t.Assert(grpc.ErrorDesc(err), checker.Contains, expectedOutput)
    52  }
    53  
    54  func (cs *ContainerdSuite) TestStartBusyboxTop(t *check.C) {
    55  	bundleName := "busybox-top"
    56  	if err := CreateSolarisBundle(bundleName, []string{"sleep", "10"}); err != nil {
    57  		t.Fatal(err)
    58  	}
    59  
    60  	containerID := "start-busybox-top"
    61  	_, err := cs.StartContainer(containerID, bundleName)
    62  	t.Assert(err, checker.Equals, nil)
    63  
    64  	containers, err := cs.ListRunningContainers()
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	}
    68  	t.Assert(len(containers), checker.Equals, 1)
    69  	t.Assert(containers[0].Id, checker.Equals, containerID)
    70  	t.Assert(containers[0].Status, checker.Equals, "running")
    71  	t.Assert(containers[0].BundlePath, check.Equals, filepath.Join(cs.cwd, GetBundle(bundleName).Path))
    72  }
    73  
    74  func (cs *ContainerdSuite) TestStartBusyboxLsEvents(t *check.C) {
    75  	if err := CreateSolarisBundle("busybox-ls", []string{"ls"}); err != nil {
    76  		t.Fatal(err)
    77  	}
    78  
    79  	containerID := "ls-events"
    80  	c, err := cs.StartContainer(containerID, "busybox-ls")
    81  	if err != nil {
    82  		t.Fatal(err)
    83  	}
    84  
    85  	for _, evt := range []types.Event{
    86  		{
    87  			Type:   "start-container",
    88  			Id:     containerID,
    89  			Status: 0,
    90  			Pid:    "",
    91  		},
    92  		{
    93  			Type:   "exit",
    94  			Id:     containerID,
    95  			Status: 0,
    96  			Pid:    "init",
    97  		},
    98  	} {
    99  		ch := c.GetEventsChannel()
   100  		select {
   101  		case e := <-ch:
   102  			evt.Timestamp = e.Timestamp
   103  			evt.Status = e.Status
   104  
   105  			t.Assert(*e, checker.Equals, evt)
   106  		case <-time.After(2 * time.Second):
   107  			t.Fatal("Container took more than 2 seconds to terminate")
   108  		}
   109  	}
   110  }
   111  
   112  func (cs *ContainerdSuite) TestStartBusyboxSleep(t *check.C) {
   113  	if err := CreateSolarisBundle("busybox-sleep-5", []string{"sleep", "5"}); err != nil {
   114  		t.Fatal(err)
   115  	}
   116  
   117  	ch := make(chan interface{})
   118  	filter := func(e *types.Event) {
   119  		if e.Type == "exit" && e.Pid == "init" {
   120  			ch <- nil
   121  		}
   122  	}
   123  
   124  	start := time.Now()
   125  	_, err := cs.StartContainerWithEventFilter("sleep5", "busybox-sleep-5", filter)
   126  	if err != nil {
   127  		t.Fatal(err)
   128  	}
   129  
   130  	// We add a generous 20% marge of error
   131  	select {
   132  	case <-ch:
   133  		t.Assert(uint64(time.Now().Sub(start)), checker.LessOrEqualThan, uint64(15*time.Second))
   134  	case <-time.After(15 * time.Second):
   135  		t.Fatal("Container took more than 15 seconds to exit")
   136  	}
   137  }
   138  
   139  func (cs *ContainerdSuite) TestStartBusyboxTopKill(t *check.C) {
   140  	bundleName := "busybox-top"
   141  	if err := CreateSolarisBundle(bundleName, []string{"sleep", "10"}); err != nil {
   142  		t.Fatal(err)
   143  	}
   144  
   145  	containerID := "top-kill"
   146  	c, err := cs.StartContainer(containerID, bundleName)
   147  	if err != nil {
   148  		t.Fatal(err)
   149  	}
   150  
   151  	<-time.After(5 * time.Second)
   152  
   153  	err = cs.KillContainer(containerID)
   154  	if err != nil {
   155  		t.Fatal(err)
   156  	}
   157  
   158  	for _, evt := range []types.Event{
   159  		{
   160  			Type:   "start-container",
   161  			Id:     containerID,
   162  			Status: 0,
   163  			Pid:    "",
   164  		},
   165  		{
   166  			Type:   "exit",
   167  			Id:     containerID,
   168  			Status: 128 + uint32(syscall.SIGKILL),
   169  			Pid:    "init",
   170  		},
   171  	} {
   172  		ch := c.GetEventsChannel()
   173  		select {
   174  		case e := <-ch:
   175  			evt.Timestamp = e.Timestamp
   176  			evt.Status = e.Status
   177  
   178  			t.Assert(*e, checker.Equals, evt)
   179  		case <-time.After(2 * time.Second):
   180  			t.Fatal("Container took more than 2 seconds to terminate")
   181  		}
   182  	}
   183  }
   184  
   185  func (cs *ContainerdSuite) TestStartBusyboxTopSignalSigterm(t *check.C) {
   186  	bundleName := "busybox-top"
   187  	if err := CreateSolarisBundle(bundleName, []string{"sleep", "10"}); err != nil {
   188  		t.Fatal(err)
   189  	}
   190  
   191  	containerID := "top-sigterm"
   192  	c, err := cs.StartContainer(containerID, bundleName)
   193  	if err != nil {
   194  		t.Fatal(err)
   195  	}
   196  
   197  	<-time.After(5 * time.Second)
   198  
   199  	err = cs.SignalContainer(containerID, uint32(syscall.SIGTERM))
   200  	if err != nil {
   201  		t.Fatal(err)
   202  	}
   203  
   204  	for _, evt := range []types.Event{
   205  		{
   206  			Type:   "start-container",
   207  			Id:     containerID,
   208  			Status: 0,
   209  			Pid:    "",
   210  		},
   211  		{
   212  			Type:   "exit",
   213  			Id:     containerID,
   214  			Status: 128 + uint32(syscall.SIGTERM),
   215  			Pid:    "init",
   216  		},
   217  	} {
   218  		ch := c.GetEventsChannel()
   219  		select {
   220  		case e := <-ch:
   221  			evt.Timestamp = e.Timestamp
   222  			evt.Status = e.Status
   223  
   224  			t.Assert(*e, checker.Equals, evt)
   225  		case <-time.After(2 * time.Second):
   226  			t.Fatal("Container took more than 2 seconds to terminate")
   227  		}
   228  	}
   229  }