Index: client/internal/lhttp/client_test.go |
diff --git a/client/internal/lhttp/client_test.go b/client/internal/lhttp/client_test.go |
deleted file mode 100644 |
index 3d7724ad7055b4a11656eac8d09fe285e0c36268..0000000000000000000000000000000000000000 |
--- a/client/internal/lhttp/client_test.go |
+++ /dev/null |
@@ -1,275 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package lhttp |
- |
-import ( |
- "bytes" |
- "encoding/json" |
- "errors" |
- "fmt" |
- "io" |
- "io/ioutil" |
- "net/http" |
- "net/http/httptest" |
- "testing" |
- "time" |
- |
- "github.com/luci/luci-go/client/internal/retry" |
- "github.com/maruel/ut" |
-) |
- |
-func TestNewRequestGET(t *testing.T) { |
- // First call returns HTTP 500, second succeeds. |
- serverCalls := 0 |
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- serverCalls++ |
- content, err := ioutil.ReadAll(r.Body) |
- ut.ExpectEqual(t, nil, err) |
- ut.ExpectEqual(t, []byte{}, content) |
- if serverCalls == 1 { |
- w.WriteHeader(500) |
- } else { |
- fmt.Fprintf(w, "Hello, client\n") |
- } |
- })) |
- defer ts.Close() |
- |
- httpReq, err := http.NewRequest("GET", ts.URL, nil) |
- ut.AssertEqual(t, nil, err) |
- |
- clientCalls := 0 |
- clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *http.Response) error { |
- clientCalls++ |
- content, err := ioutil.ReadAll(resp.Body) |
- ut.AssertEqual(t, nil, err) |
- ut.AssertEqual(t, "Hello, client\n", string(content)) |
- ut.AssertEqual(t, nil, resp.Body.Close()) |
- return nil |
- }) |
- ut.AssertEqual(t, nil, err) |
- |
- ut.AssertEqual(t, nil, fast.Do(clientReq)) |
- ut.AssertEqual(t, 200, clientReq.Status()) |
- ut.AssertEqual(t, 2, serverCalls) |
- ut.AssertEqual(t, 1, clientCalls) |
-} |
- |
-func TestNewRequestPOST(t *testing.T) { |
- // First call returns HTTP 500, second succeeds. |
- serverCalls := 0 |
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- serverCalls++ |
- content, err := ioutil.ReadAll(r.Body) |
- ut.ExpectEqual(t, nil, err) |
- // The same data is sent twice. |
- ut.ExpectEqual(t, "foo bar", string(content)) |
- if serverCalls == 1 { |
- w.WriteHeader(500) |
- } else { |
- fmt.Fprintf(w, "Hello, client\n") |
- } |
- })) |
- defer ts.Close() |
- |
- httpReq, err := http.NewRequest("POST", ts.URL, newReader([]byte("foo bar"))) |
- ut.AssertEqual(t, nil, err) |
- |
- clientCalls := 0 |
- clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *http.Response) error { |
- clientCalls++ |
- content, err := ioutil.ReadAll(resp.Body) |
- ut.AssertEqual(t, nil, err) |
- ut.AssertEqual(t, "Hello, client\n", string(content)) |
- ut.AssertEqual(t, nil, resp.Body.Close()) |
- return nil |
- }) |
- ut.AssertEqual(t, nil, err) |
- |
- ut.AssertEqual(t, nil, fast.Do(clientReq)) |
- ut.AssertEqual(t, 200, clientReq.Status()) |
- ut.AssertEqual(t, 2, serverCalls) |
- ut.AssertEqual(t, 1, clientCalls) |
-} |
- |
-func TestNewRequestNotSeeker(t *testing.T) { |
- // bytes.NewReader() doesn't implement io.Seeker. |
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- t.Fail() |
- })) |
- defer ts.Close() |
- httpReq, err := http.NewRequest("POST", ts.URL, bytes.NewReader([]byte("foo bar"))) |
- ut.AssertEqual(t, nil, err) |
- |
- clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *http.Response) error { |
- t.Fail() |
- return nil |
- }) |
- |
- ut.AssertEqual(t, nil, clientReq) |
- ut.AssertEqual(t, errors.New("req.Body must implement io.Seeker"), err) |
-} |
- |
-func TestNewRequestBadURL(t *testing.T) { |
- httpReq, err := http.NewRequest("GET", "invalid url", nil) |
- ut.AssertEqual(t, nil, err) |
- |
- clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *http.Response) error { |
- t.Fail() |
- return nil |
- }) |
- ut.AssertEqual(t, errors.New("unsupported protocol scheme \"\""), err) |
- ut.AssertEqual(t, nil, clientReq) |
-} |
- |
-func TestNewRequestGETFail(t *testing.T) { |
- serverCalls := 0 |
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- serverCalls++ |
- w.WriteHeader(500) |
- })) |
- defer ts.Close() |
- |
- httpReq, err := http.NewRequest("GET", ts.URL, nil) |
- ut.AssertEqual(t, nil, err) |
- |
- clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *http.Response) error { |
- t.Fail() |
- return nil |
- }) |
- |
- ut.AssertEqual(t, retry.Error{errors.New("http request failed: Internal Server Error (HTTP 500)")}, fast.Do(clientReq)) |
- ut.AssertEqual(t, 500, clientReq.Status()) |
- ut.AssertEqual(t, fast.MaxTries, serverCalls) |
-} |
- |
-func TestNewRequestJSONBadURL(t *testing.T) { |
- clientReq, err := NewRequestJSON(http.DefaultClient, "GET", "invalid url", nil, nil) |
- ut.AssertEqual(t, errors.New("unsupported protocol scheme \"\""), err) |
- ut.AssertEqual(t, nil, clientReq) |
-} |
- |
-func TestGetJSON(t *testing.T) { |
- // First call returns HTTP 500, second succeeds. |
- serverCalls := 0 |
- ts := httptest.NewServer(handlerJSON(t, func(body io.Reader) interface{} { |
- serverCalls++ |
- content, err := ioutil.ReadAll(body) |
- ut.ExpectEqual(t, nil, err) |
- ut.ExpectEqual(t, []byte{}, content) |
- if serverCalls == 1 { |
- return nil |
- } |
- return map[string]string{"success": "yeah"} |
- })) |
- defer ts.Close() |
- |
- actual := map[string]string{} |
- status, err := GetJSON(fast, http.DefaultClient, ts.URL, &actual) |
- ut.AssertEqual(t, nil, err) |
- ut.AssertEqual(t, 200, status) |
- ut.AssertEqual(t, map[string]string{"success": "yeah"}, actual) |
- ut.AssertEqual(t, 2, serverCalls) |
-} |
- |
-func TestGetJSONBadResult(t *testing.T) { |
- serverCalls := 0 |
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- serverCalls++ |
- w.Header().Set("Content-Type", jsonContentType) |
- _, err := io.WriteString(w, "yo") |
- ut.ExpectEqual(t, nil, err) |
- })) |
- defer ts.Close() |
- |
- actual := map[string]string{} |
- status, err := GetJSON(fast, http.DefaultClient, ts.URL, &actual) |
- ut.AssertEqual(t, retry.Error{errors.New("bad response " + ts.URL + ": invalid character 'y' looking for beginning of value")}, err) |
- ut.AssertEqual(t, 200, status) |
- ut.AssertEqual(t, map[string]string{}, actual) |
- ut.AssertEqual(t, fast.MaxTries, serverCalls) |
-} |
- |
-func TestGetJSONBadResultIgnore(t *testing.T) { |
- serverCalls := 0 |
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- serverCalls++ |
- w.Header().Set("Content-Type", jsonContentType) |
- _, err := io.WriteString(w, "yo") |
- ut.ExpectEqual(t, nil, err) |
- })) |
- defer ts.Close() |
- |
- status, err := GetJSON(fast, http.DefaultClient, ts.URL, nil) |
- ut.AssertEqual(t, retry.Error{errors.New("bad response " + ts.URL + ": invalid character 'y' looking for beginning of value")}, err) |
- ut.AssertEqual(t, 200, status) |
-} |
- |
-func TestGetJSONBadContentTypeIgnore(t *testing.T) { |
- ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- _, err := io.WriteString(w, "{}") |
- ut.ExpectEqual(t, nil, err) |
- })) |
- defer ts.Close() |
- |
- status, err := GetJSON(fast, http.DefaultClient, ts.URL, nil) |
- ut.AssertEqual(t, errors.New("unexpected Content-Type, expected \"application/json; charset=utf-8\", got \"text/plain; charset=utf-8\""), err) |
- ut.AssertEqual(t, 200, status) |
-} |
- |
-func TestPostJSON(t *testing.T) { |
- // First call returns HTTP 500, second succeeds. |
- serverCalls := 0 |
- ts := httptest.NewServer(handlerJSON(t, func(body io.Reader) interface{} { |
- serverCalls++ |
- data := map[string]string{} |
- ut.ExpectEqual(t, nil, json.NewDecoder(body).Decode(&data)) |
- ut.ExpectEqual(t, map[string]string{"in": "all"}, data) |
- if serverCalls == 1 { |
- return nil |
- } |
- return map[string]string{"success": "yeah"} |
- })) |
- defer ts.Close() |
- |
- in := map[string]string{"in": "all"} |
- actual := map[string]string{} |
- status, err := PostJSON(fast, http.DefaultClient, ts.URL, in, &actual) |
- ut.AssertEqual(t, nil, err) |
- ut.AssertEqual(t, 200, status) |
- ut.AssertEqual(t, map[string]string{"success": "yeah"}, actual) |
- ut.AssertEqual(t, 2, serverCalls) |
-} |
- |
-// Private details. |
- |
-var fast = &retry.Config{ |
- MaxTries: 3, |
- SleepMax: 0, |
-} |
- |
-// slow is to be used when no retry should happen. The test will hang in that |
-// case. |
-var slow = &retry.Config{ |
- MaxTries: 3, |
- SleepMax: time.Hour, |
- SleepBase: time.Hour, |
-} |
- |
-type jsonAPI func(body io.Reader) interface{} |
- |
-// handlerJSON converts a jsonAPI http handler to a proper http.Handler. |
-func handlerJSON(t *testing.T, handler jsonAPI) http.Handler { |
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
- //ut.ExpectEqual(t, jsonContentType, r.Header.Get("Content-Type")) |
- defer r.Body.Close() |
- out := handler(r.Body) |
- if out == nil { |
- w.WriteHeader(500) |
- } else { |
- w.Header().Set("Content-Type", jsonContentType) |
- ut.ExpectEqual(t, nil, json.NewEncoder(w).Encode(out)) |
- } |
- }) |
-} |