| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 prpc | 5 package prpc |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "bytes" | 8 "bytes" |
| 9 "net/http" | 9 "net/http" |
| 10 "net/http/httptest" | 10 "net/http/httptest" |
| 11 "strconv" |
| 11 "testing" | 12 "testing" |
| 12 | 13 |
| 13 "github.com/julienschmidt/httprouter" | 14 "github.com/julienschmidt/httprouter" |
| 14 "golang.org/x/net/context" | 15 "golang.org/x/net/context" |
| 15 "google.golang.org/grpc" | 16 "google.golang.org/grpc" |
| 16 "google.golang.org/grpc/codes" | 17 "google.golang.org/grpc/codes" |
| 17 | 18 |
| 19 "github.com/luci/luci-go/common/prpc" |
| 18 "github.com/luci/luci-go/server/middleware" | 20 "github.com/luci/luci-go/server/middleware" |
| 19 | 21 |
| 20 . "github.com/luci/luci-go/common/testing/assertions" | 22 . "github.com/luci/luci-go/common/testing/assertions" |
| 21 . "github.com/smartystreets/goconvey/convey" | 23 . "github.com/smartystreets/goconvey/convey" |
| 22 ) | 24 ) |
| 23 | 25 |
| 24 type greeterService struct{} | 26 type greeterService struct{} |
| 25 | 27 |
| 26 func (s *greeterService) SayHello(c context.Context, req *HelloRequest) (*HelloR
eply, error) { | 28 func (s *greeterService) SayHello(c context.Context, req *HelloRequest) (*HelloR
eply, error) { |
| 27 if req.Name == "" { | 29 if req.Name == "" { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 "prpc.Greeter", | 61 "prpc.Greeter", |
| 60 }) | 62 }) |
| 61 }) | 63 }) |
| 62 | 64 |
| 63 Convey("Handlers", func() { | 65 Convey("Handlers", func() { |
| 64 c := context.Background() | 66 c := context.Background() |
| 65 r := httprouter.New() | 67 r := httprouter.New() |
| 66 server.InstallHandlers(r, middleware.TestingBase(c)) | 68 server.InstallHandlers(r, middleware.TestingBase(c)) |
| 67 res := httptest.NewRecorder() | 69 res := httptest.NewRecorder() |
| 68 hiMsg := bytes.NewBufferString(`name: "Lucy"`) | 70 hiMsg := bytes.NewBufferString(`name: "Lucy"`) |
| 69 » » » req, err := http.NewRequest("POST", "http://localhost/pr
pc/prpc.Greeter/SayHello", hiMsg) | 71 » » » req, err := http.NewRequest("POST", "/prpc/prpc.Greeter/
SayHello", hiMsg) |
| 70 So(err, ShouldBeNil) | 72 So(err, ShouldBeNil) |
| 71 req.Header.Set("Content-Type", mtPRPCText) | 73 req.Header.Set("Content-Type", mtPRPCText) |
| 72 | 74 |
| 75 invalidArgument := strconv.Itoa(int(codes.InvalidArgumen
t)) |
| 76 unimplemented := strconv.Itoa(int(codes.Unimplemented)) |
| 77 |
| 73 Convey("Works", func() { | 78 Convey("Works", func() { |
| 74 req.Header.Set("Accept", mtPRPCText) | 79 req.Header.Set("Accept", mtPRPCText) |
| 75 r.ServeHTTP(res, req) | 80 r.ServeHTTP(res, req) |
| 76 So(res.Code, ShouldEqual, http.StatusOK) | 81 So(res.Code, ShouldEqual, http.StatusOK) |
| 82 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, "0") |
| 77 So(res.Body.String(), ShouldEqual, "message: \"H
ello Lucy\"\n") | 83 So(res.Body.String(), ShouldEqual, "message: \"H
ello Lucy\"\n") |
| 78 }) | 84 }) |
| 79 | 85 |
| 80 Convey("Invalid Accept header", func() { | 86 Convey("Invalid Accept header", func() { |
| 81 req.Header.Set("Accept", "blah") | 87 req.Header.Set("Accept", "blah") |
| 82 r.ServeHTTP(res, req) | 88 r.ServeHTTP(res, req) |
| 83 So(res.Code, ShouldEqual, http.StatusNotAcceptab
le) | 89 So(res.Code, ShouldEqual, http.StatusNotAcceptab
le) |
| 90 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, invalidArgument) |
| 84 }) | 91 }) |
| 85 | 92 |
| 86 Convey("Invalid header", func() { | 93 Convey("Invalid header", func() { |
| 87 req.Header.Set("X-Bin", "zzz") | 94 req.Header.Set("X-Bin", "zzz") |
| 88 r.ServeHTTP(res, req) | 95 r.ServeHTTP(res, req) |
| 89 So(res.Code, ShouldEqual, http.StatusBadRequest) | 96 So(res.Code, ShouldEqual, http.StatusBadRequest) |
| 97 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, invalidArgument) |
| 90 }) | 98 }) |
| 91 | 99 |
| 92 Convey("Malformed request message", func() { | 100 Convey("Malformed request message", func() { |
| 93 hiMsg.WriteString("\nblah") | 101 hiMsg.WriteString("\nblah") |
| 94 r.ServeHTTP(res, req) | 102 r.ServeHTTP(res, req) |
| 95 So(res.Code, ShouldEqual, http.StatusBadRequest) | 103 So(res.Code, ShouldEqual, http.StatusBadRequest) |
| 104 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, invalidArgument) |
| 96 }) | 105 }) |
| 97 | 106 |
| 98 Convey("Invalid request message", func() { | 107 Convey("Invalid request message", func() { |
| 99 hiMsg.Reset() | 108 hiMsg.Reset() |
| 100 r.ServeHTTP(res, req) | 109 r.ServeHTTP(res, req) |
| 101 So(res.Code, ShouldEqual, http.StatusBadRequest) | 110 So(res.Code, ShouldEqual, http.StatusBadRequest) |
| 111 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, invalidArgument) |
| 102 So(res.Body.String(), ShouldEqual, "Name unspeci
fied\n") | 112 So(res.Body.String(), ShouldEqual, "Name unspeci
fied\n") |
| 103 }) | 113 }) |
| 114 |
| 115 Convey("HTTP GET", func() { |
| 116 req.Method = "GET" |
| 117 r.ServeHTTP(res, req) |
| 118 So(res.Code, ShouldEqual, http.StatusMethodNotAl
lowed) |
| 119 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, unimplemented) |
| 120 }) |
| 121 |
| 122 Convey("no such service", func() { |
| 123 req.URL.Path = "/prpc/xxx/SayHello" |
| 124 r.ServeHTTP(res, req) |
| 125 So(res.Code, ShouldEqual, http.StatusNotImplemen
ted) |
| 126 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, unimplemented) |
| 127 }) |
| 128 Convey("no such method", func() { |
| 129 req.URL.Path = "/prpc/prpc.Greeter/xxx" |
| 130 r.ServeHTTP(res, req) |
| 131 So(res.Code, ShouldEqual, http.StatusNotImplemen
ted) |
| 132 So(res.Header().Get(prpc.HeaderGRPCCode), Should
Equal, unimplemented) |
| 133 }) |
| 104 }) | 134 }) |
| 105 }) | 135 }) |
| 106 } | 136 } |
| OLD | NEW |