Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 

7349 rader
220 KiB

  1. /*
  2. *
  3. * Copyright 2014 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. //go:generate protoc --go_out=plugins=grpc:. codec_perf/perf.proto
  19. //go:generate protoc --go_out=plugins=grpc:. grpc_testing/test.proto
  20. package test
  21. import (
  22. "bufio"
  23. "bytes"
  24. "context"
  25. "crypto/tls"
  26. "errors"
  27. "flag"
  28. "fmt"
  29. "io"
  30. "math"
  31. "net"
  32. "net/http"
  33. "os"
  34. "reflect"
  35. "runtime"
  36. "strings"
  37. "sync"
  38. "sync/atomic"
  39. "syscall"
  40. "testing"
  41. "time"
  42. "github.com/golang/protobuf/proto"
  43. anypb "github.com/golang/protobuf/ptypes/any"
  44. "golang.org/x/net/http2"
  45. "golang.org/x/net/http2/hpack"
  46. spb "google.golang.org/genproto/googleapis/rpc/status"
  47. "google.golang.org/grpc"
  48. "google.golang.org/grpc/balancer/roundrobin"
  49. "google.golang.org/grpc/codes"
  50. "google.golang.org/grpc/connectivity"
  51. "google.golang.org/grpc/credentials"
  52. "google.golang.org/grpc/encoding"
  53. _ "google.golang.org/grpc/encoding/gzip"
  54. _ "google.golang.org/grpc/grpclog/glogger"
  55. "google.golang.org/grpc/health"
  56. healthgrpc "google.golang.org/grpc/health/grpc_health_v1"
  57. healthpb "google.golang.org/grpc/health/grpc_health_v1"
  58. "google.golang.org/grpc/internal/channelz"
  59. "google.golang.org/grpc/internal/grpcsync"
  60. "google.golang.org/grpc/internal/grpctest"
  61. "google.golang.org/grpc/internal/leakcheck"
  62. "google.golang.org/grpc/internal/testutils"
  63. "google.golang.org/grpc/internal/transport"
  64. "google.golang.org/grpc/metadata"
  65. "google.golang.org/grpc/peer"
  66. "google.golang.org/grpc/resolver"
  67. "google.golang.org/grpc/resolver/manual"
  68. _ "google.golang.org/grpc/resolver/passthrough"
  69. "google.golang.org/grpc/stats"
  70. "google.golang.org/grpc/status"
  71. "google.golang.org/grpc/tap"
  72. testpb "google.golang.org/grpc/test/grpc_testing"
  73. "google.golang.org/grpc/testdata"
  74. )
  75. func init() {
  76. channelz.TurnOn()
  77. }
  78. type s struct{}
  79. var lcFailed uint32
  80. type errorer struct {
  81. t *testing.T
  82. }
  83. func (e errorer) Errorf(format string, args ...interface{}) {
  84. atomic.StoreUint32(&lcFailed, 1)
  85. e.t.Errorf(format, args...)
  86. }
  87. func (s) Teardown(t *testing.T) {
  88. if atomic.LoadUint32(&lcFailed) == 1 {
  89. return
  90. }
  91. leakcheck.Check(errorer{t: t})
  92. if atomic.LoadUint32(&lcFailed) == 1 {
  93. t.Log("Leak check disabled for future tests")
  94. }
  95. }
  96. func Test(t *testing.T) {
  97. grpctest.RunSubTests(t, s{})
  98. }
  99. var (
  100. // For headers:
  101. testMetadata = metadata.MD{
  102. "key1": []string{"value1"},
  103. "key2": []string{"value2"},
  104. "key3-bin": []string{"binvalue1", string([]byte{1, 2, 3})},
  105. }
  106. testMetadata2 = metadata.MD{
  107. "key1": []string{"value12"},
  108. "key2": []string{"value22"},
  109. }
  110. // For trailers:
  111. testTrailerMetadata = metadata.MD{
  112. "tkey1": []string{"trailerValue1"},
  113. "tkey2": []string{"trailerValue2"},
  114. "tkey3-bin": []string{"trailerbinvalue1", string([]byte{3, 2, 1})},
  115. }
  116. testTrailerMetadata2 = metadata.MD{
  117. "tkey1": []string{"trailerValue12"},
  118. "tkey2": []string{"trailerValue22"},
  119. }
  120. // capital "Key" is illegal in HTTP/2.
  121. malformedHTTP2Metadata = metadata.MD{
  122. "Key": []string{"foo"},
  123. }
  124. testAppUA = "myApp1/1.0 myApp2/0.9"
  125. failAppUA = "fail-this-RPC"
  126. detailedError = status.ErrorProto(&spb.Status{
  127. Code: int32(codes.DataLoss),
  128. Message: "error for testing: " + failAppUA,
  129. Details: []*anypb.Any{{
  130. TypeUrl: "url",
  131. Value: []byte{6, 0, 0, 6, 1, 3},
  132. }},
  133. })
  134. )
  135. var raceMode bool // set by race.go in race mode
  136. type testServer struct {
  137. security string // indicate the authentication protocol used by this server.
  138. earlyFail bool // whether to error out the execution of a service handler prematurely.
  139. setAndSendHeader bool // whether to call setHeader and sendHeader.
  140. setHeaderOnly bool // whether to only call setHeader, not sendHeader.
  141. multipleSetTrailer bool // whether to call setTrailer multiple times.
  142. unaryCallSleepTime time.Duration
  143. }
  144. func (s *testServer) EmptyCall(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  145. if md, ok := metadata.FromIncomingContext(ctx); ok {
  146. // For testing purpose, returns an error if user-agent is failAppUA.
  147. // To test that client gets the correct error.
  148. if ua, ok := md["user-agent"]; !ok || strings.HasPrefix(ua[0], failAppUA) {
  149. return nil, detailedError
  150. }
  151. var str []string
  152. for _, entry := range md["user-agent"] {
  153. str = append(str, "ua", entry)
  154. }
  155. grpc.SendHeader(ctx, metadata.Pairs(str...))
  156. }
  157. return new(testpb.Empty), nil
  158. }
  159. func newPayload(t testpb.PayloadType, size int32) (*testpb.Payload, error) {
  160. if size < 0 {
  161. return nil, fmt.Errorf("requested a response with invalid length %d", size)
  162. }
  163. body := make([]byte, size)
  164. switch t {
  165. case testpb.PayloadType_COMPRESSABLE:
  166. case testpb.PayloadType_UNCOMPRESSABLE:
  167. return nil, fmt.Errorf("PayloadType UNCOMPRESSABLE is not supported")
  168. default:
  169. return nil, fmt.Errorf("unsupported payload type: %d", t)
  170. }
  171. return &testpb.Payload{
  172. Type: t,
  173. Body: body,
  174. }, nil
  175. }
  176. func (s *testServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  177. md, ok := metadata.FromIncomingContext(ctx)
  178. if ok {
  179. if _, exists := md[":authority"]; !exists {
  180. return nil, status.Errorf(codes.DataLoss, "expected an :authority metadata: %v", md)
  181. }
  182. if s.setAndSendHeader {
  183. if err := grpc.SetHeader(ctx, md); err != nil {
  184. return nil, status.Errorf(status.Code(err), "grpc.SetHeader(_, %v) = %v, want <nil>", md, err)
  185. }
  186. if err := grpc.SendHeader(ctx, testMetadata2); err != nil {
  187. return nil, status.Errorf(status.Code(err), "grpc.SendHeader(_, %v) = %v, want <nil>", testMetadata2, err)
  188. }
  189. } else if s.setHeaderOnly {
  190. if err := grpc.SetHeader(ctx, md); err != nil {
  191. return nil, status.Errorf(status.Code(err), "grpc.SetHeader(_, %v) = %v, want <nil>", md, err)
  192. }
  193. if err := grpc.SetHeader(ctx, testMetadata2); err != nil {
  194. return nil, status.Errorf(status.Code(err), "grpc.SetHeader(_, %v) = %v, want <nil>", testMetadata2, err)
  195. }
  196. } else {
  197. if err := grpc.SendHeader(ctx, md); err != nil {
  198. return nil, status.Errorf(status.Code(err), "grpc.SendHeader(_, %v) = %v, want <nil>", md, err)
  199. }
  200. }
  201. if err := grpc.SetTrailer(ctx, testTrailerMetadata); err != nil {
  202. return nil, status.Errorf(status.Code(err), "grpc.SetTrailer(_, %v) = %v, want <nil>", testTrailerMetadata, err)
  203. }
  204. if s.multipleSetTrailer {
  205. if err := grpc.SetTrailer(ctx, testTrailerMetadata2); err != nil {
  206. return nil, status.Errorf(status.Code(err), "grpc.SetTrailer(_, %v) = %v, want <nil>", testTrailerMetadata2, err)
  207. }
  208. }
  209. }
  210. pr, ok := peer.FromContext(ctx)
  211. if !ok {
  212. return nil, status.Error(codes.DataLoss, "failed to get peer from ctx")
  213. }
  214. if pr.Addr == net.Addr(nil) {
  215. return nil, status.Error(codes.DataLoss, "failed to get peer address")
  216. }
  217. if s.security != "" {
  218. // Check Auth info
  219. var authType, serverName string
  220. switch info := pr.AuthInfo.(type) {
  221. case credentials.TLSInfo:
  222. authType = info.AuthType()
  223. serverName = info.State.ServerName
  224. default:
  225. return nil, status.Error(codes.Unauthenticated, "Unknown AuthInfo type")
  226. }
  227. if authType != s.security {
  228. return nil, status.Errorf(codes.Unauthenticated, "Wrong auth type: got %q, want %q", authType, s.security)
  229. }
  230. if serverName != "x.test.youtube.com" {
  231. return nil, status.Errorf(codes.Unauthenticated, "Unknown server name %q", serverName)
  232. }
  233. }
  234. // Simulate some service delay.
  235. time.Sleep(s.unaryCallSleepTime)
  236. payload, err := newPayload(in.GetResponseType(), in.GetResponseSize())
  237. if err != nil {
  238. return nil, err
  239. }
  240. return &testpb.SimpleResponse{
  241. Payload: payload,
  242. }, nil
  243. }
  244. func (s *testServer) StreamingOutputCall(args *testpb.StreamingOutputCallRequest, stream testpb.TestService_StreamingOutputCallServer) error {
  245. if md, ok := metadata.FromIncomingContext(stream.Context()); ok {
  246. if _, exists := md[":authority"]; !exists {
  247. return status.Errorf(codes.DataLoss, "expected an :authority metadata: %v", md)
  248. }
  249. // For testing purpose, returns an error if user-agent is failAppUA.
  250. // To test that client gets the correct error.
  251. if ua, ok := md["user-agent"]; !ok || strings.HasPrefix(ua[0], failAppUA) {
  252. return status.Error(codes.DataLoss, "error for testing: "+failAppUA)
  253. }
  254. }
  255. cs := args.GetResponseParameters()
  256. for _, c := range cs {
  257. if us := c.GetIntervalUs(); us > 0 {
  258. time.Sleep(time.Duration(us) * time.Microsecond)
  259. }
  260. payload, err := newPayload(args.GetResponseType(), c.GetSize())
  261. if err != nil {
  262. return err
  263. }
  264. if err := stream.Send(&testpb.StreamingOutputCallResponse{
  265. Payload: payload,
  266. }); err != nil {
  267. return err
  268. }
  269. }
  270. return nil
  271. }
  272. func (s *testServer) StreamingInputCall(stream testpb.TestService_StreamingInputCallServer) error {
  273. var sum int
  274. for {
  275. in, err := stream.Recv()
  276. if err == io.EOF {
  277. return stream.SendAndClose(&testpb.StreamingInputCallResponse{
  278. AggregatedPayloadSize: int32(sum),
  279. })
  280. }
  281. if err != nil {
  282. return err
  283. }
  284. p := in.GetPayload().GetBody()
  285. sum += len(p)
  286. if s.earlyFail {
  287. return status.Error(codes.NotFound, "not found")
  288. }
  289. }
  290. }
  291. func (s *testServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallServer) error {
  292. md, ok := metadata.FromIncomingContext(stream.Context())
  293. if ok {
  294. if s.setAndSendHeader {
  295. if err := stream.SetHeader(md); err != nil {
  296. return status.Errorf(status.Code(err), "%v.SetHeader(_, %v) = %v, want <nil>", stream, md, err)
  297. }
  298. if err := stream.SendHeader(testMetadata2); err != nil {
  299. return status.Errorf(status.Code(err), "%v.SendHeader(_, %v) = %v, want <nil>", stream, testMetadata2, err)
  300. }
  301. } else if s.setHeaderOnly {
  302. if err := stream.SetHeader(md); err != nil {
  303. return status.Errorf(status.Code(err), "%v.SetHeader(_, %v) = %v, want <nil>", stream, md, err)
  304. }
  305. if err := stream.SetHeader(testMetadata2); err != nil {
  306. return status.Errorf(status.Code(err), "%v.SetHeader(_, %v) = %v, want <nil>", stream, testMetadata2, err)
  307. }
  308. } else {
  309. if err := stream.SendHeader(md); err != nil {
  310. return status.Errorf(status.Code(err), "%v.SendHeader(%v) = %v, want %v", stream, md, err, nil)
  311. }
  312. }
  313. stream.SetTrailer(testTrailerMetadata)
  314. if s.multipleSetTrailer {
  315. stream.SetTrailer(testTrailerMetadata2)
  316. }
  317. }
  318. for {
  319. in, err := stream.Recv()
  320. if err == io.EOF {
  321. // read done.
  322. return nil
  323. }
  324. if err != nil {
  325. // to facilitate testSvrWriteStatusEarlyWrite
  326. if status.Code(err) == codes.ResourceExhausted {
  327. return status.Errorf(codes.Internal, "fake error for test testSvrWriteStatusEarlyWrite. true error: %s", err.Error())
  328. }
  329. return err
  330. }
  331. cs := in.GetResponseParameters()
  332. for _, c := range cs {
  333. if us := c.GetIntervalUs(); us > 0 {
  334. time.Sleep(time.Duration(us) * time.Microsecond)
  335. }
  336. payload, err := newPayload(in.GetResponseType(), c.GetSize())
  337. if err != nil {
  338. return err
  339. }
  340. if err := stream.Send(&testpb.StreamingOutputCallResponse{
  341. Payload: payload,
  342. }); err != nil {
  343. // to facilitate testSvrWriteStatusEarlyWrite
  344. if status.Code(err) == codes.ResourceExhausted {
  345. return status.Errorf(codes.Internal, "fake error for test testSvrWriteStatusEarlyWrite. true error: %s", err.Error())
  346. }
  347. return err
  348. }
  349. }
  350. }
  351. }
  352. func (s *testServer) HalfDuplexCall(stream testpb.TestService_HalfDuplexCallServer) error {
  353. var msgBuf []*testpb.StreamingOutputCallRequest
  354. for {
  355. in, err := stream.Recv()
  356. if err == io.EOF {
  357. // read done.
  358. break
  359. }
  360. if err != nil {
  361. return err
  362. }
  363. msgBuf = append(msgBuf, in)
  364. }
  365. for _, m := range msgBuf {
  366. cs := m.GetResponseParameters()
  367. for _, c := range cs {
  368. if us := c.GetIntervalUs(); us > 0 {
  369. time.Sleep(time.Duration(us) * time.Microsecond)
  370. }
  371. payload, err := newPayload(m.GetResponseType(), c.GetSize())
  372. if err != nil {
  373. return err
  374. }
  375. if err := stream.Send(&testpb.StreamingOutputCallResponse{
  376. Payload: payload,
  377. }); err != nil {
  378. return err
  379. }
  380. }
  381. }
  382. return nil
  383. }
  384. type env struct {
  385. name string
  386. network string // The type of network such as tcp, unix, etc.
  387. security string // The security protocol such as TLS, SSH, etc.
  388. httpHandler bool // whether to use the http.Handler ServerTransport; requires TLS
  389. balancer string // One of "round_robin", "pick_first", "v1", or "".
  390. customDialer func(string, string, time.Duration) (net.Conn, error)
  391. }
  392. func (e env) runnable() bool {
  393. if runtime.GOOS == "windows" && e.network == "unix" {
  394. return false
  395. }
  396. return true
  397. }
  398. func (e env) dialer(addr string, timeout time.Duration) (net.Conn, error) {
  399. if e.customDialer != nil {
  400. return e.customDialer(e.network, addr, timeout)
  401. }
  402. return net.DialTimeout(e.network, addr, timeout)
  403. }
  404. var (
  405. tcpClearEnv = env{name: "tcp-clear-v1-balancer", network: "tcp", balancer: "v1"}
  406. tcpTLSEnv = env{name: "tcp-tls-v1-balancer", network: "tcp", security: "tls", balancer: "v1"}
  407. tcpClearRREnv = env{name: "tcp-clear", network: "tcp", balancer: "round_robin"}
  408. tcpTLSRREnv = env{name: "tcp-tls", network: "tcp", security: "tls", balancer: "round_robin"}
  409. handlerEnv = env{name: "handler-tls", network: "tcp", security: "tls", httpHandler: true, balancer: "round_robin"}
  410. noBalancerEnv = env{name: "no-balancer", network: "tcp", security: "tls"}
  411. allEnv = []env{tcpClearEnv, tcpTLSEnv, tcpClearRREnv, tcpTLSRREnv, handlerEnv, noBalancerEnv}
  412. )
  413. var onlyEnv = flag.String("only_env", "", "If non-empty, one of 'tcp-clear', 'tcp-tls', 'unix-clear', 'unix-tls', or 'handler-tls' to only run the tests for that environment. Empty means all.")
  414. func listTestEnv() (envs []env) {
  415. if *onlyEnv != "" {
  416. for _, e := range allEnv {
  417. if e.name == *onlyEnv {
  418. if !e.runnable() {
  419. panic(fmt.Sprintf("--only_env environment %q does not run on %s", *onlyEnv, runtime.GOOS))
  420. }
  421. return []env{e}
  422. }
  423. }
  424. panic(fmt.Sprintf("invalid --only_env value %q", *onlyEnv))
  425. }
  426. for _, e := range allEnv {
  427. if e.runnable() {
  428. envs = append(envs, e)
  429. }
  430. }
  431. return envs
  432. }
  433. // test is an end-to-end test. It should be created with the newTest
  434. // func, modified as needed, and then started with its startServer method.
  435. // It should be cleaned up with the tearDown method.
  436. type test struct {
  437. t *testing.T
  438. e env
  439. ctx context.Context // valid for life of test, before tearDown
  440. cancel context.CancelFunc
  441. // Configurable knobs, after newTest returns:
  442. testServer testpb.TestServiceServer // nil means none
  443. healthServer *health.Server // nil means disabled
  444. maxStream uint32
  445. tapHandle tap.ServerInHandle
  446. maxMsgSize *int
  447. maxClientReceiveMsgSize *int
  448. maxClientSendMsgSize *int
  449. maxServerReceiveMsgSize *int
  450. maxServerSendMsgSize *int
  451. maxClientHeaderListSize *uint32
  452. maxServerHeaderListSize *uint32
  453. userAgent string
  454. // clientCompression and serverCompression are set to test the deprecated API
  455. // WithCompressor and WithDecompressor.
  456. clientCompression bool
  457. serverCompression bool
  458. // clientUseCompression is set to test the new compressor registration API UseCompressor.
  459. clientUseCompression bool
  460. // clientNopCompression is set to create a compressor whose type is not supported.
  461. clientNopCompression bool
  462. unaryClientInt grpc.UnaryClientInterceptor
  463. streamClientInt grpc.StreamClientInterceptor
  464. unaryServerInt grpc.UnaryServerInterceptor
  465. streamServerInt grpc.StreamServerInterceptor
  466. unknownHandler grpc.StreamHandler
  467. sc <-chan grpc.ServiceConfig
  468. customCodec encoding.Codec
  469. serverInitialWindowSize int32
  470. serverInitialConnWindowSize int32
  471. clientInitialWindowSize int32
  472. clientInitialConnWindowSize int32
  473. perRPCCreds credentials.PerRPCCredentials
  474. customDialOptions []grpc.DialOption
  475. customServerOptions []grpc.ServerOption
  476. resolverScheme string
  477. // All test dialing is blocking by default. Set this to true if dial
  478. // should be non-blocking.
  479. nonBlockingDial bool
  480. // srv and srvAddr are set once startServer is called.
  481. srv stopper
  482. srvAddr string
  483. // srvs and srvAddrs are set once startServers is called.
  484. srvs []*grpc.Server
  485. srvAddrs []string
  486. cc *grpc.ClientConn // nil until requested via clientConn
  487. restoreLogs func() // nil unless declareLogNoise is used
  488. }
  489. type stopper interface {
  490. Stop()
  491. GracefulStop()
  492. }
  493. func (te *test) tearDown() {
  494. if te.cancel != nil {
  495. te.cancel()
  496. te.cancel = nil
  497. }
  498. if te.cc != nil {
  499. te.cc.Close()
  500. te.cc = nil
  501. }
  502. if te.restoreLogs != nil {
  503. te.restoreLogs()
  504. te.restoreLogs = nil
  505. }
  506. if te.srv != nil {
  507. te.srv.Stop()
  508. }
  509. if len(te.srvs) != 0 {
  510. for _, s := range te.srvs {
  511. s.Stop()
  512. }
  513. }
  514. }
  515. // newTest returns a new test using the provided testing.T and
  516. // environment. It is returned with default values. Tests should
  517. // modify it before calling its startServer and clientConn methods.
  518. func newTest(t *testing.T, e env) *test {
  519. te := &test{
  520. t: t,
  521. e: e,
  522. maxStream: math.MaxUint32,
  523. }
  524. te.ctx, te.cancel = context.WithCancel(context.Background())
  525. return te
  526. }
  527. func (te *test) listenAndServe(ts testpb.TestServiceServer, listen func(network, address string) (net.Listener, error)) net.Listener {
  528. te.testServer = ts
  529. te.t.Logf("Running test in %s environment...", te.e.name)
  530. sopts := []grpc.ServerOption{grpc.MaxConcurrentStreams(te.maxStream)}
  531. if te.maxMsgSize != nil {
  532. sopts = append(sopts, grpc.MaxMsgSize(*te.maxMsgSize))
  533. }
  534. if te.maxServerReceiveMsgSize != nil {
  535. sopts = append(sopts, grpc.MaxRecvMsgSize(*te.maxServerReceiveMsgSize))
  536. }
  537. if te.maxServerSendMsgSize != nil {
  538. sopts = append(sopts, grpc.MaxSendMsgSize(*te.maxServerSendMsgSize))
  539. }
  540. if te.maxServerHeaderListSize != nil {
  541. sopts = append(sopts, grpc.MaxHeaderListSize(*te.maxServerHeaderListSize))
  542. }
  543. if te.tapHandle != nil {
  544. sopts = append(sopts, grpc.InTapHandle(te.tapHandle))
  545. }
  546. if te.serverCompression {
  547. sopts = append(sopts,
  548. grpc.RPCCompressor(grpc.NewGZIPCompressor()),
  549. grpc.RPCDecompressor(grpc.NewGZIPDecompressor()),
  550. )
  551. }
  552. if te.unaryServerInt != nil {
  553. sopts = append(sopts, grpc.UnaryInterceptor(te.unaryServerInt))
  554. }
  555. if te.streamServerInt != nil {
  556. sopts = append(sopts, grpc.StreamInterceptor(te.streamServerInt))
  557. }
  558. if te.unknownHandler != nil {
  559. sopts = append(sopts, grpc.UnknownServiceHandler(te.unknownHandler))
  560. }
  561. if te.serverInitialWindowSize > 0 {
  562. sopts = append(sopts, grpc.InitialWindowSize(te.serverInitialWindowSize))
  563. }
  564. if te.serverInitialConnWindowSize > 0 {
  565. sopts = append(sopts, grpc.InitialConnWindowSize(te.serverInitialConnWindowSize))
  566. }
  567. la := "localhost:0"
  568. switch te.e.network {
  569. case "unix":
  570. la = "/tmp/testsock" + fmt.Sprintf("%d", time.Now().UnixNano())
  571. syscall.Unlink(la)
  572. }
  573. lis, err := listen(te.e.network, la)
  574. if err != nil {
  575. te.t.Fatalf("Failed to listen: %v", err)
  576. }
  577. switch te.e.security {
  578. case "tls":
  579. creds, err := credentials.NewServerTLSFromFile(testdata.Path("server1.pem"), testdata.Path("server1.key"))
  580. if err != nil {
  581. te.t.Fatalf("Failed to generate credentials %v", err)
  582. }
  583. sopts = append(sopts, grpc.Creds(creds))
  584. case "clientTimeoutCreds":
  585. sopts = append(sopts, grpc.Creds(&clientTimeoutCreds{}))
  586. }
  587. sopts = append(sopts, te.customServerOptions...)
  588. s := grpc.NewServer(sopts...)
  589. te.srv = s
  590. if te.healthServer != nil {
  591. healthgrpc.RegisterHealthServer(s, te.healthServer)
  592. }
  593. if te.testServer != nil {
  594. testpb.RegisterTestServiceServer(s, te.testServer)
  595. }
  596. addr := la
  597. switch te.e.network {
  598. case "unix":
  599. default:
  600. _, port, err := net.SplitHostPort(lis.Addr().String())
  601. if err != nil {
  602. te.t.Fatalf("Failed to parse listener address: %v", err)
  603. }
  604. addr = "localhost:" + port
  605. }
  606. te.srvAddr = addr
  607. if te.e.httpHandler {
  608. if te.e.security != "tls" {
  609. te.t.Fatalf("unsupported environment settings")
  610. }
  611. cert, err := tls.LoadX509KeyPair(testdata.Path("server1.pem"), testdata.Path("server1.key"))
  612. if err != nil {
  613. te.t.Fatal("Error creating TLS certificate: ", err)
  614. }
  615. hs := &http.Server{
  616. Handler: s,
  617. }
  618. err = http2.ConfigureServer(hs, &http2.Server{
  619. MaxConcurrentStreams: te.maxStream,
  620. })
  621. if err != nil {
  622. te.t.Fatal("error starting http2 server: ", err)
  623. }
  624. hs.TLSConfig.Certificates = []tls.Certificate{cert}
  625. tlsListener := tls.NewListener(lis, hs.TLSConfig)
  626. whs := &wrapHS{Listener: tlsListener, s: hs, conns: make(map[net.Conn]bool)}
  627. te.srv = whs
  628. go hs.Serve(whs)
  629. return lis
  630. }
  631. go s.Serve(lis)
  632. return lis
  633. }
  634. // TODO: delete wrapHS and wrapConn when Go1.6 and Go1.7 support are gone and
  635. // call s.Close and s.Shutdown instead.
  636. type wrapHS struct {
  637. sync.Mutex
  638. net.Listener
  639. s *http.Server
  640. conns map[net.Conn]bool
  641. }
  642. func (w *wrapHS) Accept() (net.Conn, error) {
  643. c, err := w.Listener.Accept()
  644. if err != nil {
  645. return nil, err
  646. }
  647. w.Lock()
  648. if w.conns == nil {
  649. w.Unlock()
  650. c.Close()
  651. return nil, errors.New("connection after listener closed")
  652. }
  653. w.conns[&wrapConn{Conn: c, hs: w}] = true
  654. w.Unlock()
  655. return c, nil
  656. }
  657. func (w *wrapHS) Stop() {
  658. w.Listener.Close()
  659. w.Lock()
  660. conns := w.conns
  661. w.conns = nil
  662. w.Unlock()
  663. for c := range conns {
  664. c.Close()
  665. }
  666. }
  667. // Poll for now..
  668. func (w *wrapHS) GracefulStop() {
  669. w.Listener.Close()
  670. for {
  671. w.Lock()
  672. l := len(w.conns)
  673. w.Unlock()
  674. if l == 0 {
  675. return
  676. }
  677. time.Sleep(50 * time.Millisecond)
  678. }
  679. }
  680. type wrapConn struct {
  681. net.Conn
  682. hs *wrapHS
  683. }
  684. func (w *wrapConn) Close() error {
  685. w.hs.Lock()
  686. delete(w.hs.conns, w.Conn)
  687. w.hs.Unlock()
  688. return w.Conn.Close()
  689. }
  690. func (te *test) startServerWithConnControl(ts testpb.TestServiceServer) *listenerWrapper {
  691. l := te.listenAndServe(ts, listenWithConnControl)
  692. return l.(*listenerWrapper)
  693. }
  694. // startServer starts a gRPC server listening. Callers should defer a
  695. // call to te.tearDown to clean up.
  696. func (te *test) startServer(ts testpb.TestServiceServer) {
  697. te.listenAndServe(ts, net.Listen)
  698. }
  699. type nopCompressor struct {
  700. grpc.Compressor
  701. }
  702. // NewNopCompressor creates a compressor to test the case that type is not supported.
  703. func NewNopCompressor() grpc.Compressor {
  704. return &nopCompressor{grpc.NewGZIPCompressor()}
  705. }
  706. func (c *nopCompressor) Type() string {
  707. return "nop"
  708. }
  709. type nopDecompressor struct {
  710. grpc.Decompressor
  711. }
  712. // NewNopDecompressor creates a decompressor to test the case that type is not supported.
  713. func NewNopDecompressor() grpc.Decompressor {
  714. return &nopDecompressor{grpc.NewGZIPDecompressor()}
  715. }
  716. func (d *nopDecompressor) Type() string {
  717. return "nop"
  718. }
  719. func (te *test) configDial(opts ...grpc.DialOption) ([]grpc.DialOption, string) {
  720. opts = append(opts, grpc.WithDialer(te.e.dialer), grpc.WithUserAgent(te.userAgent))
  721. if te.sc != nil {
  722. opts = append(opts, grpc.WithServiceConfig(te.sc))
  723. }
  724. if te.clientCompression {
  725. opts = append(opts,
  726. grpc.WithCompressor(grpc.NewGZIPCompressor()),
  727. grpc.WithDecompressor(grpc.NewGZIPDecompressor()),
  728. )
  729. }
  730. if te.clientUseCompression {
  731. opts = append(opts, grpc.WithDefaultCallOptions(grpc.UseCompressor("gzip")))
  732. }
  733. if te.clientNopCompression {
  734. opts = append(opts,
  735. grpc.WithCompressor(NewNopCompressor()),
  736. grpc.WithDecompressor(NewNopDecompressor()),
  737. )
  738. }
  739. if te.unaryClientInt != nil {
  740. opts = append(opts, grpc.WithUnaryInterceptor(te.unaryClientInt))
  741. }
  742. if te.streamClientInt != nil {
  743. opts = append(opts, grpc.WithStreamInterceptor(te.streamClientInt))
  744. }
  745. if te.maxMsgSize != nil {
  746. opts = append(opts, grpc.WithMaxMsgSize(*te.maxMsgSize))
  747. }
  748. if te.maxClientReceiveMsgSize != nil {
  749. opts = append(opts, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(*te.maxClientReceiveMsgSize)))
  750. }
  751. if te.maxClientSendMsgSize != nil {
  752. opts = append(opts, grpc.WithDefaultCallOptions(grpc.MaxCallSendMsgSize(*te.maxClientSendMsgSize)))
  753. }
  754. if te.maxClientHeaderListSize != nil {
  755. opts = append(opts, grpc.WithMaxHeaderListSize(*te.maxClientHeaderListSize))
  756. }
  757. switch te.e.security {
  758. case "tls":
  759. creds, err := credentials.NewClientTLSFromFile(testdata.Path("ca.pem"), "x.test.youtube.com")
  760. if err != nil {
  761. te.t.Fatalf("Failed to load credentials: %v", err)
  762. }
  763. opts = append(opts, grpc.WithTransportCredentials(creds))
  764. case "clientTimeoutCreds":
  765. opts = append(opts, grpc.WithTransportCredentials(&clientTimeoutCreds{}))
  766. case "empty":
  767. // Don't add any transport creds option.
  768. default:
  769. opts = append(opts, grpc.WithInsecure())
  770. }
  771. // TODO(bar) switch balancer case "pick_first".
  772. var scheme string
  773. if te.resolverScheme == "" {
  774. scheme = "passthrough:///"
  775. } else {
  776. scheme = te.resolverScheme + ":///"
  777. }
  778. switch te.e.balancer {
  779. case "v1":
  780. opts = append(opts, grpc.WithBalancer(grpc.RoundRobin(nil)))
  781. case "round_robin":
  782. opts = append(opts, grpc.WithBalancerName(roundrobin.Name))
  783. }
  784. if te.clientInitialWindowSize > 0 {
  785. opts = append(opts, grpc.WithInitialWindowSize(te.clientInitialWindowSize))
  786. }
  787. if te.clientInitialConnWindowSize > 0 {
  788. opts = append(opts, grpc.WithInitialConnWindowSize(te.clientInitialConnWindowSize))
  789. }
  790. if te.perRPCCreds != nil {
  791. opts = append(opts, grpc.WithPerRPCCredentials(te.perRPCCreds))
  792. }
  793. if te.customCodec != nil {
  794. opts = append(opts, grpc.WithDefaultCallOptions(grpc.ForceCodec(te.customCodec)))
  795. }
  796. if !te.nonBlockingDial && te.srvAddr != "" {
  797. // Only do a blocking dial if server is up.
  798. opts = append(opts, grpc.WithBlock())
  799. }
  800. if te.srvAddr == "" {
  801. te.srvAddr = "client.side.only.test"
  802. }
  803. opts = append(opts, te.customDialOptions...)
  804. return opts, scheme
  805. }
  806. func (te *test) clientConnWithConnControl() (*grpc.ClientConn, *dialerWrapper) {
  807. if te.cc != nil {
  808. return te.cc, nil
  809. }
  810. opts, scheme := te.configDial()
  811. dw := &dialerWrapper{}
  812. // overwrite the dialer before
  813. opts = append(opts, grpc.WithDialer(dw.dialer))
  814. var err error
  815. te.cc, err = grpc.Dial(scheme+te.srvAddr, opts...)
  816. if err != nil {
  817. te.t.Fatalf("Dial(%q) = %v", scheme+te.srvAddr, err)
  818. }
  819. return te.cc, dw
  820. }
  821. func (te *test) clientConn(opts ...grpc.DialOption) *grpc.ClientConn {
  822. if te.cc != nil {
  823. return te.cc
  824. }
  825. var scheme string
  826. opts, scheme = te.configDial(opts...)
  827. var err error
  828. te.cc, err = grpc.Dial(scheme+te.srvAddr, opts...)
  829. if err != nil {
  830. te.t.Fatalf("Dial(%q) = %v", scheme+te.srvAddr, err)
  831. }
  832. return te.cc
  833. }
  834. func (te *test) declareLogNoise(phrases ...string) {
  835. te.restoreLogs = declareLogNoise(te.t, phrases...)
  836. }
  837. func (te *test) withServerTester(fn func(st *serverTester)) {
  838. c, err := te.e.dialer(te.srvAddr, 10*time.Second)
  839. if err != nil {
  840. te.t.Fatal(err)
  841. }
  842. defer c.Close()
  843. if te.e.security == "tls" {
  844. c = tls.Client(c, &tls.Config{
  845. InsecureSkipVerify: true,
  846. NextProtos: []string{http2.NextProtoTLS},
  847. })
  848. }
  849. st := newServerTesterFromConn(te.t, c)
  850. st.greet()
  851. fn(st)
  852. }
  853. type lazyConn struct {
  854. net.Conn
  855. beLazy int32
  856. }
  857. func (l *lazyConn) Write(b []byte) (int, error) {
  858. if atomic.LoadInt32(&(l.beLazy)) == 1 {
  859. time.Sleep(time.Second)
  860. }
  861. return l.Conn.Write(b)
  862. }
  863. func (s) TestContextDeadlineNotIgnored(t *testing.T) {
  864. e := noBalancerEnv
  865. var lc *lazyConn
  866. e.customDialer = func(network, addr string, timeout time.Duration) (net.Conn, error) {
  867. conn, err := net.DialTimeout(network, addr, timeout)
  868. if err != nil {
  869. return nil, err
  870. }
  871. lc = &lazyConn{Conn: conn}
  872. return lc, nil
  873. }
  874. te := newTest(t, e)
  875. te.startServer(&testServer{security: e.security})
  876. defer te.tearDown()
  877. cc := te.clientConn()
  878. tc := testpb.NewTestServiceClient(cc)
  879. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  880. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  881. }
  882. atomic.StoreInt32(&(lc.beLazy), 1)
  883. ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
  884. defer cancel()
  885. t1 := time.Now()
  886. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); status.Code(err) != codes.DeadlineExceeded {
  887. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, context.DeadlineExceeded", err)
  888. }
  889. if time.Since(t1) > 2*time.Second {
  890. t.Fatalf("TestService/EmptyCall(_, _) ran over the deadline")
  891. }
  892. }
  893. func (s) TestTimeoutOnDeadServer(t *testing.T) {
  894. for _, e := range listTestEnv() {
  895. testTimeoutOnDeadServer(t, e)
  896. }
  897. }
  898. func testTimeoutOnDeadServer(t *testing.T, e env) {
  899. te := newTest(t, e)
  900. te.userAgent = testAppUA
  901. te.declareLogNoise(
  902. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  903. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  904. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  905. )
  906. te.startServer(&testServer{security: e.security})
  907. defer te.tearDown()
  908. cc := te.clientConn()
  909. tc := testpb.NewTestServiceClient(cc)
  910. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  911. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  912. }
  913. te.srv.Stop()
  914. // Wait for the client to notice the connection is gone.
  915. ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
  916. state := cc.GetState()
  917. for ; state == connectivity.Ready && cc.WaitForStateChange(ctx, state); state = cc.GetState() {
  918. }
  919. cancel()
  920. if state == connectivity.Ready {
  921. t.Fatalf("Timed out waiting for non-ready state")
  922. }
  923. ctx, cancel = context.WithTimeout(context.Background(), time.Millisecond)
  924. _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true))
  925. cancel()
  926. if e.balancer != "" && status.Code(err) != codes.DeadlineExceeded {
  927. // If e.balancer == nil, the ac will stop reconnecting because the dialer returns non-temp error,
  928. // the error will be an internal error.
  929. t.Fatalf("TestService/EmptyCall(%v, _) = _, %v, want _, error code: %s", ctx, err, codes.DeadlineExceeded)
  930. }
  931. awaitNewConnLogOutput()
  932. }
  933. func (s) TestServerGracefulStopIdempotent(t *testing.T) {
  934. for _, e := range listTestEnv() {
  935. if e.name == "handler-tls" {
  936. continue
  937. }
  938. testServerGracefulStopIdempotent(t, e)
  939. }
  940. }
  941. func testServerGracefulStopIdempotent(t *testing.T, e env) {
  942. te := newTest(t, e)
  943. te.userAgent = testAppUA
  944. te.startServer(&testServer{security: e.security})
  945. defer te.tearDown()
  946. for i := 0; i < 3; i++ {
  947. te.srv.GracefulStop()
  948. }
  949. }
  950. func (s) TestServerGoAway(t *testing.T) {
  951. for _, e := range listTestEnv() {
  952. if e.name == "handler-tls" {
  953. continue
  954. }
  955. testServerGoAway(t, e)
  956. }
  957. }
  958. func testServerGoAway(t *testing.T, e env) {
  959. te := newTest(t, e)
  960. te.userAgent = testAppUA
  961. te.startServer(&testServer{security: e.security})
  962. defer te.tearDown()
  963. cc := te.clientConn()
  964. tc := testpb.NewTestServiceClient(cc)
  965. // Finish an RPC to make sure the connection is good.
  966. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  967. defer cancel()
  968. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  969. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  970. }
  971. ch := make(chan struct{})
  972. go func() {
  973. te.srv.GracefulStop()
  974. close(ch)
  975. }()
  976. // Loop until the server side GoAway signal is propagated to the client.
  977. for {
  978. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
  979. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); err != nil && status.Code(err) != codes.DeadlineExceeded {
  980. cancel()
  981. break
  982. }
  983. cancel()
  984. }
  985. // A new RPC should fail.
  986. ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
  987. defer cancel()
  988. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); status.Code(err) != codes.Unavailable && status.Code(err) != codes.Internal {
  989. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s or %s", err, codes.Unavailable, codes.Internal)
  990. }
  991. <-ch
  992. awaitNewConnLogOutput()
  993. }
  994. func (s) TestServerGoAwayPendingRPC(t *testing.T) {
  995. for _, e := range listTestEnv() {
  996. if e.name == "handler-tls" {
  997. continue
  998. }
  999. testServerGoAwayPendingRPC(t, e)
  1000. }
  1001. }
  1002. func testServerGoAwayPendingRPC(t *testing.T, e env) {
  1003. te := newTest(t, e)
  1004. te.userAgent = testAppUA
  1005. te.declareLogNoise(
  1006. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1007. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1008. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1009. )
  1010. te.startServer(&testServer{security: e.security})
  1011. defer te.tearDown()
  1012. cc := te.clientConn()
  1013. tc := testpb.NewTestServiceClient(cc)
  1014. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  1015. stream, err := tc.FullDuplexCall(ctx, grpc.WaitForReady(true))
  1016. if err != nil {
  1017. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1018. }
  1019. // Finish an RPC to make sure the connection is good.
  1020. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  1021. t.Fatalf("%v.EmptyCall(_, _, _) = _, %v, want _, <nil>", tc, err)
  1022. }
  1023. ch := make(chan struct{})
  1024. go func() {
  1025. te.srv.GracefulStop()
  1026. close(ch)
  1027. }()
  1028. // Loop until the server side GoAway signal is propagated to the client.
  1029. start := time.Now()
  1030. errored := false
  1031. for time.Since(start) < time.Second {
  1032. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
  1033. _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true))
  1034. cancel()
  1035. if err != nil {
  1036. errored = true
  1037. break
  1038. }
  1039. }
  1040. if !errored {
  1041. t.Fatalf("GoAway never received by client")
  1042. }
  1043. respParam := []*testpb.ResponseParameters{{Size: 1}}
  1044. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(100))
  1045. if err != nil {
  1046. t.Fatal(err)
  1047. }
  1048. req := &testpb.StreamingOutputCallRequest{
  1049. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1050. ResponseParameters: respParam,
  1051. Payload: payload,
  1052. }
  1053. // The existing RPC should be still good to proceed.
  1054. if err := stream.Send(req); err != nil {
  1055. t.Fatalf("%v.Send(_) = %v, want <nil>", stream, err)
  1056. }
  1057. if _, err := stream.Recv(); err != nil {
  1058. t.Fatalf("%v.Recv() = _, %v, want _, <nil>", stream, err)
  1059. }
  1060. // The RPC will run until canceled.
  1061. cancel()
  1062. <-ch
  1063. awaitNewConnLogOutput()
  1064. }
  1065. func (s) TestServerMultipleGoAwayPendingRPC(t *testing.T) {
  1066. for _, e := range listTestEnv() {
  1067. if e.name == "handler-tls" {
  1068. continue
  1069. }
  1070. testServerMultipleGoAwayPendingRPC(t, e)
  1071. }
  1072. }
  1073. func testServerMultipleGoAwayPendingRPC(t *testing.T, e env) {
  1074. te := newTest(t, e)
  1075. te.userAgent = testAppUA
  1076. te.declareLogNoise(
  1077. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1078. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1079. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1080. )
  1081. te.startServer(&testServer{security: e.security})
  1082. defer te.tearDown()
  1083. cc := te.clientConn()
  1084. tc := testpb.NewTestServiceClient(cc)
  1085. ctx, cancel := context.WithCancel(context.Background())
  1086. stream, err := tc.FullDuplexCall(ctx, grpc.WaitForReady(true))
  1087. if err != nil {
  1088. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1089. }
  1090. // Finish an RPC to make sure the connection is good.
  1091. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  1092. t.Fatalf("%v.EmptyCall(_, _, _) = _, %v, want _, <nil>", tc, err)
  1093. }
  1094. ch1 := make(chan struct{})
  1095. go func() {
  1096. te.srv.GracefulStop()
  1097. close(ch1)
  1098. }()
  1099. ch2 := make(chan struct{})
  1100. go func() {
  1101. te.srv.GracefulStop()
  1102. close(ch2)
  1103. }()
  1104. // Loop until the server side GoAway signal is propagated to the client.
  1105. for {
  1106. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
  1107. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  1108. cancel()
  1109. break
  1110. }
  1111. cancel()
  1112. }
  1113. select {
  1114. case <-ch1:
  1115. t.Fatal("GracefulStop() terminated early")
  1116. case <-ch2:
  1117. t.Fatal("GracefulStop() terminated early")
  1118. default:
  1119. }
  1120. respParam := []*testpb.ResponseParameters{
  1121. {
  1122. Size: 1,
  1123. },
  1124. }
  1125. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(100))
  1126. if err != nil {
  1127. t.Fatal(err)
  1128. }
  1129. req := &testpb.StreamingOutputCallRequest{
  1130. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1131. ResponseParameters: respParam,
  1132. Payload: payload,
  1133. }
  1134. // The existing RPC should be still good to proceed.
  1135. if err := stream.Send(req); err != nil {
  1136. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  1137. }
  1138. if _, err := stream.Recv(); err != nil {
  1139. t.Fatalf("%v.Recv() = _, %v, want _, <nil>", stream, err)
  1140. }
  1141. if err := stream.CloseSend(); err != nil {
  1142. t.Fatalf("%v.CloseSend() = %v, want <nil>", stream, err)
  1143. }
  1144. <-ch1
  1145. <-ch2
  1146. cancel()
  1147. awaitNewConnLogOutput()
  1148. }
  1149. func (s) TestConcurrentClientConnCloseAndServerGoAway(t *testing.T) {
  1150. for _, e := range listTestEnv() {
  1151. if e.name == "handler-tls" {
  1152. continue
  1153. }
  1154. testConcurrentClientConnCloseAndServerGoAway(t, e)
  1155. }
  1156. }
  1157. func testConcurrentClientConnCloseAndServerGoAway(t *testing.T, e env) {
  1158. te := newTest(t, e)
  1159. te.userAgent = testAppUA
  1160. te.declareLogNoise(
  1161. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1162. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1163. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1164. )
  1165. te.startServer(&testServer{security: e.security})
  1166. defer te.tearDown()
  1167. cc := te.clientConn()
  1168. tc := testpb.NewTestServiceClient(cc)
  1169. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  1170. t.Fatalf("%v.EmptyCall(_, _, _) = _, %v, want _, <nil>", tc, err)
  1171. }
  1172. ch := make(chan struct{})
  1173. // Close ClientConn and Server concurrently.
  1174. go func() {
  1175. te.srv.GracefulStop()
  1176. close(ch)
  1177. }()
  1178. go func() {
  1179. cc.Close()
  1180. }()
  1181. <-ch
  1182. }
  1183. func (s) TestConcurrentServerStopAndGoAway(t *testing.T) {
  1184. for _, e := range listTestEnv() {
  1185. if e.name == "handler-tls" {
  1186. continue
  1187. }
  1188. testConcurrentServerStopAndGoAway(t, e)
  1189. }
  1190. }
  1191. func testConcurrentServerStopAndGoAway(t *testing.T, e env) {
  1192. te := newTest(t, e)
  1193. te.userAgent = testAppUA
  1194. te.declareLogNoise(
  1195. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1196. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1197. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1198. )
  1199. te.startServer(&testServer{security: e.security})
  1200. defer te.tearDown()
  1201. cc := te.clientConn()
  1202. tc := testpb.NewTestServiceClient(cc)
  1203. stream, err := tc.FullDuplexCall(context.Background(), grpc.WaitForReady(true))
  1204. if err != nil {
  1205. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1206. }
  1207. // Finish an RPC to make sure the connection is good.
  1208. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  1209. t.Fatalf("%v.EmptyCall(_, _, _) = _, %v, want _, <nil>", tc, err)
  1210. }
  1211. ch := make(chan struct{})
  1212. go func() {
  1213. te.srv.GracefulStop()
  1214. close(ch)
  1215. }()
  1216. // Loop until the server side GoAway signal is propagated to the client.
  1217. for {
  1218. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
  1219. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  1220. cancel()
  1221. break
  1222. }
  1223. cancel()
  1224. }
  1225. // Stop the server and close all the connections.
  1226. te.srv.Stop()
  1227. respParam := []*testpb.ResponseParameters{
  1228. {
  1229. Size: 1,
  1230. },
  1231. }
  1232. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(100))
  1233. if err != nil {
  1234. t.Fatal(err)
  1235. }
  1236. req := &testpb.StreamingOutputCallRequest{
  1237. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1238. ResponseParameters: respParam,
  1239. Payload: payload,
  1240. }
  1241. sendStart := time.Now()
  1242. for {
  1243. if err := stream.Send(req); err == io.EOF {
  1244. // stream.Send should eventually send io.EOF
  1245. break
  1246. } else if err != nil {
  1247. // Send should never return a transport-level error.
  1248. t.Fatalf("stream.Send(%v) = %v; want <nil or io.EOF>", req, err)
  1249. }
  1250. if time.Since(sendStart) > 2*time.Second {
  1251. t.Fatalf("stream.Send(_) did not return io.EOF after 2s")
  1252. }
  1253. time.Sleep(time.Millisecond)
  1254. }
  1255. if _, err := stream.Recv(); err == nil || err == io.EOF {
  1256. t.Fatalf("%v.Recv() = _, %v, want _, <non-nil, non-EOF>", stream, err)
  1257. }
  1258. <-ch
  1259. awaitNewConnLogOutput()
  1260. }
  1261. func (s) TestClientConnCloseAfterGoAwayWithActiveStream(t *testing.T) {
  1262. for _, e := range listTestEnv() {
  1263. if e.name == "handler-tls" {
  1264. continue
  1265. }
  1266. testClientConnCloseAfterGoAwayWithActiveStream(t, e)
  1267. }
  1268. }
  1269. func testClientConnCloseAfterGoAwayWithActiveStream(t *testing.T, e env) {
  1270. te := newTest(t, e)
  1271. te.startServer(&testServer{security: e.security})
  1272. defer te.tearDown()
  1273. cc := te.clientConn()
  1274. tc := testpb.NewTestServiceClient(cc)
  1275. ctx, cancel := context.WithCancel(context.Background())
  1276. defer cancel()
  1277. if _, err := tc.FullDuplexCall(ctx); err != nil {
  1278. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want _, <nil>", tc, err)
  1279. }
  1280. done := make(chan struct{})
  1281. go func() {
  1282. te.srv.GracefulStop()
  1283. close(done)
  1284. }()
  1285. time.Sleep(50 * time.Millisecond)
  1286. cc.Close()
  1287. timeout := time.NewTimer(time.Second)
  1288. select {
  1289. case <-done:
  1290. case <-timeout.C:
  1291. t.Fatalf("Test timed-out.")
  1292. }
  1293. }
  1294. func (s) TestFailFast(t *testing.T) {
  1295. for _, e := range listTestEnv() {
  1296. testFailFast(t, e)
  1297. }
  1298. }
  1299. func testFailFast(t *testing.T, e env) {
  1300. te := newTest(t, e)
  1301. te.userAgent = testAppUA
  1302. te.declareLogNoise(
  1303. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1304. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1305. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1306. )
  1307. te.startServer(&testServer{security: e.security})
  1308. defer te.tearDown()
  1309. cc := te.clientConn()
  1310. tc := testpb.NewTestServiceClient(cc)
  1311. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  1312. defer cancel()
  1313. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  1314. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  1315. }
  1316. // Stop the server and tear down all the existing connections.
  1317. te.srv.Stop()
  1318. // Loop until the server teardown is propagated to the client.
  1319. for {
  1320. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  1321. _, err := tc.EmptyCall(ctx, &testpb.Empty{})
  1322. cancel()
  1323. if status.Code(err) == codes.Unavailable {
  1324. break
  1325. }
  1326. t.Logf("%v.EmptyCall(_, _) = _, %v", tc, err)
  1327. time.Sleep(10 * time.Millisecond)
  1328. }
  1329. // The client keeps reconnecting and ongoing fail-fast RPCs should fail with code.Unavailable.
  1330. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.Unavailable {
  1331. t.Fatalf("TestService/EmptyCall(_, _, _) = _, %v, want _, error code: %s", err, codes.Unavailable)
  1332. }
  1333. if _, err := tc.StreamingInputCall(context.Background()); status.Code(err) != codes.Unavailable {
  1334. t.Fatalf("TestService/StreamingInputCall(_) = _, %v, want _, error code: %s", err, codes.Unavailable)
  1335. }
  1336. awaitNewConnLogOutput()
  1337. }
  1338. func testServiceConfigSetup(t *testing.T, e env) *test {
  1339. te := newTest(t, e)
  1340. te.userAgent = testAppUA
  1341. te.declareLogNoise(
  1342. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1343. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1344. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1345. "Failed to dial : context canceled; please retry.",
  1346. )
  1347. return te
  1348. }
  1349. func newBool(b bool) (a *bool) {
  1350. return &b
  1351. }
  1352. func newInt(b int) (a *int) {
  1353. return &b
  1354. }
  1355. func newDuration(b time.Duration) (a *time.Duration) {
  1356. a = new(time.Duration)
  1357. *a = b
  1358. return
  1359. }
  1360. func (s) TestGetMethodConfig(t *testing.T) {
  1361. te := testServiceConfigSetup(t, tcpClearRREnv)
  1362. defer te.tearDown()
  1363. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  1364. defer rcleanup()
  1365. te.resolverScheme = r.Scheme()
  1366. cc := te.clientConn()
  1367. r.NewAddress([]resolver.Address{{Addr: te.srvAddr}})
  1368. r.NewServiceConfig(`{
  1369. "methodConfig": [
  1370. {
  1371. "name": [
  1372. {
  1373. "service": "grpc.testing.TestService",
  1374. "method": "EmptyCall"
  1375. }
  1376. ],
  1377. "waitForReady": true,
  1378. "timeout": ".001s"
  1379. },
  1380. {
  1381. "name": [
  1382. {
  1383. "service": "grpc.testing.TestService"
  1384. }
  1385. ],
  1386. "waitForReady": false
  1387. }
  1388. ]
  1389. }`)
  1390. tc := testpb.NewTestServiceClient(cc)
  1391. // Make sure service config has been processed by grpc.
  1392. for {
  1393. if cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall").WaitForReady != nil {
  1394. break
  1395. }
  1396. time.Sleep(time.Millisecond)
  1397. }
  1398. // The following RPCs are expected to become non-fail-fast ones with 1ms deadline.
  1399. var err error
  1400. if _, err = tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.DeadlineExceeded {
  1401. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  1402. }
  1403. r.NewServiceConfig(`{
  1404. "methodConfig": [
  1405. {
  1406. "name": [
  1407. {
  1408. "service": "grpc.testing.TestService",
  1409. "method": "UnaryCall"
  1410. }
  1411. ],
  1412. "waitForReady": true,
  1413. "timeout": ".001s"
  1414. },
  1415. {
  1416. "name": [
  1417. {
  1418. "service": "grpc.testing.TestService"
  1419. }
  1420. ],
  1421. "waitForReady": false
  1422. }
  1423. ]
  1424. }`)
  1425. // Make sure service config has been processed by grpc.
  1426. for {
  1427. if mc := cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall"); mc.WaitForReady != nil && !*mc.WaitForReady {
  1428. break
  1429. }
  1430. time.Sleep(time.Millisecond)
  1431. }
  1432. // The following RPCs are expected to become fail-fast.
  1433. if _, err = tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.Unavailable {
  1434. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.Unavailable)
  1435. }
  1436. }
  1437. func (s) TestServiceConfigWaitForReady(t *testing.T) {
  1438. te := testServiceConfigSetup(t, tcpClearRREnv)
  1439. defer te.tearDown()
  1440. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  1441. defer rcleanup()
  1442. // Case1: Client API set failfast to be false, and service config set wait_for_ready to be false, Client API should win, and the rpc will wait until deadline exceeds.
  1443. te.resolverScheme = r.Scheme()
  1444. cc := te.clientConn()
  1445. r.NewAddress([]resolver.Address{{Addr: te.srvAddr}})
  1446. r.NewServiceConfig(`{
  1447. "methodConfig": [
  1448. {
  1449. "name": [
  1450. {
  1451. "service": "grpc.testing.TestService",
  1452. "method": "EmptyCall"
  1453. },
  1454. {
  1455. "service": "grpc.testing.TestService",
  1456. "method": "FullDuplexCall"
  1457. }
  1458. ],
  1459. "waitForReady": false,
  1460. "timeout": ".001s"
  1461. }
  1462. ]
  1463. }`)
  1464. tc := testpb.NewTestServiceClient(cc)
  1465. // Make sure service config has been processed by grpc.
  1466. for {
  1467. if cc.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall").WaitForReady != nil {
  1468. break
  1469. }
  1470. time.Sleep(time.Millisecond)
  1471. }
  1472. // The following RPCs are expected to become non-fail-fast ones with 1ms deadline.
  1473. var err error
  1474. if _, err = tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  1475. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  1476. }
  1477. if _, err := tc.FullDuplexCall(context.Background(), grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  1478. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  1479. }
  1480. // Generate a service config update.
  1481. // Case2:Client API set failfast to be false, and service config set wait_for_ready to be true, and the rpc will wait until deadline exceeds.
  1482. r.NewServiceConfig(`{
  1483. "methodConfig": [
  1484. {
  1485. "name": [
  1486. {
  1487. "service": "grpc.testing.TestService",
  1488. "method": "EmptyCall"
  1489. },
  1490. {
  1491. "service": "grpc.testing.TestService",
  1492. "method": "FullDuplexCall"
  1493. }
  1494. ],
  1495. "waitForReady": true,
  1496. "timeout": ".001s"
  1497. }
  1498. ]
  1499. }`)
  1500. // Wait for the new service config to take effect.
  1501. for {
  1502. if mc := cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall"); mc.WaitForReady != nil && *mc.WaitForReady {
  1503. break
  1504. }
  1505. time.Sleep(time.Millisecond)
  1506. }
  1507. // The following RPCs are expected to become non-fail-fast ones with 1ms deadline.
  1508. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.DeadlineExceeded {
  1509. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  1510. }
  1511. if _, err := tc.FullDuplexCall(context.Background()); status.Code(err) != codes.DeadlineExceeded {
  1512. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  1513. }
  1514. }
  1515. func (s) TestServiceConfigTimeout(t *testing.T) {
  1516. te := testServiceConfigSetup(t, tcpClearRREnv)
  1517. defer te.tearDown()
  1518. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  1519. defer rcleanup()
  1520. // Case1: Client API sets timeout to be 1ns and ServiceConfig sets timeout to be 1hr. Timeout should be 1ns (min of 1ns and 1hr) and the rpc will wait until deadline exceeds.
  1521. te.resolverScheme = r.Scheme()
  1522. cc := te.clientConn()
  1523. r.NewAddress([]resolver.Address{{Addr: te.srvAddr}})
  1524. r.NewServiceConfig(`{
  1525. "methodConfig": [
  1526. {
  1527. "name": [
  1528. {
  1529. "service": "grpc.testing.TestService",
  1530. "method": "EmptyCall"
  1531. },
  1532. {
  1533. "service": "grpc.testing.TestService",
  1534. "method": "FullDuplexCall"
  1535. }
  1536. ],
  1537. "waitForReady": true,
  1538. "timeout": "3600s"
  1539. }
  1540. ]
  1541. }`)
  1542. tc := testpb.NewTestServiceClient(cc)
  1543. // Make sure service config has been processed by grpc.
  1544. for {
  1545. if cc.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall").Timeout != nil {
  1546. break
  1547. }
  1548. time.Sleep(time.Millisecond)
  1549. }
  1550. // The following RPCs are expected to become non-fail-fast ones with 1ns deadline.
  1551. var err error
  1552. ctx, cancel := context.WithTimeout(context.Background(), time.Nanosecond)
  1553. if _, err = tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  1554. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  1555. }
  1556. cancel()
  1557. ctx, cancel = context.WithTimeout(context.Background(), time.Nanosecond)
  1558. if _, err = tc.FullDuplexCall(ctx, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  1559. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  1560. }
  1561. cancel()
  1562. // Generate a service config update.
  1563. // Case2: Client API sets timeout to be 1hr and ServiceConfig sets timeout to be 1ns. Timeout should be 1ns (min of 1ns and 1hr) and the rpc will wait until deadline exceeds.
  1564. r.NewServiceConfig(`{
  1565. "methodConfig": [
  1566. {
  1567. "name": [
  1568. {
  1569. "service": "grpc.testing.TestService",
  1570. "method": "EmptyCall"
  1571. },
  1572. {
  1573. "service": "grpc.testing.TestService",
  1574. "method": "FullDuplexCall"
  1575. }
  1576. ],
  1577. "waitForReady": true,
  1578. "timeout": ".000000001s"
  1579. }
  1580. ]
  1581. }`)
  1582. // Wait for the new service config to take effect.
  1583. for {
  1584. if mc := cc.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall"); mc.Timeout != nil && *mc.Timeout == time.Nanosecond {
  1585. break
  1586. }
  1587. time.Sleep(time.Millisecond)
  1588. }
  1589. ctx, cancel = context.WithTimeout(context.Background(), time.Hour)
  1590. if _, err = tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  1591. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  1592. }
  1593. cancel()
  1594. ctx, cancel = context.WithTimeout(context.Background(), time.Hour)
  1595. if _, err = tc.FullDuplexCall(ctx, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  1596. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  1597. }
  1598. cancel()
  1599. }
  1600. func (s) TestServiceConfigMaxMsgSize(t *testing.T) {
  1601. e := tcpClearRREnv
  1602. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  1603. defer rcleanup()
  1604. // Setting up values and objects shared across all test cases.
  1605. const smallSize = 1
  1606. const largeSize = 1024
  1607. const extraLargeSize = 2048
  1608. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  1609. if err != nil {
  1610. t.Fatal(err)
  1611. }
  1612. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  1613. if err != nil {
  1614. t.Fatal(err)
  1615. }
  1616. extraLargePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, extraLargeSize)
  1617. if err != nil {
  1618. t.Fatal(err)
  1619. }
  1620. scjs := `{
  1621. "methodConfig": [
  1622. {
  1623. "name": [
  1624. {
  1625. "service": "grpc.testing.TestService",
  1626. "method": "UnaryCall"
  1627. },
  1628. {
  1629. "service": "grpc.testing.TestService",
  1630. "method": "FullDuplexCall"
  1631. }
  1632. ],
  1633. "maxRequestMessageBytes": 2048,
  1634. "maxResponseMessageBytes": 2048
  1635. }
  1636. ]
  1637. }`
  1638. // Case1: sc set maxReqSize to 2048 (send), maxRespSize to 2048 (recv).
  1639. te1 := testServiceConfigSetup(t, e)
  1640. defer te1.tearDown()
  1641. te1.resolverScheme = r.Scheme()
  1642. te1.nonBlockingDial = true
  1643. te1.startServer(&testServer{security: e.security})
  1644. cc1 := te1.clientConn()
  1645. r.NewAddress([]resolver.Address{{Addr: te1.srvAddr}})
  1646. r.NewServiceConfig(scjs)
  1647. tc := testpb.NewTestServiceClient(cc1)
  1648. req := &testpb.SimpleRequest{
  1649. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1650. ResponseSize: int32(extraLargeSize),
  1651. Payload: smallPayload,
  1652. }
  1653. for {
  1654. if cc1.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall").MaxReqSize != nil {
  1655. break
  1656. }
  1657. time.Sleep(time.Millisecond)
  1658. }
  1659. // Test for unary RPC recv.
  1660. if _, err = tc.UnaryCall(context.Background(), req, grpc.WaitForReady(true)); err == nil || status.Code(err) != codes.ResourceExhausted {
  1661. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1662. }
  1663. // Test for unary RPC send.
  1664. req.Payload = extraLargePayload
  1665. req.ResponseSize = int32(smallSize)
  1666. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  1667. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1668. }
  1669. // Test for streaming RPC recv.
  1670. respParam := []*testpb.ResponseParameters{
  1671. {
  1672. Size: int32(extraLargeSize),
  1673. },
  1674. }
  1675. sreq := &testpb.StreamingOutputCallRequest{
  1676. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1677. ResponseParameters: respParam,
  1678. Payload: smallPayload,
  1679. }
  1680. stream, err := tc.FullDuplexCall(te1.ctx)
  1681. if err != nil {
  1682. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1683. }
  1684. if err = stream.Send(sreq); err != nil {
  1685. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  1686. }
  1687. if _, err = stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  1688. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  1689. }
  1690. // Test for streaming RPC send.
  1691. respParam[0].Size = int32(smallSize)
  1692. sreq.Payload = extraLargePayload
  1693. stream, err = tc.FullDuplexCall(te1.ctx)
  1694. if err != nil {
  1695. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1696. }
  1697. if err = stream.Send(sreq); err == nil || status.Code(err) != codes.ResourceExhausted {
  1698. t.Fatalf("%v.Send(%v) = %v, want _, error code: %s", stream, sreq, err, codes.ResourceExhausted)
  1699. }
  1700. // Case2: Client API set maxReqSize to 1024 (send), maxRespSize to 1024 (recv). Sc sets maxReqSize to 2048 (send), maxRespSize to 2048 (recv).
  1701. te2 := testServiceConfigSetup(t, e)
  1702. te2.resolverScheme = r.Scheme()
  1703. te2.nonBlockingDial = true
  1704. te2.maxClientReceiveMsgSize = newInt(1024)
  1705. te2.maxClientSendMsgSize = newInt(1024)
  1706. te2.startServer(&testServer{security: e.security})
  1707. defer te2.tearDown()
  1708. cc2 := te2.clientConn()
  1709. r.NewAddress([]resolver.Address{{Addr: te2.srvAddr}})
  1710. r.NewServiceConfig(scjs)
  1711. tc = testpb.NewTestServiceClient(cc2)
  1712. for {
  1713. if cc2.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall").MaxReqSize != nil {
  1714. break
  1715. }
  1716. time.Sleep(time.Millisecond)
  1717. }
  1718. // Test for unary RPC recv.
  1719. req.Payload = smallPayload
  1720. req.ResponseSize = int32(largeSize)
  1721. if _, err = tc.UnaryCall(context.Background(), req, grpc.WaitForReady(true)); err == nil || status.Code(err) != codes.ResourceExhausted {
  1722. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1723. }
  1724. // Test for unary RPC send.
  1725. req.Payload = largePayload
  1726. req.ResponseSize = int32(smallSize)
  1727. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  1728. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1729. }
  1730. // Test for streaming RPC recv.
  1731. stream, err = tc.FullDuplexCall(te2.ctx)
  1732. respParam[0].Size = int32(largeSize)
  1733. sreq.Payload = smallPayload
  1734. if err != nil {
  1735. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1736. }
  1737. if err = stream.Send(sreq); err != nil {
  1738. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  1739. }
  1740. if _, err = stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  1741. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  1742. }
  1743. // Test for streaming RPC send.
  1744. respParam[0].Size = int32(smallSize)
  1745. sreq.Payload = largePayload
  1746. stream, err = tc.FullDuplexCall(te2.ctx)
  1747. if err != nil {
  1748. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1749. }
  1750. if err = stream.Send(sreq); err == nil || status.Code(err) != codes.ResourceExhausted {
  1751. t.Fatalf("%v.Send(%v) = %v, want _, error code: %s", stream, sreq, err, codes.ResourceExhausted)
  1752. }
  1753. // Case3: Client API set maxReqSize to 4096 (send), maxRespSize to 4096 (recv). Sc sets maxReqSize to 2048 (send), maxRespSize to 2048 (recv).
  1754. te3 := testServiceConfigSetup(t, e)
  1755. te3.resolverScheme = r.Scheme()
  1756. te3.nonBlockingDial = true
  1757. te3.maxClientReceiveMsgSize = newInt(4096)
  1758. te3.maxClientSendMsgSize = newInt(4096)
  1759. te3.startServer(&testServer{security: e.security})
  1760. defer te3.tearDown()
  1761. cc3 := te3.clientConn()
  1762. r.NewAddress([]resolver.Address{{Addr: te3.srvAddr}})
  1763. r.NewServiceConfig(scjs)
  1764. tc = testpb.NewTestServiceClient(cc3)
  1765. for {
  1766. if cc3.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall").MaxReqSize != nil {
  1767. break
  1768. }
  1769. time.Sleep(time.Millisecond)
  1770. }
  1771. // Test for unary RPC recv.
  1772. req.Payload = smallPayload
  1773. req.ResponseSize = int32(largeSize)
  1774. if _, err = tc.UnaryCall(context.Background(), req, grpc.WaitForReady(true)); err != nil {
  1775. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want <nil>", err)
  1776. }
  1777. req.ResponseSize = int32(extraLargeSize)
  1778. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  1779. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1780. }
  1781. // Test for unary RPC send.
  1782. req.Payload = largePayload
  1783. req.ResponseSize = int32(smallSize)
  1784. if _, err := tc.UnaryCall(context.Background(), req); err != nil {
  1785. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want <nil>", err)
  1786. }
  1787. req.Payload = extraLargePayload
  1788. if _, err = tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  1789. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1790. }
  1791. // Test for streaming RPC recv.
  1792. stream, err = tc.FullDuplexCall(te3.ctx)
  1793. if err != nil {
  1794. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1795. }
  1796. respParam[0].Size = int32(largeSize)
  1797. sreq.Payload = smallPayload
  1798. if err = stream.Send(sreq); err != nil {
  1799. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  1800. }
  1801. if _, err = stream.Recv(); err != nil {
  1802. t.Fatalf("%v.Recv() = _, %v, want <nil>", stream, err)
  1803. }
  1804. respParam[0].Size = int32(extraLargeSize)
  1805. if err = stream.Send(sreq); err != nil {
  1806. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  1807. }
  1808. if _, err = stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  1809. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  1810. }
  1811. // Test for streaming RPC send.
  1812. respParam[0].Size = int32(smallSize)
  1813. sreq.Payload = largePayload
  1814. stream, err = tc.FullDuplexCall(te3.ctx)
  1815. if err != nil {
  1816. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1817. }
  1818. if err := stream.Send(sreq); err != nil {
  1819. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  1820. }
  1821. sreq.Payload = extraLargePayload
  1822. if err := stream.Send(sreq); err == nil || status.Code(err) != codes.ResourceExhausted {
  1823. t.Fatalf("%v.Send(%v) = %v, want _, error code: %s", stream, sreq, err, codes.ResourceExhausted)
  1824. }
  1825. }
  1826. // Reading from a streaming RPC may fail with context canceled if timeout was
  1827. // set by service config (https://github.com/grpc/grpc-go/issues/1818). This
  1828. // test makes sure read from streaming RPC doesn't fail in this case.
  1829. func (s) TestStreamingRPCWithTimeoutInServiceConfigRecv(t *testing.T) {
  1830. te := testServiceConfigSetup(t, tcpClearRREnv)
  1831. te.startServer(&testServer{security: tcpClearRREnv.security})
  1832. defer te.tearDown()
  1833. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  1834. defer rcleanup()
  1835. te.resolverScheme = r.Scheme()
  1836. te.nonBlockingDial = true
  1837. cc := te.clientConn()
  1838. tc := testpb.NewTestServiceClient(cc)
  1839. r.NewAddress([]resolver.Address{{Addr: te.srvAddr}})
  1840. r.NewServiceConfig(`{
  1841. "methodConfig": [
  1842. {
  1843. "name": [
  1844. {
  1845. "service": "grpc.testing.TestService",
  1846. "method": "FullDuplexCall"
  1847. }
  1848. ],
  1849. "waitForReady": true,
  1850. "timeout": "10s"
  1851. }
  1852. ]
  1853. }`)
  1854. // Make sure service config has been processed by grpc.
  1855. for {
  1856. if cc.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall").Timeout != nil {
  1857. break
  1858. }
  1859. time.Sleep(time.Millisecond)
  1860. }
  1861. ctx, cancel := context.WithCancel(context.Background())
  1862. defer cancel()
  1863. stream, err := tc.FullDuplexCall(ctx, grpc.WaitForReady(true))
  1864. if err != nil {
  1865. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want <nil>", err)
  1866. }
  1867. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 0)
  1868. if err != nil {
  1869. t.Fatalf("failed to newPayload: %v", err)
  1870. }
  1871. req := &testpb.StreamingOutputCallRequest{
  1872. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1873. ResponseParameters: []*testpb.ResponseParameters{{Size: 0}},
  1874. Payload: payload,
  1875. }
  1876. if err := stream.Send(req); err != nil {
  1877. t.Fatalf("stream.Send(%v) = %v, want <nil>", req, err)
  1878. }
  1879. stream.CloseSend()
  1880. time.Sleep(time.Second)
  1881. // Sleep 1 second before recv to make sure the final status is received
  1882. // before the recv.
  1883. if _, err := stream.Recv(); err != nil {
  1884. t.Fatalf("stream.Recv = _, %v, want _, <nil>", err)
  1885. }
  1886. // Keep reading to drain the stream.
  1887. for {
  1888. if _, err := stream.Recv(); err != nil {
  1889. break
  1890. }
  1891. }
  1892. }
  1893. func (s) TestMaxMsgSizeClientDefault(t *testing.T) {
  1894. for _, e := range listTestEnv() {
  1895. testMaxMsgSizeClientDefault(t, e)
  1896. }
  1897. }
  1898. func testMaxMsgSizeClientDefault(t *testing.T, e env) {
  1899. te := newTest(t, e)
  1900. te.userAgent = testAppUA
  1901. te.declareLogNoise(
  1902. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1903. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1904. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1905. "Failed to dial : context canceled; please retry.",
  1906. )
  1907. te.startServer(&testServer{security: e.security})
  1908. defer te.tearDown()
  1909. tc := testpb.NewTestServiceClient(te.clientConn())
  1910. const smallSize = 1
  1911. const largeSize = 4 * 1024 * 1024
  1912. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  1913. if err != nil {
  1914. t.Fatal(err)
  1915. }
  1916. req := &testpb.SimpleRequest{
  1917. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1918. ResponseSize: int32(largeSize),
  1919. Payload: smallPayload,
  1920. }
  1921. // Test for unary RPC recv.
  1922. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  1923. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1924. }
  1925. respParam := []*testpb.ResponseParameters{
  1926. {
  1927. Size: int32(largeSize),
  1928. },
  1929. }
  1930. sreq := &testpb.StreamingOutputCallRequest{
  1931. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1932. ResponseParameters: respParam,
  1933. Payload: smallPayload,
  1934. }
  1935. // Test for streaming RPC recv.
  1936. stream, err := tc.FullDuplexCall(te.ctx)
  1937. if err != nil {
  1938. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  1939. }
  1940. if err := stream.Send(sreq); err != nil {
  1941. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  1942. }
  1943. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  1944. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  1945. }
  1946. }
  1947. func (s) TestMaxMsgSizeClientAPI(t *testing.T) {
  1948. for _, e := range listTestEnv() {
  1949. testMaxMsgSizeClientAPI(t, e)
  1950. }
  1951. }
  1952. func testMaxMsgSizeClientAPI(t *testing.T, e env) {
  1953. te := newTest(t, e)
  1954. te.userAgent = testAppUA
  1955. // To avoid error on server side.
  1956. te.maxServerSendMsgSize = newInt(5 * 1024 * 1024)
  1957. te.maxClientReceiveMsgSize = newInt(1024)
  1958. te.maxClientSendMsgSize = newInt(1024)
  1959. te.declareLogNoise(
  1960. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  1961. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  1962. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  1963. "Failed to dial : context canceled; please retry.",
  1964. )
  1965. te.startServer(&testServer{security: e.security})
  1966. defer te.tearDown()
  1967. tc := testpb.NewTestServiceClient(te.clientConn())
  1968. const smallSize = 1
  1969. const largeSize = 1024
  1970. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  1971. if err != nil {
  1972. t.Fatal(err)
  1973. }
  1974. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  1975. if err != nil {
  1976. t.Fatal(err)
  1977. }
  1978. req := &testpb.SimpleRequest{
  1979. ResponseType: testpb.PayloadType_COMPRESSABLE,
  1980. ResponseSize: int32(largeSize),
  1981. Payload: smallPayload,
  1982. }
  1983. // Test for unary RPC recv.
  1984. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  1985. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1986. }
  1987. // Test for unary RPC send.
  1988. req.Payload = largePayload
  1989. req.ResponseSize = int32(smallSize)
  1990. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  1991. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  1992. }
  1993. respParam := []*testpb.ResponseParameters{
  1994. {
  1995. Size: int32(largeSize),
  1996. },
  1997. }
  1998. sreq := &testpb.StreamingOutputCallRequest{
  1999. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2000. ResponseParameters: respParam,
  2001. Payload: smallPayload,
  2002. }
  2003. // Test for streaming RPC recv.
  2004. stream, err := tc.FullDuplexCall(te.ctx)
  2005. if err != nil {
  2006. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2007. }
  2008. if err := stream.Send(sreq); err != nil {
  2009. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  2010. }
  2011. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  2012. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  2013. }
  2014. // Test for streaming RPC send.
  2015. respParam[0].Size = int32(smallSize)
  2016. sreq.Payload = largePayload
  2017. stream, err = tc.FullDuplexCall(te.ctx)
  2018. if err != nil {
  2019. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2020. }
  2021. if err := stream.Send(sreq); err == nil || status.Code(err) != codes.ResourceExhausted {
  2022. t.Fatalf("%v.Send(%v) = %v, want _, error code: %s", stream, sreq, err, codes.ResourceExhausted)
  2023. }
  2024. }
  2025. func (s) TestMaxMsgSizeServerAPI(t *testing.T) {
  2026. for _, e := range listTestEnv() {
  2027. testMaxMsgSizeServerAPI(t, e)
  2028. }
  2029. }
  2030. func testMaxMsgSizeServerAPI(t *testing.T, e env) {
  2031. te := newTest(t, e)
  2032. te.userAgent = testAppUA
  2033. te.maxServerReceiveMsgSize = newInt(1024)
  2034. te.maxServerSendMsgSize = newInt(1024)
  2035. te.declareLogNoise(
  2036. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  2037. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  2038. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  2039. "Failed to dial : context canceled; please retry.",
  2040. )
  2041. te.startServer(&testServer{security: e.security})
  2042. defer te.tearDown()
  2043. tc := testpb.NewTestServiceClient(te.clientConn())
  2044. const smallSize = 1
  2045. const largeSize = 1024
  2046. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  2047. if err != nil {
  2048. t.Fatal(err)
  2049. }
  2050. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  2051. if err != nil {
  2052. t.Fatal(err)
  2053. }
  2054. req := &testpb.SimpleRequest{
  2055. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2056. ResponseSize: int32(largeSize),
  2057. Payload: smallPayload,
  2058. }
  2059. // Test for unary RPC send.
  2060. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  2061. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  2062. }
  2063. // Test for unary RPC recv.
  2064. req.Payload = largePayload
  2065. req.ResponseSize = int32(smallSize)
  2066. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  2067. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  2068. }
  2069. respParam := []*testpb.ResponseParameters{
  2070. {
  2071. Size: int32(largeSize),
  2072. },
  2073. }
  2074. sreq := &testpb.StreamingOutputCallRequest{
  2075. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2076. ResponseParameters: respParam,
  2077. Payload: smallPayload,
  2078. }
  2079. // Test for streaming RPC send.
  2080. stream, err := tc.FullDuplexCall(te.ctx)
  2081. if err != nil {
  2082. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2083. }
  2084. if err := stream.Send(sreq); err != nil {
  2085. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  2086. }
  2087. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  2088. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  2089. }
  2090. // Test for streaming RPC recv.
  2091. respParam[0].Size = int32(smallSize)
  2092. sreq.Payload = largePayload
  2093. stream, err = tc.FullDuplexCall(te.ctx)
  2094. if err != nil {
  2095. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2096. }
  2097. if err := stream.Send(sreq); err != nil {
  2098. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  2099. }
  2100. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  2101. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  2102. }
  2103. }
  2104. func (s) TestTap(t *testing.T) {
  2105. for _, e := range listTestEnv() {
  2106. if e.name == "handler-tls" {
  2107. continue
  2108. }
  2109. testTap(t, e)
  2110. }
  2111. }
  2112. type myTap struct {
  2113. cnt int
  2114. }
  2115. func (t *myTap) handle(ctx context.Context, info *tap.Info) (context.Context, error) {
  2116. if info != nil {
  2117. if info.FullMethodName == "/grpc.testing.TestService/EmptyCall" {
  2118. t.cnt++
  2119. } else if info.FullMethodName == "/grpc.testing.TestService/UnaryCall" {
  2120. return nil, fmt.Errorf("tap error")
  2121. }
  2122. }
  2123. return ctx, nil
  2124. }
  2125. func testTap(t *testing.T, e env) {
  2126. te := newTest(t, e)
  2127. te.userAgent = testAppUA
  2128. ttap := &myTap{}
  2129. te.tapHandle = ttap.handle
  2130. te.declareLogNoise(
  2131. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  2132. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  2133. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  2134. )
  2135. te.startServer(&testServer{security: e.security})
  2136. defer te.tearDown()
  2137. cc := te.clientConn()
  2138. tc := testpb.NewTestServiceClient(cc)
  2139. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  2140. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  2141. }
  2142. if ttap.cnt != 1 {
  2143. t.Fatalf("Get the count in ttap %d, want 1", ttap.cnt)
  2144. }
  2145. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 31)
  2146. if err != nil {
  2147. t.Fatal(err)
  2148. }
  2149. req := &testpb.SimpleRequest{
  2150. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2151. ResponseSize: 45,
  2152. Payload: payload,
  2153. }
  2154. if _, err := tc.UnaryCall(context.Background(), req); status.Code(err) != codes.Unavailable {
  2155. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, %s", err, codes.Unavailable)
  2156. }
  2157. }
  2158. func healthCheck(d time.Duration, cc *grpc.ClientConn, serviceName string) (*healthpb.HealthCheckResponse, error) {
  2159. ctx, cancel := context.WithTimeout(context.Background(), d)
  2160. defer cancel()
  2161. hc := healthgrpc.NewHealthClient(cc)
  2162. req := &healthpb.HealthCheckRequest{
  2163. Service: serviceName,
  2164. }
  2165. return hc.Check(ctx, req)
  2166. }
  2167. func (s) TestHealthCheckOnSuccess(t *testing.T) {
  2168. for _, e := range listTestEnv() {
  2169. testHealthCheckOnSuccess(t, e)
  2170. }
  2171. }
  2172. func testHealthCheckOnSuccess(t *testing.T, e env) {
  2173. te := newTest(t, e)
  2174. hs := health.NewServer()
  2175. hs.SetServingStatus("grpc.health.v1.Health", 1)
  2176. te.healthServer = hs
  2177. te.startServer(&testServer{security: e.security})
  2178. defer te.tearDown()
  2179. cc := te.clientConn()
  2180. if _, err := healthCheck(1*time.Second, cc, "grpc.health.v1.Health"); err != nil {
  2181. t.Fatalf("Health/Check(_, _) = _, %v, want _, <nil>", err)
  2182. }
  2183. }
  2184. func (s) TestHealthCheckOnFailure(t *testing.T) {
  2185. for _, e := range listTestEnv() {
  2186. testHealthCheckOnFailure(t, e)
  2187. }
  2188. }
  2189. func testHealthCheckOnFailure(t *testing.T, e env) {
  2190. te := newTest(t, e)
  2191. te.declareLogNoise(
  2192. "Failed to dial ",
  2193. "grpc: the client connection is closing; please retry",
  2194. )
  2195. hs := health.NewServer()
  2196. hs.SetServingStatus("grpc.health.v1.HealthCheck", 1)
  2197. te.healthServer = hs
  2198. te.startServer(&testServer{security: e.security})
  2199. defer te.tearDown()
  2200. cc := te.clientConn()
  2201. wantErr := status.Error(codes.DeadlineExceeded, "context deadline exceeded")
  2202. if _, err := healthCheck(0*time.Second, cc, "grpc.health.v1.Health"); !reflect.DeepEqual(err, wantErr) {
  2203. t.Fatalf("Health/Check(_, _) = _, %v, want _, error code %s", err, codes.DeadlineExceeded)
  2204. }
  2205. awaitNewConnLogOutput()
  2206. }
  2207. func (s) TestHealthCheckOff(t *testing.T) {
  2208. for _, e := range listTestEnv() {
  2209. // TODO(bradfitz): Temporarily skip this env due to #619.
  2210. if e.name == "handler-tls" {
  2211. continue
  2212. }
  2213. testHealthCheckOff(t, e)
  2214. }
  2215. }
  2216. func testHealthCheckOff(t *testing.T, e env) {
  2217. te := newTest(t, e)
  2218. te.startServer(&testServer{security: e.security})
  2219. defer te.tearDown()
  2220. want := status.Error(codes.Unimplemented, "unknown service grpc.health.v1.Health")
  2221. if _, err := healthCheck(1*time.Second, te.clientConn(), ""); !reflect.DeepEqual(err, want) {
  2222. t.Fatalf("Health/Check(_, _) = _, %v, want _, %v", err, want)
  2223. }
  2224. }
  2225. func (s) TestHealthWatchMultipleClients(t *testing.T) {
  2226. for _, e := range listTestEnv() {
  2227. testHealthWatchMultipleClients(t, e)
  2228. }
  2229. }
  2230. func testHealthWatchMultipleClients(t *testing.T, e env) {
  2231. const service = "grpc.health.v1.Health1"
  2232. hs := health.NewServer()
  2233. te := newTest(t, e)
  2234. te.healthServer = hs
  2235. te.startServer(&testServer{security: e.security})
  2236. defer te.tearDown()
  2237. cc := te.clientConn()
  2238. hc := healthgrpc.NewHealthClient(cc)
  2239. ctx, cancel := context.WithCancel(context.Background())
  2240. defer cancel()
  2241. req := &healthpb.HealthCheckRequest{
  2242. Service: service,
  2243. }
  2244. stream1, err := hc.Watch(ctx, req)
  2245. if err != nil {
  2246. t.Fatalf("error: %v", err)
  2247. }
  2248. healthWatchChecker(t, stream1, healthpb.HealthCheckResponse_SERVICE_UNKNOWN)
  2249. stream2, err := hc.Watch(ctx, req)
  2250. if err != nil {
  2251. t.Fatalf("error: %v", err)
  2252. }
  2253. healthWatchChecker(t, stream2, healthpb.HealthCheckResponse_SERVICE_UNKNOWN)
  2254. hs.SetServingStatus(service, healthpb.HealthCheckResponse_NOT_SERVING)
  2255. healthWatchChecker(t, stream1, healthpb.HealthCheckResponse_NOT_SERVING)
  2256. healthWatchChecker(t, stream2, healthpb.HealthCheckResponse_NOT_SERVING)
  2257. }
  2258. func (s) TestHealthWatchSameStatus(t *testing.T) {
  2259. for _, e := range listTestEnv() {
  2260. testHealthWatchSameStatus(t, e)
  2261. }
  2262. }
  2263. func testHealthWatchSameStatus(t *testing.T, e env) {
  2264. const service = "grpc.health.v1.Health1"
  2265. hs := health.NewServer()
  2266. te := newTest(t, e)
  2267. te.healthServer = hs
  2268. te.startServer(&testServer{security: e.security})
  2269. defer te.tearDown()
  2270. cc := te.clientConn()
  2271. hc := healthgrpc.NewHealthClient(cc)
  2272. ctx, cancel := context.WithCancel(context.Background())
  2273. defer cancel()
  2274. req := &healthpb.HealthCheckRequest{
  2275. Service: service,
  2276. }
  2277. stream1, err := hc.Watch(ctx, req)
  2278. if err != nil {
  2279. t.Fatalf("error: %v", err)
  2280. }
  2281. healthWatchChecker(t, stream1, healthpb.HealthCheckResponse_SERVICE_UNKNOWN)
  2282. hs.SetServingStatus(service, healthpb.HealthCheckResponse_SERVING)
  2283. healthWatchChecker(t, stream1, healthpb.HealthCheckResponse_SERVING)
  2284. hs.SetServingStatus(service, healthpb.HealthCheckResponse_SERVING)
  2285. hs.SetServingStatus(service, healthpb.HealthCheckResponse_NOT_SERVING)
  2286. healthWatchChecker(t, stream1, healthpb.HealthCheckResponse_NOT_SERVING)
  2287. }
  2288. func (s) TestHealthWatchServiceStatusSetBeforeStartingServer(t *testing.T) {
  2289. for _, e := range listTestEnv() {
  2290. testHealthWatchSetServiceStatusBeforeStartingServer(t, e)
  2291. }
  2292. }
  2293. func testHealthWatchSetServiceStatusBeforeStartingServer(t *testing.T, e env) {
  2294. const service = "grpc.health.v1.Health1"
  2295. hs := health.NewServer()
  2296. te := newTest(t, e)
  2297. te.healthServer = hs
  2298. hs.SetServingStatus(service, healthpb.HealthCheckResponse_SERVING)
  2299. te.startServer(&testServer{security: e.security})
  2300. defer te.tearDown()
  2301. cc := te.clientConn()
  2302. hc := healthgrpc.NewHealthClient(cc)
  2303. ctx, cancel := context.WithCancel(context.Background())
  2304. defer cancel()
  2305. req := &healthpb.HealthCheckRequest{
  2306. Service: service,
  2307. }
  2308. stream, err := hc.Watch(ctx, req)
  2309. if err != nil {
  2310. t.Fatalf("error: %v", err)
  2311. }
  2312. healthWatchChecker(t, stream, healthpb.HealthCheckResponse_SERVING)
  2313. }
  2314. func (s) TestHealthWatchDefaultStatusChange(t *testing.T) {
  2315. for _, e := range listTestEnv() {
  2316. testHealthWatchDefaultStatusChange(t, e)
  2317. }
  2318. }
  2319. func testHealthWatchDefaultStatusChange(t *testing.T, e env) {
  2320. const service = "grpc.health.v1.Health1"
  2321. hs := health.NewServer()
  2322. te := newTest(t, e)
  2323. te.healthServer = hs
  2324. te.startServer(&testServer{security: e.security})
  2325. defer te.tearDown()
  2326. cc := te.clientConn()
  2327. hc := healthgrpc.NewHealthClient(cc)
  2328. ctx, cancel := context.WithCancel(context.Background())
  2329. defer cancel()
  2330. req := &healthpb.HealthCheckRequest{
  2331. Service: service,
  2332. }
  2333. stream, err := hc.Watch(ctx, req)
  2334. if err != nil {
  2335. t.Fatalf("error: %v", err)
  2336. }
  2337. healthWatchChecker(t, stream, healthpb.HealthCheckResponse_SERVICE_UNKNOWN)
  2338. hs.SetServingStatus(service, healthpb.HealthCheckResponse_SERVING)
  2339. healthWatchChecker(t, stream, healthpb.HealthCheckResponse_SERVING)
  2340. }
  2341. func (s) TestHealthWatchSetServiceStatusBeforeClientCallsWatch(t *testing.T) {
  2342. for _, e := range listTestEnv() {
  2343. testHealthWatchSetServiceStatusBeforeClientCallsWatch(t, e)
  2344. }
  2345. }
  2346. func testHealthWatchSetServiceStatusBeforeClientCallsWatch(t *testing.T, e env) {
  2347. const service = "grpc.health.v1.Health1"
  2348. hs := health.NewServer()
  2349. te := newTest(t, e)
  2350. te.healthServer = hs
  2351. te.startServer(&testServer{security: e.security})
  2352. defer te.tearDown()
  2353. cc := te.clientConn()
  2354. hc := healthgrpc.NewHealthClient(cc)
  2355. ctx, cancel := context.WithCancel(context.Background())
  2356. defer cancel()
  2357. req := &healthpb.HealthCheckRequest{
  2358. Service: service,
  2359. }
  2360. hs.SetServingStatus(service, healthpb.HealthCheckResponse_SERVING)
  2361. stream, err := hc.Watch(ctx, req)
  2362. if err != nil {
  2363. t.Fatalf("error: %v", err)
  2364. }
  2365. healthWatchChecker(t, stream, healthpb.HealthCheckResponse_SERVING)
  2366. }
  2367. func (s) TestHealthWatchOverallServerHealthChange(t *testing.T) {
  2368. for _, e := range listTestEnv() {
  2369. testHealthWatchOverallServerHealthChange(t, e)
  2370. }
  2371. }
  2372. func testHealthWatchOverallServerHealthChange(t *testing.T, e env) {
  2373. const service = ""
  2374. hs := health.NewServer()
  2375. te := newTest(t, e)
  2376. te.healthServer = hs
  2377. te.startServer(&testServer{security: e.security})
  2378. defer te.tearDown()
  2379. cc := te.clientConn()
  2380. hc := healthgrpc.NewHealthClient(cc)
  2381. ctx, cancel := context.WithCancel(context.Background())
  2382. defer cancel()
  2383. req := &healthpb.HealthCheckRequest{
  2384. Service: service,
  2385. }
  2386. stream, err := hc.Watch(ctx, req)
  2387. if err != nil {
  2388. t.Fatalf("error: %v", err)
  2389. }
  2390. healthWatchChecker(t, stream, healthpb.HealthCheckResponse_SERVING)
  2391. hs.SetServingStatus(service, healthpb.HealthCheckResponse_NOT_SERVING)
  2392. healthWatchChecker(t, stream, healthpb.HealthCheckResponse_NOT_SERVING)
  2393. }
  2394. func healthWatchChecker(t *testing.T, stream healthgrpc.Health_WatchClient, expectedServingStatus healthpb.HealthCheckResponse_ServingStatus) {
  2395. response, err := stream.Recv()
  2396. if err != nil {
  2397. t.Fatalf("error on %v.Recv(): %v", stream, err)
  2398. }
  2399. if response.Status != expectedServingStatus {
  2400. t.Fatalf("response.Status is %v (%v expected)", response.Status, expectedServingStatus)
  2401. }
  2402. }
  2403. func (s) TestUnknownHandler(t *testing.T) {
  2404. // An example unknownHandler that returns a different code and a different method, making sure that we do not
  2405. // expose what methods are implemented to a client that is not authenticated.
  2406. unknownHandler := func(srv interface{}, stream grpc.ServerStream) error {
  2407. return status.Error(codes.Unauthenticated, "user unauthenticated")
  2408. }
  2409. for _, e := range listTestEnv() {
  2410. // TODO(bradfitz): Temporarily skip this env due to #619.
  2411. if e.name == "handler-tls" {
  2412. continue
  2413. }
  2414. testUnknownHandler(t, e, unknownHandler)
  2415. }
  2416. }
  2417. func testUnknownHandler(t *testing.T, e env, unknownHandler grpc.StreamHandler) {
  2418. te := newTest(t, e)
  2419. te.unknownHandler = unknownHandler
  2420. te.startServer(&testServer{security: e.security})
  2421. defer te.tearDown()
  2422. want := status.Error(codes.Unauthenticated, "user unauthenticated")
  2423. if _, err := healthCheck(1*time.Second, te.clientConn(), ""); !reflect.DeepEqual(err, want) {
  2424. t.Fatalf("Health/Check(_, _) = _, %v, want _, %v", err, want)
  2425. }
  2426. }
  2427. func (s) TestHealthCheckServingStatus(t *testing.T) {
  2428. for _, e := range listTestEnv() {
  2429. testHealthCheckServingStatus(t, e)
  2430. }
  2431. }
  2432. func testHealthCheckServingStatus(t *testing.T, e env) {
  2433. te := newTest(t, e)
  2434. hs := health.NewServer()
  2435. te.healthServer = hs
  2436. te.startServer(&testServer{security: e.security})
  2437. defer te.tearDown()
  2438. cc := te.clientConn()
  2439. out, err := healthCheck(1*time.Second, cc, "")
  2440. if err != nil {
  2441. t.Fatalf("Health/Check(_, _) = _, %v, want _, <nil>", err)
  2442. }
  2443. if out.Status != healthpb.HealthCheckResponse_SERVING {
  2444. t.Fatalf("Got the serving status %v, want SERVING", out.Status)
  2445. }
  2446. wantErr := status.Error(codes.NotFound, "unknown service")
  2447. if _, err := healthCheck(1*time.Second, cc, "grpc.health.v1.Health"); !reflect.DeepEqual(err, wantErr) {
  2448. t.Fatalf("Health/Check(_, _) = _, %v, want _, error code %s", err, codes.NotFound)
  2449. }
  2450. hs.SetServingStatus("grpc.health.v1.Health", healthpb.HealthCheckResponse_SERVING)
  2451. out, err = healthCheck(1*time.Second, cc, "grpc.health.v1.Health")
  2452. if err != nil {
  2453. t.Fatalf("Health/Check(_, _) = _, %v, want _, <nil>", err)
  2454. }
  2455. if out.Status != healthpb.HealthCheckResponse_SERVING {
  2456. t.Fatalf("Got the serving status %v, want SERVING", out.Status)
  2457. }
  2458. hs.SetServingStatus("grpc.health.v1.Health", healthpb.HealthCheckResponse_NOT_SERVING)
  2459. out, err = healthCheck(1*time.Second, cc, "grpc.health.v1.Health")
  2460. if err != nil {
  2461. t.Fatalf("Health/Check(_, _) = _, %v, want _, <nil>", err)
  2462. }
  2463. if out.Status != healthpb.HealthCheckResponse_NOT_SERVING {
  2464. t.Fatalf("Got the serving status %v, want NOT_SERVING", out.Status)
  2465. }
  2466. }
  2467. func (s) TestEmptyUnaryWithUserAgent(t *testing.T) {
  2468. for _, e := range listTestEnv() {
  2469. testEmptyUnaryWithUserAgent(t, e)
  2470. }
  2471. }
  2472. func testEmptyUnaryWithUserAgent(t *testing.T, e env) {
  2473. te := newTest(t, e)
  2474. te.userAgent = testAppUA
  2475. te.startServer(&testServer{security: e.security})
  2476. defer te.tearDown()
  2477. cc := te.clientConn()
  2478. tc := testpb.NewTestServiceClient(cc)
  2479. var header metadata.MD
  2480. reply, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Header(&header))
  2481. if err != nil || !proto.Equal(&testpb.Empty{}, reply) {
  2482. t.Fatalf("TestService/EmptyCall(_, _) = %v, %v, want %v, <nil>", reply, err, &testpb.Empty{})
  2483. }
  2484. if v, ok := header["ua"]; !ok || !strings.HasPrefix(v[0], testAppUA) {
  2485. t.Fatalf("header[\"ua\"] = %q, %t, want string with prefix %q, true", v, ok, testAppUA)
  2486. }
  2487. te.srv.Stop()
  2488. }
  2489. func (s) TestFailedEmptyUnary(t *testing.T) {
  2490. for _, e := range listTestEnv() {
  2491. if e.name == "handler-tls" {
  2492. // This test covers status details, but
  2493. // Grpc-Status-Details-Bin is not support in handler_server.
  2494. continue
  2495. }
  2496. testFailedEmptyUnary(t, e)
  2497. }
  2498. }
  2499. func testFailedEmptyUnary(t *testing.T, e env) {
  2500. te := newTest(t, e)
  2501. te.userAgent = failAppUA
  2502. te.startServer(&testServer{security: e.security})
  2503. defer te.tearDown()
  2504. tc := testpb.NewTestServiceClient(te.clientConn())
  2505. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2506. wantErr := detailedError
  2507. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); !reflect.DeepEqual(err, wantErr) {
  2508. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %v", err, wantErr)
  2509. }
  2510. }
  2511. func (s) TestLargeUnary(t *testing.T) {
  2512. for _, e := range listTestEnv() {
  2513. testLargeUnary(t, e)
  2514. }
  2515. }
  2516. func testLargeUnary(t *testing.T, e env) {
  2517. te := newTest(t, e)
  2518. te.startServer(&testServer{security: e.security})
  2519. defer te.tearDown()
  2520. tc := testpb.NewTestServiceClient(te.clientConn())
  2521. const argSize = 271828
  2522. const respSize = 314159
  2523. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2524. if err != nil {
  2525. t.Fatal(err)
  2526. }
  2527. req := &testpb.SimpleRequest{
  2528. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2529. ResponseSize: respSize,
  2530. Payload: payload,
  2531. }
  2532. reply, err := tc.UnaryCall(context.Background(), req)
  2533. if err != nil {
  2534. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, <nil>", err)
  2535. }
  2536. pt := reply.GetPayload().GetType()
  2537. ps := len(reply.GetPayload().GetBody())
  2538. if pt != testpb.PayloadType_COMPRESSABLE || ps != respSize {
  2539. t.Fatalf("Got the reply with type %d len %d; want %d, %d", pt, ps, testpb.PayloadType_COMPRESSABLE, respSize)
  2540. }
  2541. }
  2542. // Test backward-compatibility API for setting msg size limit.
  2543. func (s) TestExceedMsgLimit(t *testing.T) {
  2544. for _, e := range listTestEnv() {
  2545. testExceedMsgLimit(t, e)
  2546. }
  2547. }
  2548. func testExceedMsgLimit(t *testing.T, e env) {
  2549. te := newTest(t, e)
  2550. te.maxMsgSize = newInt(1024)
  2551. te.startServer(&testServer{security: e.security})
  2552. defer te.tearDown()
  2553. tc := testpb.NewTestServiceClient(te.clientConn())
  2554. argSize := int32(*te.maxMsgSize + 1)
  2555. const smallSize = 1
  2556. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2557. if err != nil {
  2558. t.Fatal(err)
  2559. }
  2560. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  2561. if err != nil {
  2562. t.Fatal(err)
  2563. }
  2564. // Test on server side for unary RPC.
  2565. req := &testpb.SimpleRequest{
  2566. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2567. ResponseSize: smallSize,
  2568. Payload: payload,
  2569. }
  2570. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  2571. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  2572. }
  2573. // Test on client side for unary RPC.
  2574. req.ResponseSize = int32(*te.maxMsgSize) + 1
  2575. req.Payload = smallPayload
  2576. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  2577. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  2578. }
  2579. // Test on server side for streaming RPC.
  2580. stream, err := tc.FullDuplexCall(te.ctx)
  2581. if err != nil {
  2582. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2583. }
  2584. respParam := []*testpb.ResponseParameters{
  2585. {
  2586. Size: 1,
  2587. },
  2588. }
  2589. spayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(*te.maxMsgSize+1))
  2590. if err != nil {
  2591. t.Fatal(err)
  2592. }
  2593. sreq := &testpb.StreamingOutputCallRequest{
  2594. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2595. ResponseParameters: respParam,
  2596. Payload: spayload,
  2597. }
  2598. if err := stream.Send(sreq); err != nil {
  2599. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  2600. }
  2601. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  2602. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  2603. }
  2604. // Test on client side for streaming RPC.
  2605. stream, err = tc.FullDuplexCall(te.ctx)
  2606. if err != nil {
  2607. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2608. }
  2609. respParam[0].Size = int32(*te.maxMsgSize) + 1
  2610. sreq.Payload = smallPayload
  2611. if err := stream.Send(sreq); err != nil {
  2612. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  2613. }
  2614. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  2615. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  2616. }
  2617. }
  2618. func (s) TestPeerClientSide(t *testing.T) {
  2619. for _, e := range listTestEnv() {
  2620. testPeerClientSide(t, e)
  2621. }
  2622. }
  2623. func testPeerClientSide(t *testing.T, e env) {
  2624. te := newTest(t, e)
  2625. te.userAgent = testAppUA
  2626. te.startServer(&testServer{security: e.security})
  2627. defer te.tearDown()
  2628. tc := testpb.NewTestServiceClient(te.clientConn())
  2629. peer := new(peer.Peer)
  2630. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.Peer(peer), grpc.WaitForReady(true)); err != nil {
  2631. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  2632. }
  2633. pa := peer.Addr.String()
  2634. if e.network == "unix" {
  2635. if pa != te.srvAddr {
  2636. t.Fatalf("peer.Addr = %v, want %v", pa, te.srvAddr)
  2637. }
  2638. return
  2639. }
  2640. _, pp, err := net.SplitHostPort(pa)
  2641. if err != nil {
  2642. t.Fatalf("Failed to parse address from peer.")
  2643. }
  2644. _, sp, err := net.SplitHostPort(te.srvAddr)
  2645. if err != nil {
  2646. t.Fatalf("Failed to parse address of test server.")
  2647. }
  2648. if pp != sp {
  2649. t.Fatalf("peer.Addr = localhost:%v, want localhost:%v", pp, sp)
  2650. }
  2651. }
  2652. // TestPeerNegative tests that if call fails setting peer
  2653. // doesn't cause a segmentation fault.
  2654. // issue#1141 https://github.com/grpc/grpc-go/issues/1141
  2655. func (s) TestPeerNegative(t *testing.T) {
  2656. for _, e := range listTestEnv() {
  2657. testPeerNegative(t, e)
  2658. }
  2659. }
  2660. func testPeerNegative(t *testing.T, e env) {
  2661. te := newTest(t, e)
  2662. te.startServer(&testServer{security: e.security})
  2663. defer te.tearDown()
  2664. cc := te.clientConn()
  2665. tc := testpb.NewTestServiceClient(cc)
  2666. peer := new(peer.Peer)
  2667. ctx, cancel := context.WithCancel(context.Background())
  2668. cancel()
  2669. tc.EmptyCall(ctx, &testpb.Empty{}, grpc.Peer(peer))
  2670. }
  2671. func (s) TestPeerFailedRPC(t *testing.T) {
  2672. for _, e := range listTestEnv() {
  2673. testPeerFailedRPC(t, e)
  2674. }
  2675. }
  2676. func testPeerFailedRPC(t *testing.T, e env) {
  2677. te := newTest(t, e)
  2678. te.maxServerReceiveMsgSize = newInt(1 * 1024)
  2679. te.startServer(&testServer{security: e.security})
  2680. defer te.tearDown()
  2681. tc := testpb.NewTestServiceClient(te.clientConn())
  2682. // first make a successful request to the server
  2683. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  2684. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  2685. }
  2686. // make a second request that will be rejected by the server
  2687. const largeSize = 5 * 1024
  2688. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  2689. if err != nil {
  2690. t.Fatal(err)
  2691. }
  2692. req := &testpb.SimpleRequest{
  2693. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2694. Payload: largePayload,
  2695. }
  2696. peer := new(peer.Peer)
  2697. if _, err := tc.UnaryCall(context.Background(), req, grpc.Peer(peer)); err == nil || status.Code(err) != codes.ResourceExhausted {
  2698. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  2699. } else {
  2700. pa := peer.Addr.String()
  2701. if e.network == "unix" {
  2702. if pa != te.srvAddr {
  2703. t.Fatalf("peer.Addr = %v, want %v", pa, te.srvAddr)
  2704. }
  2705. return
  2706. }
  2707. _, pp, err := net.SplitHostPort(pa)
  2708. if err != nil {
  2709. t.Fatalf("Failed to parse address from peer.")
  2710. }
  2711. _, sp, err := net.SplitHostPort(te.srvAddr)
  2712. if err != nil {
  2713. t.Fatalf("Failed to parse address of test server.")
  2714. }
  2715. if pp != sp {
  2716. t.Fatalf("peer.Addr = localhost:%v, want localhost:%v", pp, sp)
  2717. }
  2718. }
  2719. }
  2720. func (s) TestMetadataUnaryRPC(t *testing.T) {
  2721. for _, e := range listTestEnv() {
  2722. testMetadataUnaryRPC(t, e)
  2723. }
  2724. }
  2725. func testMetadataUnaryRPC(t *testing.T, e env) {
  2726. te := newTest(t, e)
  2727. te.startServer(&testServer{security: e.security})
  2728. defer te.tearDown()
  2729. tc := testpb.NewTestServiceClient(te.clientConn())
  2730. const argSize = 2718
  2731. const respSize = 314
  2732. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2733. if err != nil {
  2734. t.Fatal(err)
  2735. }
  2736. req := &testpb.SimpleRequest{
  2737. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2738. ResponseSize: respSize,
  2739. Payload: payload,
  2740. }
  2741. var header, trailer metadata.MD
  2742. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2743. if _, err := tc.UnaryCall(ctx, req, grpc.Header(&header), grpc.Trailer(&trailer)); err != nil {
  2744. t.Fatalf("TestService.UnaryCall(%v, _, _, _) = _, %v; want _, <nil>", ctx, err)
  2745. }
  2746. // Ignore optional response headers that Servers may set:
  2747. if header != nil {
  2748. delete(header, "trailer") // RFC 2616 says server SHOULD (but optional) declare trailers
  2749. delete(header, "date") // the Date header is also optional
  2750. delete(header, "user-agent")
  2751. delete(header, "content-type")
  2752. }
  2753. if !reflect.DeepEqual(header, testMetadata) {
  2754. t.Fatalf("Received header metadata %v, want %v", header, testMetadata)
  2755. }
  2756. if !reflect.DeepEqual(trailer, testTrailerMetadata) {
  2757. t.Fatalf("Received trailer metadata %v, want %v", trailer, testTrailerMetadata)
  2758. }
  2759. }
  2760. func (s) TestMultipleSetTrailerUnaryRPC(t *testing.T) {
  2761. for _, e := range listTestEnv() {
  2762. testMultipleSetTrailerUnaryRPC(t, e)
  2763. }
  2764. }
  2765. func testMultipleSetTrailerUnaryRPC(t *testing.T, e env) {
  2766. te := newTest(t, e)
  2767. te.startServer(&testServer{security: e.security, multipleSetTrailer: true})
  2768. defer te.tearDown()
  2769. tc := testpb.NewTestServiceClient(te.clientConn())
  2770. const (
  2771. argSize = 1
  2772. respSize = 1
  2773. )
  2774. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2775. if err != nil {
  2776. t.Fatal(err)
  2777. }
  2778. req := &testpb.SimpleRequest{
  2779. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2780. ResponseSize: respSize,
  2781. Payload: payload,
  2782. }
  2783. var trailer metadata.MD
  2784. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2785. if _, err := tc.UnaryCall(ctx, req, grpc.Trailer(&trailer), grpc.WaitForReady(true)); err != nil {
  2786. t.Fatalf("TestService.UnaryCall(%v, _, _, _) = _, %v; want _, <nil>", ctx, err)
  2787. }
  2788. expectedTrailer := metadata.Join(testTrailerMetadata, testTrailerMetadata2)
  2789. if !reflect.DeepEqual(trailer, expectedTrailer) {
  2790. t.Fatalf("Received trailer metadata %v, want %v", trailer, expectedTrailer)
  2791. }
  2792. }
  2793. func (s) TestMultipleSetTrailerStreamingRPC(t *testing.T) {
  2794. for _, e := range listTestEnv() {
  2795. testMultipleSetTrailerStreamingRPC(t, e)
  2796. }
  2797. }
  2798. func testMultipleSetTrailerStreamingRPC(t *testing.T, e env) {
  2799. te := newTest(t, e)
  2800. te.startServer(&testServer{security: e.security, multipleSetTrailer: true})
  2801. defer te.tearDown()
  2802. tc := testpb.NewTestServiceClient(te.clientConn())
  2803. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2804. stream, err := tc.FullDuplexCall(ctx, grpc.WaitForReady(true))
  2805. if err != nil {
  2806. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2807. }
  2808. if err := stream.CloseSend(); err != nil {
  2809. t.Fatalf("%v.CloseSend() got %v, want %v", stream, err, nil)
  2810. }
  2811. if _, err := stream.Recv(); err != io.EOF {
  2812. t.Fatalf("%v failed to complele the FullDuplexCall: %v", stream, err)
  2813. }
  2814. trailer := stream.Trailer()
  2815. expectedTrailer := metadata.Join(testTrailerMetadata, testTrailerMetadata2)
  2816. if !reflect.DeepEqual(trailer, expectedTrailer) {
  2817. t.Fatalf("Received trailer metadata %v, want %v", trailer, expectedTrailer)
  2818. }
  2819. }
  2820. func (s) TestSetAndSendHeaderUnaryRPC(t *testing.T) {
  2821. for _, e := range listTestEnv() {
  2822. if e.name == "handler-tls" {
  2823. continue
  2824. }
  2825. testSetAndSendHeaderUnaryRPC(t, e)
  2826. }
  2827. }
  2828. // To test header metadata is sent on SendHeader().
  2829. func testSetAndSendHeaderUnaryRPC(t *testing.T, e env) {
  2830. te := newTest(t, e)
  2831. te.startServer(&testServer{security: e.security, setAndSendHeader: true})
  2832. defer te.tearDown()
  2833. tc := testpb.NewTestServiceClient(te.clientConn())
  2834. const (
  2835. argSize = 1
  2836. respSize = 1
  2837. )
  2838. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2839. if err != nil {
  2840. t.Fatal(err)
  2841. }
  2842. req := &testpb.SimpleRequest{
  2843. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2844. ResponseSize: respSize,
  2845. Payload: payload,
  2846. }
  2847. var header metadata.MD
  2848. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2849. if _, err := tc.UnaryCall(ctx, req, grpc.Header(&header), grpc.WaitForReady(true)); err != nil {
  2850. t.Fatalf("TestService.UnaryCall(%v, _, _, _) = _, %v; want _, <nil>", ctx, err)
  2851. }
  2852. delete(header, "user-agent")
  2853. delete(header, "content-type")
  2854. expectedHeader := metadata.Join(testMetadata, testMetadata2)
  2855. if !reflect.DeepEqual(header, expectedHeader) {
  2856. t.Fatalf("Received header metadata %v, want %v", header, expectedHeader)
  2857. }
  2858. }
  2859. func (s) TestMultipleSetHeaderUnaryRPC(t *testing.T) {
  2860. for _, e := range listTestEnv() {
  2861. if e.name == "handler-tls" {
  2862. continue
  2863. }
  2864. testMultipleSetHeaderUnaryRPC(t, e)
  2865. }
  2866. }
  2867. // To test header metadata is sent when sending response.
  2868. func testMultipleSetHeaderUnaryRPC(t *testing.T, e env) {
  2869. te := newTest(t, e)
  2870. te.startServer(&testServer{security: e.security, setHeaderOnly: true})
  2871. defer te.tearDown()
  2872. tc := testpb.NewTestServiceClient(te.clientConn())
  2873. const (
  2874. argSize = 1
  2875. respSize = 1
  2876. )
  2877. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2878. if err != nil {
  2879. t.Fatal(err)
  2880. }
  2881. req := &testpb.SimpleRequest{
  2882. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2883. ResponseSize: respSize,
  2884. Payload: payload,
  2885. }
  2886. var header metadata.MD
  2887. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2888. if _, err := tc.UnaryCall(ctx, req, grpc.Header(&header), grpc.WaitForReady(true)); err != nil {
  2889. t.Fatalf("TestService.UnaryCall(%v, _, _, _) = _, %v; want _, <nil>", ctx, err)
  2890. }
  2891. delete(header, "user-agent")
  2892. delete(header, "content-type")
  2893. expectedHeader := metadata.Join(testMetadata, testMetadata2)
  2894. if !reflect.DeepEqual(header, expectedHeader) {
  2895. t.Fatalf("Received header metadata %v, want %v", header, expectedHeader)
  2896. }
  2897. }
  2898. func (s) TestMultipleSetHeaderUnaryRPCError(t *testing.T) {
  2899. for _, e := range listTestEnv() {
  2900. if e.name == "handler-tls" {
  2901. continue
  2902. }
  2903. testMultipleSetHeaderUnaryRPCError(t, e)
  2904. }
  2905. }
  2906. // To test header metadata is sent when sending status.
  2907. func testMultipleSetHeaderUnaryRPCError(t *testing.T, e env) {
  2908. te := newTest(t, e)
  2909. te.startServer(&testServer{security: e.security, setHeaderOnly: true})
  2910. defer te.tearDown()
  2911. tc := testpb.NewTestServiceClient(te.clientConn())
  2912. const (
  2913. argSize = 1
  2914. respSize = -1 // Invalid respSize to make RPC fail.
  2915. )
  2916. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2917. if err != nil {
  2918. t.Fatal(err)
  2919. }
  2920. req := &testpb.SimpleRequest{
  2921. ResponseType: testpb.PayloadType_COMPRESSABLE,
  2922. ResponseSize: respSize,
  2923. Payload: payload,
  2924. }
  2925. var header metadata.MD
  2926. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2927. if _, err := tc.UnaryCall(ctx, req, grpc.Header(&header), grpc.WaitForReady(true)); err == nil {
  2928. t.Fatalf("TestService.UnaryCall(%v, _, _, _) = _, %v; want _, <non-nil>", ctx, err)
  2929. }
  2930. delete(header, "user-agent")
  2931. delete(header, "content-type")
  2932. expectedHeader := metadata.Join(testMetadata, testMetadata2)
  2933. if !reflect.DeepEqual(header, expectedHeader) {
  2934. t.Fatalf("Received header metadata %v, want %v", header, expectedHeader)
  2935. }
  2936. }
  2937. func (s) TestSetAndSendHeaderStreamingRPC(t *testing.T) {
  2938. for _, e := range listTestEnv() {
  2939. if e.name == "handler-tls" {
  2940. continue
  2941. }
  2942. testSetAndSendHeaderStreamingRPC(t, e)
  2943. }
  2944. }
  2945. // To test header metadata is sent on SendHeader().
  2946. func testSetAndSendHeaderStreamingRPC(t *testing.T, e env) {
  2947. te := newTest(t, e)
  2948. te.startServer(&testServer{security: e.security, setAndSendHeader: true})
  2949. defer te.tearDown()
  2950. tc := testpb.NewTestServiceClient(te.clientConn())
  2951. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2952. stream, err := tc.FullDuplexCall(ctx)
  2953. if err != nil {
  2954. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2955. }
  2956. if err := stream.CloseSend(); err != nil {
  2957. t.Fatalf("%v.CloseSend() got %v, want %v", stream, err, nil)
  2958. }
  2959. if _, err := stream.Recv(); err != io.EOF {
  2960. t.Fatalf("%v failed to complele the FullDuplexCall: %v", stream, err)
  2961. }
  2962. header, err := stream.Header()
  2963. if err != nil {
  2964. t.Fatalf("%v.Header() = _, %v, want _, <nil>", stream, err)
  2965. }
  2966. delete(header, "user-agent")
  2967. delete(header, "content-type")
  2968. expectedHeader := metadata.Join(testMetadata, testMetadata2)
  2969. if !reflect.DeepEqual(header, expectedHeader) {
  2970. t.Fatalf("Received header metadata %v, want %v", header, expectedHeader)
  2971. }
  2972. }
  2973. func (s) TestMultipleSetHeaderStreamingRPC(t *testing.T) {
  2974. for _, e := range listTestEnv() {
  2975. if e.name == "handler-tls" {
  2976. continue
  2977. }
  2978. testMultipleSetHeaderStreamingRPC(t, e)
  2979. }
  2980. }
  2981. // To test header metadata is sent when sending response.
  2982. func testMultipleSetHeaderStreamingRPC(t *testing.T, e env) {
  2983. te := newTest(t, e)
  2984. te.startServer(&testServer{security: e.security, setHeaderOnly: true})
  2985. defer te.tearDown()
  2986. tc := testpb.NewTestServiceClient(te.clientConn())
  2987. const (
  2988. argSize = 1
  2989. respSize = 1
  2990. )
  2991. ctx := metadata.NewOutgoingContext(context.Background(), testMetadata)
  2992. stream, err := tc.FullDuplexCall(ctx)
  2993. if err != nil {
  2994. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  2995. }
  2996. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  2997. if err != nil {
  2998. t.Fatal(err)
  2999. }
  3000. req := &testpb.StreamingOutputCallRequest{
  3001. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3002. ResponseParameters: []*testpb.ResponseParameters{
  3003. {Size: respSize},
  3004. },
  3005. Payload: payload,
  3006. }
  3007. if err := stream.Send(req); err != nil {
  3008. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  3009. }
  3010. if _, err := stream.Recv(); err != nil {
  3011. t.Fatalf("%v.Recv() = %v, want <nil>", stream, err)
  3012. }
  3013. if err := stream.CloseSend(); err != nil {
  3014. t.Fatalf("%v.CloseSend() got %v, want %v", stream, err, nil)
  3015. }
  3016. if _, err := stream.Recv(); err != io.EOF {
  3017. t.Fatalf("%v failed to complele the FullDuplexCall: %v", stream, err)
  3018. }
  3019. header, err := stream.Header()
  3020. if err != nil {
  3021. t.Fatalf("%v.Header() = _, %v, want _, <nil>", stream, err)
  3022. }
  3023. delete(header, "user-agent")
  3024. delete(header, "content-type")
  3025. expectedHeader := metadata.Join(testMetadata, testMetadata2)
  3026. if !reflect.DeepEqual(header, expectedHeader) {
  3027. t.Fatalf("Received header metadata %v, want %v", header, expectedHeader)
  3028. }
  3029. }
  3030. func (s) TestMultipleSetHeaderStreamingRPCError(t *testing.T) {
  3031. for _, e := range listTestEnv() {
  3032. if e.name == "handler-tls" {
  3033. continue
  3034. }
  3035. testMultipleSetHeaderStreamingRPCError(t, e)
  3036. }
  3037. }
  3038. // To test header metadata is sent when sending status.
  3039. func testMultipleSetHeaderStreamingRPCError(t *testing.T, e env) {
  3040. te := newTest(t, e)
  3041. te.startServer(&testServer{security: e.security, setHeaderOnly: true})
  3042. defer te.tearDown()
  3043. tc := testpb.NewTestServiceClient(te.clientConn())
  3044. const (
  3045. argSize = 1
  3046. respSize = -1
  3047. )
  3048. ctx, cancel := context.WithCancel(context.Background())
  3049. defer cancel()
  3050. ctx = metadata.NewOutgoingContext(ctx, testMetadata)
  3051. stream, err := tc.FullDuplexCall(ctx)
  3052. if err != nil {
  3053. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  3054. }
  3055. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  3056. if err != nil {
  3057. t.Fatal(err)
  3058. }
  3059. req := &testpb.StreamingOutputCallRequest{
  3060. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3061. ResponseParameters: []*testpb.ResponseParameters{
  3062. {Size: respSize},
  3063. },
  3064. Payload: payload,
  3065. }
  3066. if err := stream.Send(req); err != nil {
  3067. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  3068. }
  3069. if _, err := stream.Recv(); err == nil {
  3070. t.Fatalf("%v.Recv() = %v, want <non-nil>", stream, err)
  3071. }
  3072. header, err := stream.Header()
  3073. if err != nil {
  3074. t.Fatalf("%v.Header() = _, %v, want _, <nil>", stream, err)
  3075. }
  3076. delete(header, "user-agent")
  3077. delete(header, "content-type")
  3078. expectedHeader := metadata.Join(testMetadata, testMetadata2)
  3079. if !reflect.DeepEqual(header, expectedHeader) {
  3080. t.Fatalf("Received header metadata %v, want %v", header, expectedHeader)
  3081. }
  3082. if err := stream.CloseSend(); err != nil {
  3083. t.Fatalf("%v.CloseSend() got %v, want %v", stream, err, nil)
  3084. }
  3085. }
  3086. // TestMalformedHTTP2Metedata verfies the returned error when the client
  3087. // sends an illegal metadata.
  3088. func (s) TestMalformedHTTP2Metadata(t *testing.T) {
  3089. for _, e := range listTestEnv() {
  3090. if e.name == "handler-tls" {
  3091. // Failed with "server stops accepting new RPCs".
  3092. // Server stops accepting new RPCs when the client sends an illegal http2 header.
  3093. continue
  3094. }
  3095. testMalformedHTTP2Metadata(t, e)
  3096. }
  3097. }
  3098. func testMalformedHTTP2Metadata(t *testing.T, e env) {
  3099. te := newTest(t, e)
  3100. te.startServer(&testServer{security: e.security})
  3101. defer te.tearDown()
  3102. tc := testpb.NewTestServiceClient(te.clientConn())
  3103. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 2718)
  3104. if err != nil {
  3105. t.Fatal(err)
  3106. }
  3107. req := &testpb.SimpleRequest{
  3108. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3109. ResponseSize: 314,
  3110. Payload: payload,
  3111. }
  3112. ctx := metadata.NewOutgoingContext(context.Background(), malformedHTTP2Metadata)
  3113. if _, err := tc.UnaryCall(ctx, req); status.Code(err) != codes.Internal {
  3114. t.Fatalf("TestService.UnaryCall(%v, _) = _, %v; want _, %s", ctx, err, codes.Internal)
  3115. }
  3116. }
  3117. func (s) TestTransparentRetry(t *testing.T) {
  3118. for _, e := range listTestEnv() {
  3119. if e.name == "handler-tls" {
  3120. // Fails with RST_STREAM / FLOW_CONTROL_ERROR
  3121. continue
  3122. }
  3123. testTransparentRetry(t, e)
  3124. }
  3125. }
  3126. // This test makes sure RPCs are retried times when they receive a RST_STREAM
  3127. // with the REFUSED_STREAM error code, which the InTapHandle provokes.
  3128. func testTransparentRetry(t *testing.T, e env) {
  3129. te := newTest(t, e)
  3130. attempts := 0
  3131. successAttempt := 2
  3132. te.tapHandle = func(ctx context.Context, _ *tap.Info) (context.Context, error) {
  3133. attempts++
  3134. if attempts < successAttempt {
  3135. return nil, errors.New("not now")
  3136. }
  3137. return ctx, nil
  3138. }
  3139. te.startServer(&testServer{security: e.security})
  3140. defer te.tearDown()
  3141. cc := te.clientConn()
  3142. tsc := testpb.NewTestServiceClient(cc)
  3143. testCases := []struct {
  3144. successAttempt int
  3145. failFast bool
  3146. errCode codes.Code
  3147. }{{
  3148. successAttempt: 1,
  3149. }, {
  3150. successAttempt: 2,
  3151. }, {
  3152. successAttempt: 3,
  3153. errCode: codes.Unavailable,
  3154. }, {
  3155. successAttempt: 1,
  3156. failFast: true,
  3157. }, {
  3158. successAttempt: 2,
  3159. failFast: true,
  3160. errCode: codes.Unavailable, // We won't retry on fail fast.
  3161. }}
  3162. for _, tc := range testCases {
  3163. attempts = 0
  3164. successAttempt = tc.successAttempt
  3165. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  3166. _, err := tsc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(!tc.failFast))
  3167. cancel()
  3168. if status.Code(err) != tc.errCode {
  3169. t.Errorf("%+v: tsc.EmptyCall(_, _) = _, %v, want _, Code=%v", tc, err, tc.errCode)
  3170. }
  3171. }
  3172. }
  3173. func (s) TestCancel(t *testing.T) {
  3174. for _, e := range listTestEnv() {
  3175. testCancel(t, e)
  3176. }
  3177. }
  3178. func testCancel(t *testing.T, e env) {
  3179. te := newTest(t, e)
  3180. te.declareLogNoise("grpc: the client connection is closing; please retry")
  3181. te.startServer(&testServer{security: e.security, unaryCallSleepTime: time.Second})
  3182. defer te.tearDown()
  3183. cc := te.clientConn()
  3184. tc := testpb.NewTestServiceClient(cc)
  3185. const argSize = 2718
  3186. const respSize = 314
  3187. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  3188. if err != nil {
  3189. t.Fatal(err)
  3190. }
  3191. req := &testpb.SimpleRequest{
  3192. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3193. ResponseSize: respSize,
  3194. Payload: payload,
  3195. }
  3196. ctx, cancel := context.WithCancel(context.Background())
  3197. time.AfterFunc(1*time.Millisecond, cancel)
  3198. if r, err := tc.UnaryCall(ctx, req); status.Code(err) != codes.Canceled {
  3199. t.Fatalf("TestService/UnaryCall(_, _) = %v, %v; want _, error code: %s", r, err, codes.Canceled)
  3200. }
  3201. awaitNewConnLogOutput()
  3202. }
  3203. func (s) TestCancelNoIO(t *testing.T) {
  3204. for _, e := range listTestEnv() {
  3205. testCancelNoIO(t, e)
  3206. }
  3207. }
  3208. func testCancelNoIO(t *testing.T, e env) {
  3209. te := newTest(t, e)
  3210. te.declareLogNoise("http2Client.notifyError got notified that the client transport was broken")
  3211. te.maxStream = 1 // Only allows 1 live stream per server transport.
  3212. te.startServer(&testServer{security: e.security})
  3213. defer te.tearDown()
  3214. cc := te.clientConn()
  3215. tc := testpb.NewTestServiceClient(cc)
  3216. // Start one blocked RPC for which we'll never send streaming
  3217. // input. This will consume the 1 maximum concurrent streams,
  3218. // causing future RPCs to hang.
  3219. ctx, cancelFirst := context.WithCancel(context.Background())
  3220. _, err := tc.StreamingInputCall(ctx)
  3221. if err != nil {
  3222. t.Fatalf("%v.StreamingInputCall(_) = _, %v, want _, <nil>", tc, err)
  3223. }
  3224. // Loop until the ClientConn receives the initial settings
  3225. // frame from the server, notifying it about the maximum
  3226. // concurrent streams. We know when it's received it because
  3227. // an RPC will fail with codes.DeadlineExceeded instead of
  3228. // succeeding.
  3229. // TODO(bradfitz): add internal test hook for this (Issue 534)
  3230. for {
  3231. ctx, cancelSecond := context.WithTimeout(context.Background(), 50*time.Millisecond)
  3232. _, err := tc.StreamingInputCall(ctx)
  3233. cancelSecond()
  3234. if err == nil {
  3235. continue
  3236. }
  3237. if status.Code(err) == codes.DeadlineExceeded {
  3238. break
  3239. }
  3240. t.Fatalf("%v.StreamingInputCall(_) = _, %v, want _, %s", tc, err, codes.DeadlineExceeded)
  3241. }
  3242. // If there are any RPCs in flight before the client receives
  3243. // the max streams setting, let them be expired.
  3244. // TODO(bradfitz): add internal test hook for this (Issue 534)
  3245. time.Sleep(50 * time.Millisecond)
  3246. go func() {
  3247. time.Sleep(50 * time.Millisecond)
  3248. cancelFirst()
  3249. }()
  3250. // This should be blocked until the 1st is canceled, then succeed.
  3251. ctx, cancelThird := context.WithTimeout(context.Background(), 500*time.Millisecond)
  3252. if _, err := tc.StreamingInputCall(ctx); err != nil {
  3253. t.Errorf("%v.StreamingInputCall(_) = _, %v, want _, <nil>", tc, err)
  3254. }
  3255. cancelThird()
  3256. }
  3257. // The following tests the gRPC streaming RPC implementations.
  3258. // TODO(zhaoq): Have better coverage on error cases.
  3259. var (
  3260. reqSizes = []int{27182, 8, 1828, 45904}
  3261. respSizes = []int{31415, 9, 2653, 58979}
  3262. )
  3263. func (s) TestNoService(t *testing.T) {
  3264. for _, e := range listTestEnv() {
  3265. testNoService(t, e)
  3266. }
  3267. }
  3268. func testNoService(t *testing.T, e env) {
  3269. te := newTest(t, e)
  3270. te.startServer(nil)
  3271. defer te.tearDown()
  3272. cc := te.clientConn()
  3273. tc := testpb.NewTestServiceClient(cc)
  3274. stream, err := tc.FullDuplexCall(te.ctx, grpc.WaitForReady(true))
  3275. if err != nil {
  3276. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  3277. }
  3278. if _, err := stream.Recv(); status.Code(err) != codes.Unimplemented {
  3279. t.Fatalf("stream.Recv() = _, %v, want _, error code %s", err, codes.Unimplemented)
  3280. }
  3281. }
  3282. func (s) TestPingPong(t *testing.T) {
  3283. for _, e := range listTestEnv() {
  3284. testPingPong(t, e)
  3285. }
  3286. }
  3287. func testPingPong(t *testing.T, e env) {
  3288. te := newTest(t, e)
  3289. te.startServer(&testServer{security: e.security})
  3290. defer te.tearDown()
  3291. tc := testpb.NewTestServiceClient(te.clientConn())
  3292. stream, err := tc.FullDuplexCall(te.ctx)
  3293. if err != nil {
  3294. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  3295. }
  3296. var index int
  3297. for index < len(reqSizes) {
  3298. respParam := []*testpb.ResponseParameters{
  3299. {
  3300. Size: int32(respSizes[index]),
  3301. },
  3302. }
  3303. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(reqSizes[index]))
  3304. if err != nil {
  3305. t.Fatal(err)
  3306. }
  3307. req := &testpb.StreamingOutputCallRequest{
  3308. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3309. ResponseParameters: respParam,
  3310. Payload: payload,
  3311. }
  3312. if err := stream.Send(req); err != nil {
  3313. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  3314. }
  3315. reply, err := stream.Recv()
  3316. if err != nil {
  3317. t.Fatalf("%v.Recv() = %v, want <nil>", stream, err)
  3318. }
  3319. pt := reply.GetPayload().GetType()
  3320. if pt != testpb.PayloadType_COMPRESSABLE {
  3321. t.Fatalf("Got the reply of type %d, want %d", pt, testpb.PayloadType_COMPRESSABLE)
  3322. }
  3323. size := len(reply.GetPayload().GetBody())
  3324. if size != int(respSizes[index]) {
  3325. t.Fatalf("Got reply body of length %d, want %d", size, respSizes[index])
  3326. }
  3327. index++
  3328. }
  3329. if err := stream.CloseSend(); err != nil {
  3330. t.Fatalf("%v.CloseSend() got %v, want %v", stream, err, nil)
  3331. }
  3332. if _, err := stream.Recv(); err != io.EOF {
  3333. t.Fatalf("%v failed to complele the ping pong test: %v", stream, err)
  3334. }
  3335. }
  3336. func (s) TestMetadataStreamingRPC(t *testing.T) {
  3337. for _, e := range listTestEnv() {
  3338. testMetadataStreamingRPC(t, e)
  3339. }
  3340. }
  3341. func testMetadataStreamingRPC(t *testing.T, e env) {
  3342. te := newTest(t, e)
  3343. te.startServer(&testServer{security: e.security})
  3344. defer te.tearDown()
  3345. tc := testpb.NewTestServiceClient(te.clientConn())
  3346. ctx := metadata.NewOutgoingContext(te.ctx, testMetadata)
  3347. stream, err := tc.FullDuplexCall(ctx)
  3348. if err != nil {
  3349. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  3350. }
  3351. go func() {
  3352. headerMD, err := stream.Header()
  3353. if e.security == "tls" {
  3354. delete(headerMD, "transport_security_type")
  3355. }
  3356. delete(headerMD, "trailer") // ignore if present
  3357. delete(headerMD, "user-agent")
  3358. delete(headerMD, "content-type")
  3359. if err != nil || !reflect.DeepEqual(testMetadata, headerMD) {
  3360. t.Errorf("#1 %v.Header() = %v, %v, want %v, <nil>", stream, headerMD, err, testMetadata)
  3361. }
  3362. // test the cached value.
  3363. headerMD, err = stream.Header()
  3364. delete(headerMD, "trailer") // ignore if present
  3365. delete(headerMD, "user-agent")
  3366. delete(headerMD, "content-type")
  3367. if err != nil || !reflect.DeepEqual(testMetadata, headerMD) {
  3368. t.Errorf("#2 %v.Header() = %v, %v, want %v, <nil>", stream, headerMD, err, testMetadata)
  3369. }
  3370. err = func() error {
  3371. for index := 0; index < len(reqSizes); index++ {
  3372. respParam := []*testpb.ResponseParameters{
  3373. {
  3374. Size: int32(respSizes[index]),
  3375. },
  3376. }
  3377. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(reqSizes[index]))
  3378. if err != nil {
  3379. return err
  3380. }
  3381. req := &testpb.StreamingOutputCallRequest{
  3382. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3383. ResponseParameters: respParam,
  3384. Payload: payload,
  3385. }
  3386. if err := stream.Send(req); err != nil {
  3387. return fmt.Errorf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  3388. }
  3389. }
  3390. return nil
  3391. }()
  3392. // Tell the server we're done sending args.
  3393. stream.CloseSend()
  3394. if err != nil {
  3395. t.Error(err)
  3396. }
  3397. }()
  3398. for {
  3399. if _, err := stream.Recv(); err != nil {
  3400. break
  3401. }
  3402. }
  3403. trailerMD := stream.Trailer()
  3404. if !reflect.DeepEqual(testTrailerMetadata, trailerMD) {
  3405. t.Fatalf("%v.Trailer() = %v, want %v", stream, trailerMD, testTrailerMetadata)
  3406. }
  3407. }
  3408. func (s) TestServerStreaming(t *testing.T) {
  3409. for _, e := range listTestEnv() {
  3410. testServerStreaming(t, e)
  3411. }
  3412. }
  3413. func testServerStreaming(t *testing.T, e env) {
  3414. te := newTest(t, e)
  3415. te.startServer(&testServer{security: e.security})
  3416. defer te.tearDown()
  3417. tc := testpb.NewTestServiceClient(te.clientConn())
  3418. respParam := make([]*testpb.ResponseParameters, len(respSizes))
  3419. for i, s := range respSizes {
  3420. respParam[i] = &testpb.ResponseParameters{
  3421. Size: int32(s),
  3422. }
  3423. }
  3424. req := &testpb.StreamingOutputCallRequest{
  3425. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3426. ResponseParameters: respParam,
  3427. }
  3428. stream, err := tc.StreamingOutputCall(context.Background(), req)
  3429. if err != nil {
  3430. t.Fatalf("%v.StreamingOutputCall(_) = _, %v, want <nil>", tc, err)
  3431. }
  3432. var rpcStatus error
  3433. var respCnt int
  3434. var index int
  3435. for {
  3436. reply, err := stream.Recv()
  3437. if err != nil {
  3438. rpcStatus = err
  3439. break
  3440. }
  3441. pt := reply.GetPayload().GetType()
  3442. if pt != testpb.PayloadType_COMPRESSABLE {
  3443. t.Fatalf("Got the reply of type %d, want %d", pt, testpb.PayloadType_COMPRESSABLE)
  3444. }
  3445. size := len(reply.GetPayload().GetBody())
  3446. if size != int(respSizes[index]) {
  3447. t.Fatalf("Got reply body of length %d, want %d", size, respSizes[index])
  3448. }
  3449. index++
  3450. respCnt++
  3451. }
  3452. if rpcStatus != io.EOF {
  3453. t.Fatalf("Failed to finish the server streaming rpc: %v, want <EOF>", rpcStatus)
  3454. }
  3455. if respCnt != len(respSizes) {
  3456. t.Fatalf("Got %d reply, want %d", len(respSizes), respCnt)
  3457. }
  3458. }
  3459. func (s) TestFailedServerStreaming(t *testing.T) {
  3460. for _, e := range listTestEnv() {
  3461. testFailedServerStreaming(t, e)
  3462. }
  3463. }
  3464. func testFailedServerStreaming(t *testing.T, e env) {
  3465. te := newTest(t, e)
  3466. te.userAgent = failAppUA
  3467. te.startServer(&testServer{security: e.security})
  3468. defer te.tearDown()
  3469. tc := testpb.NewTestServiceClient(te.clientConn())
  3470. respParam := make([]*testpb.ResponseParameters, len(respSizes))
  3471. for i, s := range respSizes {
  3472. respParam[i] = &testpb.ResponseParameters{
  3473. Size: int32(s),
  3474. }
  3475. }
  3476. req := &testpb.StreamingOutputCallRequest{
  3477. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3478. ResponseParameters: respParam,
  3479. }
  3480. ctx := metadata.NewOutgoingContext(te.ctx, testMetadata)
  3481. stream, err := tc.StreamingOutputCall(ctx, req)
  3482. if err != nil {
  3483. t.Fatalf("%v.StreamingOutputCall(_) = _, %v, want <nil>", tc, err)
  3484. }
  3485. wantErr := status.Error(codes.DataLoss, "error for testing: "+failAppUA)
  3486. if _, err := stream.Recv(); !reflect.DeepEqual(err, wantErr) {
  3487. t.Fatalf("%v.Recv() = _, %v, want _, %v", stream, err, wantErr)
  3488. }
  3489. }
  3490. // concurrentSendServer is a TestServiceServer whose
  3491. // StreamingOutputCall makes ten serial Send calls, sending payloads
  3492. // "0".."9", inclusive. TestServerStreamingConcurrent verifies they
  3493. // were received in the correct order, and that there were no races.
  3494. //
  3495. // All other TestServiceServer methods crash if called.
  3496. type concurrentSendServer struct {
  3497. testpb.TestServiceServer
  3498. }
  3499. func (s concurrentSendServer) StreamingOutputCall(args *testpb.StreamingOutputCallRequest, stream testpb.TestService_StreamingOutputCallServer) error {
  3500. for i := 0; i < 10; i++ {
  3501. stream.Send(&testpb.StreamingOutputCallResponse{
  3502. Payload: &testpb.Payload{
  3503. Body: []byte{'0' + uint8(i)},
  3504. },
  3505. })
  3506. }
  3507. return nil
  3508. }
  3509. // Tests doing a bunch of concurrent streaming output calls.
  3510. func (s) TestServerStreamingConcurrent(t *testing.T) {
  3511. for _, e := range listTestEnv() {
  3512. testServerStreamingConcurrent(t, e)
  3513. }
  3514. }
  3515. func testServerStreamingConcurrent(t *testing.T, e env) {
  3516. te := newTest(t, e)
  3517. te.startServer(concurrentSendServer{})
  3518. defer te.tearDown()
  3519. cc := te.clientConn()
  3520. tc := testpb.NewTestServiceClient(cc)
  3521. doStreamingCall := func() {
  3522. req := &testpb.StreamingOutputCallRequest{}
  3523. stream, err := tc.StreamingOutputCall(context.Background(), req)
  3524. if err != nil {
  3525. t.Errorf("%v.StreamingOutputCall(_) = _, %v, want <nil>", tc, err)
  3526. return
  3527. }
  3528. var ngot int
  3529. var buf bytes.Buffer
  3530. for {
  3531. reply, err := stream.Recv()
  3532. if err == io.EOF {
  3533. break
  3534. }
  3535. if err != nil {
  3536. t.Fatal(err)
  3537. }
  3538. ngot++
  3539. if buf.Len() > 0 {
  3540. buf.WriteByte(',')
  3541. }
  3542. buf.Write(reply.GetPayload().GetBody())
  3543. }
  3544. if want := 10; ngot != want {
  3545. t.Errorf("Got %d replies, want %d", ngot, want)
  3546. }
  3547. if got, want := buf.String(), "0,1,2,3,4,5,6,7,8,9"; got != want {
  3548. t.Errorf("Got replies %q; want %q", got, want)
  3549. }
  3550. }
  3551. var wg sync.WaitGroup
  3552. for i := 0; i < 20; i++ {
  3553. wg.Add(1)
  3554. go func() {
  3555. defer wg.Done()
  3556. doStreamingCall()
  3557. }()
  3558. }
  3559. wg.Wait()
  3560. }
  3561. func generatePayloadSizes() [][]int {
  3562. reqSizes := [][]int{
  3563. {27182, 8, 1828, 45904},
  3564. }
  3565. num8KPayloads := 1024
  3566. eightKPayloads := []int{}
  3567. for i := 0; i < num8KPayloads; i++ {
  3568. eightKPayloads = append(eightKPayloads, (1 << 13))
  3569. }
  3570. reqSizes = append(reqSizes, eightKPayloads)
  3571. num2MPayloads := 8
  3572. twoMPayloads := []int{}
  3573. for i := 0; i < num2MPayloads; i++ {
  3574. twoMPayloads = append(twoMPayloads, (1 << 21))
  3575. }
  3576. reqSizes = append(reqSizes, twoMPayloads)
  3577. return reqSizes
  3578. }
  3579. func (s) TestClientStreaming(t *testing.T) {
  3580. for _, s := range generatePayloadSizes() {
  3581. for _, e := range listTestEnv() {
  3582. testClientStreaming(t, e, s)
  3583. }
  3584. }
  3585. }
  3586. func testClientStreaming(t *testing.T, e env, sizes []int) {
  3587. te := newTest(t, e)
  3588. te.startServer(&testServer{security: e.security})
  3589. defer te.tearDown()
  3590. tc := testpb.NewTestServiceClient(te.clientConn())
  3591. ctx, cancel := context.WithTimeout(te.ctx, time.Second*30)
  3592. defer cancel()
  3593. stream, err := tc.StreamingInputCall(ctx)
  3594. if err != nil {
  3595. t.Fatalf("%v.StreamingInputCall(_) = _, %v, want <nil>", tc, err)
  3596. }
  3597. var sum int
  3598. for _, s := range sizes {
  3599. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(s))
  3600. if err != nil {
  3601. t.Fatal(err)
  3602. }
  3603. req := &testpb.StreamingInputCallRequest{
  3604. Payload: payload,
  3605. }
  3606. if err := stream.Send(req); err != nil {
  3607. t.Fatalf("%v.Send(_) = %v, want <nil>", stream, err)
  3608. }
  3609. sum += s
  3610. }
  3611. reply, err := stream.CloseAndRecv()
  3612. if err != nil {
  3613. t.Fatalf("%v.CloseAndRecv() got error %v, want %v", stream, err, nil)
  3614. }
  3615. if reply.GetAggregatedPayloadSize() != int32(sum) {
  3616. t.Fatalf("%v.CloseAndRecv().GetAggregatePayloadSize() = %v; want %v", stream, reply.GetAggregatedPayloadSize(), sum)
  3617. }
  3618. }
  3619. func (s) TestClientStreamingError(t *testing.T) {
  3620. for _, e := range listTestEnv() {
  3621. if e.name == "handler-tls" {
  3622. continue
  3623. }
  3624. testClientStreamingError(t, e)
  3625. }
  3626. }
  3627. func testClientStreamingError(t *testing.T, e env) {
  3628. te := newTest(t, e)
  3629. te.startServer(&testServer{security: e.security, earlyFail: true})
  3630. defer te.tearDown()
  3631. tc := testpb.NewTestServiceClient(te.clientConn())
  3632. stream, err := tc.StreamingInputCall(te.ctx)
  3633. if err != nil {
  3634. t.Fatalf("%v.StreamingInputCall(_) = _, %v, want <nil>", tc, err)
  3635. }
  3636. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 1)
  3637. if err != nil {
  3638. t.Fatal(err)
  3639. }
  3640. req := &testpb.StreamingInputCallRequest{
  3641. Payload: payload,
  3642. }
  3643. // The 1st request should go through.
  3644. if err := stream.Send(req); err != nil {
  3645. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  3646. }
  3647. for {
  3648. if err := stream.Send(req); err != io.EOF {
  3649. continue
  3650. }
  3651. if _, err := stream.CloseAndRecv(); status.Code(err) != codes.NotFound {
  3652. t.Fatalf("%v.CloseAndRecv() = %v, want error %s", stream, err, codes.NotFound)
  3653. }
  3654. break
  3655. }
  3656. }
  3657. func (s) TestExceedMaxStreamsLimit(t *testing.T) {
  3658. for _, e := range listTestEnv() {
  3659. testExceedMaxStreamsLimit(t, e)
  3660. }
  3661. }
  3662. func testExceedMaxStreamsLimit(t *testing.T, e env) {
  3663. te := newTest(t, e)
  3664. te.declareLogNoise(
  3665. "http2Client.notifyError got notified that the client transport was broken",
  3666. "Conn.resetTransport failed to create client transport",
  3667. "grpc: the connection is closing",
  3668. )
  3669. te.maxStream = 1 // Only allows 1 live stream per server transport.
  3670. te.startServer(&testServer{security: e.security})
  3671. defer te.tearDown()
  3672. cc := te.clientConn()
  3673. tc := testpb.NewTestServiceClient(cc)
  3674. _, err := tc.StreamingInputCall(te.ctx)
  3675. if err != nil {
  3676. t.Fatalf("%v.StreamingInputCall(_) = _, %v, want _, <nil>", tc, err)
  3677. }
  3678. // Loop until receiving the new max stream setting from the server.
  3679. for {
  3680. ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
  3681. defer cancel()
  3682. _, err := tc.StreamingInputCall(ctx)
  3683. if err == nil {
  3684. time.Sleep(50 * time.Millisecond)
  3685. continue
  3686. }
  3687. if status.Code(err) == codes.DeadlineExceeded {
  3688. break
  3689. }
  3690. t.Fatalf("%v.StreamingInputCall(_) = _, %v, want _, %s", tc, err, codes.DeadlineExceeded)
  3691. }
  3692. }
  3693. func (s) TestStreamsQuotaRecovery(t *testing.T) {
  3694. for _, e := range listTestEnv() {
  3695. testStreamsQuotaRecovery(t, e)
  3696. }
  3697. }
  3698. func testStreamsQuotaRecovery(t *testing.T, e env) {
  3699. te := newTest(t, e)
  3700. te.declareLogNoise(
  3701. "http2Client.notifyError got notified that the client transport was broken",
  3702. "Conn.resetTransport failed to create client transport",
  3703. "grpc: the connection is closing",
  3704. )
  3705. te.maxStream = 1 // Allows 1 live stream.
  3706. te.startServer(&testServer{security: e.security})
  3707. defer te.tearDown()
  3708. cc := te.clientConn()
  3709. tc := testpb.NewTestServiceClient(cc)
  3710. ctx, cancel := context.WithCancel(context.Background())
  3711. defer cancel()
  3712. if _, err := tc.StreamingInputCall(ctx); err != nil {
  3713. t.Fatalf("tc.StreamingInputCall(_) = _, %v, want _, <nil>", err)
  3714. }
  3715. // Loop until the new max stream setting is effective.
  3716. for {
  3717. ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
  3718. _, err := tc.StreamingInputCall(ctx)
  3719. cancel()
  3720. if err == nil {
  3721. time.Sleep(5 * time.Millisecond)
  3722. continue
  3723. }
  3724. if status.Code(err) == codes.DeadlineExceeded {
  3725. break
  3726. }
  3727. t.Fatalf("tc.StreamingInputCall(_) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  3728. }
  3729. var wg sync.WaitGroup
  3730. for i := 0; i < 10; i++ {
  3731. wg.Add(1)
  3732. go func() {
  3733. defer wg.Done()
  3734. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 314)
  3735. if err != nil {
  3736. t.Error(err)
  3737. return
  3738. }
  3739. req := &testpb.SimpleRequest{
  3740. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3741. ResponseSize: 1592,
  3742. Payload: payload,
  3743. }
  3744. // No rpc should go through due to the max streams limit.
  3745. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Millisecond)
  3746. defer cancel()
  3747. if _, err := tc.UnaryCall(ctx, req, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  3748. t.Errorf("tc.UnaryCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  3749. }
  3750. }()
  3751. }
  3752. wg.Wait()
  3753. cancel()
  3754. // A new stream should be allowed after canceling the first one.
  3755. ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
  3756. defer cancel()
  3757. if _, err := tc.StreamingInputCall(ctx); err != nil {
  3758. t.Fatalf("tc.StreamingInputCall(_) = _, %v, want _, %v", err, nil)
  3759. }
  3760. }
  3761. func (s) TestCompressServerHasNoSupport(t *testing.T) {
  3762. for _, e := range listTestEnv() {
  3763. testCompressServerHasNoSupport(t, e)
  3764. }
  3765. }
  3766. func testCompressServerHasNoSupport(t *testing.T, e env) {
  3767. te := newTest(t, e)
  3768. te.serverCompression = false
  3769. te.clientCompression = false
  3770. te.clientNopCompression = true
  3771. te.startServer(&testServer{security: e.security})
  3772. defer te.tearDown()
  3773. tc := testpb.NewTestServiceClient(te.clientConn())
  3774. const argSize = 271828
  3775. const respSize = 314159
  3776. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  3777. if err != nil {
  3778. t.Fatal(err)
  3779. }
  3780. req := &testpb.SimpleRequest{
  3781. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3782. ResponseSize: respSize,
  3783. Payload: payload,
  3784. }
  3785. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.Unimplemented {
  3786. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code %s", err, codes.Unimplemented)
  3787. }
  3788. // Streaming RPC
  3789. stream, err := tc.FullDuplexCall(context.Background())
  3790. if err != nil {
  3791. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  3792. }
  3793. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.Unimplemented {
  3794. t.Fatalf("%v.Recv() = %v, want error code %s", stream, err, codes.Unimplemented)
  3795. }
  3796. }
  3797. func (s) TestCompressOK(t *testing.T) {
  3798. for _, e := range listTestEnv() {
  3799. testCompressOK(t, e)
  3800. }
  3801. }
  3802. func testCompressOK(t *testing.T, e env) {
  3803. te := newTest(t, e)
  3804. te.serverCompression = true
  3805. te.clientCompression = true
  3806. te.startServer(&testServer{security: e.security})
  3807. defer te.tearDown()
  3808. tc := testpb.NewTestServiceClient(te.clientConn())
  3809. // Unary call
  3810. const argSize = 271828
  3811. const respSize = 314159
  3812. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  3813. if err != nil {
  3814. t.Fatal(err)
  3815. }
  3816. req := &testpb.SimpleRequest{
  3817. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3818. ResponseSize: respSize,
  3819. Payload: payload,
  3820. }
  3821. ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("something", "something"))
  3822. if _, err := tc.UnaryCall(ctx, req); err != nil {
  3823. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, <nil>", err)
  3824. }
  3825. // Streaming RPC
  3826. ctx, cancel := context.WithCancel(context.Background())
  3827. defer cancel()
  3828. stream, err := tc.FullDuplexCall(ctx)
  3829. if err != nil {
  3830. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  3831. }
  3832. respParam := []*testpb.ResponseParameters{
  3833. {
  3834. Size: 31415,
  3835. },
  3836. }
  3837. payload, err = newPayload(testpb.PayloadType_COMPRESSABLE, int32(31415))
  3838. if err != nil {
  3839. t.Fatal(err)
  3840. }
  3841. sreq := &testpb.StreamingOutputCallRequest{
  3842. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3843. ResponseParameters: respParam,
  3844. Payload: payload,
  3845. }
  3846. if err := stream.Send(sreq); err != nil {
  3847. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  3848. }
  3849. stream.CloseSend()
  3850. if _, err := stream.Recv(); err != nil {
  3851. t.Fatalf("%v.Recv() = %v, want <nil>", stream, err)
  3852. }
  3853. if _, err := stream.Recv(); err != io.EOF {
  3854. t.Fatalf("%v.Recv() = %v, want io.EOF", stream, err)
  3855. }
  3856. }
  3857. func (s) TestIdentityEncoding(t *testing.T) {
  3858. for _, e := range listTestEnv() {
  3859. testIdentityEncoding(t, e)
  3860. }
  3861. }
  3862. func testIdentityEncoding(t *testing.T, e env) {
  3863. te := newTest(t, e)
  3864. te.startServer(&testServer{security: e.security})
  3865. defer te.tearDown()
  3866. tc := testpb.NewTestServiceClient(te.clientConn())
  3867. // Unary call
  3868. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 5)
  3869. if err != nil {
  3870. t.Fatal(err)
  3871. }
  3872. req := &testpb.SimpleRequest{
  3873. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3874. ResponseSize: 10,
  3875. Payload: payload,
  3876. }
  3877. ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("something", "something"))
  3878. if _, err := tc.UnaryCall(ctx, req); err != nil {
  3879. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, <nil>", err)
  3880. }
  3881. // Streaming RPC
  3882. ctx, cancel := context.WithCancel(context.Background())
  3883. defer cancel()
  3884. stream, err := tc.FullDuplexCall(ctx, grpc.UseCompressor("identity"))
  3885. if err != nil {
  3886. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  3887. }
  3888. payload, err = newPayload(testpb.PayloadType_COMPRESSABLE, int32(31415))
  3889. if err != nil {
  3890. t.Fatal(err)
  3891. }
  3892. sreq := &testpb.StreamingOutputCallRequest{
  3893. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3894. ResponseParameters: []*testpb.ResponseParameters{{Size: 10}},
  3895. Payload: payload,
  3896. }
  3897. if err := stream.Send(sreq); err != nil {
  3898. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  3899. }
  3900. stream.CloseSend()
  3901. if _, err := stream.Recv(); err != nil {
  3902. t.Fatalf("%v.Recv() = %v, want <nil>", stream, err)
  3903. }
  3904. if _, err := stream.Recv(); err != io.EOF {
  3905. t.Fatalf("%v.Recv() = %v, want io.EOF", stream, err)
  3906. }
  3907. }
  3908. func (s) TestUnaryClientInterceptor(t *testing.T) {
  3909. for _, e := range listTestEnv() {
  3910. testUnaryClientInterceptor(t, e)
  3911. }
  3912. }
  3913. func failOkayRPC(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  3914. err := invoker(ctx, method, req, reply, cc, opts...)
  3915. if err == nil {
  3916. return status.Error(codes.NotFound, "")
  3917. }
  3918. return err
  3919. }
  3920. func testUnaryClientInterceptor(t *testing.T, e env) {
  3921. te := newTest(t, e)
  3922. te.userAgent = testAppUA
  3923. te.unaryClientInt = failOkayRPC
  3924. te.startServer(&testServer{security: e.security})
  3925. defer te.tearDown()
  3926. tc := testpb.NewTestServiceClient(te.clientConn())
  3927. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.NotFound {
  3928. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, error code %s", tc, err, codes.NotFound)
  3929. }
  3930. }
  3931. func (s) TestStreamClientInterceptor(t *testing.T) {
  3932. for _, e := range listTestEnv() {
  3933. testStreamClientInterceptor(t, e)
  3934. }
  3935. }
  3936. func failOkayStream(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
  3937. s, err := streamer(ctx, desc, cc, method, opts...)
  3938. if err == nil {
  3939. return nil, status.Error(codes.NotFound, "")
  3940. }
  3941. return s, nil
  3942. }
  3943. func testStreamClientInterceptor(t *testing.T, e env) {
  3944. te := newTest(t, e)
  3945. te.streamClientInt = failOkayStream
  3946. te.startServer(&testServer{security: e.security})
  3947. defer te.tearDown()
  3948. tc := testpb.NewTestServiceClient(te.clientConn())
  3949. respParam := []*testpb.ResponseParameters{
  3950. {
  3951. Size: int32(1),
  3952. },
  3953. }
  3954. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(1))
  3955. if err != nil {
  3956. t.Fatal(err)
  3957. }
  3958. req := &testpb.StreamingOutputCallRequest{
  3959. ResponseType: testpb.PayloadType_COMPRESSABLE,
  3960. ResponseParameters: respParam,
  3961. Payload: payload,
  3962. }
  3963. if _, err := tc.StreamingOutputCall(context.Background(), req); status.Code(err) != codes.NotFound {
  3964. t.Fatalf("%v.StreamingOutputCall(_) = _, %v, want _, error code %s", tc, err, codes.NotFound)
  3965. }
  3966. }
  3967. func (s) TestUnaryServerInterceptor(t *testing.T) {
  3968. for _, e := range listTestEnv() {
  3969. testUnaryServerInterceptor(t, e)
  3970. }
  3971. }
  3972. func errInjector(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
  3973. return nil, status.Error(codes.PermissionDenied, "")
  3974. }
  3975. func testUnaryServerInterceptor(t *testing.T, e env) {
  3976. te := newTest(t, e)
  3977. te.unaryServerInt = errInjector
  3978. te.startServer(&testServer{security: e.security})
  3979. defer te.tearDown()
  3980. tc := testpb.NewTestServiceClient(te.clientConn())
  3981. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.PermissionDenied {
  3982. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, error code %s", tc, err, codes.PermissionDenied)
  3983. }
  3984. }
  3985. func (s) TestStreamServerInterceptor(t *testing.T) {
  3986. for _, e := range listTestEnv() {
  3987. // TODO(bradfitz): Temporarily skip this env due to #619.
  3988. if e.name == "handler-tls" {
  3989. continue
  3990. }
  3991. testStreamServerInterceptor(t, e)
  3992. }
  3993. }
  3994. func fullDuplexOnly(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
  3995. if info.FullMethod == "/grpc.testing.TestService/FullDuplexCall" {
  3996. return handler(srv, ss)
  3997. }
  3998. // Reject the other methods.
  3999. return status.Error(codes.PermissionDenied, "")
  4000. }
  4001. func testStreamServerInterceptor(t *testing.T, e env) {
  4002. te := newTest(t, e)
  4003. te.streamServerInt = fullDuplexOnly
  4004. te.startServer(&testServer{security: e.security})
  4005. defer te.tearDown()
  4006. tc := testpb.NewTestServiceClient(te.clientConn())
  4007. respParam := []*testpb.ResponseParameters{
  4008. {
  4009. Size: int32(1),
  4010. },
  4011. }
  4012. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(1))
  4013. if err != nil {
  4014. t.Fatal(err)
  4015. }
  4016. req := &testpb.StreamingOutputCallRequest{
  4017. ResponseType: testpb.PayloadType_COMPRESSABLE,
  4018. ResponseParameters: respParam,
  4019. Payload: payload,
  4020. }
  4021. s1, err := tc.StreamingOutputCall(context.Background(), req)
  4022. if err != nil {
  4023. t.Fatalf("%v.StreamingOutputCall(_) = _, %v, want _, <nil>", tc, err)
  4024. }
  4025. if _, err := s1.Recv(); status.Code(err) != codes.PermissionDenied {
  4026. t.Fatalf("%v.StreamingInputCall(_) = _, %v, want _, error code %s", tc, err, codes.PermissionDenied)
  4027. }
  4028. s2, err := tc.FullDuplexCall(context.Background())
  4029. if err != nil {
  4030. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  4031. }
  4032. if err := s2.Send(req); err != nil {
  4033. t.Fatalf("%v.Send(_) = %v, want <nil>", s2, err)
  4034. }
  4035. if _, err := s2.Recv(); err != nil {
  4036. t.Fatalf("%v.Recv() = _, %v, want _, <nil>", s2, err)
  4037. }
  4038. }
  4039. // funcServer implements methods of TestServiceServer using funcs,
  4040. // similar to an http.HandlerFunc.
  4041. // Any unimplemented method will crash. Tests implement the method(s)
  4042. // they need.
  4043. type funcServer struct {
  4044. testpb.TestServiceServer
  4045. unaryCall func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error)
  4046. streamingInputCall func(stream testpb.TestService_StreamingInputCallServer) error
  4047. fullDuplexCall func(stream testpb.TestService_FullDuplexCallServer) error
  4048. }
  4049. func (s *funcServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  4050. return s.unaryCall(ctx, in)
  4051. }
  4052. func (s *funcServer) StreamingInputCall(stream testpb.TestService_StreamingInputCallServer) error {
  4053. return s.streamingInputCall(stream)
  4054. }
  4055. func (s *funcServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallServer) error {
  4056. return s.fullDuplexCall(stream)
  4057. }
  4058. func (s) TestClientRequestBodyErrorUnexpectedEOF(t *testing.T) {
  4059. for _, e := range listTestEnv() {
  4060. testClientRequestBodyErrorUnexpectedEOF(t, e)
  4061. }
  4062. }
  4063. func testClientRequestBodyErrorUnexpectedEOF(t *testing.T, e env) {
  4064. te := newTest(t, e)
  4065. ts := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  4066. errUnexpectedCall := errors.New("unexpected call func server method")
  4067. t.Error(errUnexpectedCall)
  4068. return nil, errUnexpectedCall
  4069. }}
  4070. te.startServer(ts)
  4071. defer te.tearDown()
  4072. te.withServerTester(func(st *serverTester) {
  4073. st.writeHeadersGRPC(1, "/grpc.testing.TestService/UnaryCall")
  4074. // Say we have 5 bytes coming, but set END_STREAM flag:
  4075. st.writeData(1, true, []byte{0, 0, 0, 0, 5})
  4076. st.wantAnyFrame() // wait for server to crash (it used to crash)
  4077. })
  4078. }
  4079. func (s) TestClientRequestBodyErrorCloseAfterLength(t *testing.T) {
  4080. for _, e := range listTestEnv() {
  4081. testClientRequestBodyErrorCloseAfterLength(t, e)
  4082. }
  4083. }
  4084. func testClientRequestBodyErrorCloseAfterLength(t *testing.T, e env) {
  4085. te := newTest(t, e)
  4086. te.declareLogNoise("Server.processUnaryRPC failed to write status")
  4087. ts := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  4088. errUnexpectedCall := errors.New("unexpected call func server method")
  4089. t.Error(errUnexpectedCall)
  4090. return nil, errUnexpectedCall
  4091. }}
  4092. te.startServer(ts)
  4093. defer te.tearDown()
  4094. te.withServerTester(func(st *serverTester) {
  4095. st.writeHeadersGRPC(1, "/grpc.testing.TestService/UnaryCall")
  4096. // say we're sending 5 bytes, but then close the connection instead.
  4097. st.writeData(1, false, []byte{0, 0, 0, 0, 5})
  4098. st.cc.Close()
  4099. })
  4100. }
  4101. func (s) TestClientRequestBodyErrorCancel(t *testing.T) {
  4102. for _, e := range listTestEnv() {
  4103. testClientRequestBodyErrorCancel(t, e)
  4104. }
  4105. }
  4106. func testClientRequestBodyErrorCancel(t *testing.T, e env) {
  4107. te := newTest(t, e)
  4108. gotCall := make(chan bool, 1)
  4109. ts := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  4110. gotCall <- true
  4111. return new(testpb.SimpleResponse), nil
  4112. }}
  4113. te.startServer(ts)
  4114. defer te.tearDown()
  4115. te.withServerTester(func(st *serverTester) {
  4116. st.writeHeadersGRPC(1, "/grpc.testing.TestService/UnaryCall")
  4117. // Say we have 5 bytes coming, but cancel it instead.
  4118. st.writeRSTStream(1, http2.ErrCodeCancel)
  4119. st.writeData(1, false, []byte{0, 0, 0, 0, 5})
  4120. // Verify we didn't a call yet.
  4121. select {
  4122. case <-gotCall:
  4123. t.Fatal("unexpected call")
  4124. default:
  4125. }
  4126. // And now send an uncanceled (but still invalid), just to get a response.
  4127. st.writeHeadersGRPC(3, "/grpc.testing.TestService/UnaryCall")
  4128. st.writeData(3, true, []byte{0, 0, 0, 0, 0})
  4129. <-gotCall
  4130. st.wantAnyFrame()
  4131. })
  4132. }
  4133. func (s) TestClientRequestBodyErrorCancelStreamingInput(t *testing.T) {
  4134. for _, e := range listTestEnv() {
  4135. testClientRequestBodyErrorCancelStreamingInput(t, e)
  4136. }
  4137. }
  4138. func testClientRequestBodyErrorCancelStreamingInput(t *testing.T, e env) {
  4139. te := newTest(t, e)
  4140. recvErr := make(chan error, 1)
  4141. ts := &funcServer{streamingInputCall: func(stream testpb.TestService_StreamingInputCallServer) error {
  4142. _, err := stream.Recv()
  4143. recvErr <- err
  4144. return nil
  4145. }}
  4146. te.startServer(ts)
  4147. defer te.tearDown()
  4148. te.withServerTester(func(st *serverTester) {
  4149. st.writeHeadersGRPC(1, "/grpc.testing.TestService/StreamingInputCall")
  4150. // Say we have 5 bytes coming, but cancel it instead.
  4151. st.writeData(1, false, []byte{0, 0, 0, 0, 5})
  4152. st.writeRSTStream(1, http2.ErrCodeCancel)
  4153. var got error
  4154. select {
  4155. case got = <-recvErr:
  4156. case <-time.After(3 * time.Second):
  4157. t.Fatal("timeout waiting for error")
  4158. }
  4159. if grpc.Code(got) != codes.Canceled {
  4160. t.Errorf("error = %#v; want error code %s", got, codes.Canceled)
  4161. }
  4162. })
  4163. }
  4164. func (s) TestClientResourceExhaustedCancelFullDuplex(t *testing.T) {
  4165. for _, e := range listTestEnv() {
  4166. if e.httpHandler {
  4167. // httpHandler write won't be blocked on flow control window.
  4168. continue
  4169. }
  4170. testClientResourceExhaustedCancelFullDuplex(t, e)
  4171. }
  4172. }
  4173. func testClientResourceExhaustedCancelFullDuplex(t *testing.T, e env) {
  4174. te := newTest(t, e)
  4175. recvErr := make(chan error, 1)
  4176. ts := &funcServer{fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
  4177. defer close(recvErr)
  4178. _, err := stream.Recv()
  4179. if err != nil {
  4180. return status.Errorf(codes.Internal, "stream.Recv() got error: %v, want <nil>", err)
  4181. }
  4182. // create a payload that's larger than the default flow control window.
  4183. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 10)
  4184. if err != nil {
  4185. return err
  4186. }
  4187. resp := &testpb.StreamingOutputCallResponse{
  4188. Payload: payload,
  4189. }
  4190. ce := make(chan error)
  4191. go func() {
  4192. var err error
  4193. for {
  4194. if err = stream.Send(resp); err != nil {
  4195. break
  4196. }
  4197. }
  4198. ce <- err
  4199. }()
  4200. select {
  4201. case err = <-ce:
  4202. case <-time.After(10 * time.Second):
  4203. err = errors.New("10s timeout reached")
  4204. }
  4205. recvErr <- err
  4206. return err
  4207. }}
  4208. te.startServer(ts)
  4209. defer te.tearDown()
  4210. // set a low limit on receive message size to error with Resource Exhausted on
  4211. // client side when server send a large message.
  4212. te.maxClientReceiveMsgSize = newInt(10)
  4213. cc := te.clientConn()
  4214. tc := testpb.NewTestServiceClient(cc)
  4215. stream, err := tc.FullDuplexCall(context.Background())
  4216. if err != nil {
  4217. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  4218. }
  4219. req := &testpb.StreamingOutputCallRequest{}
  4220. if err := stream.Send(req); err != nil {
  4221. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  4222. }
  4223. if _, err := stream.Recv(); status.Code(err) != codes.ResourceExhausted {
  4224. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  4225. }
  4226. err = <-recvErr
  4227. if status.Code(err) != codes.Canceled {
  4228. t.Fatalf("server got error %v, want error code: %s", err, codes.Canceled)
  4229. }
  4230. }
  4231. type clientTimeoutCreds struct {
  4232. timeoutReturned bool
  4233. }
  4234. func (c *clientTimeoutCreds) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4235. if !c.timeoutReturned {
  4236. c.timeoutReturned = true
  4237. return nil, nil, context.DeadlineExceeded
  4238. }
  4239. return rawConn, nil, nil
  4240. }
  4241. func (c *clientTimeoutCreds) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4242. return rawConn, nil, nil
  4243. }
  4244. func (c *clientTimeoutCreds) Info() credentials.ProtocolInfo {
  4245. return credentials.ProtocolInfo{}
  4246. }
  4247. func (c *clientTimeoutCreds) Clone() credentials.TransportCredentials {
  4248. return nil
  4249. }
  4250. func (c *clientTimeoutCreds) OverrideServerName(s string) error {
  4251. return nil
  4252. }
  4253. func (s) TestNonFailFastRPCSucceedOnTimeoutCreds(t *testing.T) {
  4254. te := newTest(t, env{name: "timeout-cred", network: "tcp", security: "clientTimeoutCreds", balancer: "v1"})
  4255. te.userAgent = testAppUA
  4256. te.startServer(&testServer{security: te.e.security})
  4257. defer te.tearDown()
  4258. cc := te.clientConn()
  4259. tc := testpb.NewTestServiceClient(cc)
  4260. // This unary call should succeed, because ClientHandshake will succeed for the second time.
  4261. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  4262. te.t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want <nil>", err)
  4263. }
  4264. }
  4265. type serverDispatchCred struct {
  4266. rawConnCh chan net.Conn
  4267. }
  4268. func newServerDispatchCred() *serverDispatchCred {
  4269. return &serverDispatchCred{
  4270. rawConnCh: make(chan net.Conn, 1),
  4271. }
  4272. }
  4273. func (c *serverDispatchCred) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4274. return rawConn, nil, nil
  4275. }
  4276. func (c *serverDispatchCred) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4277. select {
  4278. case c.rawConnCh <- rawConn:
  4279. default:
  4280. }
  4281. return nil, nil, credentials.ErrConnDispatched
  4282. }
  4283. func (c *serverDispatchCred) Info() credentials.ProtocolInfo {
  4284. return credentials.ProtocolInfo{}
  4285. }
  4286. func (c *serverDispatchCred) Clone() credentials.TransportCredentials {
  4287. return nil
  4288. }
  4289. func (c *serverDispatchCred) OverrideServerName(s string) error {
  4290. return nil
  4291. }
  4292. func (c *serverDispatchCred) getRawConn() net.Conn {
  4293. return <-c.rawConnCh
  4294. }
  4295. func (s) TestServerCredsDispatch(t *testing.T) {
  4296. lis, err := net.Listen("tcp", "localhost:0")
  4297. if err != nil {
  4298. t.Fatalf("Failed to listen: %v", err)
  4299. }
  4300. cred := newServerDispatchCred()
  4301. s := grpc.NewServer(grpc.Creds(cred))
  4302. go s.Serve(lis)
  4303. defer s.Stop()
  4304. cc, err := grpc.Dial(lis.Addr().String(), grpc.WithTransportCredentials(cred))
  4305. if err != nil {
  4306. t.Fatalf("grpc.Dial(%q) = %v", lis.Addr().String(), err)
  4307. }
  4308. defer cc.Close()
  4309. rawConn := cred.getRawConn()
  4310. // Give grpc a chance to see the error and potentially close the connection.
  4311. // And check that connection is not closed after that.
  4312. time.Sleep(100 * time.Millisecond)
  4313. // Check rawConn is not closed.
  4314. if n, err := rawConn.Write([]byte{0}); n <= 0 || err != nil {
  4315. t.Errorf("Read() = %v, %v; want n>0, <nil>", n, err)
  4316. }
  4317. }
  4318. type authorityCheckCreds struct {
  4319. got string
  4320. }
  4321. func (c *authorityCheckCreds) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4322. return rawConn, nil, nil
  4323. }
  4324. func (c *authorityCheckCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4325. c.got = authority
  4326. return rawConn, nil, nil
  4327. }
  4328. func (c *authorityCheckCreds) Info() credentials.ProtocolInfo {
  4329. return credentials.ProtocolInfo{}
  4330. }
  4331. func (c *authorityCheckCreds) Clone() credentials.TransportCredentials {
  4332. return c
  4333. }
  4334. func (c *authorityCheckCreds) OverrideServerName(s string) error {
  4335. return nil
  4336. }
  4337. // This test makes sure that the authority client handshake gets is the endpoint
  4338. // in dial target, not the resolved ip address.
  4339. func (s) TestCredsHandshakeAuthority(t *testing.T) {
  4340. const testAuthority = "test.auth.ori.ty"
  4341. lis, err := net.Listen("tcp", "localhost:0")
  4342. if err != nil {
  4343. t.Fatalf("Failed to listen: %v", err)
  4344. }
  4345. cred := &authorityCheckCreds{}
  4346. s := grpc.NewServer()
  4347. go s.Serve(lis)
  4348. defer s.Stop()
  4349. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  4350. defer rcleanup()
  4351. cc, err := grpc.Dial(r.Scheme()+":///"+testAuthority, grpc.WithTransportCredentials(cred))
  4352. if err != nil {
  4353. t.Fatalf("grpc.Dial(%q) = %v", lis.Addr().String(), err)
  4354. }
  4355. defer cc.Close()
  4356. r.NewAddress([]resolver.Address{{Addr: lis.Addr().String()}})
  4357. ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
  4358. defer cancel()
  4359. for {
  4360. s := cc.GetState()
  4361. if s == connectivity.Ready {
  4362. break
  4363. }
  4364. if !cc.WaitForStateChange(ctx, s) {
  4365. // ctx got timeout or canceled.
  4366. t.Fatalf("ClientConn is not ready after 100 ms")
  4367. }
  4368. }
  4369. if cred.got != testAuthority {
  4370. t.Fatalf("client creds got authority: %q, want: %q", cred.got, testAuthority)
  4371. }
  4372. }
  4373. type clientFailCreds struct{}
  4374. func (c *clientFailCreds) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4375. return rawConn, nil, nil
  4376. }
  4377. func (c *clientFailCreds) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  4378. return nil, nil, fmt.Errorf("client handshake fails with fatal error")
  4379. }
  4380. func (c *clientFailCreds) Info() credentials.ProtocolInfo {
  4381. return credentials.ProtocolInfo{}
  4382. }
  4383. func (c *clientFailCreds) Clone() credentials.TransportCredentials {
  4384. return c
  4385. }
  4386. func (c *clientFailCreds) OverrideServerName(s string) error {
  4387. return nil
  4388. }
  4389. // This test makes sure that failfast RPCs fail if client handshake fails with
  4390. // fatal errors.
  4391. func (s) TestFailfastRPCFailOnFatalHandshakeError(t *testing.T) {
  4392. lis, err := net.Listen("tcp", "localhost:0")
  4393. if err != nil {
  4394. t.Fatalf("Failed to listen: %v", err)
  4395. }
  4396. defer lis.Close()
  4397. cc, err := grpc.Dial("passthrough:///"+lis.Addr().String(), grpc.WithTransportCredentials(&clientFailCreds{}))
  4398. if err != nil {
  4399. t.Fatalf("grpc.Dial(_) = %v", err)
  4400. }
  4401. defer cc.Close()
  4402. tc := testpb.NewTestServiceClient(cc)
  4403. // This unary call should fail, but not timeout.
  4404. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  4405. defer cancel()
  4406. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(false)); status.Code(err) != codes.Unavailable {
  4407. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want <Unavailable>", err)
  4408. }
  4409. }
  4410. func (s) TestFlowControlLogicalRace(t *testing.T) {
  4411. // Test for a regression of https://github.com/grpc/grpc-go/issues/632,
  4412. // and other flow control bugs.
  4413. const (
  4414. itemCount = 100
  4415. itemSize = 1 << 10
  4416. recvCount = 2
  4417. maxFailures = 3
  4418. requestTimeout = time.Second * 5
  4419. )
  4420. requestCount := 10000
  4421. if raceMode {
  4422. requestCount = 1000
  4423. }
  4424. lis, err := net.Listen("tcp", "localhost:0")
  4425. if err != nil {
  4426. t.Fatalf("Failed to listen: %v", err)
  4427. }
  4428. defer lis.Close()
  4429. s := grpc.NewServer()
  4430. testpb.RegisterTestServiceServer(s, &flowControlLogicalRaceServer{
  4431. itemCount: itemCount,
  4432. itemSize: itemSize,
  4433. })
  4434. defer s.Stop()
  4435. go s.Serve(lis)
  4436. ctx := context.Background()
  4437. cc, err := grpc.Dial(lis.Addr().String(), grpc.WithInsecure(), grpc.WithBlock())
  4438. if err != nil {
  4439. t.Fatalf("grpc.Dial(%q) = %v", lis.Addr().String(), err)
  4440. }
  4441. defer cc.Close()
  4442. cl := testpb.NewTestServiceClient(cc)
  4443. failures := 0
  4444. for i := 0; i < requestCount; i++ {
  4445. ctx, cancel := context.WithTimeout(ctx, requestTimeout)
  4446. output, err := cl.StreamingOutputCall(ctx, &testpb.StreamingOutputCallRequest{})
  4447. if err != nil {
  4448. t.Fatalf("StreamingOutputCall; err = %q", err)
  4449. }
  4450. j := 0
  4451. loop:
  4452. for ; j < recvCount; j++ {
  4453. _, err := output.Recv()
  4454. if err != nil {
  4455. if err == io.EOF {
  4456. break loop
  4457. }
  4458. switch status.Code(err) {
  4459. case codes.DeadlineExceeded:
  4460. break loop
  4461. default:
  4462. t.Fatalf("Recv; err = %q", err)
  4463. }
  4464. }
  4465. }
  4466. cancel()
  4467. <-ctx.Done()
  4468. if j < recvCount {
  4469. t.Errorf("got %d responses to request %d", j, i)
  4470. failures++
  4471. if failures >= maxFailures {
  4472. // Continue past the first failure to see if the connection is
  4473. // entirely broken, or if only a single RPC was affected
  4474. break
  4475. }
  4476. }
  4477. }
  4478. }
  4479. type flowControlLogicalRaceServer struct {
  4480. testpb.TestServiceServer
  4481. itemSize int
  4482. itemCount int
  4483. }
  4484. func (s *flowControlLogicalRaceServer) StreamingOutputCall(req *testpb.StreamingOutputCallRequest, srv testpb.TestService_StreamingOutputCallServer) error {
  4485. for i := 0; i < s.itemCount; i++ {
  4486. err := srv.Send(&testpb.StreamingOutputCallResponse{
  4487. Payload: &testpb.Payload{
  4488. // Sending a large stream of data which the client reject
  4489. // helps to trigger some types of flow control bugs.
  4490. //
  4491. // Reallocating memory here is inefficient, but the stress it
  4492. // puts on the GC leads to more frequent flow control
  4493. // failures. The GC likely causes more variety in the
  4494. // goroutine scheduling orders.
  4495. Body: bytes.Repeat([]byte("a"), s.itemSize),
  4496. },
  4497. })
  4498. if err != nil {
  4499. return err
  4500. }
  4501. }
  4502. return nil
  4503. }
  4504. type lockingWriter struct {
  4505. mu sync.Mutex
  4506. w io.Writer
  4507. }
  4508. func (lw *lockingWriter) Write(p []byte) (n int, err error) {
  4509. lw.mu.Lock()
  4510. defer lw.mu.Unlock()
  4511. return lw.w.Write(p)
  4512. }
  4513. func (lw *lockingWriter) setWriter(w io.Writer) {
  4514. lw.mu.Lock()
  4515. defer lw.mu.Unlock()
  4516. lw.w = w
  4517. }
  4518. var testLogOutput = &lockingWriter{w: os.Stderr}
  4519. // awaitNewConnLogOutput waits for any of grpc.NewConn's goroutines to
  4520. // terminate, if they're still running. It spams logs with this
  4521. // message. We wait for it so our log filter is still
  4522. // active. Otherwise the "defer restore()" at the top of various test
  4523. // functions restores our log filter and then the goroutine spams.
  4524. func awaitNewConnLogOutput() {
  4525. awaitLogOutput(50*time.Millisecond, "grpc: the client connection is closing; please retry")
  4526. }
  4527. func awaitLogOutput(maxWait time.Duration, phrase string) {
  4528. pb := []byte(phrase)
  4529. timer := time.NewTimer(maxWait)
  4530. defer timer.Stop()
  4531. wakeup := make(chan bool, 1)
  4532. for {
  4533. if logOutputHasContents(pb, wakeup) {
  4534. return
  4535. }
  4536. select {
  4537. case <-timer.C:
  4538. // Too slow. Oh well.
  4539. return
  4540. case <-wakeup:
  4541. }
  4542. }
  4543. }
  4544. func logOutputHasContents(v []byte, wakeup chan<- bool) bool {
  4545. testLogOutput.mu.Lock()
  4546. defer testLogOutput.mu.Unlock()
  4547. fw, ok := testLogOutput.w.(*filterWriter)
  4548. if !ok {
  4549. return false
  4550. }
  4551. fw.mu.Lock()
  4552. defer fw.mu.Unlock()
  4553. if bytes.Contains(fw.buf.Bytes(), v) {
  4554. return true
  4555. }
  4556. fw.wakeup = wakeup
  4557. return false
  4558. }
  4559. var verboseLogs = flag.Bool("verbose_logs", false, "show all grpclog output, without filtering")
  4560. func noop() {}
  4561. // declareLogNoise declares that t is expected to emit the following noisy phrases,
  4562. // even on success. Those phrases will be filtered from grpclog output
  4563. // and only be shown if *verbose_logs or t ends up failing.
  4564. // The returned restore function should be called with defer to be run
  4565. // before the test ends.
  4566. func declareLogNoise(t *testing.T, phrases ...string) (restore func()) {
  4567. if *verboseLogs {
  4568. return noop
  4569. }
  4570. fw := &filterWriter{dst: os.Stderr, filter: phrases}
  4571. testLogOutput.setWriter(fw)
  4572. return func() {
  4573. if t.Failed() {
  4574. fw.mu.Lock()
  4575. defer fw.mu.Unlock()
  4576. if fw.buf.Len() > 0 {
  4577. t.Logf("Complete log output:\n%s", fw.buf.Bytes())
  4578. }
  4579. }
  4580. testLogOutput.setWriter(os.Stderr)
  4581. }
  4582. }
  4583. type filterWriter struct {
  4584. dst io.Writer
  4585. filter []string
  4586. mu sync.Mutex
  4587. buf bytes.Buffer
  4588. wakeup chan<- bool // if non-nil, gets true on write
  4589. }
  4590. func (fw *filterWriter) Write(p []byte) (n int, err error) {
  4591. fw.mu.Lock()
  4592. fw.buf.Write(p)
  4593. if fw.wakeup != nil {
  4594. select {
  4595. case fw.wakeup <- true:
  4596. default:
  4597. }
  4598. }
  4599. fw.mu.Unlock()
  4600. ps := string(p)
  4601. for _, f := range fw.filter {
  4602. if strings.Contains(ps, f) {
  4603. return len(p), nil
  4604. }
  4605. }
  4606. return fw.dst.Write(p)
  4607. }
  4608. // stubServer is a server that is easy to customize within individual test
  4609. // cases.
  4610. type stubServer struct {
  4611. // Guarantees we satisfy this interface; panics if unimplemented methods are called.
  4612. testpb.TestServiceServer
  4613. // Customizable implementations of server handlers.
  4614. emptyCall func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error)
  4615. unaryCall func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error)
  4616. fullDuplexCall func(stream testpb.TestService_FullDuplexCallServer) error
  4617. // A client connected to this service the test may use. Created in Start().
  4618. client testpb.TestServiceClient
  4619. cc *grpc.ClientConn
  4620. cleanups []func() // Lambdas executed in Stop(); populated by Start().
  4621. r *manual.Resolver
  4622. }
  4623. func (ss *stubServer) EmptyCall(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  4624. return ss.emptyCall(ctx, in)
  4625. }
  4626. func (ss *stubServer) UnaryCall(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  4627. return ss.unaryCall(ctx, in)
  4628. }
  4629. func (ss *stubServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallServer) error {
  4630. return ss.fullDuplexCall(stream)
  4631. }
  4632. // Start starts the server and creates a client connected to it.
  4633. func (ss *stubServer) Start(sopts []grpc.ServerOption, dopts ...grpc.DialOption) error {
  4634. r, cleanup := manual.GenerateAndRegisterManualResolver()
  4635. ss.r = r
  4636. ss.cleanups = append(ss.cleanups, cleanup)
  4637. lis, err := net.Listen("tcp", "localhost:0")
  4638. if err != nil {
  4639. return fmt.Errorf(`net.Listen("tcp", "localhost:0") = %v`, err)
  4640. }
  4641. ss.cleanups = append(ss.cleanups, func() { lis.Close() })
  4642. s := grpc.NewServer(sopts...)
  4643. testpb.RegisterTestServiceServer(s, ss)
  4644. go s.Serve(lis)
  4645. ss.cleanups = append(ss.cleanups, s.Stop)
  4646. target := ss.r.Scheme() + ":///" + lis.Addr().String()
  4647. opts := append([]grpc.DialOption{grpc.WithInsecure()}, dopts...)
  4648. cc, err := grpc.Dial(target, opts...)
  4649. if err != nil {
  4650. return fmt.Errorf("grpc.Dial(%q) = %v", target, err)
  4651. }
  4652. ss.cc = cc
  4653. ss.r.NewAddress([]resolver.Address{{Addr: lis.Addr().String()}})
  4654. if err := ss.waitForReady(cc); err != nil {
  4655. return err
  4656. }
  4657. ss.cleanups = append(ss.cleanups, func() { cc.Close() })
  4658. ss.client = testpb.NewTestServiceClient(cc)
  4659. return nil
  4660. }
  4661. func (ss *stubServer) waitForReady(cc *grpc.ClientConn) error {
  4662. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  4663. defer cancel()
  4664. for {
  4665. s := cc.GetState()
  4666. if s == connectivity.Ready {
  4667. return nil
  4668. }
  4669. if !cc.WaitForStateChange(ctx, s) {
  4670. // ctx got timeout or canceled.
  4671. return ctx.Err()
  4672. }
  4673. }
  4674. }
  4675. func (ss *stubServer) Stop() {
  4676. for i := len(ss.cleanups) - 1; i >= 0; i-- {
  4677. ss.cleanups[i]()
  4678. }
  4679. }
  4680. func (s) TestGRPCMethod(t *testing.T) {
  4681. var method string
  4682. var ok bool
  4683. ss := &stubServer{
  4684. emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  4685. method, ok = grpc.Method(ctx)
  4686. return &testpb.Empty{}, nil
  4687. },
  4688. }
  4689. if err := ss.Start(nil); err != nil {
  4690. t.Fatalf("Error starting endpoint server: %v", err)
  4691. }
  4692. defer ss.Stop()
  4693. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  4694. defer cancel()
  4695. if _, err := ss.client.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  4696. t.Fatalf("ss.client.EmptyCall(_, _) = _, %v; want _, nil", err)
  4697. }
  4698. if want := "/grpc.testing.TestService/EmptyCall"; !ok || method != want {
  4699. t.Fatalf("grpc.Method(_) = %q, %v; want %q, true", method, ok, want)
  4700. }
  4701. }
  4702. func (s) TestUnaryProxyDoesNotForwardMetadata(t *testing.T) {
  4703. const mdkey = "somedata"
  4704. // endpoint ensures mdkey is NOT in metadata and returns an error if it is.
  4705. endpoint := &stubServer{
  4706. emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  4707. if md, ok := metadata.FromIncomingContext(ctx); !ok || md[mdkey] != nil {
  4708. return nil, status.Errorf(codes.Internal, "endpoint: md=%v; want !contains(%q)", md, mdkey)
  4709. }
  4710. return &testpb.Empty{}, nil
  4711. },
  4712. }
  4713. if err := endpoint.Start(nil); err != nil {
  4714. t.Fatalf("Error starting endpoint server: %v", err)
  4715. }
  4716. defer endpoint.Stop()
  4717. // proxy ensures mdkey IS in metadata, then forwards the RPC to endpoint
  4718. // without explicitly copying the metadata.
  4719. proxy := &stubServer{
  4720. emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  4721. if md, ok := metadata.FromIncomingContext(ctx); !ok || md[mdkey] == nil {
  4722. return nil, status.Errorf(codes.Internal, "proxy: md=%v; want contains(%q)", md, mdkey)
  4723. }
  4724. return endpoint.client.EmptyCall(ctx, in)
  4725. },
  4726. }
  4727. if err := proxy.Start(nil); err != nil {
  4728. t.Fatalf("Error starting proxy server: %v", err)
  4729. }
  4730. defer proxy.Stop()
  4731. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  4732. defer cancel()
  4733. md := metadata.Pairs(mdkey, "val")
  4734. ctx = metadata.NewOutgoingContext(ctx, md)
  4735. // Sanity check that endpoint properly errors when it sees mdkey.
  4736. _, err := endpoint.client.EmptyCall(ctx, &testpb.Empty{})
  4737. if s, ok := status.FromError(err); !ok || s.Code() != codes.Internal {
  4738. t.Fatalf("endpoint.client.EmptyCall(_, _) = _, %v; want _, <status with Code()=Internal>", err)
  4739. }
  4740. if _, err := proxy.client.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  4741. t.Fatal(err.Error())
  4742. }
  4743. }
  4744. func (s) TestStreamingProxyDoesNotForwardMetadata(t *testing.T) {
  4745. const mdkey = "somedata"
  4746. // doFDC performs a FullDuplexCall with client and returns the error from the
  4747. // first stream.Recv call, or nil if that error is io.EOF. Calls t.Fatal if
  4748. // the stream cannot be established.
  4749. doFDC := func(ctx context.Context, client testpb.TestServiceClient) error {
  4750. stream, err := client.FullDuplexCall(ctx)
  4751. if err != nil {
  4752. t.Fatalf("Unwanted error: %v", err)
  4753. }
  4754. if _, err := stream.Recv(); err != io.EOF {
  4755. return err
  4756. }
  4757. return nil
  4758. }
  4759. // endpoint ensures mdkey is NOT in metadata and returns an error if it is.
  4760. endpoint := &stubServer{
  4761. fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
  4762. ctx := stream.Context()
  4763. if md, ok := metadata.FromIncomingContext(ctx); !ok || md[mdkey] != nil {
  4764. return status.Errorf(codes.Internal, "endpoint: md=%v; want !contains(%q)", md, mdkey)
  4765. }
  4766. return nil
  4767. },
  4768. }
  4769. if err := endpoint.Start(nil); err != nil {
  4770. t.Fatalf("Error starting endpoint server: %v", err)
  4771. }
  4772. defer endpoint.Stop()
  4773. // proxy ensures mdkey IS in metadata, then forwards the RPC to endpoint
  4774. // without explicitly copying the metadata.
  4775. proxy := &stubServer{
  4776. fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
  4777. ctx := stream.Context()
  4778. if md, ok := metadata.FromIncomingContext(ctx); !ok || md[mdkey] == nil {
  4779. return status.Errorf(codes.Internal, "endpoint: md=%v; want !contains(%q)", md, mdkey)
  4780. }
  4781. return doFDC(ctx, endpoint.client)
  4782. },
  4783. }
  4784. if err := proxy.Start(nil); err != nil {
  4785. t.Fatalf("Error starting proxy server: %v", err)
  4786. }
  4787. defer proxy.Stop()
  4788. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  4789. defer cancel()
  4790. md := metadata.Pairs(mdkey, "val")
  4791. ctx = metadata.NewOutgoingContext(ctx, md)
  4792. // Sanity check that endpoint properly errors when it sees mdkey in ctx.
  4793. err := doFDC(ctx, endpoint.client)
  4794. if s, ok := status.FromError(err); !ok || s.Code() != codes.Internal {
  4795. t.Fatalf("stream.Recv() = _, %v; want _, <status with Code()=Internal>", err)
  4796. }
  4797. if err := doFDC(ctx, proxy.client); err != nil {
  4798. t.Fatalf("doFDC(_, proxy.client) = %v; want nil", err)
  4799. }
  4800. }
  4801. func (s) TestStatsTagsAndTrace(t *testing.T) {
  4802. // Data added to context by client (typically in a stats handler).
  4803. tags := []byte{1, 5, 2, 4, 3}
  4804. trace := []byte{5, 2, 1, 3, 4}
  4805. // endpoint ensures Tags() and Trace() in context match those that were added
  4806. // by the client and returns an error if not.
  4807. endpoint := &stubServer{
  4808. emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  4809. md, _ := metadata.FromIncomingContext(ctx)
  4810. if tg := stats.Tags(ctx); !reflect.DeepEqual(tg, tags) {
  4811. return nil, status.Errorf(codes.Internal, "stats.Tags(%v)=%v; want %v", ctx, tg, tags)
  4812. }
  4813. if !reflect.DeepEqual(md["grpc-tags-bin"], []string{string(tags)}) {
  4814. return nil, status.Errorf(codes.Internal, "md['grpc-tags-bin']=%v; want %v", md["grpc-tags-bin"], tags)
  4815. }
  4816. if tr := stats.Trace(ctx); !reflect.DeepEqual(tr, trace) {
  4817. return nil, status.Errorf(codes.Internal, "stats.Trace(%v)=%v; want %v", ctx, tr, trace)
  4818. }
  4819. if !reflect.DeepEqual(md["grpc-trace-bin"], []string{string(trace)}) {
  4820. return nil, status.Errorf(codes.Internal, "md['grpc-trace-bin']=%v; want %v", md["grpc-trace-bin"], trace)
  4821. }
  4822. return &testpb.Empty{}, nil
  4823. },
  4824. }
  4825. if err := endpoint.Start(nil); err != nil {
  4826. t.Fatalf("Error starting endpoint server: %v", err)
  4827. }
  4828. defer endpoint.Stop()
  4829. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  4830. defer cancel()
  4831. testCases := []struct {
  4832. ctx context.Context
  4833. want codes.Code
  4834. }{
  4835. {ctx: ctx, want: codes.Internal},
  4836. {ctx: stats.SetTags(ctx, tags), want: codes.Internal},
  4837. {ctx: stats.SetTrace(ctx, trace), want: codes.Internal},
  4838. {ctx: stats.SetTags(stats.SetTrace(ctx, tags), tags), want: codes.Internal},
  4839. {ctx: stats.SetTags(stats.SetTrace(ctx, trace), tags), want: codes.OK},
  4840. }
  4841. for _, tc := range testCases {
  4842. _, err := endpoint.client.EmptyCall(tc.ctx, &testpb.Empty{})
  4843. if tc.want == codes.OK && err != nil {
  4844. t.Fatalf("endpoint.client.EmptyCall(%v, _) = _, %v; want _, nil", tc.ctx, err)
  4845. }
  4846. if s, ok := status.FromError(err); !ok || s.Code() != tc.want {
  4847. t.Fatalf("endpoint.client.EmptyCall(%v, _) = _, %v; want _, <status with Code()=%v>", tc.ctx, err, tc.want)
  4848. }
  4849. }
  4850. }
  4851. func (s) TestTapTimeout(t *testing.T) {
  4852. sopts := []grpc.ServerOption{
  4853. grpc.InTapHandle(func(ctx context.Context, _ *tap.Info) (context.Context, error) {
  4854. c, cancel := context.WithCancel(ctx)
  4855. // Call cancel instead of setting a deadline so we can detect which error
  4856. // occurred -- this cancellation (desired) or the client's deadline
  4857. // expired (indicating this cancellation did not affect the RPC).
  4858. time.AfterFunc(10*time.Millisecond, cancel)
  4859. return c, nil
  4860. }),
  4861. }
  4862. ss := &stubServer{
  4863. emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  4864. <-ctx.Done()
  4865. return nil, status.Errorf(codes.Canceled, ctx.Err().Error())
  4866. },
  4867. }
  4868. if err := ss.Start(sopts); err != nil {
  4869. t.Fatalf("Error starting endpoint server: %v", err)
  4870. }
  4871. defer ss.Stop()
  4872. // This was known to be flaky; test several times.
  4873. for i := 0; i < 10; i++ {
  4874. // Set our own deadline in case the server hangs.
  4875. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  4876. res, err := ss.client.EmptyCall(ctx, &testpb.Empty{})
  4877. cancel()
  4878. if s, ok := status.FromError(err); !ok || s.Code() != codes.Canceled {
  4879. t.Fatalf("ss.client.EmptyCall(context.Background(), _) = %v, %v; want nil, <status with Code()=Canceled>", res, err)
  4880. }
  4881. }
  4882. }
  4883. func (s) TestClientWriteFailsAfterServerClosesStream(t *testing.T) {
  4884. ss := &stubServer{
  4885. fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
  4886. return status.Errorf(codes.Internal, "")
  4887. },
  4888. }
  4889. sopts := []grpc.ServerOption{}
  4890. if err := ss.Start(sopts); err != nil {
  4891. t.Fatalf("Error starting endpoint server: %v", err)
  4892. }
  4893. defer ss.Stop()
  4894. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  4895. defer cancel()
  4896. stream, err := ss.client.FullDuplexCall(ctx)
  4897. if err != nil {
  4898. t.Fatalf("Error while creating stream: %v", err)
  4899. }
  4900. for {
  4901. if err := stream.Send(&testpb.StreamingOutputCallRequest{}); err == nil {
  4902. time.Sleep(5 * time.Millisecond)
  4903. } else if err == io.EOF {
  4904. break // Success.
  4905. } else {
  4906. t.Fatalf("stream.Send(_) = %v, want io.EOF", err)
  4907. }
  4908. }
  4909. }
  4910. type windowSizeConfig struct {
  4911. serverStream int32
  4912. serverConn int32
  4913. clientStream int32
  4914. clientConn int32
  4915. }
  4916. func max(a, b int32) int32 {
  4917. if a > b {
  4918. return a
  4919. }
  4920. return b
  4921. }
  4922. func (s) TestConfigurableWindowSizeWithLargeWindow(t *testing.T) {
  4923. wc := windowSizeConfig{
  4924. serverStream: 8 * 1024 * 1024,
  4925. serverConn: 12 * 1024 * 1024,
  4926. clientStream: 6 * 1024 * 1024,
  4927. clientConn: 8 * 1024 * 1024,
  4928. }
  4929. for _, e := range listTestEnv() {
  4930. testConfigurableWindowSize(t, e, wc)
  4931. }
  4932. }
  4933. func (s) TestConfigurableWindowSizeWithSmallWindow(t *testing.T) {
  4934. wc := windowSizeConfig{
  4935. serverStream: 1,
  4936. serverConn: 1,
  4937. clientStream: 1,
  4938. clientConn: 1,
  4939. }
  4940. for _, e := range listTestEnv() {
  4941. testConfigurableWindowSize(t, e, wc)
  4942. }
  4943. }
  4944. func testConfigurableWindowSize(t *testing.T, e env, wc windowSizeConfig) {
  4945. te := newTest(t, e)
  4946. te.serverInitialWindowSize = wc.serverStream
  4947. te.serverInitialConnWindowSize = wc.serverConn
  4948. te.clientInitialWindowSize = wc.clientStream
  4949. te.clientInitialConnWindowSize = wc.clientConn
  4950. te.startServer(&testServer{security: e.security})
  4951. defer te.tearDown()
  4952. cc := te.clientConn()
  4953. tc := testpb.NewTestServiceClient(cc)
  4954. stream, err := tc.FullDuplexCall(context.Background())
  4955. if err != nil {
  4956. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  4957. }
  4958. numOfIter := 11
  4959. // Set message size to exhaust largest of window sizes.
  4960. messageSize := max(max(wc.serverStream, wc.serverConn), max(wc.clientStream, wc.clientConn)) / int32(numOfIter-1)
  4961. messageSize = max(messageSize, 64*1024)
  4962. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, messageSize)
  4963. if err != nil {
  4964. t.Fatal(err)
  4965. }
  4966. respParams := []*testpb.ResponseParameters{
  4967. {
  4968. Size: messageSize,
  4969. },
  4970. }
  4971. req := &testpb.StreamingOutputCallRequest{
  4972. ResponseType: testpb.PayloadType_COMPRESSABLE,
  4973. ResponseParameters: respParams,
  4974. Payload: payload,
  4975. }
  4976. for i := 0; i < numOfIter; i++ {
  4977. if err := stream.Send(req); err != nil {
  4978. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, req, err)
  4979. }
  4980. if _, err := stream.Recv(); err != nil {
  4981. t.Fatalf("%v.Recv() = _, %v, want _, <nil>", stream, err)
  4982. }
  4983. }
  4984. if err := stream.CloseSend(); err != nil {
  4985. t.Fatalf("%v.CloseSend() = %v, want <nil>", stream, err)
  4986. }
  4987. }
  4988. var (
  4989. // test authdata
  4990. authdata = map[string]string{
  4991. "test-key": "test-value",
  4992. "test-key2-bin": string([]byte{1, 2, 3}),
  4993. }
  4994. )
  4995. type testPerRPCCredentials struct{}
  4996. func (cr testPerRPCCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
  4997. return authdata, nil
  4998. }
  4999. func (cr testPerRPCCredentials) RequireTransportSecurity() bool {
  5000. return false
  5001. }
  5002. func authHandle(ctx context.Context, info *tap.Info) (context.Context, error) {
  5003. md, ok := metadata.FromIncomingContext(ctx)
  5004. if !ok {
  5005. return ctx, fmt.Errorf("didn't find metadata in context")
  5006. }
  5007. for k, vwant := range authdata {
  5008. vgot, ok := md[k]
  5009. if !ok {
  5010. return ctx, fmt.Errorf("didn't find authdata key %v in context", k)
  5011. }
  5012. if vgot[0] != vwant {
  5013. return ctx, fmt.Errorf("for key %v, got value %v, want %v", k, vgot, vwant)
  5014. }
  5015. }
  5016. return ctx, nil
  5017. }
  5018. func (s) TestPerRPCCredentialsViaDialOptions(t *testing.T) {
  5019. for _, e := range listTestEnv() {
  5020. testPerRPCCredentialsViaDialOptions(t, e)
  5021. }
  5022. }
  5023. func testPerRPCCredentialsViaDialOptions(t *testing.T, e env) {
  5024. te := newTest(t, e)
  5025. te.tapHandle = authHandle
  5026. te.perRPCCreds = testPerRPCCredentials{}
  5027. te.startServer(&testServer{security: e.security})
  5028. defer te.tearDown()
  5029. cc := te.clientConn()
  5030. tc := testpb.NewTestServiceClient(cc)
  5031. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  5032. t.Fatalf("Test failed. Reason: %v", err)
  5033. }
  5034. }
  5035. func (s) TestPerRPCCredentialsViaCallOptions(t *testing.T) {
  5036. for _, e := range listTestEnv() {
  5037. testPerRPCCredentialsViaCallOptions(t, e)
  5038. }
  5039. }
  5040. func testPerRPCCredentialsViaCallOptions(t *testing.T, e env) {
  5041. te := newTest(t, e)
  5042. te.tapHandle = authHandle
  5043. te.startServer(&testServer{security: e.security})
  5044. defer te.tearDown()
  5045. cc := te.clientConn()
  5046. tc := testpb.NewTestServiceClient(cc)
  5047. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.PerRPCCredentials(testPerRPCCredentials{})); err != nil {
  5048. t.Fatalf("Test failed. Reason: %v", err)
  5049. }
  5050. }
  5051. func (s) TestPerRPCCredentialsViaDialOptionsAndCallOptions(t *testing.T) {
  5052. for _, e := range listTestEnv() {
  5053. testPerRPCCredentialsViaDialOptionsAndCallOptions(t, e)
  5054. }
  5055. }
  5056. func testPerRPCCredentialsViaDialOptionsAndCallOptions(t *testing.T, e env) {
  5057. te := newTest(t, e)
  5058. te.perRPCCreds = testPerRPCCredentials{}
  5059. // When credentials are provided via both dial options and call options,
  5060. // we apply both sets.
  5061. te.tapHandle = func(ctx context.Context, _ *tap.Info) (context.Context, error) {
  5062. md, ok := metadata.FromIncomingContext(ctx)
  5063. if !ok {
  5064. return ctx, fmt.Errorf("couldn't find metadata in context")
  5065. }
  5066. for k, vwant := range authdata {
  5067. vgot, ok := md[k]
  5068. if !ok {
  5069. return ctx, fmt.Errorf("couldn't find metadata for key %v", k)
  5070. }
  5071. if len(vgot) != 2 {
  5072. return ctx, fmt.Errorf("len of value for key %v was %v, want 2", k, len(vgot))
  5073. }
  5074. if vgot[0] != vwant || vgot[1] != vwant {
  5075. return ctx, fmt.Errorf("value for %v was %v, want [%v, %v]", k, vgot, vwant, vwant)
  5076. }
  5077. }
  5078. return ctx, nil
  5079. }
  5080. te.startServer(&testServer{security: e.security})
  5081. defer te.tearDown()
  5082. cc := te.clientConn()
  5083. tc := testpb.NewTestServiceClient(cc)
  5084. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.PerRPCCredentials(testPerRPCCredentials{})); err != nil {
  5085. t.Fatalf("Test failed. Reason: %v", err)
  5086. }
  5087. }
  5088. func (s) TestWaitForReadyConnection(t *testing.T) {
  5089. for _, e := range listTestEnv() {
  5090. testWaitForReadyConnection(t, e)
  5091. }
  5092. }
  5093. func testWaitForReadyConnection(t *testing.T, e env) {
  5094. te := newTest(t, e)
  5095. te.userAgent = testAppUA
  5096. te.startServer(&testServer{security: e.security})
  5097. defer te.tearDown()
  5098. cc := te.clientConn() // Non-blocking dial.
  5099. tc := testpb.NewTestServiceClient(cc)
  5100. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  5101. defer cancel()
  5102. state := cc.GetState()
  5103. // Wait for connection to be Ready.
  5104. for ; state != connectivity.Ready && cc.WaitForStateChange(ctx, state); state = cc.GetState() {
  5105. }
  5106. if state != connectivity.Ready {
  5107. t.Fatalf("Want connection state to be Ready, got %v", state)
  5108. }
  5109. ctx, cancel = context.WithTimeout(context.Background(), time.Second)
  5110. defer cancel()
  5111. // Make a fail-fast RPC.
  5112. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  5113. t.Fatalf("TestService/EmptyCall(_,_) = _, %v, want _, nil", err)
  5114. }
  5115. }
  5116. type errCodec struct {
  5117. noError bool
  5118. }
  5119. func (c *errCodec) Marshal(v interface{}) ([]byte, error) {
  5120. if c.noError {
  5121. return []byte{}, nil
  5122. }
  5123. return nil, fmt.Errorf("3987^12 + 4365^12 = 4472^12")
  5124. }
  5125. func (c *errCodec) Unmarshal(data []byte, v interface{}) error {
  5126. return nil
  5127. }
  5128. func (c *errCodec) Name() string {
  5129. return "Fermat's near-miss."
  5130. }
  5131. func (s) TestEncodeDoesntPanic(t *testing.T) {
  5132. for _, e := range listTestEnv() {
  5133. testEncodeDoesntPanic(t, e)
  5134. }
  5135. }
  5136. func testEncodeDoesntPanic(t *testing.T, e env) {
  5137. te := newTest(t, e)
  5138. erc := &errCodec{}
  5139. te.customCodec = erc
  5140. te.startServer(&testServer{security: e.security})
  5141. defer te.tearDown()
  5142. te.customCodec = nil
  5143. tc := testpb.NewTestServiceClient(te.clientConn())
  5144. // Failure case, should not panic.
  5145. tc.EmptyCall(context.Background(), &testpb.Empty{})
  5146. erc.noError = true
  5147. // Passing case.
  5148. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  5149. t.Fatalf("EmptyCall(_, _) = _, %v, want _, <nil>", err)
  5150. }
  5151. }
  5152. func (s) TestSvrWriteStatusEarlyWrite(t *testing.T) {
  5153. for _, e := range listTestEnv() {
  5154. testSvrWriteStatusEarlyWrite(t, e)
  5155. }
  5156. }
  5157. func testSvrWriteStatusEarlyWrite(t *testing.T, e env) {
  5158. te := newTest(t, e)
  5159. const smallSize = 1024
  5160. const largeSize = 2048
  5161. const extraLargeSize = 4096
  5162. te.maxServerReceiveMsgSize = newInt(largeSize)
  5163. te.maxServerSendMsgSize = newInt(largeSize)
  5164. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  5165. if err != nil {
  5166. t.Fatal(err)
  5167. }
  5168. extraLargePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, extraLargeSize)
  5169. if err != nil {
  5170. t.Fatal(err)
  5171. }
  5172. te.startServer(&testServer{security: e.security})
  5173. defer te.tearDown()
  5174. tc := testpb.NewTestServiceClient(te.clientConn())
  5175. respParam := []*testpb.ResponseParameters{
  5176. {
  5177. Size: int32(smallSize),
  5178. },
  5179. }
  5180. sreq := &testpb.StreamingOutputCallRequest{
  5181. ResponseType: testpb.PayloadType_COMPRESSABLE,
  5182. ResponseParameters: respParam,
  5183. Payload: extraLargePayload,
  5184. }
  5185. // Test recv case: server receives a message larger than maxServerReceiveMsgSize.
  5186. stream, err := tc.FullDuplexCall(te.ctx)
  5187. if err != nil {
  5188. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5189. }
  5190. if err = stream.Send(sreq); err != nil {
  5191. t.Fatalf("%v.Send() = _, %v, want <nil>", stream, err)
  5192. }
  5193. if _, err = stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  5194. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  5195. }
  5196. // Test send case: server sends a message larger than maxServerSendMsgSize.
  5197. sreq.Payload = smallPayload
  5198. respParam[0].Size = int32(extraLargeSize)
  5199. stream, err = tc.FullDuplexCall(te.ctx)
  5200. if err != nil {
  5201. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5202. }
  5203. if err = stream.Send(sreq); err != nil {
  5204. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  5205. }
  5206. if _, err = stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  5207. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  5208. }
  5209. }
  5210. // The following functions with function name ending with TD indicates that they
  5211. // should be deleted after old service config API is deprecated and deleted.
  5212. func testServiceConfigSetupTD(t *testing.T, e env) (*test, chan grpc.ServiceConfig) {
  5213. te := newTest(t, e)
  5214. // We write before read.
  5215. ch := make(chan grpc.ServiceConfig, 1)
  5216. te.sc = ch
  5217. te.userAgent = testAppUA
  5218. te.declareLogNoise(
  5219. "transport: http2Client.notifyError got notified that the client transport was broken EOF",
  5220. "grpc: addrConn.transportMonitor exits due to: grpc: the connection is closing",
  5221. "grpc: addrConn.resetTransport failed to create client transport: connection error",
  5222. "Failed to dial : context canceled; please retry.",
  5223. )
  5224. return te, ch
  5225. }
  5226. func (s) TestServiceConfigGetMethodConfigTD(t *testing.T) {
  5227. for _, e := range listTestEnv() {
  5228. testGetMethodConfigTD(t, e)
  5229. }
  5230. }
  5231. func testGetMethodConfigTD(t *testing.T, e env) {
  5232. te, ch := testServiceConfigSetupTD(t, e)
  5233. defer te.tearDown()
  5234. mc1 := grpc.MethodConfig{
  5235. WaitForReady: newBool(true),
  5236. Timeout: newDuration(time.Millisecond),
  5237. }
  5238. mc2 := grpc.MethodConfig{WaitForReady: newBool(false)}
  5239. m := make(map[string]grpc.MethodConfig)
  5240. m["/grpc.testing.TestService/EmptyCall"] = mc1
  5241. m["/grpc.testing.TestService/"] = mc2
  5242. sc := grpc.ServiceConfig{
  5243. Methods: m,
  5244. }
  5245. ch <- sc
  5246. cc := te.clientConn()
  5247. tc := testpb.NewTestServiceClient(cc)
  5248. // The following RPCs are expected to become non-fail-fast ones with 1ms deadline.
  5249. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.DeadlineExceeded {
  5250. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  5251. }
  5252. m = make(map[string]grpc.MethodConfig)
  5253. m["/grpc.testing.TestService/UnaryCall"] = mc1
  5254. m["/grpc.testing.TestService/"] = mc2
  5255. sc = grpc.ServiceConfig{
  5256. Methods: m,
  5257. }
  5258. ch <- sc
  5259. // Wait for the new service config to propagate.
  5260. for {
  5261. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) == codes.DeadlineExceeded {
  5262. continue
  5263. }
  5264. break
  5265. }
  5266. // The following RPCs are expected to become fail-fast.
  5267. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.Unavailable {
  5268. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.Unavailable)
  5269. }
  5270. }
  5271. func (s) TestServiceConfigWaitForReadyTD(t *testing.T) {
  5272. for _, e := range listTestEnv() {
  5273. testServiceConfigWaitForReadyTD(t, e)
  5274. }
  5275. }
  5276. func testServiceConfigWaitForReadyTD(t *testing.T, e env) {
  5277. te, ch := testServiceConfigSetupTD(t, e)
  5278. defer te.tearDown()
  5279. // Case1: Client API set failfast to be false, and service config set wait_for_ready to be false, Client API should win, and the rpc will wait until deadline exceeds.
  5280. mc := grpc.MethodConfig{
  5281. WaitForReady: newBool(false),
  5282. Timeout: newDuration(time.Millisecond),
  5283. }
  5284. m := make(map[string]grpc.MethodConfig)
  5285. m["/grpc.testing.TestService/EmptyCall"] = mc
  5286. m["/grpc.testing.TestService/FullDuplexCall"] = mc
  5287. sc := grpc.ServiceConfig{
  5288. Methods: m,
  5289. }
  5290. ch <- sc
  5291. cc := te.clientConn()
  5292. tc := testpb.NewTestServiceClient(cc)
  5293. // The following RPCs are expected to become non-fail-fast ones with 1ms deadline.
  5294. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  5295. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  5296. }
  5297. if _, err := tc.FullDuplexCall(context.Background(), grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  5298. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  5299. }
  5300. // Generate a service config update.
  5301. // Case2: Client API does not set failfast, and service config set wait_for_ready to be true, and the rpc will wait until deadline exceeds.
  5302. mc.WaitForReady = newBool(true)
  5303. m = make(map[string]grpc.MethodConfig)
  5304. m["/grpc.testing.TestService/EmptyCall"] = mc
  5305. m["/grpc.testing.TestService/FullDuplexCall"] = mc
  5306. sc = grpc.ServiceConfig{
  5307. Methods: m,
  5308. }
  5309. ch <- sc
  5310. // Wait for the new service config to take effect.
  5311. mc = cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall")
  5312. for {
  5313. if !*mc.WaitForReady {
  5314. time.Sleep(100 * time.Millisecond)
  5315. mc = cc.GetMethodConfig("/grpc.testing.TestService/EmptyCall")
  5316. continue
  5317. }
  5318. break
  5319. }
  5320. // The following RPCs are expected to become non-fail-fast ones with 1ms deadline.
  5321. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); status.Code(err) != codes.DeadlineExceeded {
  5322. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  5323. }
  5324. if _, err := tc.FullDuplexCall(context.Background()); status.Code(err) != codes.DeadlineExceeded {
  5325. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  5326. }
  5327. }
  5328. func (s) TestServiceConfigTimeoutTD(t *testing.T) {
  5329. for _, e := range listTestEnv() {
  5330. testServiceConfigTimeoutTD(t, e)
  5331. }
  5332. }
  5333. func testServiceConfigTimeoutTD(t *testing.T, e env) {
  5334. te, ch := testServiceConfigSetupTD(t, e)
  5335. defer te.tearDown()
  5336. // Case1: Client API sets timeout to be 1ns and ServiceConfig sets timeout to be 1hr. Timeout should be 1ns (min of 1ns and 1hr) and the rpc will wait until deadline exceeds.
  5337. mc := grpc.MethodConfig{
  5338. Timeout: newDuration(time.Hour),
  5339. }
  5340. m := make(map[string]grpc.MethodConfig)
  5341. m["/grpc.testing.TestService/EmptyCall"] = mc
  5342. m["/grpc.testing.TestService/FullDuplexCall"] = mc
  5343. sc := grpc.ServiceConfig{
  5344. Methods: m,
  5345. }
  5346. ch <- sc
  5347. cc := te.clientConn()
  5348. tc := testpb.NewTestServiceClient(cc)
  5349. // The following RPCs are expected to become non-fail-fast ones with 1ns deadline.
  5350. ctx, cancel := context.WithTimeout(context.Background(), time.Nanosecond)
  5351. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  5352. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  5353. }
  5354. cancel()
  5355. ctx, cancel = context.WithTimeout(context.Background(), time.Nanosecond)
  5356. if _, err := tc.FullDuplexCall(ctx, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  5357. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  5358. }
  5359. cancel()
  5360. // Generate a service config update.
  5361. // Case2: Client API sets timeout to be 1hr and ServiceConfig sets timeout to be 1ns. Timeout should be 1ns (min of 1ns and 1hr) and the rpc will wait until deadline exceeds.
  5362. mc.Timeout = newDuration(time.Nanosecond)
  5363. m = make(map[string]grpc.MethodConfig)
  5364. m["/grpc.testing.TestService/EmptyCall"] = mc
  5365. m["/grpc.testing.TestService/FullDuplexCall"] = mc
  5366. sc = grpc.ServiceConfig{
  5367. Methods: m,
  5368. }
  5369. ch <- sc
  5370. // Wait for the new service config to take effect.
  5371. mc = cc.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall")
  5372. for {
  5373. if *mc.Timeout != time.Nanosecond {
  5374. time.Sleep(100 * time.Millisecond)
  5375. mc = cc.GetMethodConfig("/grpc.testing.TestService/FullDuplexCall")
  5376. continue
  5377. }
  5378. break
  5379. }
  5380. ctx, cancel = context.WithTimeout(context.Background(), time.Hour)
  5381. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  5382. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  5383. }
  5384. cancel()
  5385. ctx, cancel = context.WithTimeout(context.Background(), time.Hour)
  5386. if _, err := tc.FullDuplexCall(ctx, grpc.WaitForReady(true)); status.Code(err) != codes.DeadlineExceeded {
  5387. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want %s", err, codes.DeadlineExceeded)
  5388. }
  5389. cancel()
  5390. }
  5391. func (s) TestServiceConfigMaxMsgSizeTD(t *testing.T) {
  5392. for _, e := range listTestEnv() {
  5393. testServiceConfigMaxMsgSizeTD(t, e)
  5394. }
  5395. }
  5396. func testServiceConfigMaxMsgSizeTD(t *testing.T, e env) {
  5397. // Setting up values and objects shared across all test cases.
  5398. const smallSize = 1
  5399. const largeSize = 1024
  5400. const extraLargeSize = 2048
  5401. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  5402. if err != nil {
  5403. t.Fatal(err)
  5404. }
  5405. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  5406. if err != nil {
  5407. t.Fatal(err)
  5408. }
  5409. extraLargePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, extraLargeSize)
  5410. if err != nil {
  5411. t.Fatal(err)
  5412. }
  5413. mc := grpc.MethodConfig{
  5414. MaxReqSize: newInt(extraLargeSize),
  5415. MaxRespSize: newInt(extraLargeSize),
  5416. }
  5417. m := make(map[string]grpc.MethodConfig)
  5418. m["/grpc.testing.TestService/UnaryCall"] = mc
  5419. m["/grpc.testing.TestService/FullDuplexCall"] = mc
  5420. sc := grpc.ServiceConfig{
  5421. Methods: m,
  5422. }
  5423. // Case1: sc set maxReqSize to 2048 (send), maxRespSize to 2048 (recv).
  5424. te1, ch1 := testServiceConfigSetupTD(t, e)
  5425. te1.startServer(&testServer{security: e.security})
  5426. defer te1.tearDown()
  5427. ch1 <- sc
  5428. tc := testpb.NewTestServiceClient(te1.clientConn())
  5429. req := &testpb.SimpleRequest{
  5430. ResponseType: testpb.PayloadType_COMPRESSABLE,
  5431. ResponseSize: int32(extraLargeSize),
  5432. Payload: smallPayload,
  5433. }
  5434. // Test for unary RPC recv.
  5435. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  5436. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  5437. }
  5438. // Test for unary RPC send.
  5439. req.Payload = extraLargePayload
  5440. req.ResponseSize = int32(smallSize)
  5441. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  5442. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  5443. }
  5444. // Test for streaming RPC recv.
  5445. respParam := []*testpb.ResponseParameters{
  5446. {
  5447. Size: int32(extraLargeSize),
  5448. },
  5449. }
  5450. sreq := &testpb.StreamingOutputCallRequest{
  5451. ResponseType: testpb.PayloadType_COMPRESSABLE,
  5452. ResponseParameters: respParam,
  5453. Payload: smallPayload,
  5454. }
  5455. stream, err := tc.FullDuplexCall(te1.ctx)
  5456. if err != nil {
  5457. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5458. }
  5459. if err := stream.Send(sreq); err != nil {
  5460. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  5461. }
  5462. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  5463. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  5464. }
  5465. // Test for streaming RPC send.
  5466. respParam[0].Size = int32(smallSize)
  5467. sreq.Payload = extraLargePayload
  5468. stream, err = tc.FullDuplexCall(te1.ctx)
  5469. if err != nil {
  5470. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5471. }
  5472. if err := stream.Send(sreq); err == nil || status.Code(err) != codes.ResourceExhausted {
  5473. t.Fatalf("%v.Send(%v) = %v, want _, error code: %s", stream, sreq, err, codes.ResourceExhausted)
  5474. }
  5475. // Case2: Client API set maxReqSize to 1024 (send), maxRespSize to 1024 (recv). Sc sets maxReqSize to 2048 (send), maxRespSize to 2048 (recv).
  5476. te2, ch2 := testServiceConfigSetupTD(t, e)
  5477. te2.maxClientReceiveMsgSize = newInt(1024)
  5478. te2.maxClientSendMsgSize = newInt(1024)
  5479. te2.startServer(&testServer{security: e.security})
  5480. defer te2.tearDown()
  5481. ch2 <- sc
  5482. tc = testpb.NewTestServiceClient(te2.clientConn())
  5483. // Test for unary RPC recv.
  5484. req.Payload = smallPayload
  5485. req.ResponseSize = int32(largeSize)
  5486. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  5487. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  5488. }
  5489. // Test for unary RPC send.
  5490. req.Payload = largePayload
  5491. req.ResponseSize = int32(smallSize)
  5492. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  5493. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  5494. }
  5495. // Test for streaming RPC recv.
  5496. stream, err = tc.FullDuplexCall(te2.ctx)
  5497. respParam[0].Size = int32(largeSize)
  5498. sreq.Payload = smallPayload
  5499. if err != nil {
  5500. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5501. }
  5502. if err := stream.Send(sreq); err != nil {
  5503. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  5504. }
  5505. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  5506. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  5507. }
  5508. // Test for streaming RPC send.
  5509. respParam[0].Size = int32(smallSize)
  5510. sreq.Payload = largePayload
  5511. stream, err = tc.FullDuplexCall(te2.ctx)
  5512. if err != nil {
  5513. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5514. }
  5515. if err := stream.Send(sreq); err == nil || status.Code(err) != codes.ResourceExhausted {
  5516. t.Fatalf("%v.Send(%v) = %v, want _, error code: %s", stream, sreq, err, codes.ResourceExhausted)
  5517. }
  5518. // Case3: Client API set maxReqSize to 4096 (send), maxRespSize to 4096 (recv). Sc sets maxReqSize to 2048 (send), maxRespSize to 2048 (recv).
  5519. te3, ch3 := testServiceConfigSetupTD(t, e)
  5520. te3.maxClientReceiveMsgSize = newInt(4096)
  5521. te3.maxClientSendMsgSize = newInt(4096)
  5522. te3.startServer(&testServer{security: e.security})
  5523. defer te3.tearDown()
  5524. ch3 <- sc
  5525. tc = testpb.NewTestServiceClient(te3.clientConn())
  5526. // Test for unary RPC recv.
  5527. req.Payload = smallPayload
  5528. req.ResponseSize = int32(largeSize)
  5529. if _, err := tc.UnaryCall(context.Background(), req); err != nil {
  5530. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want <nil>", err)
  5531. }
  5532. req.ResponseSize = int32(extraLargeSize)
  5533. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  5534. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  5535. }
  5536. // Test for unary RPC send.
  5537. req.Payload = largePayload
  5538. req.ResponseSize = int32(smallSize)
  5539. if _, err := tc.UnaryCall(context.Background(), req); err != nil {
  5540. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want <nil>", err)
  5541. }
  5542. req.Payload = extraLargePayload
  5543. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  5544. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  5545. }
  5546. // Test for streaming RPC recv.
  5547. stream, err = tc.FullDuplexCall(te3.ctx)
  5548. if err != nil {
  5549. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5550. }
  5551. respParam[0].Size = int32(largeSize)
  5552. sreq.Payload = smallPayload
  5553. if err := stream.Send(sreq); err != nil {
  5554. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  5555. }
  5556. if _, err := stream.Recv(); err != nil {
  5557. t.Fatalf("%v.Recv() = _, %v, want <nil>", stream, err)
  5558. }
  5559. respParam[0].Size = int32(extraLargeSize)
  5560. if err := stream.Send(sreq); err != nil {
  5561. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  5562. }
  5563. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  5564. t.Fatalf("%v.Recv() = _, %v, want _, error code: %s", stream, err, codes.ResourceExhausted)
  5565. }
  5566. // Test for streaming RPC send.
  5567. respParam[0].Size = int32(smallSize)
  5568. sreq.Payload = largePayload
  5569. stream, err = tc.FullDuplexCall(te3.ctx)
  5570. if err != nil {
  5571. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5572. }
  5573. if err := stream.Send(sreq); err != nil {
  5574. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  5575. }
  5576. sreq.Payload = extraLargePayload
  5577. if err := stream.Send(sreq); err == nil || status.Code(err) != codes.ResourceExhausted {
  5578. t.Fatalf("%v.Send(%v) = %v, want _, error code: %s", stream, sreq, err, codes.ResourceExhausted)
  5579. }
  5580. }
  5581. func (s) TestMethodFromServerStream(t *testing.T) {
  5582. const testMethod = "/package.service/method"
  5583. e := tcpClearRREnv
  5584. te := newTest(t, e)
  5585. var method string
  5586. var ok bool
  5587. te.unknownHandler = func(srv interface{}, stream grpc.ServerStream) error {
  5588. method, ok = grpc.MethodFromServerStream(stream)
  5589. return nil
  5590. }
  5591. te.startServer(nil)
  5592. defer te.tearDown()
  5593. _ = te.clientConn().Invoke(context.Background(), testMethod, nil, nil)
  5594. if !ok || method != testMethod {
  5595. t.Fatalf("Invoke with method %q, got %q, %v, want %q, true", testMethod, method, ok, testMethod)
  5596. }
  5597. }
  5598. func (s) TestInterceptorCanAccessCallOptions(t *testing.T) {
  5599. e := tcpClearRREnv
  5600. te := newTest(t, e)
  5601. te.startServer(&testServer{security: e.security})
  5602. defer te.tearDown()
  5603. type observedOptions struct {
  5604. headers []*metadata.MD
  5605. trailers []*metadata.MD
  5606. peer []*peer.Peer
  5607. creds []credentials.PerRPCCredentials
  5608. failFast []bool
  5609. maxRecvSize []int
  5610. maxSendSize []int
  5611. compressor []string
  5612. subtype []string
  5613. }
  5614. var observedOpts observedOptions
  5615. populateOpts := func(opts []grpc.CallOption) {
  5616. for _, o := range opts {
  5617. switch o := o.(type) {
  5618. case grpc.HeaderCallOption:
  5619. observedOpts.headers = append(observedOpts.headers, o.HeaderAddr)
  5620. case grpc.TrailerCallOption:
  5621. observedOpts.trailers = append(observedOpts.trailers, o.TrailerAddr)
  5622. case grpc.PeerCallOption:
  5623. observedOpts.peer = append(observedOpts.peer, o.PeerAddr)
  5624. case grpc.PerRPCCredsCallOption:
  5625. observedOpts.creds = append(observedOpts.creds, o.Creds)
  5626. case grpc.FailFastCallOption:
  5627. observedOpts.failFast = append(observedOpts.failFast, o.FailFast)
  5628. case grpc.MaxRecvMsgSizeCallOption:
  5629. observedOpts.maxRecvSize = append(observedOpts.maxRecvSize, o.MaxRecvMsgSize)
  5630. case grpc.MaxSendMsgSizeCallOption:
  5631. observedOpts.maxSendSize = append(observedOpts.maxSendSize, o.MaxSendMsgSize)
  5632. case grpc.CompressorCallOption:
  5633. observedOpts.compressor = append(observedOpts.compressor, o.CompressorType)
  5634. case grpc.ContentSubtypeCallOption:
  5635. observedOpts.subtype = append(observedOpts.subtype, o.ContentSubtype)
  5636. }
  5637. }
  5638. }
  5639. te.unaryClientInt = func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  5640. populateOpts(opts)
  5641. return nil
  5642. }
  5643. te.streamClientInt = func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
  5644. populateOpts(opts)
  5645. return nil, nil
  5646. }
  5647. defaults := []grpc.CallOption{
  5648. grpc.WaitForReady(true),
  5649. grpc.MaxCallRecvMsgSize(1010),
  5650. }
  5651. tc := testpb.NewTestServiceClient(te.clientConn(grpc.WithDefaultCallOptions(defaults...)))
  5652. var headers metadata.MD
  5653. var trailers metadata.MD
  5654. var pr peer.Peer
  5655. tc.UnaryCall(context.Background(), &testpb.SimpleRequest{},
  5656. grpc.MaxCallRecvMsgSize(100),
  5657. grpc.MaxCallSendMsgSize(200),
  5658. grpc.PerRPCCredentials(testPerRPCCredentials{}),
  5659. grpc.Header(&headers),
  5660. grpc.Trailer(&trailers),
  5661. grpc.Peer(&pr))
  5662. expected := observedOptions{
  5663. failFast: []bool{false},
  5664. maxRecvSize: []int{1010, 100},
  5665. maxSendSize: []int{200},
  5666. creds: []credentials.PerRPCCredentials{testPerRPCCredentials{}},
  5667. headers: []*metadata.MD{&headers},
  5668. trailers: []*metadata.MD{&trailers},
  5669. peer: []*peer.Peer{&pr},
  5670. }
  5671. if !reflect.DeepEqual(expected, observedOpts) {
  5672. t.Errorf("unary call did not observe expected options: expected %#v, got %#v", expected, observedOpts)
  5673. }
  5674. observedOpts = observedOptions{} // reset
  5675. tc.StreamingInputCall(context.Background(),
  5676. grpc.WaitForReady(false),
  5677. grpc.MaxCallSendMsgSize(2020),
  5678. grpc.UseCompressor("comp-type"),
  5679. grpc.CallContentSubtype("json"))
  5680. expected = observedOptions{
  5681. failFast: []bool{false, true},
  5682. maxRecvSize: []int{1010},
  5683. maxSendSize: []int{2020},
  5684. compressor: []string{"comp-type"},
  5685. subtype: []string{"json"},
  5686. }
  5687. if !reflect.DeepEqual(expected, observedOpts) {
  5688. t.Errorf("streaming call did not observe expected options: expected %#v, got %#v", expected, observedOpts)
  5689. }
  5690. }
  5691. func (s) TestCompressorRegister(t *testing.T) {
  5692. for _, e := range listTestEnv() {
  5693. testCompressorRegister(t, e)
  5694. }
  5695. }
  5696. func testCompressorRegister(t *testing.T, e env) {
  5697. te := newTest(t, e)
  5698. te.clientCompression = false
  5699. te.serverCompression = false
  5700. te.clientUseCompression = true
  5701. te.startServer(&testServer{security: e.security})
  5702. defer te.tearDown()
  5703. tc := testpb.NewTestServiceClient(te.clientConn())
  5704. // Unary call
  5705. const argSize = 271828
  5706. const respSize = 314159
  5707. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  5708. if err != nil {
  5709. t.Fatal(err)
  5710. }
  5711. req := &testpb.SimpleRequest{
  5712. ResponseType: testpb.PayloadType_COMPRESSABLE,
  5713. ResponseSize: respSize,
  5714. Payload: payload,
  5715. }
  5716. ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("something", "something"))
  5717. if _, err := tc.UnaryCall(ctx, req); err != nil {
  5718. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, <nil>", err)
  5719. }
  5720. // Streaming RPC
  5721. ctx, cancel := context.WithCancel(context.Background())
  5722. defer cancel()
  5723. stream, err := tc.FullDuplexCall(ctx)
  5724. if err != nil {
  5725. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  5726. }
  5727. respParam := []*testpb.ResponseParameters{
  5728. {
  5729. Size: 31415,
  5730. },
  5731. }
  5732. payload, err = newPayload(testpb.PayloadType_COMPRESSABLE, int32(31415))
  5733. if err != nil {
  5734. t.Fatal(err)
  5735. }
  5736. sreq := &testpb.StreamingOutputCallRequest{
  5737. ResponseType: testpb.PayloadType_COMPRESSABLE,
  5738. ResponseParameters: respParam,
  5739. Payload: payload,
  5740. }
  5741. if err := stream.Send(sreq); err != nil {
  5742. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  5743. }
  5744. if _, err := stream.Recv(); err != nil {
  5745. t.Fatalf("%v.Recv() = %v, want <nil>", stream, err)
  5746. }
  5747. }
  5748. func (s) TestServeExitsWhenListenerClosed(t *testing.T) {
  5749. ss := &stubServer{
  5750. emptyCall: func(context.Context, *testpb.Empty) (*testpb.Empty, error) {
  5751. return &testpb.Empty{}, nil
  5752. },
  5753. }
  5754. s := grpc.NewServer()
  5755. testpb.RegisterTestServiceServer(s, ss)
  5756. lis, err := net.Listen("tcp", "localhost:0")
  5757. if err != nil {
  5758. t.Fatalf("Failed to create listener: %v", err)
  5759. }
  5760. done := make(chan struct{})
  5761. go func() {
  5762. s.Serve(lis)
  5763. close(done)
  5764. }()
  5765. cc, err := grpc.Dial(lis.Addr().String(), grpc.WithInsecure(), grpc.WithBlock())
  5766. if err != nil {
  5767. t.Fatalf("Failed to dial server: %v", err)
  5768. }
  5769. defer cc.Close()
  5770. c := testpb.NewTestServiceClient(cc)
  5771. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  5772. defer cancel()
  5773. if _, err := c.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  5774. t.Fatalf("Failed to send test RPC to server: %v", err)
  5775. }
  5776. if err := lis.Close(); err != nil {
  5777. t.Fatalf("Failed to close listener: %v", err)
  5778. }
  5779. const timeout = 5 * time.Second
  5780. timer := time.NewTimer(timeout)
  5781. select {
  5782. case <-done:
  5783. return
  5784. case <-timer.C:
  5785. t.Fatalf("Serve did not return after %v", timeout)
  5786. }
  5787. }
  5788. // Service handler returns status with invalid utf8 message.
  5789. func (s) TestStatusInvalidUTF8Message(t *testing.T) {
  5790. var (
  5791. origMsg = string([]byte{0xff, 0xfe, 0xfd})
  5792. wantMsg = "���"
  5793. )
  5794. ss := &stubServer{
  5795. emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  5796. return nil, status.Errorf(codes.Internal, origMsg)
  5797. },
  5798. }
  5799. if err := ss.Start(nil); err != nil {
  5800. t.Fatalf("Error starting endpoint server: %v", err)
  5801. }
  5802. defer ss.Stop()
  5803. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  5804. defer cancel()
  5805. if _, err := ss.client.EmptyCall(ctx, &testpb.Empty{}); status.Convert(err).Message() != wantMsg {
  5806. t.Fatalf("ss.client.EmptyCall(_, _) = _, %v (msg %q); want _, err with msg %q", err, status.Convert(err).Message(), wantMsg)
  5807. }
  5808. }
  5809. // Service handler returns status with details and invalid utf8 message. Proto
  5810. // will fail to marshal the status because of the invalid utf8 message. Details
  5811. // will be dropped when sending.
  5812. func (s) TestStatusInvalidUTF8Details(t *testing.T) {
  5813. var (
  5814. origMsg = string([]byte{0xff, 0xfe, 0xfd})
  5815. wantMsg = "���"
  5816. )
  5817. ss := &stubServer{
  5818. emptyCall: func(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  5819. st := status.New(codes.Internal, origMsg)
  5820. st, err := st.WithDetails(&testpb.Empty{})
  5821. if err != nil {
  5822. return nil, err
  5823. }
  5824. return nil, st.Err()
  5825. },
  5826. }
  5827. if err := ss.Start(nil); err != nil {
  5828. t.Fatalf("Error starting endpoint server: %v", err)
  5829. }
  5830. defer ss.Stop()
  5831. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  5832. defer cancel()
  5833. _, err := ss.client.EmptyCall(ctx, &testpb.Empty{})
  5834. st := status.Convert(err)
  5835. if st.Message() != wantMsg {
  5836. t.Fatalf("ss.client.EmptyCall(_, _) = _, %v (msg %q); want _, err with msg %q", err, st.Message(), wantMsg)
  5837. }
  5838. if len(st.Details()) != 0 {
  5839. // Details should be dropped on the server side.
  5840. t.Fatalf("RPC status contain details: %v, want no details", st.Details())
  5841. }
  5842. }
  5843. func (s) TestClientDoesntDeadlockWhileWritingErrornousLargeMessages(t *testing.T) {
  5844. for _, e := range listTestEnv() {
  5845. if e.httpHandler {
  5846. continue
  5847. }
  5848. testClientDoesntDeadlockWhileWritingErrornousLargeMessages(t, e)
  5849. }
  5850. }
  5851. func testClientDoesntDeadlockWhileWritingErrornousLargeMessages(t *testing.T, e env) {
  5852. te := newTest(t, e)
  5853. te.userAgent = testAppUA
  5854. smallSize := 1024
  5855. te.maxServerReceiveMsgSize = &smallSize
  5856. te.startServer(&testServer{security: e.security})
  5857. defer te.tearDown()
  5858. tc := testpb.NewTestServiceClient(te.clientConn())
  5859. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 1048576)
  5860. if err != nil {
  5861. t.Fatal(err)
  5862. }
  5863. req := &testpb.SimpleRequest{
  5864. ResponseType: testpb.PayloadType_COMPRESSABLE,
  5865. Payload: payload,
  5866. }
  5867. var wg sync.WaitGroup
  5868. for i := 0; i < 10; i++ {
  5869. wg.Add(1)
  5870. go func() {
  5871. defer wg.Done()
  5872. for j := 0; j < 100; j++ {
  5873. ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*10))
  5874. defer cancel()
  5875. if _, err := tc.UnaryCall(ctx, req); status.Code(err) != codes.ResourceExhausted {
  5876. t.Errorf("TestService/UnaryCall(_,_) = _. %v, want code: %s", err, codes.ResourceExhausted)
  5877. return
  5878. }
  5879. }
  5880. }()
  5881. }
  5882. wg.Wait()
  5883. }
  5884. const clientAlwaysFailCredErrorMsg = "clientAlwaysFailCred always fails"
  5885. var errClientAlwaysFailCred = errors.New(clientAlwaysFailCredErrorMsg)
  5886. type clientAlwaysFailCred struct{}
  5887. func (c clientAlwaysFailCred) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  5888. return nil, nil, errClientAlwaysFailCred
  5889. }
  5890. func (c clientAlwaysFailCred) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  5891. return rawConn, nil, nil
  5892. }
  5893. func (c clientAlwaysFailCred) Info() credentials.ProtocolInfo {
  5894. return credentials.ProtocolInfo{}
  5895. }
  5896. func (c clientAlwaysFailCred) Clone() credentials.TransportCredentials {
  5897. return nil
  5898. }
  5899. func (c clientAlwaysFailCred) OverrideServerName(s string) error {
  5900. return nil
  5901. }
  5902. func (s) TestFailFastRPCErrorOnBadCertificates(t *testing.T) {
  5903. te := newTest(t, env{name: "bad-cred", network: "tcp", security: "clientAlwaysFailCred", balancer: "round_robin"})
  5904. te.startServer(&testServer{security: te.e.security})
  5905. defer te.tearDown()
  5906. opts := []grpc.DialOption{grpc.WithTransportCredentials(clientAlwaysFailCred{})}
  5907. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  5908. defer cancel()
  5909. cc, err := grpc.DialContext(ctx, te.srvAddr, opts...)
  5910. if err != nil {
  5911. t.Fatalf("Dial(_) = %v, want %v", err, nil)
  5912. }
  5913. defer cc.Close()
  5914. tc := testpb.NewTestServiceClient(cc)
  5915. for i := 0; i < 1000; i++ {
  5916. // This loop runs for at most 1 second. The first several RPCs will fail
  5917. // with Unavailable because the connection hasn't started. When the
  5918. // first connection failed with creds error, the next RPC should also
  5919. // fail with the expected error.
  5920. if _, err = tc.EmptyCall(context.Background(), &testpb.Empty{}); strings.Contains(err.Error(), clientAlwaysFailCredErrorMsg) {
  5921. return
  5922. }
  5923. time.Sleep(time.Millisecond)
  5924. }
  5925. te.t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want err.Error() contains %q", err, clientAlwaysFailCredErrorMsg)
  5926. }
  5927. func (s) TestRPCTimeout(t *testing.T) {
  5928. for _, e := range listTestEnv() {
  5929. testRPCTimeout(t, e)
  5930. }
  5931. }
  5932. func testRPCTimeout(t *testing.T, e env) {
  5933. te := newTest(t, e)
  5934. te.startServer(&testServer{security: e.security, unaryCallSleepTime: 500 * time.Millisecond})
  5935. defer te.tearDown()
  5936. cc := te.clientConn()
  5937. tc := testpb.NewTestServiceClient(cc)
  5938. const argSize = 2718
  5939. const respSize = 314
  5940. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, argSize)
  5941. if err != nil {
  5942. t.Fatal(err)
  5943. }
  5944. req := &testpb.SimpleRequest{
  5945. ResponseType: testpb.PayloadType_COMPRESSABLE,
  5946. ResponseSize: respSize,
  5947. Payload: payload,
  5948. }
  5949. for i := -1; i <= 10; i++ {
  5950. ctx, cancel := context.WithTimeout(context.Background(), time.Duration(i)*time.Millisecond)
  5951. if _, err := tc.UnaryCall(ctx, req); status.Code(err) != codes.DeadlineExceeded {
  5952. t.Fatalf("TestService/UnaryCallv(_, _) = _, %v; want <nil>, error code: %s", err, codes.DeadlineExceeded)
  5953. }
  5954. cancel()
  5955. }
  5956. }
  5957. func (s) TestDisabledIOBuffers(t *testing.T) {
  5958. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(60000))
  5959. if err != nil {
  5960. t.Fatalf("Failed to create payload: %v", err)
  5961. }
  5962. req := &testpb.StreamingOutputCallRequest{
  5963. Payload: payload,
  5964. }
  5965. resp := &testpb.StreamingOutputCallResponse{
  5966. Payload: payload,
  5967. }
  5968. ss := &stubServer{
  5969. fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
  5970. for {
  5971. in, err := stream.Recv()
  5972. if err == io.EOF {
  5973. return nil
  5974. }
  5975. if err != nil {
  5976. t.Errorf("stream.Recv() = _, %v, want _, <nil>", err)
  5977. return err
  5978. }
  5979. if !reflect.DeepEqual(in.Payload.Body, payload.Body) {
  5980. t.Errorf("Received message(len: %v) on server not what was expected(len: %v).", len(in.Payload.Body), len(payload.Body))
  5981. return err
  5982. }
  5983. if err := stream.Send(resp); err != nil {
  5984. t.Errorf("stream.Send(_)= %v, want <nil>", err)
  5985. return err
  5986. }
  5987. }
  5988. },
  5989. }
  5990. s := grpc.NewServer(grpc.WriteBufferSize(0), grpc.ReadBufferSize(0))
  5991. testpb.RegisterTestServiceServer(s, ss)
  5992. lis, err := net.Listen("tcp", "localhost:0")
  5993. if err != nil {
  5994. t.Fatalf("Failed to create listener: %v", err)
  5995. }
  5996. done := make(chan struct{})
  5997. go func() {
  5998. s.Serve(lis)
  5999. close(done)
  6000. }()
  6001. defer s.Stop()
  6002. dctx, dcancel := context.WithTimeout(context.Background(), 5*time.Second)
  6003. defer dcancel()
  6004. cc, err := grpc.DialContext(dctx, lis.Addr().String(), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithWriteBufferSize(0), grpc.WithReadBufferSize(0))
  6005. if err != nil {
  6006. t.Fatalf("Failed to dial server")
  6007. }
  6008. defer cc.Close()
  6009. c := testpb.NewTestServiceClient(cc)
  6010. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  6011. defer cancel()
  6012. stream, err := c.FullDuplexCall(ctx, grpc.WaitForReady(true))
  6013. if err != nil {
  6014. t.Fatalf("Failed to send test RPC to server")
  6015. }
  6016. for i := 0; i < 10; i++ {
  6017. if err := stream.Send(req); err != nil {
  6018. t.Fatalf("stream.Send(_) = %v, want <nil>", err)
  6019. }
  6020. in, err := stream.Recv()
  6021. if err != nil {
  6022. t.Fatalf("stream.Recv() = _, %v, want _, <nil>", err)
  6023. }
  6024. if !reflect.DeepEqual(in.Payload.Body, payload.Body) {
  6025. t.Fatalf("Received message(len: %v) on client not what was expected(len: %v).", len(in.Payload.Body), len(payload.Body))
  6026. }
  6027. }
  6028. stream.CloseSend()
  6029. if _, err := stream.Recv(); err != io.EOF {
  6030. t.Fatalf("stream.Recv() = _, %v, want _, io.EOF", err)
  6031. }
  6032. }
  6033. func (s) TestServerMaxHeaderListSizeClientUserViolation(t *testing.T) {
  6034. for _, e := range listTestEnv() {
  6035. if e.httpHandler {
  6036. continue
  6037. }
  6038. testServerMaxHeaderListSizeClientUserViolation(t, e)
  6039. }
  6040. }
  6041. func testServerMaxHeaderListSizeClientUserViolation(t *testing.T, e env) {
  6042. te := newTest(t, e)
  6043. te.maxServerHeaderListSize = new(uint32)
  6044. *te.maxServerHeaderListSize = 216
  6045. te.startServer(&testServer{security: e.security})
  6046. defer te.tearDown()
  6047. cc := te.clientConn()
  6048. tc := testpb.NewTestServiceClient(cc)
  6049. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  6050. defer cancel()
  6051. metadata.AppendToOutgoingContext(ctx, "oversize", string(make([]byte, 216)))
  6052. var err error
  6053. if err = verifyResultWithDelay(func() (bool, error) {
  6054. if _, err = tc.EmptyCall(ctx, &testpb.Empty{}); err != nil && status.Code(err) == codes.Internal {
  6055. return true, nil
  6056. }
  6057. return false, fmt.Errorf("tc.EmptyCall() = _, err: %v, want _, error code: %v", err, codes.Internal)
  6058. }); err != nil {
  6059. t.Fatal(err)
  6060. }
  6061. }
  6062. func (s) TestClientMaxHeaderListSizeServerUserViolation(t *testing.T) {
  6063. for _, e := range listTestEnv() {
  6064. if e.httpHandler {
  6065. continue
  6066. }
  6067. testClientMaxHeaderListSizeServerUserViolation(t, e)
  6068. }
  6069. }
  6070. func testClientMaxHeaderListSizeServerUserViolation(t *testing.T, e env) {
  6071. te := newTest(t, e)
  6072. te.maxClientHeaderListSize = new(uint32)
  6073. *te.maxClientHeaderListSize = 1 // any header server sends will violate
  6074. te.startServer(&testServer{security: e.security})
  6075. defer te.tearDown()
  6076. cc := te.clientConn()
  6077. tc := testpb.NewTestServiceClient(cc)
  6078. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  6079. defer cancel()
  6080. var err error
  6081. if err = verifyResultWithDelay(func() (bool, error) {
  6082. if _, err = tc.EmptyCall(ctx, &testpb.Empty{}); err != nil && status.Code(err) == codes.Internal {
  6083. return true, nil
  6084. }
  6085. return false, fmt.Errorf("tc.EmptyCall() = _, err: %v, want _, error code: %v", err, codes.Internal)
  6086. }); err != nil {
  6087. t.Fatal(err)
  6088. }
  6089. }
  6090. func (s) TestServerMaxHeaderListSizeClientIntentionalViolation(t *testing.T) {
  6091. for _, e := range listTestEnv() {
  6092. if e.httpHandler || e.security == "tls" {
  6093. continue
  6094. }
  6095. testServerMaxHeaderListSizeClientIntentionalViolation(t, e)
  6096. }
  6097. }
  6098. func testServerMaxHeaderListSizeClientIntentionalViolation(t *testing.T, e env) {
  6099. te := newTest(t, e)
  6100. te.maxServerHeaderListSize = new(uint32)
  6101. *te.maxServerHeaderListSize = 512
  6102. te.startServer(&testServer{security: e.security})
  6103. defer te.tearDown()
  6104. cc, dw := te.clientConnWithConnControl()
  6105. tc := &testServiceClientWrapper{TestServiceClient: testpb.NewTestServiceClient(cc)}
  6106. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  6107. defer cancel()
  6108. stream, err := tc.FullDuplexCall(ctx)
  6109. if err != nil {
  6110. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want _, <nil>", tc, err)
  6111. }
  6112. rcw := dw.getRawConnWrapper()
  6113. val := make([]string, 512)
  6114. for i := range val {
  6115. val[i] = "a"
  6116. }
  6117. // allow for client to send the initial header
  6118. time.Sleep(100 * time.Millisecond)
  6119. rcw.writeHeaders(http2.HeadersFrameParam{
  6120. StreamID: tc.getCurrentStreamID(),
  6121. BlockFragment: rcw.encodeHeader("oversize", strings.Join(val, "")),
  6122. EndStream: false,
  6123. EndHeaders: true,
  6124. })
  6125. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.Internal {
  6126. t.Fatalf("stream.Recv() = _, %v, want _, error code: %v", err, codes.Internal)
  6127. }
  6128. }
  6129. func (s) TestClientMaxHeaderListSizeServerIntentionalViolation(t *testing.T) {
  6130. for _, e := range listTestEnv() {
  6131. if e.httpHandler || e.security == "tls" {
  6132. continue
  6133. }
  6134. testClientMaxHeaderListSizeServerIntentionalViolation(t, e)
  6135. }
  6136. }
  6137. func testClientMaxHeaderListSizeServerIntentionalViolation(t *testing.T, e env) {
  6138. te := newTest(t, e)
  6139. te.maxClientHeaderListSize = new(uint32)
  6140. *te.maxClientHeaderListSize = 200
  6141. lw := te.startServerWithConnControl(&testServer{security: e.security, setHeaderOnly: true})
  6142. defer te.tearDown()
  6143. cc, _ := te.clientConnWithConnControl()
  6144. tc := &testServiceClientWrapper{TestServiceClient: testpb.NewTestServiceClient(cc)}
  6145. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  6146. defer cancel()
  6147. stream, err := tc.FullDuplexCall(ctx)
  6148. if err != nil {
  6149. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want _, <nil>", tc, err)
  6150. }
  6151. var i int
  6152. var rcw *rawConnWrapper
  6153. for i = 0; i < 100; i++ {
  6154. rcw = lw.getLastConn()
  6155. if rcw != nil {
  6156. break
  6157. }
  6158. time.Sleep(10 * time.Millisecond)
  6159. continue
  6160. }
  6161. if i == 100 {
  6162. t.Fatalf("failed to create server transport after 1s")
  6163. }
  6164. val := make([]string, 200)
  6165. for i := range val {
  6166. val[i] = "a"
  6167. }
  6168. // allow for client to send the initial header.
  6169. time.Sleep(100 * time.Millisecond)
  6170. rcw.writeHeaders(http2.HeadersFrameParam{
  6171. StreamID: tc.getCurrentStreamID(),
  6172. BlockFragment: rcw.encodeRawHeader("oversize", strings.Join(val, "")),
  6173. EndStream: false,
  6174. EndHeaders: true,
  6175. })
  6176. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.Internal {
  6177. t.Fatalf("stream.Recv() = _, %v, want _, error code: %v", err, codes.Internal)
  6178. }
  6179. }
  6180. func (s) TestNetPipeConn(t *testing.T) {
  6181. // This test will block indefinitely if grpc writes both client and server
  6182. // prefaces without either reading from the Conn.
  6183. pl := testutils.NewPipeListener()
  6184. s := grpc.NewServer()
  6185. defer s.Stop()
  6186. ts := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  6187. return &testpb.SimpleResponse{}, nil
  6188. }}
  6189. testpb.RegisterTestServiceServer(s, ts)
  6190. go s.Serve(pl)
  6191. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  6192. defer cancel()
  6193. cc, err := grpc.DialContext(ctx, "", grpc.WithInsecure(), grpc.WithDialer(pl.Dialer()))
  6194. if err != nil {
  6195. t.Fatalf("Error creating client: %v", err)
  6196. }
  6197. defer cc.Close()
  6198. client := testpb.NewTestServiceClient(cc)
  6199. if _, err := client.UnaryCall(ctx, &testpb.SimpleRequest{}); err != nil {
  6200. t.Fatalf("UnaryCall(_) = _, %v; want _, nil", err)
  6201. }
  6202. }
  6203. func (s) TestLargeTimeout(t *testing.T) {
  6204. for _, e := range listTestEnv() {
  6205. testLargeTimeout(t, e)
  6206. }
  6207. }
  6208. func testLargeTimeout(t *testing.T, e env) {
  6209. te := newTest(t, e)
  6210. te.declareLogNoise("Server.processUnaryRPC failed to write status")
  6211. ts := &funcServer{}
  6212. te.startServer(ts)
  6213. defer te.tearDown()
  6214. tc := testpb.NewTestServiceClient(te.clientConn())
  6215. timeouts := []time.Duration{
  6216. time.Duration(math.MaxInt64), // will be (correctly) converted to
  6217. // 2562048 hours, which overflows upon converting back to an int64
  6218. 2562047 * time.Hour, // the largest timeout that does not overflow
  6219. }
  6220. for i, maxTimeout := range timeouts {
  6221. ts.unaryCall = func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  6222. deadline, ok := ctx.Deadline()
  6223. timeout := time.Until(deadline)
  6224. minTimeout := maxTimeout - 5*time.Second
  6225. if !ok || timeout < minTimeout || timeout > maxTimeout {
  6226. t.Errorf("ctx.Deadline() = (now+%v), %v; want [%v, %v], true", timeout, ok, minTimeout, maxTimeout)
  6227. return nil, status.Error(codes.OutOfRange, "deadline error")
  6228. }
  6229. return &testpb.SimpleResponse{}, nil
  6230. }
  6231. ctx, cancel := context.WithTimeout(context.Background(), maxTimeout)
  6232. defer cancel()
  6233. if _, err := tc.UnaryCall(ctx, &testpb.SimpleRequest{}); err != nil {
  6234. t.Errorf("case %v: UnaryCall(_) = _, %v; want _, nil", i, err)
  6235. }
  6236. }
  6237. }
  6238. // Proxies typically send GO_AWAY followed by connection closure a minute or so later. This
  6239. // test ensures that the connection is re-created after GO_AWAY and not affected by the
  6240. // subsequent (old) connection closure.
  6241. func (s) TestGoAwayThenClose(t *testing.T) {
  6242. ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
  6243. defer cancel()
  6244. lis1, err := net.Listen("tcp", "localhost:0")
  6245. if err != nil {
  6246. t.Fatalf("Error while listening. Err: %v", err)
  6247. }
  6248. s1 := grpc.NewServer()
  6249. defer s1.Stop()
  6250. ts1 := &funcServer{
  6251. unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  6252. return &testpb.SimpleResponse{}, nil
  6253. },
  6254. fullDuplexCall: func(stream testpb.TestService_FullDuplexCallServer) error {
  6255. // Wait forever.
  6256. _, err := stream.Recv()
  6257. if err == nil {
  6258. t.Error("expected to never receive any message")
  6259. }
  6260. return err
  6261. },
  6262. }
  6263. testpb.RegisterTestServiceServer(s1, ts1)
  6264. go s1.Serve(lis1)
  6265. conn2Established := grpcsync.NewEvent()
  6266. lis2, err := listenWithNotifyingListener("tcp", "localhost:0", conn2Established)
  6267. if err != nil {
  6268. t.Fatalf("Error while listening. Err: %v", err)
  6269. }
  6270. s2 := grpc.NewServer()
  6271. defer s2.Stop()
  6272. conn2Ready := grpcsync.NewEvent()
  6273. ts2 := &funcServer{unaryCall: func(ctx context.Context, in *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
  6274. conn2Ready.Fire()
  6275. return &testpb.SimpleResponse{}, nil
  6276. }}
  6277. testpb.RegisterTestServiceServer(s2, ts2)
  6278. go s2.Serve(lis2)
  6279. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  6280. defer rcleanup()
  6281. r.InitialAddrs([]resolver.Address{
  6282. {Addr: lis1.Addr().String()},
  6283. {Addr: lis2.Addr().String()},
  6284. })
  6285. cc, err := grpc.DialContext(ctx, r.Scheme()+":///", grpc.WithInsecure())
  6286. if err != nil {
  6287. t.Fatalf("Error creating client: %v", err)
  6288. }
  6289. defer cc.Close()
  6290. client := testpb.NewTestServiceClient(cc)
  6291. // Should go on connection 1. We use a long-lived RPC because it will cause GracefulStop to send GO_AWAY, but the
  6292. // connection doesn't get closed until the server stops and the client receives.
  6293. stream, err := client.FullDuplexCall(ctx)
  6294. if err != nil {
  6295. t.Fatalf("FullDuplexCall(_) = _, %v; want _, nil", err)
  6296. }
  6297. // Send GO_AWAY to connection 1.
  6298. go s1.GracefulStop()
  6299. // Wait for connection 2 to be established.
  6300. <-conn2Established.Done()
  6301. // Close connection 1.
  6302. s1.Stop()
  6303. // Wait for client to close.
  6304. _, err = stream.Recv()
  6305. if err == nil {
  6306. t.Fatal("expected the stream to die, but got a successful Recv")
  6307. }
  6308. // Do a bunch of RPCs, make sure it stays stable. These should go to connection 2.
  6309. for i := 0; i < 10; i++ {
  6310. if _, err := client.UnaryCall(ctx, &testpb.SimpleRequest{}); err != nil {
  6311. t.Fatalf("UnaryCall(_) = _, %v; want _, nil", err)
  6312. }
  6313. }
  6314. }
  6315. func listenWithNotifyingListener(network, address string, event *grpcsync.Event) (net.Listener, error) {
  6316. lis, err := net.Listen(network, address)
  6317. if err != nil {
  6318. return nil, err
  6319. }
  6320. return notifyingListener{connEstablished: event, Listener: lis}, nil
  6321. }
  6322. type notifyingListener struct {
  6323. connEstablished *grpcsync.Event
  6324. net.Listener
  6325. }
  6326. func (lis notifyingListener) Accept() (net.Conn, error) {
  6327. defer lis.connEstablished.Fire()
  6328. return lis.Listener.Accept()
  6329. }
  6330. func (s) TestRPCWaitsForResolver(t *testing.T) {
  6331. te := testServiceConfigSetup(t, tcpClearRREnv)
  6332. te.startServer(&testServer{security: tcpClearRREnv.security})
  6333. defer te.tearDown()
  6334. r, rcleanup := manual.GenerateAndRegisterManualResolver()
  6335. defer rcleanup()
  6336. te.resolverScheme = r.Scheme()
  6337. te.nonBlockingDial = true
  6338. cc := te.clientConn()
  6339. tc := testpb.NewTestServiceClient(cc)
  6340. ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
  6341. defer cancel()
  6342. // With no resolved addresses yet, this will timeout.
  6343. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); status.Code(err) != codes.DeadlineExceeded {
  6344. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, %s", err, codes.DeadlineExceeded)
  6345. }
  6346. ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
  6347. defer cancel()
  6348. go func() {
  6349. time.Sleep(time.Second)
  6350. r.NewServiceConfig(`{
  6351. "methodConfig": [
  6352. {
  6353. "name": [
  6354. {
  6355. "service": "grpc.testing.TestService",
  6356. "method": "UnaryCall"
  6357. }
  6358. ],
  6359. "maxRequestMessageBytes": 0
  6360. }
  6361. ]
  6362. }`)
  6363. r.NewAddress([]resolver.Address{{Addr: te.srvAddr}})
  6364. }()
  6365. // We wait a second before providing a service config and resolving
  6366. // addresses. So this will wait for that and then honor the
  6367. // maxRequestMessageBytes it contains.
  6368. if _, err := tc.UnaryCall(ctx, &testpb.SimpleRequest{ResponseType: testpb.PayloadType_UNCOMPRESSABLE}); status.Code(err) != codes.ResourceExhausted {
  6369. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, nil", err)
  6370. }
  6371. if got := ctx.Err(); got != nil {
  6372. t.Fatalf("ctx.Err() = %v; want nil (deadline should be set short by service config)", got)
  6373. }
  6374. if _, err := tc.UnaryCall(ctx, &testpb.SimpleRequest{}); err != nil {
  6375. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, nil", err)
  6376. }
  6377. }
  6378. func (s) TestHTTPHeaderFrameErrorHandlingHTTPMode(t *testing.T) {
  6379. // Non-gRPC content-type fallback path.
  6380. for httpCode := range transport.HTTPStatusConvTab {
  6381. doHTTPHeaderTest(t, transport.HTTPStatusConvTab[int(httpCode)], []string{
  6382. ":status", fmt.Sprintf("%d", httpCode),
  6383. "content-type", "text/html", // non-gRPC content type to switch to HTTP mode.
  6384. "grpc-status", "1", // Make up a gRPC status error
  6385. "grpc-status-details-bin", "???", // Make up a gRPC field parsing error
  6386. })
  6387. }
  6388. // Missing content-type fallback path.
  6389. for httpCode := range transport.HTTPStatusConvTab {
  6390. doHTTPHeaderTest(t, transport.HTTPStatusConvTab[int(httpCode)], []string{
  6391. ":status", fmt.Sprintf("%d", httpCode),
  6392. // Omitting content type to switch to HTTP mode.
  6393. "grpc-status", "1", // Make up a gRPC status error
  6394. "grpc-status-details-bin", "???", // Make up a gRPC field parsing error
  6395. })
  6396. }
  6397. // Malformed HTTP status when fallback.
  6398. doHTTPHeaderTest(t, codes.Internal, []string{
  6399. ":status", "abc",
  6400. // Omitting content type to switch to HTTP mode.
  6401. "grpc-status", "1", // Make up a gRPC status error
  6402. "grpc-status-details-bin", "???", // Make up a gRPC field parsing error
  6403. })
  6404. }
  6405. // Testing erroneous ResponseHeader or Trailers-only (delivered in the first HEADERS frame).
  6406. func (s) TestHTTPHeaderFrameErrorHandlingInitialHeader(t *testing.T) {
  6407. for _, test := range []struct {
  6408. header []string
  6409. errCode codes.Code
  6410. }{
  6411. {
  6412. // missing gRPC status.
  6413. header: []string{
  6414. ":status", "403",
  6415. "content-type", "application/grpc",
  6416. },
  6417. errCode: codes.Unknown,
  6418. },
  6419. {
  6420. // malformed grpc-status.
  6421. header: []string{
  6422. ":status", "502",
  6423. "content-type", "application/grpc",
  6424. "grpc-status", "abc",
  6425. },
  6426. errCode: codes.Internal,
  6427. },
  6428. {
  6429. // Malformed grpc-tags-bin field.
  6430. header: []string{
  6431. ":status", "502",
  6432. "content-type", "application/grpc",
  6433. "grpc-status", "0",
  6434. "grpc-tags-bin", "???",
  6435. },
  6436. errCode: codes.Internal,
  6437. },
  6438. {
  6439. // gRPC status error.
  6440. header: []string{
  6441. ":status", "502",
  6442. "content-type", "application/grpc",
  6443. "grpc-status", "3",
  6444. },
  6445. errCode: codes.InvalidArgument,
  6446. },
  6447. } {
  6448. doHTTPHeaderTest(t, test.errCode, test.header)
  6449. }
  6450. }
  6451. // Testing non-Trailers-only Trailers (delievered in second HEADERS frame)
  6452. func (s) TestHTTPHeaderFrameErrorHandlingNormalTrailer(t *testing.T) {
  6453. for _, test := range []struct {
  6454. responseHeader []string
  6455. trailer []string
  6456. errCode codes.Code
  6457. }{
  6458. {
  6459. responseHeader: []string{
  6460. ":status", "200",
  6461. "content-type", "application/grpc",
  6462. },
  6463. trailer: []string{
  6464. // trailer missing grpc-status
  6465. ":status", "502",
  6466. },
  6467. errCode: codes.Unknown,
  6468. },
  6469. {
  6470. responseHeader: []string{
  6471. ":status", "404",
  6472. "content-type", "application/grpc",
  6473. },
  6474. trailer: []string{
  6475. // malformed grpc-status-details-bin field
  6476. "grpc-status", "0",
  6477. "grpc-status-details-bin", "????",
  6478. },
  6479. errCode: codes.Internal,
  6480. },
  6481. } {
  6482. doHTTPHeaderTest(t, test.errCode, test.responseHeader, test.trailer)
  6483. }
  6484. }
  6485. func (s) TestHTTPHeaderFrameErrorHandlingMoreThanTwoHeaders(t *testing.T) {
  6486. header := []string{
  6487. ":status", "200",
  6488. "content-type", "application/grpc",
  6489. }
  6490. doHTTPHeaderTest(t, codes.Internal, header, header, header)
  6491. }
  6492. type httpServer struct {
  6493. headerFields [][]string
  6494. }
  6495. func (s *httpServer) writeHeader(framer *http2.Framer, sid uint32, headerFields []string, endStream bool) error {
  6496. if len(headerFields)%2 == 1 {
  6497. panic("odd number of kv args")
  6498. }
  6499. var buf bytes.Buffer
  6500. henc := hpack.NewEncoder(&buf)
  6501. for len(headerFields) > 0 {
  6502. k, v := headerFields[0], headerFields[1]
  6503. headerFields = headerFields[2:]
  6504. henc.WriteField(hpack.HeaderField{Name: k, Value: v})
  6505. }
  6506. return framer.WriteHeaders(http2.HeadersFrameParam{
  6507. StreamID: sid,
  6508. BlockFragment: buf.Bytes(),
  6509. EndStream: endStream,
  6510. EndHeaders: true,
  6511. })
  6512. }
  6513. func (s *httpServer) start(t *testing.T, lis net.Listener) {
  6514. // Launch an HTTP server to send back header.
  6515. go func() {
  6516. conn, err := lis.Accept()
  6517. if err != nil {
  6518. t.Errorf("Error accepting connection: %v", err)
  6519. return
  6520. }
  6521. defer conn.Close()
  6522. // Read preface sent by client.
  6523. if _, err = io.ReadFull(conn, make([]byte, len(http2.ClientPreface))); err != nil {
  6524. t.Errorf("Error at server-side while reading preface from client. Err: %v", err)
  6525. return
  6526. }
  6527. reader := bufio.NewReader(conn)
  6528. writer := bufio.NewWriter(conn)
  6529. framer := http2.NewFramer(writer, reader)
  6530. if err = framer.WriteSettingsAck(); err != nil {
  6531. t.Errorf("Error at server-side while sending Settings ack. Err: %v", err)
  6532. return
  6533. }
  6534. writer.Flush() // necessary since client is expecting preface before declaring connection fully setup.
  6535. var sid uint32
  6536. // Read frames until a header is received.
  6537. for {
  6538. frame, err := framer.ReadFrame()
  6539. if err != nil {
  6540. t.Errorf("Error at server-side while reading frame. Err: %v", err)
  6541. return
  6542. }
  6543. if hframe, ok := frame.(*http2.HeadersFrame); ok {
  6544. sid = hframe.Header().StreamID
  6545. break
  6546. }
  6547. }
  6548. for i, headers := range s.headerFields {
  6549. if err = s.writeHeader(framer, sid, headers, i == len(s.headerFields)-1); err != nil {
  6550. t.Errorf("Error at server-side while writing headers. Err: %v", err)
  6551. return
  6552. }
  6553. writer.Flush()
  6554. }
  6555. }()
  6556. }
  6557. func doHTTPHeaderTest(t *testing.T, errCode codes.Code, headerFields ...[]string) {
  6558. lis, err := net.Listen("tcp", "localhost:0")
  6559. if err != nil {
  6560. t.Fatalf("Failed to listen. Err: %v", err)
  6561. }
  6562. defer lis.Close()
  6563. server := &httpServer{
  6564. headerFields: headerFields,
  6565. }
  6566. server.start(t, lis)
  6567. ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  6568. defer cancel()
  6569. cc, err := grpc.DialContext(ctx, lis.Addr().String(), grpc.WithInsecure())
  6570. if err != nil {
  6571. t.Fatalf("failed to dial due to err: %v", err)
  6572. }
  6573. defer cc.Close()
  6574. client := testpb.NewTestServiceClient(cc)
  6575. stream, err := client.FullDuplexCall(ctx)
  6576. if err != nil {
  6577. t.Fatalf("error creating stream due to err: %v", err)
  6578. }
  6579. if _, err := stream.Recv(); err == nil || status.Code(err) != errCode {
  6580. t.Fatalf("stream.Recv() = _, %v, want error code: %v", err, errCode)
  6581. }
  6582. }