addrConn drain happens when addrConn gets torn down due to its address being no longer in the address list returned by the resolver.
(t *testing.T)
| 413 | // addrConn drain happens when addrConn gets torn down due to its address being no longer in the |
| 414 | // address list returned by the resolver. |
| 415 | func (s) TestHealthCheckWithAddrConnDrain(t *testing.T) { |
| 416 | _, lis, ts := setupServer(t, nil) |
| 417 | ts.SetServingStatus("foo", healthpb.HealthCheckResponse_SERVING) |
| 418 | |
| 419 | hcEnterChan, hcExitChan := setupHealthCheckWrapper(t) |
| 420 | cc, r := setupClient(t, &clientConfig{}) |
| 421 | tc := testgrpc.NewTestServiceClient(cc) |
| 422 | sc := parseServiceConfig(t, r, fmt.Sprintf(`{ |
| 423 | "healthCheckConfig": { |
| 424 | "serviceName": "foo" |
| 425 | }, |
| 426 | "loadBalancingConfig": [{"%s":{}}] |
| 427 | }`, roundrobin.Name)) |
| 428 | r.UpdateState(resolver.State{ |
| 429 | Addresses: []resolver.Address{{Addr: lis.Addr().String()}}, |
| 430 | ServiceConfig: sc, |
| 431 | }) |
| 432 | |
| 433 | ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) |
| 434 | defer cancel() |
| 435 | // make some rpcs to make sure connection is working. |
| 436 | if err := verifyResultWithDelay(func() (bool, error) { |
| 437 | if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); err != nil { |
| 438 | return false, fmt.Errorf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err) |
| 439 | } |
| 440 | return true, nil |
| 441 | }); err != nil { |
| 442 | t.Fatal(err) |
| 443 | } |
| 444 | |
| 445 | // the stream rpc will persist through goaway event. |
| 446 | stream, err := tc.FullDuplexCall(ctx, grpc.WaitForReady(true)) |
| 447 | if err != nil { |
| 448 | t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err) |
| 449 | } |
| 450 | respParam := []*testpb.ResponseParameters{{Size: 1}} |
| 451 | payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, int32(1)) |
| 452 | if err != nil { |
| 453 | t.Fatal(err) |
| 454 | } |
| 455 | req := &testpb.StreamingOutputCallRequest{ |
| 456 | ResponseParameters: respParam, |
| 457 | Payload: payload, |
| 458 | } |
| 459 | if err := stream.Send(req); err != nil { |
| 460 | t.Fatalf("%v.Send(_) = %v, want <nil>", stream, err) |
| 461 | } |
| 462 | if _, err := stream.Recv(); err != nil { |
| 463 | t.Fatalf("%v.Recv() = _, %v, want _, <nil>", stream, err) |
| 464 | } |
| 465 | |
| 466 | select { |
| 467 | case <-hcExitChan: |
| 468 | t.Fatal("Health check function has exited, which is not expected.") |
| 469 | default: |
| 470 | } |
| 471 | // trigger teardown of the ac |
| 472 | r.UpdateState(resolver.State{Addresses: []resolver.Address{{Addr: "fake address"}}, ServiceConfig: sc}) |
nothing calls this directly
no test coverage detected