diff --git a/api.go b/api.go index 9485fca05..2198a0963 100644 --- a/api.go +++ b/api.go @@ -39,22 +39,28 @@ func httpError(w http.ResponseWriter, err error) { } } -func getAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func writeJson(w http.ResponseWriter, b []byte) { + w.Header().Set("Content-Type", "application/json") + w.Write(b) +} + +func getAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { config := &auth.AuthConfig{ Username: srv.runtime.authConfig.Username, Email: srv.runtime.authConfig.Email, } b, err := json.Marshal(config) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func postAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { config := &auth.AuthConfig{} if err := json.NewDecoder(r.Body).Decode(config); err != nil { - return nil, err + return err } if config.Username == srv.runtime.authConfig.Username { @@ -64,7 +70,7 @@ func postAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[stri newAuthConfig := auth.NewAuthConfig(config.Username, config.Password, config.Email, srv.runtime.root) status, err := auth.Login(newAuthConfig) if err != nil { - return nil, err + return err } else { srv.runtime.graph.getHttpClient().Jar = cookiejar.NewCookieJar() srv.runtime.authConfig = newAuthConfig @@ -72,38 +78,40 @@ func postAuth(srv *Server, w http.ResponseWriter, r *http.Request, vars map[stri if status != "" { b, err := json.Marshal(&ApiAuth{Status: status}) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } w.WriteHeader(http.StatusNoContent) - return nil, nil + return nil } -func getVersion(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getVersion(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { m := srv.DockerVersion() b, err := json.Marshal(m) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func postContainersKill(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postContainersKill(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] if err := srv.ContainerKill(name); err != nil { - return nil, err + return err } w.WriteHeader(http.StatusNoContent) - return nil, nil + return nil } -func getContainersExport(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getContainersExport(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] @@ -111,12 +119,12 @@ func getContainersExport(srv *Server, w http.ResponseWriter, r *http.Request, va Debugf("%s", err.Error()) //return nil, err } - return nil, nil + return nil } -func getImagesJson(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getImagesJson(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } all := r.Form.Get("all") == "1" @@ -125,66 +133,70 @@ func getImagesJson(srv *Server, w http.ResponseWriter, r *http.Request, vars map outs, err := srv.Images(all, only_ids, filter) if err != nil { - return nil, err + return err } b, err := json.Marshal(outs) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func getImagesViz(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getImagesViz(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := srv.ImagesViz(w); err != nil { - return nil, err + return err } - return nil, nil + return nil } -func getInfo(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getInfo(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { out := srv.DockerInfo() b, err := json.Marshal(out) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func getImagesHistory(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getImagesHistory(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] outs, err := srv.ImageHistory(name) if err != nil { - return nil, err + return err } b, err := json.Marshal(outs) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func getContainersChanges(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getContainersChanges(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] changesStr, err := srv.ContainerChanges(name) if err != nil { - return nil, err + return err } b, err := json.Marshal(changesStr) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func getContainersPs(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getContainersPs(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } all := r.Form.Get("all") == "1" trunc_cmd := r.Form.Get("trunc_cmd") != "0" @@ -199,33 +211,34 @@ func getContainersPs(srv *Server, w http.ResponseWriter, r *http.Request, vars m outs := srv.Containers(all, trunc_cmd, only_ids, n, since, before) b, err := json.Marshal(outs) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func postImagesTag(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postImagesTag(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } repo := r.Form.Get("repo") tag := r.Form.Get("tag") if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] force := r.Form.Get("force") == "1" if err := srv.ContainerTag(name, repo, tag, force); err != nil { - return nil, err + return err } w.WriteHeader(http.StatusCreated) - return nil, nil + return nil } -func postCommit(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postCommit(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } config := &Config{} if err := json.NewDecoder(r.Body).Decode(config); err != nil { @@ -238,20 +251,21 @@ func postCommit(srv *Server, w http.ResponseWriter, r *http.Request, vars map[st comment := r.Form.Get("comment") id, err := srv.ContainerCommit(container, repo, tag, author, comment, config) if err != nil { - return nil, err + return err } b, err := json.Marshal(&ApiId{id}) if err != nil { - return nil, err + return err } w.WriteHeader(http.StatusCreated) - return b, nil + writeJson(w, b) + return nil } // Creates an image from Pull or from Import -func postImagesCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postImagesCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } src := r.Form.Get("fromSrc") @@ -261,7 +275,7 @@ func postImagesCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars in, out, err := hijackServer(w) if err != nil { - return nil, err + return err } defer in.Close() fmt.Fprintf(out, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n") @@ -275,95 +289,96 @@ func postImagesCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars fmt.Fprintf(out, "Error: %s\n", err) } } - return nil, nil + return nil } -func getImagesSearch(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getImagesSearch(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } term := r.Form.Get("term") outs, err := srv.ImagesSearch(term) if err != nil { - return nil, err + return err } b, err := json.Marshal(outs) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func postImagesInsert(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postImagesInsert(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } url := r.Form.Get("url") path := r.Form.Get("path") if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] in, out, err := hijackServer(w) if err != nil { - return nil, err + return err } defer in.Close() fmt.Fprintf(out, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n") if err := srv.ImageInsert(name, url, path, out); err != nil { fmt.Fprintf(out, "Error: %s\n", err) } - return nil, nil + return nil } -func postImagesPush(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postImagesPush(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } registry := r.Form.Get("registry") if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] in, out, err := hijackServer(w) if err != nil { - return nil, err + return err } defer in.Close() fmt.Fprintf(out, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n") if err := srv.ImagePush(name, registry, out); err != nil { fmt.Fprintln(out, "Error: %s\n", err) } - return nil, nil + return nil } -func postBuild(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postBuild(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { in, out, err := hijackServer(w) if err != nil { - return nil, err + return err } defer in.Close() fmt.Fprintf(out, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n") if err := srv.ImageCreateFromFile(in, out); err != nil { fmt.Fprintln(out, "Error: %s\n", err) } - return nil, nil + return nil } -func postContainersCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postContainersCreate(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { config := &Config{} if err := json.NewDecoder(r.Body).Decode(config); err != nil { - return nil, err + return err } id, err := srv.ContainerCreate(config) if err != nil { - return nil, err + return err } out := &ApiRun{ @@ -379,75 +394,76 @@ func postContainersCreate(srv *Server, w http.ResponseWriter, r *http.Request, v } b, err := json.Marshal(out) if err != nil { - return nil, err + return err } w.WriteHeader(http.StatusCreated) - return b, nil + writeJson(w, b) + return nil } -func postContainersRestart(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postContainersRestart(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } t, err := strconv.Atoi(r.Form.Get("t")) if err != nil || t < 0 { t = 10 } if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] if err := srv.ContainerRestart(name, t); err != nil { - return nil, err + return err } w.WriteHeader(http.StatusNoContent) - return nil, nil + return nil } -func deleteContainers(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func deleteContainers(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] removeVolume := r.Form.Get("v") == "1" if err := srv.ContainerDestroy(name, removeVolume); err != nil { - return nil, err + return err } w.WriteHeader(http.StatusNoContent) - return nil, nil + return nil } -func deleteImages(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func deleteImages(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] if err := srv.ImageDelete(name); err != nil { - return nil, err + return err } w.WriteHeader(http.StatusNoContent) - return nil, nil + return nil } -func postContainersStart(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postContainersStart(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] if err := srv.ContainerStart(name); err != nil { - return nil, err + return err } w.WriteHeader(http.StatusNoContent) - return nil, nil + return nil } -func postContainersStop(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postContainersStop(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } t, err := strconv.Atoi(r.Form.Get("t")) if err != nil || t < 0 { @@ -455,36 +471,37 @@ func postContainersStop(srv *Server, w http.ResponseWriter, r *http.Request, var } if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] if err := srv.ContainerStop(name, t); err != nil { - return nil, err + return err } w.WriteHeader(http.StatusNoContent) - return nil, nil + return nil } -func postContainersWait(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postContainersWait(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] status, err := srv.ContainerWait(name) if err != nil { - return nil, err + return err } b, err := json.Marshal(&ApiWait{StatusCode: status}) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func postContainersAttach(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func postContainersAttach(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if err := parseForm(r); err != nil { - return nil, err + return err } logs := r.Form.Get("logs") == "1" stream := r.Form.Get("stream") == "1" @@ -492,13 +509,13 @@ func postContainersAttach(srv *Server, w http.ResponseWriter, r *http.Request, v stdout := r.Form.Get("stdout") == "1" stderr := r.Form.Get("stderr") == "1" if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] in, out, err := hijackServer(w) if err != nil { - return nil, err + return err } defer in.Close() @@ -506,48 +523,50 @@ func postContainersAttach(srv *Server, w http.ResponseWriter, r *http.Request, v if err := srv.ContainerAttach(name, logs, stream, stdin, stdout, stderr, in, out); err != nil { fmt.Fprintf(out, "Error: %s\n", err) } - return nil, nil + return nil } -func getContainersByName(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getContainersByName(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] container, err := srv.ContainerInspect(name) if err != nil { - return nil, err + return err } b, err := json.Marshal(container) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } -func getImagesByName(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) ([]byte, error) { +func getImagesByName(srv *Server, w http.ResponseWriter, r *http.Request, vars map[string]string) error { if vars == nil { - return nil, fmt.Errorf("Missing parameter") + return fmt.Errorf("Missing parameter") } name := vars["name"] image, err := srv.ImageInspect(name) if err != nil { - return nil, err + return err } b, err := json.Marshal(image) if err != nil { - return nil, err + return err } - return b, nil + writeJson(w, b) + return nil } func ListenAndServe(addr string, srv *Server, logging bool) error { r := mux.NewRouter() log.Printf("Listening for HTTP on %s\n", addr) - m := map[string]map[string]func(*Server, http.ResponseWriter, *http.Request, map[string]string) ([]byte, error){ + m := map[string]map[string]func(*Server, http.ResponseWriter, *http.Request, map[string]string) error{ "GET": { "/auth": getAuth, "/version": getVersion, @@ -602,14 +621,9 @@ func ListenAndServe(addr string, srv *Server, logging bool) error { Debugf("Warning: client and server don't have the same version (client: %s, server: %s)", userAgent[1], VERSION) } } - json, err := localFct(srv, w, r, mux.Vars(r)) - if err != nil { + if err := localFct(srv, w, r, mux.Vars(r)); err != nil { httpError(w, err) } - if json != nil { - w.Header().Set("Content-Type", "application/json") - w.Write(json) - } }) } } diff --git a/api_test.go b/api_test.go index 1b139b7d6..68e60adc2 100644 --- a/api_test.go +++ b/api_test.go @@ -43,13 +43,9 @@ func TestGetAuth(t *testing.T) { t.Fatal(err) } - body, err := postAuth(srv, r, req, nil) - if err != nil { + if err := postAuth(srv, r, req, nil); err != nil { t.Fatal(err) } - if body == nil { - t.Fatalf("No body received\n") - } if r.Code != http.StatusOK && r.Code != 0 { t.Fatalf("%d OK or 0 expected, received %d\n", http.StatusOK, r.Code) } @@ -70,15 +66,14 @@ func TestGetVersion(t *testing.T) { srv := &Server{runtime: runtime} - body, err := getVersion(srv, nil, nil, nil) - if err != nil { + r := httptest.NewRecorder() + + if err := getVersion(srv, r, nil, nil); err != nil { t.Fatal(err) } v := &ApiVersion{} - - err = json.Unmarshal(body, v) - if err != nil { + if err = json.Unmarshal(r.Body.Bytes(), v); err != nil { t.Fatal(err) } if v.Version != VERSION { @@ -95,12 +90,14 @@ func TestGetInfo(t *testing.T) { srv := &Server{runtime: runtime} - body, err := getInfo(srv, nil, nil, nil) - if err != nil { + r := httptest.NewRecorder() + + if err := getInfo(srv, r, nil, nil); err != nil { t.Fatal(err) } + infos := &ApiInfo{} - err = json.Unmarshal(body, infos) + err = json.Unmarshal(r.Body.Bytes(), infos) if err != nil { t.Fatal(err) } @@ -124,14 +121,14 @@ func TestGetImagesJson(t *testing.T) { t.Fatal(err) } - body, err := getImagesJson(srv, nil, req, nil) - if err != nil { + r := httptest.NewRecorder() + + if err := getImagesJson(srv, r, req, nil); err != nil { t.Fatal(err) } images := []ApiImages{} - err = json.Unmarshal(body, &images) - if err != nil { + if err := json.Unmarshal(r.Body.Bytes(), &images); err != nil { t.Fatal(err) } @@ -143,20 +140,20 @@ func TestGetImagesJson(t *testing.T) { t.Errorf("Excepted image %s, %s found", unitTestImageName, images[0].Repository) } + r2 := httptest.NewRecorder() + // only_ids=1&all=1 req2, err := http.NewRequest("GET", "/images/json?only_ids=1&all=1", nil) if err != nil { t.Fatal(err) } - body2, err := getImagesJson(srv, nil, req2, nil) - if err != nil { + if err := getImagesJson(srv, r2, req2, nil); err != nil { t.Fatal(err) } images2 := []ApiImages{} - err = json.Unmarshal(body2, &images2) - if err != nil { + if err := json.Unmarshal(r2.Body.Bytes(), &images2); err != nil { t.Fatal(err) } @@ -172,20 +169,20 @@ func TestGetImagesJson(t *testing.T) { t.Errorf("Retrieved image Id differs, expected %s, received %s", GetTestImage(runtime).ShortId(), images2[0].Id) } + r3 := httptest.NewRecorder() + // filter=a req3, err := http.NewRequest("GET", "/images/json?filter=a", nil) if err != nil { t.Fatal(err) } - body3, err := getImagesJson(srv, nil, req3, nil) - if err != nil { + if err := getImagesJson(srv, r3, req3, nil); err != nil { t.Fatal(err) } images3 := []ApiImages{} - err = json.Unmarshal(body3, &images3) - if err != nil { + if err := json.Unmarshal(r3.Body.Bytes(), &images3); err != nil { t.Fatal(err) } @@ -204,9 +201,7 @@ func TestGetImagesViz(t *testing.T) { srv := &Server{runtime: runtime} r := httptest.NewRecorder() - - _, err = getImagesViz(srv, r, nil, nil) - if err != nil { + if err := getImagesViz(srv, r, nil, nil); err != nil { t.Fatal(err) } @@ -233,19 +228,19 @@ func TestGetImagesSearch(t *testing.T) { srv := &Server{runtime: runtime} + r := httptest.NewRecorder() + req, err := http.NewRequest("GET", "/images/search?term=redis", nil) if err != nil { t.Fatal(err) } - body, err := getImagesSearch(srv, nil, req, nil) - if err != nil { + if err := getImagesSearch(srv, r, req, nil); err != nil { t.Fatal(err) } results := []ApiSearch{} - err = json.Unmarshal(body, &results) - if err != nil { + if err := json.Unmarshal(r.Body.Bytes(), &results); err != nil { t.Fatal(err) } if len(results) < 2 { @@ -262,14 +257,14 @@ func TestGetImagesHistory(t *testing.T) { srv := &Server{runtime: runtime} - body, err := getImagesHistory(srv, nil, nil, map[string]string{"name": unitTestImageName}) - if err != nil { + r := httptest.NewRecorder() + + if err := getImagesHistory(srv, r, nil, map[string]string{"name": unitTestImageName}); err != nil { t.Fatal(err) } history := []ApiHistory{} - err = json.Unmarshal(body, &history) - if err != nil { + if err := json.Unmarshal(r.Body.Bytes(), &history); err != nil { t.Fatal(err) } if len(history) != 1 { @@ -286,15 +281,13 @@ func TestGetImagesByName(t *testing.T) { srv := &Server{runtime: runtime} - body, err := getImagesByName(srv, nil, nil, map[string]string{"name": unitTestImageName}) - if err != nil { + r := httptest.NewRecorder() + if err := getImagesByName(srv, r, nil, map[string]string{"name": unitTestImageName}); err != nil { t.Fatal(err) } img := &Image{} - - err = json.Unmarshal(body, img) - if err != nil { + if err := json.Unmarshal(r.Body.Bytes(), img); err != nil { t.Fatal(err) } if img.Id != GetTestImage(runtime).Id || img.Comment != "Imported from http://get.docker.io/images/busybox" { @@ -325,13 +318,12 @@ func TestGetContainersPs(t *testing.T) { t.Fatal(err) } - body, err := getContainersPs(srv, nil, req, nil) - if err != nil { + r := httptest.NewRecorder() + if err := getContainersPs(srv, r, req, nil); err != nil { t.Fatal(err) } containers := []ApiContainers{} - err = json.Unmarshal(body, &containers) - if err != nil { + if err := json.Unmarshal(r.Body.Bytes(), &containers); err != nil { t.Fatal(err) } if len(containers) != 1 { @@ -370,9 +362,7 @@ func TestGetContainersExport(t *testing.T) { } r := httptest.NewRecorder() - - _, err = getContainersExport(srv, r, nil, map[string]string{"name": container.Id}) - if err != nil { + if err = getContainersExport(srv, r, nil, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } @@ -426,12 +416,12 @@ func TestGetContainersChanges(t *testing.T) { t.Fatal(err) } - body, err := getContainersChanges(srv, nil, nil, map[string]string{"name": container.Id}) - if err != nil { + r := httptest.NewRecorder() + if err := getContainersChanges(srv, r, nil, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } changes := []Change{} - if err := json.Unmarshal(body, &changes); err != nil { + if err := json.Unmarshal(r.Body.Bytes(), &changes); err != nil { t.Fatal(err) } @@ -470,12 +460,12 @@ func TestGetContainersByName(t *testing.T) { } defer runtime.Destroy(container) - body, err := getContainersByName(srv, nil, nil, map[string]string{"name": container.Id}) - if err != nil { + r := httptest.NewRecorder() + if err := getContainersByName(srv, r, nil, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } outContainer := &Container{} - if err := json.Unmarshal(body, outContainer); err != nil { + if err := json.Unmarshal(r.Body.Bytes(), outContainer); err != nil { t.Fatal(err) } if outContainer.Id != container.Id { @@ -498,14 +488,13 @@ func TestPostAuth(t *testing.T) { } runtime.authConfig = authConfigOrig - body, err := getAuth(srv, nil, nil, nil) - if err != nil { + r := httptest.NewRecorder() + if err := getAuth(srv, r, nil, nil); err != nil { t.Fatal(err) } authConfig := &auth.AuthConfig{} - err = json.Unmarshal(body, authConfig) - if err != nil { + if err := json.Unmarshal(r.Body.Bytes(), authConfig); err != nil { t.Fatal(err) } @@ -523,8 +512,6 @@ func TestPostCommit(t *testing.T) { srv := &Server{runtime: runtime} - r := httptest.NewRecorder() - builder := NewBuilder(runtime) // Create a container and remove a file @@ -548,8 +535,8 @@ func TestPostCommit(t *testing.T) { t.Fatal(err) } - body, err := postCommit(srv, r, req, nil) - if err != nil { + r := httptest.NewRecorder() + if err := postCommit(srv, r, req, nil); err != nil { t.Fatal(err) } if r.Code != http.StatusCreated { @@ -557,7 +544,7 @@ func TestPostCommit(t *testing.T) { } apiId := &ApiId{} - if err := json.Unmarshal(body, apiId); err != nil { + if err := json.Unmarshal(r.Body.Bytes(), apiId); err != nil { t.Fatal(err) } if _, err := runtime.graph.Get(apiId.Id); err != nil { @@ -579,20 +566,16 @@ func TestPostBuild(t *testing.T) { c1 := make(chan struct{}) go func() { + defer close(c1) r := &hijackTester{ ResponseRecorder: httptest.NewRecorder(), in: stdin, out: stdoutPipe, } - body, err := postBuild(srv, r, nil, nil) - close(c1) - if err != nil { + if err := postBuild(srv, r, nil, nil); err != nil { t.Fatal(err) } - if body != nil { - t.Fatalf("No body expected, received: %s\n", body) - } }() // Acknowledge hijack @@ -794,8 +777,6 @@ func TestPostContainersCreate(t *testing.T) { srv := &Server{runtime: runtime} - r := httptest.NewRecorder() - configJson, err := json.Marshal(&Config{ Image: GetTestImage(runtime).Id, Memory: 33554432, @@ -810,8 +791,8 @@ func TestPostContainersCreate(t *testing.T) { t.Fatal(err) } - body, err := postContainersCreate(srv, r, req, nil) - if err != nil { + r := httptest.NewRecorder() + if err := postContainersCreate(srv, r, req, nil); err != nil { t.Fatal(err) } if r.Code != http.StatusCreated { @@ -819,7 +800,7 @@ func TestPostContainersCreate(t *testing.T) { } apiRun := &ApiRun{} - if err := json.Unmarshal(body, apiRun); err != nil { + if err := json.Unmarshal(r.Body.Bytes(), apiRun); err != nil { t.Fatal(err) } @@ -874,14 +855,9 @@ func TestPostContainersKill(t *testing.T) { } r := httptest.NewRecorder() - - body, err := postContainersKill(srv, r, nil, map[string]string{"name": container.Id}) - if err != nil { + if err := postContainersKill(srv, r, nil, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } - if body != nil { - t.Fatalf("No body expected, received: %s\n", body) - } if r.Code != http.StatusNoContent { t.Fatalf("%d NO CONTENT expected, received %d\n", http.StatusNoContent, r.Code) } @@ -922,19 +898,14 @@ func TestPostContainersRestart(t *testing.T) { t.Errorf("Container should be running") } - r := httptest.NewRecorder() - req, err := http.NewRequest("POST", "/containers/"+container.Id+"/restart?t=1", bytes.NewReader([]byte{})) if err != nil { t.Fatal(err) } - body, err := postContainersRestart(srv, r, req, map[string]string{"name": container.Id}) - if err != nil { + r := httptest.NewRecorder() + if err := postContainersRestart(srv, r, req, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } - if body != nil { - t.Fatalf("No body expected, received: %s\n", body) - } if r.Code != http.StatusNoContent { t.Fatalf("%d NO CONTENT expected, received %d\n", http.StatusNoContent, r.Code) } @@ -973,14 +944,9 @@ func TestPostContainersStart(t *testing.T) { defer runtime.Destroy(container) r := httptest.NewRecorder() - - body, err := postContainersStart(srv, r, nil, map[string]string{"name": container.Id}) - if err != nil { + if err := postContainersStart(srv, r, nil, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } - if body != nil { - t.Fatalf("No body expected, received: %s\n", body) - } if r.Code != http.StatusNoContent { t.Fatalf("%d NO CONTENT expected, received %d\n", http.StatusNoContent, r.Code) } @@ -992,7 +958,8 @@ func TestPostContainersStart(t *testing.T) { t.Errorf("Container should be running") } - if _, err = postContainersStart(srv, r, nil, map[string]string{"name": container.Id}); err == nil { + r = httptest.NewRecorder() + if err = postContainersStart(srv, r, nil, map[string]string{"name": container.Id}); err == nil { t.Fatalf("A running containter should be able to be started") } @@ -1033,20 +1000,15 @@ func TestPostContainersStop(t *testing.T) { t.Errorf("Container should be running") } - r := httptest.NewRecorder() - // Note: as it is a POST request, it requires a body. req, err := http.NewRequest("POST", "/containers/"+container.Id+"/stop?t=1", bytes.NewReader([]byte{})) if err != nil { t.Fatal(err) } - body, err := postContainersStop(srv, r, req, map[string]string{"name": container.Id}) - if err != nil { + r := httptest.NewRecorder() + if err := postContainersStop(srv, r, req, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } - if body != nil { - t.Fatalf("No body expected, received: %s\n", body) - } if r.Code != http.StatusNoContent { t.Fatalf("%d NO CONTENT expected, received %d\n", http.StatusNoContent, r.Code) } @@ -1081,12 +1043,12 @@ func TestPostContainersWait(t *testing.T) { } setTimeout(t, "Wait timed out", 3*time.Second, func() { - body, err := postContainersWait(srv, nil, nil, map[string]string{"name": container.Id}) - if err != nil { + r := httptest.NewRecorder() + if err := postContainersWait(srv, r, nil, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } apiWait := &ApiWait{} - if err := json.Unmarshal(body, apiWait); err != nil { + if err := json.Unmarshal(r.Body.Bytes(), apiWait); err != nil { t.Fatal(err) } if apiWait.StatusCode != 0 { @@ -1131,8 +1093,7 @@ func TestPostContainersAttach(t *testing.T) { // Attach to it c1 := make(chan struct{}) go func() { - // We're simulating a disconnect so the return value doesn't matter. What matters is the - // fact that CmdAttach returns. + defer close(c1) r := &hijackTester{ ResponseRecorder: httptest.NewRecorder(), @@ -1145,14 +1106,9 @@ func TestPostContainersAttach(t *testing.T) { t.Fatal(err) } - body, err := postContainersAttach(srv, r, req, map[string]string{"name": container.Id}) - close(c1) - if err != nil { + if err := postContainersAttach(srv, r, req, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } - if body != nil { - t.Fatalf("No body expected, received: %s\n", body) - } }() // Acknowledge hijack @@ -1215,20 +1171,14 @@ func TestDeleteContainers(t *testing.T) { t.Fatal(err) } - r := httptest.NewRecorder() - req, err := http.NewRequest("DELETE", "/containers/"+container.Id, nil) if err != nil { t.Fatal(err) } - - body, err := deleteContainers(srv, r, req, map[string]string{"name": container.Id}) - if err != nil { + r := httptest.NewRecorder() + if err := deleteContainers(srv, r, req, map[string]string{"name": container.Id}); err != nil { t.Fatal(err) } - if body != nil { - t.Fatalf("No body expected, received: %s\n", body) - } if r.Code != http.StatusNoContent { t.Fatalf("%d NO CONTENT expected, received %d\n", http.StatusNoContent, r.Code) } @@ -1244,7 +1194,7 @@ func TestDeleteContainers(t *testing.T) { func TestDeleteImages(t *testing.T) { //FIXME: Implement this test - t.Log("Test not implemented") + t.Skip("Test not implemented") } // Mocked types for tests