package main import ( "bytes" "os/exec" "strings" "testing" "time" "code.google.com/p/go.net/websocket" ) func TestGetContainersAttachWebsocket(t *testing.T) { runCmd := exec.Command(dockerBinary, "run", "-dit", "busybox", "cat") out, _, err := runCommandWithOutput(runCmd) if err != nil { t.Fatalf(out, err) } defer deleteAllContainers() rwc, err := sockConn(time.Duration(10 * time.Second)) if err != nil { t.Fatal(err) } cleanedContainerID := strings.TrimSpace(out) config, err := websocket.NewConfig( "/containers/"+cleanedContainerID+"/attach/ws?stream=1&stdin=1&stdout=1&stderr=1", "http://localhost", ) if err != nil { t.Fatal(err) } ws, err := websocket.NewClient(config, rwc) if err != nil { t.Fatal(err) } defer ws.Close() expected := []byte("hello") actual := make([]byte, len(expected)) outChan := make(chan string) go func() { if _, err := ws.Read(actual); err != nil { t.Fatal(err) } outChan <- "done" }() inChan := make(chan string) go func() { if _, err := ws.Write(expected); err != nil { t.Fatal(err) } inChan <- "done" }() <-inChan <-outChan if !bytes.Equal(expected, actual) { t.Fatal("Expected output on websocket to match input") } logDone("container attach websocket - can echo input via cat") }