| // +build !windows,!test_no_exec |
| |
| package main |
| |
| import ( |
| "bytes" |
| "io" |
| "os/exec" |
| "strings" |
| "time" |
| |
| "github.com/go-check/check" |
| "github.com/kr/pty" |
| ) |
| |
| // regression test for #12546 |
| func (s *DockerSuite) TestExecInteractiveStdinClose(c *check.C) { |
| out, _ := dockerCmd(c, "run", "-itd", "busybox", "/bin/cat") |
| contID := strings.TrimSpace(out) |
| |
| cmd := exec.Command(dockerBinary, "exec", "-i", contID, "echo", "-n", "hello") |
| p, err := pty.Start(cmd) |
| if err != nil { |
| c.Fatal(err) |
| } |
| |
| b := bytes.NewBuffer(nil) |
| go io.Copy(b, p) |
| |
| ch := make(chan error) |
| go func() { ch <- cmd.Wait() }() |
| |
| select { |
| case err := <-ch: |
| if err != nil { |
| c.Errorf("cmd finished with error %v", err) |
| } |
| if output := b.String(); strings.TrimSpace(output) != "hello" { |
| c.Fatalf("Unexpected output %s", output) |
| } |
| case <-time.After(1 * time.Second): |
| c.Fatal("timed out running docker exec") |
| } |
| } |