| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package lhttp | 5 package lhttp |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "bytes" | 8 "bytes" |
| 9 "encoding/json" | 9 "encoding/json" |
| 10 "errors" | 10 "errors" |
| 11 "fmt" | 11 "fmt" |
| 12 "io" | 12 "io" |
| 13 "io/ioutil" | 13 "io/ioutil" |
| 14 "net/http" | 14 "net/http" |
| 15 "net/http/httptest" | 15 "net/http/httptest" |
| 16 "testing" | 16 "testing" |
| 17 "time" | 17 "time" |
| 18 | 18 |
| 19 "github.com/luci/luci-go/client/internal/retry" | 19 "github.com/luci/luci-go/client/internal/retry" |
| 20 "github.com/maruel/ut" | 20 "github.com/maruel/ut" |
| 21 ) | 21 ) |
| 22 | 22 |
| 23 func httpReqGen(method, url string, body []byte) RequestGen { |
| 24 return func() (*http.Request, error) { |
| 25 var bodyReader io.Reader |
| 26 if body != nil { |
| 27 bodyReader = bytes.NewReader(body) |
| 28 } |
| 29 return http.NewRequest("GET", url, bodyReader) |
| 30 } |
| 31 } |
| 32 |
| 23 func TestNewRequestGET(t *testing.T) { | 33 func TestNewRequestGET(t *testing.T) { |
| 24 // First call returns HTTP 500, second succeeds. | 34 // First call returns HTTP 500, second succeeds. |
| 25 serverCalls := 0 | 35 serverCalls := 0 |
| 26 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r
*http.Request) { | 36 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r
*http.Request) { |
| 27 serverCalls++ | 37 serverCalls++ |
| 28 content, err := ioutil.ReadAll(r.Body) | 38 content, err := ioutil.ReadAll(r.Body) |
| 29 ut.ExpectEqual(t, nil, err) | 39 ut.ExpectEqual(t, nil, err) |
| 30 ut.ExpectEqual(t, []byte{}, content) | 40 ut.ExpectEqual(t, []byte{}, content) |
| 31 if serverCalls == 1 { | 41 if serverCalls == 1 { |
| 32 w.WriteHeader(500) | 42 w.WriteHeader(500) |
| 33 } else { | 43 } else { |
| 34 fmt.Fprintf(w, "Hello, client\n") | 44 fmt.Fprintf(w, "Hello, client\n") |
| 35 } | 45 } |
| 36 })) | 46 })) |
| 37 defer ts.Close() | 47 defer ts.Close() |
| 38 | 48 |
| 39 » httpReq, err := http.NewRequest("GET", ts.URL, nil) | 49 » httpReq := httpReqGen("GET", ts.URL, nil) |
| 40 » ut.AssertEqual(t, nil, err) | |
| 41 | 50 |
| 42 clientCalls := 0 | 51 clientCalls := 0 |
| 43 » clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *htt
p.Response) error { | 52 » clientReq := NewRequest(http.DefaultClient, httpReq, func(resp *http.Res
ponse) error { |
| 44 clientCalls++ | 53 clientCalls++ |
| 45 content, err := ioutil.ReadAll(resp.Body) | 54 content, err := ioutil.ReadAll(resp.Body) |
| 46 ut.AssertEqual(t, nil, err) | 55 ut.AssertEqual(t, nil, err) |
| 47 ut.AssertEqual(t, "Hello, client\n", string(content)) | 56 ut.AssertEqual(t, "Hello, client\n", string(content)) |
| 48 ut.AssertEqual(t, nil, resp.Body.Close()) | 57 ut.AssertEqual(t, nil, resp.Body.Close()) |
| 49 return nil | 58 return nil |
| 50 }) | 59 }) |
| 51 ut.AssertEqual(t, nil, err) | |
| 52 | 60 |
| 53 ut.AssertEqual(t, nil, fast.Do(clientReq)) | 61 ut.AssertEqual(t, nil, fast.Do(clientReq)) |
| 54 ut.AssertEqual(t, 200, clientReq.Status()) | 62 ut.AssertEqual(t, 200, clientReq.Status()) |
| 55 ut.AssertEqual(t, 2, serverCalls) | 63 ut.AssertEqual(t, 2, serverCalls) |
| 56 ut.AssertEqual(t, 1, clientCalls) | 64 ut.AssertEqual(t, 1, clientCalls) |
| 57 } | 65 } |
| 58 | 66 |
| 59 func TestNewRequestPOST(t *testing.T) { | 67 func TestNewRequestPOST(t *testing.T) { |
| 60 // First call returns HTTP 500, second succeeds. | 68 // First call returns HTTP 500, second succeeds. |
| 61 serverCalls := 0 | 69 serverCalls := 0 |
| 62 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r
*http.Request) { | 70 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r
*http.Request) { |
| 63 serverCalls++ | 71 serverCalls++ |
| 64 content, err := ioutil.ReadAll(r.Body) | 72 content, err := ioutil.ReadAll(r.Body) |
| 65 ut.ExpectEqual(t, nil, err) | 73 ut.ExpectEqual(t, nil, err) |
| 66 // The same data is sent twice. | 74 // The same data is sent twice. |
| 67 ut.ExpectEqual(t, "foo bar", string(content)) | 75 ut.ExpectEqual(t, "foo bar", string(content)) |
| 68 if serverCalls == 1 { | 76 if serverCalls == 1 { |
| 69 w.WriteHeader(500) | 77 w.WriteHeader(500) |
| 70 } else { | 78 } else { |
| 71 fmt.Fprintf(w, "Hello, client\n") | 79 fmt.Fprintf(w, "Hello, client\n") |
| 72 } | 80 } |
| 73 })) | 81 })) |
| 74 defer ts.Close() | 82 defer ts.Close() |
| 75 | 83 |
| 76 » httpReq, err := http.NewRequest("POST", ts.URL, newReader([]byte("foo ba
r"))) | 84 » httpReq := httpReqGen("POST", ts.URL, []byte("foo bar")) |
| 77 » ut.AssertEqual(t, nil, err) | |
| 78 | 85 |
| 79 clientCalls := 0 | 86 clientCalls := 0 |
| 80 » clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *htt
p.Response) error { | 87 » clientReq := NewRequest(http.DefaultClient, httpReq, func(resp *http.Res
ponse) error { |
| 81 clientCalls++ | 88 clientCalls++ |
| 82 content, err := ioutil.ReadAll(resp.Body) | 89 content, err := ioutil.ReadAll(resp.Body) |
| 83 ut.AssertEqual(t, nil, err) | 90 ut.AssertEqual(t, nil, err) |
| 84 ut.AssertEqual(t, "Hello, client\n", string(content)) | 91 ut.AssertEqual(t, "Hello, client\n", string(content)) |
| 85 ut.AssertEqual(t, nil, resp.Body.Close()) | 92 ut.AssertEqual(t, nil, resp.Body.Close()) |
| 86 return nil | 93 return nil |
| 87 }) | 94 }) |
| 88 ut.AssertEqual(t, nil, err) | |
| 89 | 95 |
| 90 ut.AssertEqual(t, nil, fast.Do(clientReq)) | 96 ut.AssertEqual(t, nil, fast.Do(clientReq)) |
| 91 ut.AssertEqual(t, 200, clientReq.Status()) | 97 ut.AssertEqual(t, 200, clientReq.Status()) |
| 92 ut.AssertEqual(t, 2, serverCalls) | 98 ut.AssertEqual(t, 2, serverCalls) |
| 93 ut.AssertEqual(t, 1, clientCalls) | 99 ut.AssertEqual(t, 1, clientCalls) |
| 94 } | 100 } |
| 95 | 101 |
| 96 func TestNewRequestNotSeeker(t *testing.T) { | |
| 97 // bytes.NewReader() doesn't implement io.Seeker. | |
| 98 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r
*http.Request) { | |
| 99 t.Fail() | |
| 100 })) | |
| 101 defer ts.Close() | |
| 102 httpReq, err := http.NewRequest("POST", ts.URL, bytes.NewReader([]byte("
foo bar"))) | |
| 103 ut.AssertEqual(t, nil, err) | |
| 104 | |
| 105 clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *htt
p.Response) error { | |
| 106 t.Fail() | |
| 107 return nil | |
| 108 }) | |
| 109 | |
| 110 ut.AssertEqual(t, nil, clientReq) | |
| 111 ut.AssertEqual(t, errors.New("req.Body must implement io.Seeker"), err) | |
| 112 } | |
| 113 | |
| 114 func TestNewRequestBadURL(t *testing.T) { | |
| 115 httpReq, err := http.NewRequest("GET", "invalid url", nil) | |
| 116 ut.AssertEqual(t, nil, err) | |
| 117 | |
| 118 clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *htt
p.Response) error { | |
| 119 t.Fail() | |
| 120 return nil | |
| 121 }) | |
| 122 ut.AssertEqual(t, errors.New("unsupported protocol scheme \"\""), err) | |
| 123 ut.AssertEqual(t, nil, clientReq) | |
| 124 } | |
| 125 | |
| 126 func TestNewRequestGETFail(t *testing.T) { | 102 func TestNewRequestGETFail(t *testing.T) { |
| 127 serverCalls := 0 | 103 serverCalls := 0 |
| 128 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r
*http.Request) { | 104 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r
*http.Request) { |
| 129 serverCalls++ | 105 serverCalls++ |
| 130 w.WriteHeader(500) | 106 w.WriteHeader(500) |
| 131 })) | 107 })) |
| 132 defer ts.Close() | 108 defer ts.Close() |
| 133 | 109 |
| 134 » httpReq, err := http.NewRequest("GET", ts.URL, nil) | 110 » httpReq := httpReqGen("GET", ts.URL, nil) |
| 135 » ut.AssertEqual(t, nil, err) | |
| 136 | 111 |
| 137 » clientReq, err := NewRequest(http.DefaultClient, httpReq, func(resp *htt
p.Response) error { | 112 » clientReq := NewRequest(http.DefaultClient, httpReq, func(resp *http.Res
ponse) error { |
| 138 t.Fail() | 113 t.Fail() |
| 139 return nil | 114 return nil |
| 140 }) | 115 }) |
| 141 | 116 |
| 142 ut.AssertEqual(t, retry.Error{errors.New("http request failed: Internal
Server Error (HTTP 500)")}, fast.Do(clientReq)) | 117 ut.AssertEqual(t, retry.Error{errors.New("http request failed: Internal
Server Error (HTTP 500)")}, fast.Do(clientReq)) |
| 143 ut.AssertEqual(t, 500, clientReq.Status()) | 118 ut.AssertEqual(t, 500, clientReq.Status()) |
| 144 ut.AssertEqual(t, fast.MaxTries, serverCalls) | 119 ut.AssertEqual(t, fast.MaxTries, serverCalls) |
| 145 } | 120 } |
| 146 | 121 |
| 147 func TestNewRequestJSONBadURL(t *testing.T) { | |
| 148 clientReq, err := NewRequestJSON(http.DefaultClient, "GET", "invalid url
", nil, nil, nil) | |
| 149 if err == nil { | |
| 150 t.Fatalf("NewRequestJSON should have failed, but it didn't") | |
| 151 } | |
| 152 ut.AssertEqual(t, nil, clientReq) | |
| 153 } | |
| 154 | |
| 155 func TestGetJSON(t *testing.T) { | 122 func TestGetJSON(t *testing.T) { |
| 156 // First call returns HTTP 500, second succeeds. | 123 // First call returns HTTP 500, second succeeds. |
| 157 serverCalls := 0 | 124 serverCalls := 0 |
| 158 ts := httptest.NewServer(handlerJSON(t, func(body io.Reader) interface{}
{ | 125 ts := httptest.NewServer(handlerJSON(t, func(body io.Reader) interface{}
{ |
| 159 serverCalls++ | 126 serverCalls++ |
| 160 content, err := ioutil.ReadAll(body) | 127 content, err := ioutil.ReadAll(body) |
| 161 ut.ExpectEqual(t, nil, err) | 128 ut.ExpectEqual(t, nil, err) |
| 162 ut.ExpectEqual(t, []byte{}, content) | 129 ut.ExpectEqual(t, []byte{}, content) |
| 163 if serverCalls == 1 { | 130 if serverCalls == 1 { |
| 164 return nil | 131 return nil |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 defer r.Body.Close() | 253 defer r.Body.Close() |
| 287 out := handler(r.Body) | 254 out := handler(r.Body) |
| 288 if out == nil { | 255 if out == nil { |
| 289 w.WriteHeader(500) | 256 w.WriteHeader(500) |
| 290 } else { | 257 } else { |
| 291 w.Header().Set("Content-Type", jsonContentType) | 258 w.Header().Set("Content-Type", jsonContentType) |
| 292 ut.ExpectEqual(t, nil, json.NewEncoder(w).Encode(out)) | 259 ut.ExpectEqual(t, nil, json.NewEncoder(w).Encode(out)) |
| 293 } | 260 } |
| 294 }) | 261 }) |
| 295 } | 262 } |
| OLD | NEW |