Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(710)

Side by Side Diff: client/internal/lhttp/client_test.go

Issue 1846263002: Isolate: Use generators instead of seekers (Closed) Base URL: https://github.com/luci/luci-go@master
Patch Set: Tweaks from comments. Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698