Proxies typically send GO_AWAY followed by connection closure a minute or so later. This test ensures that the connection is re-created after GO_AWAY and not affected by the subsequent (old) connection closure.
(t *testing.T)
| 540 | // test ensures that the connection is re-created after GO_AWAY and not affected by the |
| 541 | // subsequent (old) connection closure. |
| 542 | func (s) TestGoAwayThenClose(t *testing.T) { |
| 543 | ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) |
| 544 | defer cancel() |
| 545 | |
| 546 | lis1, err := testutils.LocalTCPListener() |
| 547 | if err != nil { |
| 548 | t.Fatalf("Error while listening. Err: %v", err) |
| 549 | } |
| 550 | |
| 551 | unaryCallF := func(context.Context, *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { |
| 552 | return &testpb.SimpleResponse{}, nil |
| 553 | } |
| 554 | fullDuplexCallF := func(stream testgrpc.TestService_FullDuplexCallServer) error { |
| 555 | if err := stream.Send(&testpb.StreamingOutputCallResponse{}); err != nil { |
| 556 | t.Errorf("Unexpected error from send: %v", err) |
| 557 | return err |
| 558 | } |
| 559 | // Wait until a message is received from client |
| 560 | _, err := stream.Recv() |
| 561 | if err == nil { |
| 562 | t.Error("Expected to never receive any message") |
| 563 | } |
| 564 | return err |
| 565 | } |
| 566 | ss1 := &stubserver.StubServer{ |
| 567 | Listener: lis1, |
| 568 | UnaryCallF: unaryCallF, |
| 569 | FullDuplexCallF: fullDuplexCallF, |
| 570 | S: grpc.NewServer(), |
| 571 | } |
| 572 | stubserver.StartTestService(t, ss1) |
| 573 | defer ss1.S.Stop() |
| 574 | |
| 575 | conn2Established := grpcsync.NewEvent() |
| 576 | lis2, err := listenWithNotifyingListener("tcp", "localhost:0", conn2Established) |
| 577 | if err != nil { |
| 578 | t.Fatalf("Error while listening. Err: %v", err) |
| 579 | } |
| 580 | ss2 := &stubserver.StubServer{ |
| 581 | Listener: lis2, |
| 582 | UnaryCallF: unaryCallF, |
| 583 | FullDuplexCallF: fullDuplexCallF, |
| 584 | S: grpc.NewServer(), |
| 585 | } |
| 586 | stubserver.StartTestService(t, ss2) |
| 587 | defer ss2.S.Stop() |
| 588 | |
| 589 | r := manual.NewBuilderWithScheme("whatever") |
| 590 | r.InitialState(resolver.State{Addresses: []resolver.Address{ |
| 591 | {Addr: lis1.Addr().String()}, |
| 592 | {Addr: lis2.Addr().String()}, |
| 593 | }}) |
| 594 | cc, err := grpc.NewClient(r.Scheme()+":///", grpc.WithResolvers(r), grpc.WithTransportCredentials(insecure.NewCredentials())) |
| 595 | if err != nil { |
| 596 | t.Fatalf("Error creating client: %v", err) |
| 597 | } |
| 598 | defer cc.Close() |
| 599 |
nothing calls this directly
no test coverage detected