MCPcopy
hub / github.com/grpc/grpc-go / TestHealthCheckWithAddrConnDrain

Method TestHealthCheckWithAddrConnDrain

test/healthcheck_test.go:415–492  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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.
415func (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})

Callers

nothing calls this directly

Calls 15

EmptyCallMethod · 0.95
FullDuplexCallMethod · 0.95
WaitForReadyFunction · 0.92
setupServerFunction · 0.85
setupHealthCheckWrapperFunction · 0.85
setupClientFunction · 0.85
newPayloadFunction · 0.85
parseServiceConfigFunction · 0.70
verifyResultWithDelayFunction · 0.70
UpdateStateMethod · 0.65
StringMethod · 0.65
ErrorfMethod · 0.65

Tested by

no test coverage detected