// TODO: this test is largely cut and paste, refactor to share code func TestRequestAttachRemoteCommand(t *testing.T) { testCases := []struct { Stdin string Stdout string Stderr string Error string Tty bool }{ { Error: "bail", }, { Stdin: "a", Stdout: "b", Stderr: "c", }, { Stdin: "a", Stdout: "b", Tty: true, }, } for i, testCase := range testCases { localOut := &bytes.Buffer{} localErr := &bytes.Buffer{} server := httptest.NewServer(fakeExecServer(t, i, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, 1)) url, _ := url.ParseRequestURI(server.URL) c := client.NewRESTClient(url, "x", nil, -1, -1) req := c.Post().Resource("testing") conf := &client.Config{ Host: server.URL, } e, err := NewExecutor(conf, "POST", req.URL()) if err != nil { t.Errorf("%d: unexpected error: %v", i, err) continue } err = e.Stream(strings.NewReader(testCase.Stdin), localOut, localErr, testCase.Tty) hasErr := err != nil if len(testCase.Error) > 0 { if !hasErr { t.Errorf("%d: expected an error", i) } else { if e, a := testCase.Error, err.Error(); !strings.Contains(a, e) { t.Errorf("%d: expected error stream read '%v', got '%v'", i, e, a) } } server.Close() continue } if hasErr { t.Errorf("%d: unexpected error: %v", i, err) server.Close() continue } if len(testCase.Stdout) > 0 { if e, a := testCase.Stdout, localOut; e != a.String() { t.Errorf("%d: expected stdout data '%s', got '%s'", i, e, a) } } if testCase.Stderr != "" { if e, a := testCase.Stderr, localErr; e != a.String() { t.Errorf("%d: expected stderr data '%s', got '%s'", i, e, a) } } server.Close() } }
func TestRequestExecuteRemoteCommand(t *testing.T) { testCases := []struct { Stdin string Stdout string Stderr string Error string Tty bool MessageCount int }{ { Error: "bail", }, { Stdin: "a", Stdout: "b", Stderr: "c", // TODO bump this to a larger number such as 100 once // https://github.com/docker/spdystream/issues/55 is fixed and the Godep // is bumped. Sending multiple messages over stdin/stdout/stderr results // in more frames being spread across multiple spdystream frame workers. // This makes it more likely that the spdystream bug will be encountered, // where streams are closed as soon as a goaway frame is received, and // any pending frames that haven't been processed yet may not be // delivered (it's a race). MessageCount: 1, }, { Stdin: "a", Stdout: "b", Tty: true, }, } for i, testCase := range testCases { localOut := &bytes.Buffer{} localErr := &bytes.Buffer{} server := httptest.NewServer(fakeExecServer(t, i, testCase.Stdin, testCase.Stdout, testCase.Stderr, testCase.Error, testCase.Tty, testCase.MessageCount)) url, _ := url.ParseRequestURI(server.URL) c := client.NewRESTClient(url, "x", nil, -1, -1) req := c.Post().Resource("testing") req.SetHeader(httpstream.HeaderProtocolVersion, StreamProtocolV2Name) req.Param("command", "ls") req.Param("command", "/") conf := &client.Config{ Host: server.URL, } e, err := NewExecutor(conf, "POST", req.URL()) if err != nil { t.Errorf("%d: unexpected error: %v", i, err) continue } err = e.Stream(strings.NewReader(strings.Repeat(testCase.Stdin, testCase.MessageCount)), localOut, localErr, testCase.Tty) hasErr := err != nil if len(testCase.Error) > 0 { if !hasErr { t.Errorf("%d: expected an error", i) } else { if e, a := testCase.Error, err.Error(); !strings.Contains(a, e) { t.Errorf("%d: expected error stream read '%v', got '%v'", i, e, a) } } server.Close() continue } if hasErr { t.Errorf("%d: unexpected error: %v", i, err) server.Close() continue } if len(testCase.Stdout) > 0 { if e, a := strings.Repeat(testCase.Stdout, testCase.MessageCount), localOut; e != a.String() { t.Errorf("%d: expected stdout data '%s', got '%s'", i, e, a) } } if testCase.Stderr != "" { if e, a := strings.Repeat(testCase.Stderr, testCase.MessageCount), localErr; e != a.String() { t.Errorf("%d: expected stderr data '%s', got '%s'", i, e, a) } } server.Close() } }