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 }