github.com/fntlnz/docker@v1.9.0-rc3/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, NativeExecDriver) 60 testRequires(c, oomControl) 61 62 errChan := make(chan error) 63 go func() { 64 defer close(errChan) 65 out, exitCode, _ := dockerCmdWithError("run", "--name", "oomFalse", "-m", "10MB", "busybox", "sh", "-c", "x=a; while true; do x=$x$x$x$x; done") 66 if expected := 137; exitCode != expected { 67 errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out) 68 } 69 }() 70 select { 71 case err := <-errChan: 72 c.Assert(err, check.IsNil) 73 case <-time.After(30 * time.Second): 74 c.Fatal("Timeout waiting for container to die on OOM") 75 } 76 77 out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomFalse", fmt.Sprintf("--until=%d", daemonTime(c).Unix())) 78 events := strings.Split(strings.TrimSuffix(out, "\n"), "\n") 79 if len(events) < 5 { 80 c.Fatalf("Missing expected event") 81 } 82 83 createEvent := strings.Fields(events[len(events)-5]) 84 attachEvent := strings.Fields(events[len(events)-4]) 85 startEvent := strings.Fields(events[len(events)-3]) 86 oomEvent := strings.Fields(events[len(events)-2]) 87 dieEvent := strings.Fields(events[len(events)-1]) 88 if createEvent[len(createEvent)-1] != "create" { 89 c.Fatalf("event should be create, not %#v", createEvent) 90 } 91 if attachEvent[len(attachEvent)-1] != "attach" { 92 c.Fatalf("event should be attach, not %#v", attachEvent) 93 } 94 if startEvent[len(startEvent)-1] != "start" { 95 c.Fatalf("event should be start, not %#v", startEvent) 96 } 97 if oomEvent[len(oomEvent)-1] != "oom" { 98 c.Fatalf("event should be oom, not %#v", oomEvent) 99 } 100 if dieEvent[len(dieEvent)-1] != "die" { 101 c.Fatalf("event should be die, not %#v", dieEvent) 102 } 103 } 104 105 func (s *DockerSuite) TestEventsOOMDisableTrue(c *check.C) { 106 testRequires(c, DaemonIsLinux) 107 testRequires(c, NativeExecDriver) 108 testRequires(c, oomControl) 109 110 errChan := make(chan error) 111 go func() { 112 defer close(errChan) 113 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") 114 if expected := 137; exitCode != expected { 115 errChan <- fmt.Errorf("wrong exit code for OOM container: expected %d, got %d (output: %q)", expected, exitCode, out) 116 } 117 }() 118 select { 119 case err := <-errChan: 120 c.Assert(err, check.IsNil) 121 case <-time.After(20 * time.Second): 122 defer dockerCmd(c, "kill", "oomTrue") 123 124 out, _ := dockerCmd(c, "events", "--since=0", "-f", "container=oomTrue", fmt.Sprintf("--until=%d", daemonTime(c).Unix())) 125 events := strings.Split(strings.TrimSuffix(out, "\n"), "\n") 126 if len(events) < 4 { 127 c.Fatalf("Missing expected event") 128 } 129 130 createEvent := strings.Fields(events[len(events)-4]) 131 attachEvent := strings.Fields(events[len(events)-3]) 132 startEvent := strings.Fields(events[len(events)-2]) 133 oomEvent := strings.Fields(events[len(events)-1]) 134 135 if createEvent[len(createEvent)-1] != "create" { 136 c.Fatalf("event should be create, not %#v", createEvent) 137 } 138 if attachEvent[len(attachEvent)-1] != "attach" { 139 c.Fatalf("event should be attach, not %#v", attachEvent) 140 } 141 if startEvent[len(startEvent)-1] != "start" { 142 c.Fatalf("event should be start, not %#v", startEvent) 143 } 144 if oomEvent[len(oomEvent)-1] != "oom" { 145 c.Fatalf("event should be oom, not %#v", oomEvent) 146 } 147 148 out, _ = dockerCmd(c, "inspect", "-f", "{{.State.Status}}", "oomTrue") 149 if strings.TrimSpace(out) != "running" { 150 c.Fatalf("container should be still running, not %v", out) 151 } 152 } 153 }