github.com/guilhermebr/docker@v1.4.2-0.20150428121140-67da055cebca/integration-cli/docker_cli_attach_test.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "io" 6 "os/exec" 7 "strings" 8 "sync" 9 "time" 10 11 "github.com/go-check/check" 12 ) 13 14 const attachWait = 5 * time.Second 15 16 func (s *DockerSuite) TestAttachMultipleAndRestart(c *check.C) { 17 18 endGroup := &sync.WaitGroup{} 19 startGroup := &sync.WaitGroup{} 20 endGroup.Add(3) 21 startGroup.Add(3) 22 23 if err := waitForContainer("attacher", "-d", "busybox", "/bin/sh", "-c", "while true; do sleep 1; echo hello; done"); err != nil { 24 c.Fatal(err) 25 } 26 27 startDone := make(chan struct{}) 28 endDone := make(chan struct{}) 29 30 go func() { 31 endGroup.Wait() 32 close(endDone) 33 }() 34 35 go func() { 36 startGroup.Wait() 37 close(startDone) 38 }() 39 40 for i := 0; i < 3; i++ { 41 go func() { 42 cmd := exec.Command(dockerBinary, "attach", "attacher") 43 44 defer func() { 45 cmd.Wait() 46 endGroup.Done() 47 }() 48 49 out, err := cmd.StdoutPipe() 50 if err != nil { 51 c.Fatal(err) 52 } 53 54 if err := cmd.Start(); err != nil { 55 c.Fatal(err) 56 } 57 58 buf := make([]byte, 1024) 59 60 if _, err := out.Read(buf); err != nil && err != io.EOF { 61 c.Fatal(err) 62 } 63 64 startGroup.Done() 65 66 if !strings.Contains(string(buf), "hello") { 67 c.Fatalf("unexpected output %s expected hello\n", string(buf)) 68 } 69 }() 70 } 71 72 select { 73 case <-startDone: 74 case <-time.After(attachWait): 75 c.Fatalf("Attaches did not initialize properly") 76 } 77 78 cmd := exec.Command(dockerBinary, "kill", "attacher") 79 if _, err := runCommand(cmd); err != nil { 80 c.Fatal(err) 81 } 82 83 select { 84 case <-endDone: 85 case <-time.After(attachWait): 86 c.Fatalf("Attaches did not finish properly") 87 } 88 89 } 90 91 func (s *DockerSuite) TestAttachTtyWithoutStdin(c *check.C) { 92 93 cmd := exec.Command(dockerBinary, "run", "-d", "-ti", "busybox") 94 out, _, err := runCommandWithOutput(cmd) 95 if err != nil { 96 c.Fatalf("failed to start container: %v (%v)", out, err) 97 } 98 99 id := strings.TrimSpace(out) 100 if err := waitRun(id); err != nil { 101 c.Fatal(err) 102 } 103 104 defer func() { 105 cmd := exec.Command(dockerBinary, "kill", id) 106 if out, _, err := runCommandWithOutput(cmd); err != nil { 107 c.Fatalf("failed to kill container: %v (%v)", out, err) 108 } 109 }() 110 111 done := make(chan struct{}) 112 go func() { 113 defer close(done) 114 115 cmd := exec.Command(dockerBinary, "attach", id) 116 if _, err := cmd.StdinPipe(); err != nil { 117 c.Fatal(err) 118 } 119 120 expected := "cannot enable tty mode" 121 if out, _, err := runCommandWithOutput(cmd); err == nil { 122 c.Fatal("attach should have failed") 123 } else if !strings.Contains(out, expected) { 124 c.Fatalf("attach failed with error %q: expected %q", out, expected) 125 } 126 }() 127 128 select { 129 case <-done: 130 case <-time.After(attachWait): 131 c.Fatal("attach is running but should have failed") 132 } 133 134 } 135 136 func (s *DockerSuite) TestAttachDisconnect(c *check.C) { 137 out, _ := dockerCmd(c, "run", "-di", "busybox", "/bin/cat") 138 id := strings.TrimSpace(out) 139 140 cmd := exec.Command(dockerBinary, "attach", id) 141 stdin, err := cmd.StdinPipe() 142 if err != nil { 143 c.Fatal(err) 144 } 145 defer stdin.Close() 146 stdout, err := cmd.StdoutPipe() 147 if err != nil { 148 c.Fatal(err) 149 } 150 defer stdout.Close() 151 if err := cmd.Start(); err != nil { 152 c.Fatal(err) 153 } 154 defer cmd.Process.Kill() 155 156 if _, err := stdin.Write([]byte("hello\n")); err != nil { 157 c.Fatal(err) 158 } 159 out, err = bufio.NewReader(stdout).ReadString('\n') 160 if err != nil { 161 c.Fatal(err) 162 } 163 if strings.TrimSpace(out) != "hello" { 164 c.Fatalf("expected 'hello', got %q", out) 165 } 166 167 if err := stdin.Close(); err != nil { 168 c.Fatal(err) 169 } 170 171 // Expect container to still be running after stdin is closed 172 running, err := inspectField(id, "State.Running") 173 if err != nil { 174 c.Fatal(err) 175 } 176 if running != "true" { 177 c.Fatal("expected container to still be running") 178 } 179 180 }