github.com/gondor/docker@v1.9.0-rc1/integration-cli/docker_cli_events_unix_test.go (about) 1 // +build !windows 2 3 package main 4 5 import ( 6 "bufio" 7 "fmt" 8 "io/ioutil" 9 "os" 10 "os/exec" 11 "strings" 12 "time" 13 "unicode" 14 15 "github.com/go-check/check" 16 "github.com/kr/pty" 17 ) 18 19 // #5979 20 func (s *DockerSuite) TestEventsRedirectStdout(c *check.C) { 21 since := daemonTime(c).Unix() 22 dockerCmd(c, "run", "busybox", "true") 23 24 file, err := ioutil.TempFile("", "") 25 if err != nil { 26 c.Fatalf("could not create temp file: %v", err) 27 } 28 defer os.Remove(file.Name()) 29 30 command := fmt.Sprintf("%s events --since=%d --until=%d > %s", dockerBinary, since, daemonTime(c).Unix(), file.Name()) 31 _, tty, err := pty.Open() 32 if err != nil { 33 c.Fatalf("Could not open pty: %v", err) 34 } 35 cmd := exec.Command("sh", "-c", command) 36 cmd.Stdin = tty 37 cmd.Stdout = tty 38 cmd.Stderr = tty 39 if err := cmd.Run(); err != nil { 40 c.Fatalf("run err for command %q: %v", command, err) 41 } 42 43 scanner := bufio.NewScanner(file) 44 for scanner.Scan() { 45 for _, ch := range scanner.Text() { 46 if unicode.IsControl(ch) { 47 c.Fatalf("found control character %v", []byte(string(ch))) 48 } 49 } 50 } 51 if err := scanner.Err(); err != nil { 52 c.Fatalf("Scan err for command %q: %v", command, err) 53 } 54 55 } 56 57 func (s *DockerSuite) TestEventsOOMDisableFalse(c *check.C) { 58 testRequires(c, DaemonIsLinux) 59 testRequires(c, oomControl) 60 61 errChan := make(chan error) 62 go func() { 63 defer close(errChan) 64 out, exitCode, _ := dockerCmdWithError("run", "--name", "oomFalse", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done") 65 if expected := 137; exitCode != expected { 66 errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out) 67 } 68 }() 69 select { 70 case err := <-errChan: 71 c.Assert(err, check.IsNil) 72 case <-time.After(30 * time.Second): 73 c.Fatal("Timeout waiting for container to die on OOM") 74 } 75 76 out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomFalse", fmt.Sprintf("--until=%d", daemonTime(c).Unix())) 77 events := strings.Split(strings.TrimSuffix(out, "\n"), "\n") 78 if len(events) < 5 { 79 c.Fatalf("Missing expected event") 80 } 81 82 createEvent := strings.Fields(events[len(events)-5]) 83 attachEvent := strings.Fields(events[len(events)-4]) 84 startEvent := strings.Fields(events[len(events)-3]) 85 oomEvent := strings.Fields(events[len(events)-2]) 86 dieEvent := strings.Fields(events[len(events)-1]) 87 if createEvent[len(createEvent)-1] != "create" { 88 c.Fatalf("event should be create, not %#v", createEvent) 89 } 90 if attachEvent[len(attachEvent)-1] != "attach" { 91 c.Fatalf("event should be attach, not %#v", attachEvent) 92 } 93 if startEvent[len(startEvent)-1] != "start" { 94 c.Fatalf("event should be start, not %#v", startEvent) 95 } 96 if oomEvent[len(oomEvent)-1] != "oom" { 97 c.Fatalf("event should be oom, not %#v", oomEvent) 98 } 99 if dieEvent[len(dieEvent)-1] != "die" { 100 c.Fatalf("event should be die, not %#v", dieEvent) 101 } 102 } 103 104 func (s *DockerSuite) TestEventsOOMDisableTrue(c *check.C) { 105 testRequires(c, DaemonIsLinux) 106 testRequires(c, oomControl) 107 108 errChan := make(chan error) 109 go func() { 110 defer close(errChan) 111 out, exitCode, _ := dockerCmdWithError("run", "--oom-kill-disable=true", "--name", "oomTrue", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done") 112 if expected := 137; exitCode != expected { 113 errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out) 114 } 115 }() 116 select { 117 case err := <-errChan: 118 c.Assert(err, check.IsNil) 119 case <-time.After(20 * time.Second): 120 defer dockerCmd(c, "kill", "oomTrue") 121 122 out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomTrue", fmt.Sprintf("--until=%d", daemonTime(c).Unix())) 123 events := strings.Split(strings.TrimSuffix(out, "\n"), "\n") 124 if len(events) < 4 { 125 c.Fatalf("Missing expected event") 126 } 127 128 createEvent := strings.Fields(events[len(events)-4]) 129 attachEvent := strings.Fields(events[len(events)-3]) 130 startEvent := strings.Fields(events[len(events)-2]) 131 oomEvent := strings.Fields(events[len(events)-1]) 132 133 if createEvent[len(createEvent)-1] != "create" { 134 c.Fatalf("event should be create, not %#v", createEvent) 135 } 136 if attachEvent[len(attachEvent)-1] != "attach" { 137 c.Fatalf("event should be attach, not %#v", attachEvent) 138 } 139 if startEvent[len(startEvent)-1] != "start" { 140 c.Fatalf("event should be start, not %#v", startEvent) 141 } 142 if oomEvent[len(oomEvent)-1] != "oom" { 143 c.Fatalf("event should be oom, not %#v", oomEvent) 144 } 145 146 out, _ = dockerCmd(c, "inspect", "-f", "{{.State.Status}}", "oomTrue") 147 if strings.TrimSpace(out) != "running" { 148 c.Fatalf("container should be still running, not %v", out) 149 } 150 } 151 }