| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |