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

Side by Side Diff: grpc/prpc/client_test.go

Issue 2360403002: pRPC: Retry on certain transient HTTP failures. (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « grpc/prpc/client.go ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The LUCI Authors. All rights reserved. 1 // Copyright 2016 The LUCI Authors. All rights reserved.
2 // Use of this source code is governed under the Apache License, Version 2.0 2 // Use of this source code is governed under the Apache License, Version 2.0
3 // that can be found in the LICENSE file. 3 // that can be found in the LICENSE file.
4 4
5 package prpc 5 package prpc
6 6
7 import ( 7 import (
8 "fmt" 8 "fmt"
9 "io/ioutil" 9 "io/ioutil"
10 "net/http" 10 "net/http"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 w.Header().Set("Content-Type", ContentTypePRPC) 61 w.Header().Set("Content-Type", ContentTypePRPC)
62 _, err = w.Write(buf) 62 _, err = w.Write(buf)
63 c.So(err, ShouldBeNil) 63 c.So(err, ShouldBeNil)
64 } 64 }
65 } 65 }
66 66
67 func doPanicHandler(w http.ResponseWriter, r *http.Request) { 67 func doPanicHandler(w http.ResponseWriter, r *http.Request) {
68 panic("test panic") 68 panic("test panic")
69 } 69 }
70 70
71 func transientErrors(count int, then http.Handler) http.HandlerFunc { 71 func transientErrors(count int, grpcHeader bool, then http.Handler) http.Handler Func {
72 return func(w http.ResponseWriter, r *http.Request) { 72 return func(w http.ResponseWriter, r *http.Request) {
73 if count > 0 { 73 if count > 0 {
74 count-- 74 count--
75 » » » w.Header().Set(HeaderGRPCCode, strconv.Itoa(int(codes.In ternal))) 75 » » » if grpcHeader {
76 » » » » w.Header().Set(HeaderGRPCCode, strconv.Itoa(int( codes.Internal)))
77 » » » }
76 w.WriteHeader(http.StatusInternalServerError) 78 w.WriteHeader(http.StatusInternalServerError)
77 fmt.Fprintln(w, "Server misbehaved") 79 fmt.Fprintln(w, "Server misbehaved")
78 return 80 return
79 } 81 }
80 then.ServeHTTP(w, r) 82 then.ServeHTTP(w, r)
81 } 83 }
82 } 84 }
83 85
84 func shouldHaveMessagesLike(actual interface{}, expected ...interface{}) string { 86 func shouldHaveMessagesLike(actual interface{}, expected ...interface{}) string {
85 log := actual.(*memlogger.MemLogger) 87 log := actual.(*memlogger.MemLogger)
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 Convey(`When the response returns a huge Content Length, returns "ErrResponseTooBig".`, func(c C) { 178 Convey(`When the response returns a huge Content Length, returns "ErrResponseTooBig".`, func(c C) {
177 client, server := setUp(sayHello(c)) 179 client, server := setUp(sayHello(c))
178 defer server.Close() 180 defer server.Close()
179 181
180 req.Name = "TOO BIG" 182 req.Name = "TOO BIG"
181 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res) 183 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res)
182 So(err, ShouldEqual, ErrResponseTooBig) 184 So(err, ShouldEqual, ErrResponseTooBig)
183 }) 185 })
184 186
185 Convey("HTTP 500 x2", func(c C) { 187 Convey("HTTP 500 x2", func(c C) {
186 » » » » client, server := setUp(transientErrors(2, sayHe llo(c))) 188 » » » » client, server := setUp(transientErrors(2, true, sayHello(c)))
187 defer server.Close() 189 defer server.Close()
188 190
189 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res) 191 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res)
190 So(err, ShouldBeNil) 192 So(err, ShouldBeNil)
191 So(res.Message, ShouldEqual, "Hello John") 193 So(res.Message, ShouldEqual, "Hello John")
192 194
193 So(log, shouldHaveMessagesLike, 195 So(log, shouldHaveMessagesLike,
194 expectedCallLogEntry(client), 196 expectedCallLogEntry(client),
195 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"}, 197 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
196 198
197 expectedCallLogEntry(client), 199 expectedCallLogEntry(client),
198 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"}, 200 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
199 201
200 expectedCallLogEntry(client), 202 expectedCallLogEntry(client),
201 ) 203 )
202 }) 204 })
203 205
204 Convey("HTTP 500 many", func(c C) { 206 Convey("HTTP 500 many", func(c C) {
205 » » » » client, server := setUp(transientErrors(10, sayH ello(c))) 207 » » » » client, server := setUp(transientErrors(10, true , sayHello(c)))
206 defer server.Close() 208 defer server.Close()
207 209
208 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res) 210 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res)
209 So(grpc.Code(err), ShouldEqual, codes.Internal) 211 So(grpc.Code(err), ShouldEqual, codes.Internal)
210 So(grpc.ErrorDesc(err), ShouldEqual, "Server mis behaved") 212 So(grpc.ErrorDesc(err), ShouldEqual, "Server mis behaved")
211 213
212 So(log, shouldHaveMessagesLike, 214 So(log, shouldHaveMessagesLike,
213 expectedCallLogEntry(client), 215 expectedCallLogEntry(client),
214 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"}, 216 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
215 217
216 expectedCallLogEntry(client), 218 expectedCallLogEntry(client),
217 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"}, 219 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
218 220
219 expectedCallLogEntry(client), 221 expectedCallLogEntry(client),
220 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"}, 222 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
221 223
222 expectedCallLogEntry(client), 224 expectedCallLogEntry(client),
223 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed permanently"}, 225 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed permanently"},
224 ) 226 )
225 }) 227 })
226 228
229 Convey("HTTP 500 without gRPC header", func(c C) {
230 client, server := setUp(transientErrors(10, fals e, sayHello(c)))
231 defer server.Close()
232
233 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res)
234 So(grpc.Code(err), ShouldEqual, codes.Unknown)
235
236 So(log, shouldHaveMessagesLike,
237 expectedCallLogEntry(client),
238 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
239
240 expectedCallLogEntry(client),
241 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
242
243 expectedCallLogEntry(client),
244 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed transiently. Will retry in 0"},
245
246 expectedCallLogEntry(client),
247 memlogger.LogEntry{Level: logging.Warnin g, Msg: "RPC failed permanently"},
248 )
249 })
250
227 Convey("Forbidden", func(c C) { 251 Convey("Forbidden", func(c C) {
228 client, server := setUp(func(w http.ResponseWrit er, r *http.Request) { 252 client, server := setUp(func(w http.ResponseWrit er, r *http.Request) {
229 w.Header().Set(HeaderGRPCCode, strconv.I toa(int(codes.PermissionDenied))) 253 w.Header().Set(HeaderGRPCCode, strconv.I toa(int(codes.PermissionDenied)))
230 w.WriteHeader(http.StatusForbidden) 254 w.WriteHeader(http.StatusForbidden)
231 fmt.Fprintln(w, "Access denied") 255 fmt.Fprintln(w, "Access denied")
232 }) 256 })
233 defer server.Close() 257 defer server.Close()
234 258
235 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res) 259 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res)
236 So(grpc.Code(err), ShouldEqual, codes.Permission Denied) 260 So(grpc.Code(err), ShouldEqual, codes.Permission Denied)
(...skipping 11 matching lines...) Expand all
248 w.WriteHeader(http.StatusBadRequest) 272 w.WriteHeader(http.StatusBadRequest)
249 }) 273 })
250 defer server.Close() 274 defer server.Close()
251 275
252 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res) 276 err := client.Call(ctx, "prpc.Greeter", "SayHell o", req, res)
253 So(grpc.Code(err), ShouldEqual, codes.Canceled) 277 So(grpc.Code(err), ShouldEqual, codes.Canceled)
254 }) 278 })
255 }) 279 })
256 }) 280 })
257 } 281 }
OLDNEW
« no previous file with comments | « grpc/prpc/client.go ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698