dns: rate limit DNS resolution requests
Fixes #2402


To prevent excessive re-resolution in round-robin scenarios where connections are frequently going down, C implements a debouncing strategy to coalesce DNS resolutions.  Only one resolution is allowed every 30 seconds; if one has been performed in the last 30 seconds, it delays the new request until the end of the 30 second period and ignores any subsequent requests during that window.  We should implement the same feature in grpc-go.
Rate limit DNS resolutions
diff --git a/resolver/dns/dns_resolver.go b/resolver/dns/dns_resolver.go
index 58355990779b..297492e87af4 100644
--- a/resolver/dns/dns_resolver.go
+++ b/resolver/dns/dns_resolver.go
@@ -66,6 +66,9 @@ var (
 
 var (
 	defaultResolver netResolver = net.DefaultResolver
+	// To prevent excessive re-resolution, we enforce a rate limit on DNS
+	// resolution requests.
+	minDNSResRate = 30 * time.Second
 )
 
 var customAuthorityDialler = func(authority string) func(ctx context.Context, network, address string) (net.Conn, error) {
@@ -241,7 +244,13 @@ func (d *dnsResolver) watcher() {
 			return
 		case <-d.t.C:
 		case <-d.rn:
+			if !d.t.Stop() {
+				// Before resetting a timer, it should be stopped to prevent racing with
+				// reads on it's channel.
+				<-d.t.C
+			}
 		}
+
 		result, sc := d.lookup()
 		// Next lookup should happen within an interval defined by d.freq. It may be
 		// more often due to exponential retry on empty address list.
@@ -254,6 +263,16 @@ func (d *dnsResolver) watcher() {
 		}
 		d.cc.NewServiceConfig(sc)
 		d.cc.NewAddress(result)
+
+		// Sleep to prevent excessive re-resolutions. Incoming resolution requests
+		// will be queued in d.rn.
+		t := time.NewTimer(minDNSResRate)
+		select {
+		case <-t.C:
+		case <-d.ctx.Done():
+			t.Stop()
+			return
+		}
 	}
 }
 

diff --git a/resolver/dns/dns_resolver_test.go b/resolver/dns/dns_resolver_test.go
index b97cf4f8843c..b03486b11d7c 100644
--- a/resolver/dns/dns_resolver_test.go
+++ b/resolver/dns/dns_resolver_test.go
@@ -34,7 +34,12 @@ import (
 )
 
 func TestMain(m *testing.M) {
-	cleanup := replaceNetFunc()
+	// Set a valid duration for the re-resolution rate only for tests which are
+	// actually testing that feature.
+	dc := replaceDNSResRate(time.Duration(0))
+	defer dc()
+
+	cleanup := replaceNetFunc(nil)
 	code := m.Run()
 	cleanup()
 	os.Exit(code)
@@ -85,9 +90,16 @@ func (t *testClientConn) getSc() (string, int) {
 }
 
 type testResolver struct {
+	// A write to this channel is made when this resolver receives a resolution
+	// request. Tests can rely on reading from this channel to be notified about
+	// resolution requests instead of sleeping for a predefined period of time.
+	ch chan struct{}
 }
 
-func (*testResolver) LookupHost(ctx context.Context, host string) ([]string, error) {
+func (tr *testResolver) LookupHost(ctx context.Context, host string) ([]string, error) {
+	if tr.ch != nil {
+		tr.ch <- struct{}{}
+	}
 	return hostLookup(host)
 }
 
@@ -99,15 +111,24 @@ func (*testResolver) LookupTXT(ctx context.Context, host string) ([]string, erro
 	return txtLookup(host)
 }
 
-func replaceNetFunc() func() {
+func replaceNetFunc(ch chan struct{}) func() {
 	oldResolver := defaultResolver
-	defaultResolver = &testResolver{}
+	defaultResolver = &testResolver{ch: ch}
 
 	return func() {
 		defaultResolver = oldResolver
 	}
 }
 
+func replaceDNSResRate(d time.Duration) func() {
+	oldMinDNSResRate := minDNSResRate
+	minDNSResRate = d
+
+	return func() {
+		minDNSResRate = oldMinDNSResRate
+	}
+}
+
 var hostLookupTbl = struct {
 	sync.Mutex
 	tbl map[string][]string
@@ -1126,3 +1147,98 @@ func TestCustomAuthority(t *testing.T) {
 		}
 	}
 }
+
+// TestRateLimitedResolve exercises the rate limit enforced on re-resolution
+// requests. It sets the re-resolution rate to a small value and repeatedly
+// calls ResolveNow() and ensures only the expected number of resolution
+// requests are made.
+func TestRateLimitedResolve(t *testing.T) {
+	defer leakcheck.Check(t)
+
+	const dnsResRate = 100 * time.Millisecond
+	dc := replaceDNSResRate(dnsResRate)
+	defer dc()
+
+	// Create a new testResolver{} for this test because we want the exact count
+	// of the number of times the resolver was invoked.
+	nc := replaceNetFunc(make(chan struct{}, 1))
+	defer nc()
+
+	target := "foo.bar.com"
+	b := NewBuilder()
+	cc := &testClientConn{target: target}
+	r, err := b.Build(resolver.Target{Endpoint: target}, cc, resolver.BuildOption{})
+	if err != nil {
+		t.Fatalf("resolver.Build() returned error: %v\n", err)
+	}
+	defer r.Close()
+
+	dnsR, ok := r.(*dnsResolver)
+	if !ok {
+		t.Fatalf("resolver.Build() returned unexpected type: %T\n", dnsR)
+	}
+	tr, ok := dnsR.resolver.(*testResolver)
+	if !ok {
+		t.Fatalf("delegate resolver returned unexpected type: %T\n", tr)
+	}
+
+	// Wait for the first resolution request to be done. This happens as part of
+	// the first iteration of the for loop in watcher() because we start with a
+	// timer of zero duration.
+	<-tr.ch
+
+	// Here we start a couple of goroutines. One repeatedly calls ResolveNow()
+	// until asked to stop, and the other waits for two resolution requests to be
+	// made to our testResolver and stops the former. We measure the start and
+	// end times, and expect the duration elapsed to be in the interval
+	// {2*dnsResRate, 3*dnsResRate}
+	start := time.Now()
+	done := make(chan struct{})
+	go func() {
+		for {
+			select {
+			case <-done:
+				return
+			default:
+				r.ResolveNow(resolver.ResolveNowOption{})
+				time.Sleep(1 * time.Millisecond)
+			}
+		}
+	}()
+
+	gotCalls := 0
+	const wantCalls = 2
+	min, max := wantCalls*dnsResRate, (wantCalls+1)*dnsResRate
+	tMax := time.NewTimer(max)
+	for gotCalls != wantCalls {
+		select {
+		case <-tr.ch:
+			gotCalls++
+		case <-tMax.C:
+			t.Fatalf("Timed out waiting for %v calls after %v; got %v", wantCalls, max, gotCalls)
+		}
+	}
+	close(done)
+	elapsed := time.Since(start)
+
+	if gotCalls != wantCalls {
+		t.Fatalf("resolve count mismatch for target: %q = %+v, want %+v\n", target, gotCalls, wantCalls)
+	}
+	if elapsed < min {
+		t.Fatalf("elapsed time: %v, wanted it to be between {%v and %v}", elapsed, min, max)
+	}
+
+	wantAddrs := []resolver.Address{{Addr: "1.2.3.4" + colonDefaultPort}, {Addr: "5.6.7.8" + colonDefaultPort}}
+	var gotAddrs []resolver.Address
+	for {
+		var cnt int
+		gotAddrs, cnt = cc.getAddress()
+		if cnt > 0 {
+			break
+		}
+		time.Sleep(time.Millisecond)
+	}
+	if !reflect.DeepEqual(gotAddrs, wantAddrs) {
+		t.Errorf("Resolved addresses of target: %q = %+v, want %+v\n", target, gotAddrs, wantAddrs)
+	}
+}

{"TestRateLimitedResolve": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestDNSResolverRetry": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestDisableServiceConfig": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestCustomAuthority": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"TestOneBackend": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAppendH2ToNextProtos": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsUnaryRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPipeClose": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAppendToOutgoingContext_FromKVSlice": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBalancerGroup_TwoRR_ChangeWeight_MoreBackends": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogServerStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestIsRoundRobin": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestEventHasFired": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestDropper": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFillMethodLoggerWithConfigStringInvalid": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerHandshake": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetServers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsFullDuplexRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestSayHello": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBalancerGroup_TwoRR_OneBackend": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBStatsUnaryDrop": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestHeaderConfigRegexp": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestErrorsWithSameParameters": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAuthInfoFromContext": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromErrorUnknownError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPingPong": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBStatsStreamingSuccess": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestIsRunningOnGCP": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestDial": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTruncateMessageNotTruncated": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogFullDuplexError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestConvertUnknownError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientHandshake": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLBCacheClientConnExpire": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetSocketOptions": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientHealthCheckBackoff": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPairsMD": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestErrorProtoOK": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerHandshakeReturnsAuthInfo": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetSubChannel": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromErrorImplementsInterface": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFileDescForType": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBalancerGroup_TwoRR_MoreBackends": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAES128GCMEncrypt": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestNewLoggerFromConfigStringInvalid": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromNilProto": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestListener": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestResolve": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCloneServer": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAllExtensionNumbersForType": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogCancel": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRegister": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseMethodNameInvalid": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestResolveFunc": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestWrapSyscallConn": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsServerStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsFullDuplexRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRouteChat": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestNoSetupOrTeardown": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestListenerAndDialer": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestIncorrectMsgType": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetSocketOpt": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestSet": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestSmallReadBuffer": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestEDS_UpdateSubBalancerName": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestConnCloseWithData": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPipeListener": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAllServersDown": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogClientStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsServerStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsServerStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCloseWhileAccepting": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsUnaryRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCompareRPCVersions": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetMethodLoggerOff": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestErrorOK": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestSync": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestNewLoggerFromConfigString": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestSyncTooSlow": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCloseWithPendingRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogServerStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGet": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogClientStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestJSONUnmarshal": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsClientStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestOneServerDown": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBackendsRoundRobin": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFillMethodLoggerWithConfigStringPerService": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBStatsStreamingFailedToSend": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetServerSockets": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAppendToOutgoingContext_Repeated": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFillMethodLoggerWithConfigStringGlobal": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestConvertKnownError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerAndClientHandshake": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestExample": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCopy": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromContextError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestConcurrentUsage": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTLSOverrideServerName": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPeerNotResponding": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLoggerV2Severity": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAuthInfoFromPeer": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCloneClient": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseMethodName": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTruncateMessageTruncated": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestEDS_OneLocality": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestInfo": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogUnaryRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAES128GCMRekeyEncryptRoundtrip": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestInfoServerName": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAppend": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetMethodLogger": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTruncateMetadataTruncated": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTrace": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestOverrideServerName": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLongMethodConfigRegexp": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogUnaryRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsFullDuplexRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTags": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientHandshakeReturnsAuthInfo": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAES128GCMEncryptRoundtrip": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestMessageConfigRegexp": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsFullDuplexRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCheckRegisterIgnore": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPipe": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBalancerGroup_OneRR_AddRemoveBackend": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFrameTooLarge": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestUnblocking": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestJoin": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBWeighted": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestALTSAuthInfo": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFillMethodLoggerWithConfigStringPerMethod": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestEventMultipleFires": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBasicProtoCodecMarshalAndUnmarshal": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestWriteLargeData": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsUnaryRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCounterSides": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseMethodConfigAndSuffix": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAES128GCMRekeyEncrypt": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAppendToOutgoingContext": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestUnmarshalJSON": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsUnaryRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBalancerGroup_ThreeRR_RemoveBalancer": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestEDS_TwoLocalities": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestIPWatcher": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCheck": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestStatus_WithDetails_Fail": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestNewAddressWhileBlocking": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAddressesRemoved": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogFullDuplex": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBalancerGroup_TwoRR_DifferentWeight_MoreBackends": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFileDescContainingExtension": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestUnmarshalJSON_UnknownInput": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestDropPicker": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBStatsStreamingDrop": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestStatus_ErrorDetails": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogUnaryRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBPickFirst": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromMetadata": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCheckRPCVersions": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestReflectionEnd2end": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestDropRequest": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromToProto": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsClientStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBufferBloat": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerBinaryLogClientStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLB": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsClientStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogServerStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestBalancerDisconnects": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestConn": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBStatsUnaryFailedToSend": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLog": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestStaggeredMarshalAndUnmarshalUsingSamePool": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetChannel": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCounterInc": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogClientStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTypeForName": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseHeaderMessageLengthConfig": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestServerStatsServerStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLBCacheClientConnReuse": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFromErrorOK": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTLSClone": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTruncateMetadataNotTruncated": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestShutdown": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseHeaderMessageLengthConfigInvalid": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestUnmarshalJSON_MarshalUnmarshal": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestWrapSyscallConnNoWrap": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseMethodConfigAndSuffixInvalid": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetTopChannels": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFillMethodLoggerWithConfigStringBlacklist": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCloseWhileDialing": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRolloverCounter": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCompileUpdate": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientStatsClientStreamRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogUnaryRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLargeMsg": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestEventDoneChannel": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGRPCLBStatsUnarySuccess": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogFullDuplexRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTypeForNameNotFound": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetSocket": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRunSubTests": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogFullDuplexRPCError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestHeaderMessageConfigRegexp": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestClientBinaryLogServerStreamRPC": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGetServerSocketsNonZeroStartID": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestUnmarshalJSON_NilReceiver": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestStatus_ErrorDetails_Fail": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestToMetadata": {"run": "PASS", "test": "PASS", "fix": "PASS"}}
{"TestRateLimitedResolve": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestDNSResolverRetry": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestDisableServiceConfig": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestCustomAuthority": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"passed_count": 212, "failed_count": 2, "skipped_count": 0, "passed_tests": ["TestOneBackend", "TestAppendH2ToNextProtos", "TestServerStatsUnaryRPC", "TestPipeClose", "TestAppendToOutgoingContext_FromKVSlice", "TestBalancerGroup_TwoRR_ChangeWeight_MoreBackends", "TestServerBinaryLogServerStreamRPCError", "TestIsRoundRobin", "TestEventHasFired", "TestDropper", "TestFillMethodLoggerWithConfigStringInvalid", "TestGetServers", "TestServerStatsFullDuplexRPC", "TestSayHello", "TestBalancerGroup_TwoRR_OneBackend", "TestGRPCLBStatsUnaryDrop", "TestHeaderConfigRegexp", "TestErrorsWithSameParameters", "TestAuthInfoFromContext", "TestFromErrorUnknownError", "TestPingPong", "TestGRPCLBStatsStreamingSuccess", "TestIsRunningOnGCP", "TestDial", "TestTruncateMessageNotTruncated", "TestServerBinaryLogFullDuplexError", "TestConvertUnknownError", "TestDNSResolverRetry", "TestClientHandshake", "TestLBCacheClientConnExpire", "TestGetSocketOptions", "TestClientHealthCheckBackoff", "TestPairsMD", "TestErrorProtoOK", "TestServerHandshakeReturnsAuthInfo", "TestFromErrorImplementsInterface", "TestFileDescForType", "TestBalancerGroup_TwoRR_MoreBackends", "TestAES128GCMEncrypt", "TestNewLoggerFromConfigStringInvalid", "TestFromNilProto", "TestStatus_ErrorDetails_Fail", "TestListener", "TestResolve", "TestCloneServer", "TestAllExtensionNumbersForType", "TestClientBinaryLogCancel", "TestRegister", "TestParseMethodNameInvalid", "TestResolveFunc", "TestServerStatsServerStreamRPCError", "TestServerStatsFullDuplexRPCError", "TestRouteChat", "TestNoSetupOrTeardown", "TestListenerAndDialer", "TestIncorrectMsgType", "TestGetSocketOpt", "TestSet", "TestSmallReadBuffer", "TestEDS_UpdateSubBalancerName", "TestConnCloseWithData", "TestPipeListener", "TestAllServersDown", "TestClientBinaryLogClientStreamRPCError", "TestClientStatsServerStreamRPC", "TestClientStatsServerStreamRPCError", "TestCloseWhileAccepting", "TestClientStatsUnaryRPCError", "TestCompareRPCVersions", "TestGetMethodLoggerOff", "TestErrorOK", "TestSync", "TestNewLoggerFromConfigString", "TestSyncTooSlow", "TestCloseWithPendingRPC", "TestServerBinaryLogServerStreamRPC", "TestGet", "TestServerBinaryLogClientStreamRPC", "TestJSONUnmarshal", "TestClientStatsClientStreamRPC", "TestOneServerDown", "TestBackendsRoundRobin", "TestFillMethodLoggerWithConfigStringPerService", "TestGRPCLBStatsStreamingFailedToSend", "TestGetServerSockets", "TestAppendToOutgoingContext_Repeated", "TestFillMethodLoggerWithConfigStringGlobal", "TestDisableServiceConfig", "TestConvertKnownError", "TestServerAndClientHandshake", "TestExample", "TestCopy", "TestFromContextError", "TestConcurrentUsage", "TestTLSOverrideServerName", "TestPeerNotResponding", "TestLoggerV2Severity", "TestAuthInfoFromPeer", "TestCloneClient", "TestParseMethodName", "TestTruncateMessageTruncated", "TestEDS_OneLocality", "TestInfo", "TestServerBinaryLogUnaryRPCError", "TestAES128GCMRekeyEncryptRoundtrip", "TestInfoServerName", "TestAppend", "TestGetMethodLogger", "TestTruncateMetadataTruncated", "TestTrace", "TestOverrideServerName", "TestLongMethodConfigRegexp", "TestClientBinaryLogUnaryRPC", "TestClientStatsFullDuplexRPCError", "TestTags", "TestClientHandshakeReturnsAuthInfo", "TestAES128GCMEncryptRoundtrip", "TestMessageConfigRegexp", "TestClientStatsFullDuplexRPC", "TestCheckRegisterIgnore", "TestPipe", "TestBalancerGroup_OneRR_AddRemoveBackend", "TestFrameTooLarge", "TestUnblocking", "TestJoin", "TestGRPCLBWeighted", "TestALTSAuthInfo", "TestFillMethodLoggerWithConfigStringPerMethod", "TestEventMultipleFires", "TestBasicProtoCodecMarshalAndUnmarshal", "TestWriteLargeData", "TestServerStatsUnaryRPCError", "TestCounterSides", "TestParseMethodConfigAndSuffix", "TestAES128GCMRekeyEncrypt", "TestFromError", "TestAppendToOutgoingContext", "TestUnmarshalJSON", "TestClientStatsUnaryRPC", "TestBalancerGroup_ThreeRR_RemoveBalancer", "TestEDS_TwoLocalities", "TestIPWatcher", "TestCheck", "TestStatus_WithDetails_Fail", "TestNewAddressWhileBlocking", "TestAddressesRemoved", "TestServerBinaryLogFullDuplex", "TestBalancerGroup_TwoRR_DifferentWeight_MoreBackends", "TestFileDescContainingExtension", "TestUnmarshalJSON_UnknownInput", "TestDropPicker", "TestGRPCLBStatsStreamingDrop", "TestStatus_ErrorDetails", "TestServerBinaryLogUnaryRPC", "TestGRPCLBPickFirst", "TestFromMetadata", "TestCheckRPCVersions", "TestReflectionEnd2end", "TestDropRequest", "TestFromToProto", "TestServerStatsClientStreamRPCError", "Test", "TestBufferBloat", "TestServerBinaryLogClientStreamRPCError", "TestGRPCLB", "TestServerStatsClientStreamRPC", "TestClientBinaryLogServerStreamRPCError", "TestBalancerDisconnects", "TestConn", "TestGRPCLBStatsUnaryFailedToSend", "TestLog", "TestStaggeredMarshalAndUnmarshalUsingSamePool", "TestGetChannel", "TestCounterInc", "TestClientBinaryLogClientStreamRPC", "TestTypeForName", "TestClientBinaryLogServerStreamRPC", "TestParseHeaderMessageLengthConfig", "TestCustomAuthority", "TestServerStatsServerStreamRPC", "TestLBCacheClientConnReuse", "TestFromErrorOK", "TestTLSClone", "TestTruncateMetadataNotTruncated", "TestShutdown", "TestParseHeaderMessageLengthConfigInvalid", "TestUnmarshalJSON_MarshalUnmarshal", "TestWrapSyscallConnNoWrap", "TestParseMethodConfigAndSuffixInvalid", "TestError", "TestGetTopChannels", "TestFillMethodLoggerWithConfigStringBlacklist", "TestCloseWhileDialing", "TestRolloverCounter", "TestCompileUpdate", "TestClientStatsClientStreamRPCError", "TestClientBinaryLogUnaryRPCError", "TestLargeMsg", "TestEventDoneChannel", "TestGRPCLBStatsUnarySuccess", "TestGetServerSocketsNonZeroStartID", "TestClientBinaryLogFullDuplexRPC", "TestTypeForNameNotFound", "TestGetSocket", "TestRunSubTests", "TestClientBinaryLogFullDuplexRPCError", "TestHeaderMessageConfigRegexp", "TestWrapSyscallConn", "TestGetSubChannel", "TestUnmarshalJSON_NilReceiver", "TestServerHandshake", "TestToMetadata"], "failed_tests": ["google.golang.org/grpc/internal", "google.golang.org/grpc"], "skipped_tests": []}
{"passed_count": 209, "failed_count": 3, "skipped_count": 0, "passed_tests": ["TestOneBackend", "TestAppendH2ToNextProtos", "TestServerStatsUnaryRPC", "TestPipeClose", "TestAppendToOutgoingContext_FromKVSlice", "TestBalancerGroup_TwoRR_ChangeWeight_MoreBackends", "TestServerBinaryLogServerStreamRPCError", "TestIsRoundRobin", "TestEventHasFired", "TestDropper", "TestFillMethodLoggerWithConfigStringInvalid", "TestGetServers", "TestServerStatsFullDuplexRPC", "TestSayHello", "TestBalancerGroup_TwoRR_OneBackend", "TestGRPCLBStatsUnaryDrop", "TestHeaderConfigRegexp", "TestErrorsWithSameParameters", "TestAuthInfoFromContext", "TestFromErrorUnknownError", "TestPingPong", "TestGRPCLBStatsStreamingSuccess", "TestIsRunningOnGCP", "TestDial", "TestTruncateMessageNotTruncated", "TestServerBinaryLogFullDuplexError", "TestConvertUnknownError", "TestClientHandshake", "TestLBCacheClientConnExpire", "TestGetSocketOptions", "TestClientHealthCheckBackoff", "TestPairsMD", "TestErrorProtoOK", "TestServerHandshakeReturnsAuthInfo", "TestFromErrorImplementsInterface", "TestFileDescForType", "TestBalancerGroup_TwoRR_MoreBackends", "TestAES128GCMEncrypt", "TestNewLoggerFromConfigStringInvalid", "TestFromNilProto", "TestStatus_ErrorDetails_Fail", "TestListener", "TestResolve", "TestCloneServer", "TestAllExtensionNumbersForType", "TestClientBinaryLogCancel", "TestRegister", "TestParseMethodNameInvalid", "TestResolveFunc", "TestServerStatsServerStreamRPCError", "TestServerStatsFullDuplexRPCError", "TestRouteChat", "TestNoSetupOrTeardown", "TestListenerAndDialer", "TestIncorrectMsgType", "TestGetSocketOpt", "TestSet", "TestSmallReadBuffer", "TestEDS_UpdateSubBalancerName", "TestConnCloseWithData", "TestPipeListener", "TestAllServersDown", "TestClientBinaryLogClientStreamRPCError", "TestClientStatsServerStreamRPC", "TestClientStatsServerStreamRPCError", "TestCloseWhileAccepting", "TestClientStatsUnaryRPCError", "TestCompareRPCVersions", "TestGetMethodLoggerOff", "TestErrorOK", "TestSync", "TestNewLoggerFromConfigString", "TestSyncTooSlow", "TestCloseWithPendingRPC", "TestServerBinaryLogServerStreamRPC", "TestGet", "TestServerBinaryLogClientStreamRPC", "TestJSONUnmarshal", "TestClientStatsClientStreamRPC", "TestOneServerDown", "TestBackendsRoundRobin", "TestFillMethodLoggerWithConfigStringPerService", "TestGRPCLBStatsStreamingFailedToSend", "TestGetServerSockets", "TestAppendToOutgoingContext_Repeated", "TestFillMethodLoggerWithConfigStringGlobal", "TestConvertKnownError", "TestServerAndClientHandshake", "TestExample", "TestCopy", "TestFromContextError", "TestConcurrentUsage", "TestTLSOverrideServerName", "TestPeerNotResponding", "TestLoggerV2Severity", "TestAuthInfoFromPeer", "TestCloneClient", "TestParseMethodName", "TestTruncateMessageTruncated", "TestEDS_OneLocality", "TestInfo", "TestServerBinaryLogUnaryRPCError", "TestAES128GCMRekeyEncryptRoundtrip", "TestInfoServerName", "TestAppend", "TestGetMethodLogger", "TestTruncateMetadataTruncated", "TestTrace", "TestOverrideServerName", "TestLongMethodConfigRegexp", "TestClientBinaryLogUnaryRPC", "TestClientStatsFullDuplexRPCError", "TestTags", "TestClientHandshakeReturnsAuthInfo", "TestAES128GCMEncryptRoundtrip", "TestMessageConfigRegexp", "TestClientStatsFullDuplexRPC", "TestCheckRegisterIgnore", "TestPipe", "TestBalancerGroup_OneRR_AddRemoveBackend", "TestFrameTooLarge", "TestUnblocking", "TestJoin", "TestGRPCLBWeighted", "TestALTSAuthInfo", "TestFillMethodLoggerWithConfigStringPerMethod", "TestEventMultipleFires", "TestBasicProtoCodecMarshalAndUnmarshal", "TestWriteLargeData", "TestServerStatsUnaryRPCError", "TestCounterSides", "TestParseMethodConfigAndSuffix", "TestAES128GCMRekeyEncrypt", "TestFromError", "TestAppendToOutgoingContext", "TestUnmarshalJSON", "TestClientStatsUnaryRPC", "TestBalancerGroup_ThreeRR_RemoveBalancer", "TestEDS_TwoLocalities", "TestIPWatcher", "TestCheck", "TestStatus_WithDetails_Fail", "TestNewAddressWhileBlocking", "TestAddressesRemoved", "TestServerBinaryLogFullDuplex", "TestBalancerGroup_TwoRR_DifferentWeight_MoreBackends", "TestFileDescContainingExtension", "TestUnmarshalJSON_UnknownInput", "TestDropPicker", "TestGRPCLBStatsStreamingDrop", "TestStatus_ErrorDetails", "TestServerBinaryLogUnaryRPC", "TestGRPCLBPickFirst", "TestFromMetadata", "TestCheckRPCVersions", "TestReflectionEnd2end", "TestDropRequest", "TestFromToProto", "TestServerStatsClientStreamRPCError", "Test", "TestBufferBloat", "TestServerBinaryLogClientStreamRPCError", "TestGRPCLB", "TestServerStatsClientStreamRPC", "TestClientBinaryLogServerStreamRPCError", "TestBalancerDisconnects", "TestConn", "TestGRPCLBStatsUnaryFailedToSend", "TestLog", "TestStaggeredMarshalAndUnmarshalUsingSamePool", "TestGetChannel", "TestCounterInc", "TestClientBinaryLogClientStreamRPC", "TestTypeForName", "TestClientBinaryLogServerStreamRPC", "TestParseHeaderMessageLengthConfig", "TestServerStatsServerStreamRPC", "TestLBCacheClientConnReuse", "TestFromErrorOK", "TestTLSClone", "TestTruncateMetadataNotTruncated", "TestShutdown", "TestParseHeaderMessageLengthConfigInvalid", "TestUnmarshalJSON_MarshalUnmarshal", "TestWrapSyscallConnNoWrap", "TestParseMethodConfigAndSuffixInvalid", "TestError", "TestGetTopChannels", "TestFillMethodLoggerWithConfigStringBlacklist", "TestCloseWhileDialing", "TestRolloverCounter", "TestCompileUpdate", "TestClientStatsClientStreamRPCError", "TestClientBinaryLogUnaryRPCError", "TestLargeMsg", "TestEventDoneChannel", "TestGRPCLBStatsUnarySuccess", "TestGetServerSocketsNonZeroStartID", "TestClientBinaryLogFullDuplexRPC", "TestTypeForNameNotFound", "TestGetSocket", "TestRunSubTests", "TestClientBinaryLogFullDuplexRPCError", "TestHeaderMessageConfigRegexp", "TestWrapSyscallConn", "TestGetSubChannel", "TestUnmarshalJSON_NilReceiver", "TestServerHandshake", "TestToMetadata"], "failed_tests": ["google.golang.org/grpc/internal", "google.golang.org/grpc/resolver", "google.golang.org/grpc"], "skipped_tests": []}
{"passed_count": 213, "failed_count": 2, "skipped_count": 0, "passed_tests": ["TestOneBackend", "TestAppendH2ToNextProtos", "TestServerStatsUnaryRPC", "TestPipeClose", "TestAppendToOutgoingContext_FromKVSlice", "TestBalancerGroup_TwoRR_ChangeWeight_MoreBackends", "TestServerBinaryLogServerStreamRPCError", "TestIsRoundRobin", "TestEventHasFired", "TestDropper", "TestFillMethodLoggerWithConfigStringInvalid", "TestGetServers", "TestServerStatsFullDuplexRPC", "TestSayHello", "TestBalancerGroup_TwoRR_OneBackend", "TestGRPCLBStatsUnaryDrop", "TestRateLimitedResolve", "TestHeaderConfigRegexp", "TestErrorsWithSameParameters", "TestAuthInfoFromContext", "TestFromErrorUnknownError", "TestPingPong", "TestGRPCLBStatsStreamingSuccess", "TestIsRunningOnGCP", "TestDial", "TestTruncateMessageNotTruncated", "TestServerBinaryLogFullDuplexError", "TestConvertUnknownError", "TestDNSResolverRetry", "TestClientHandshake", "TestLBCacheClientConnExpire", "TestGetSocketOptions", "TestClientHealthCheckBackoff", "TestPairsMD", "TestErrorProtoOK", "TestServerHandshakeReturnsAuthInfo", "TestFromErrorImplementsInterface", "TestFileDescForType", "TestBalancerGroup_TwoRR_MoreBackends", "TestAES128GCMEncrypt", "TestNewLoggerFromConfigStringInvalid", "TestFromNilProto", "TestStatus_ErrorDetails_Fail", "TestListener", "TestResolve", "TestCloneServer", "TestAllExtensionNumbersForType", "TestClientBinaryLogCancel", "TestRegister", "TestParseMethodNameInvalid", "TestResolveFunc", "TestServerStatsServerStreamRPCError", "TestServerStatsFullDuplexRPCError", "TestRouteChat", "TestNoSetupOrTeardown", "TestListenerAndDialer", "TestIncorrectMsgType", "TestGetSocketOpt", "TestSet", "TestSmallReadBuffer", "TestEDS_UpdateSubBalancerName", "TestConnCloseWithData", "TestPipeListener", "TestAllServersDown", "TestClientBinaryLogClientStreamRPCError", "TestClientStatsServerStreamRPC", "TestClientStatsServerStreamRPCError", "TestCloseWhileAccepting", "TestClientStatsUnaryRPCError", "TestCompareRPCVersions", "TestGetMethodLoggerOff", "TestErrorOK", "TestSync", "TestNewLoggerFromConfigString", "TestSyncTooSlow", "TestCloseWithPendingRPC", "TestServerBinaryLogServerStreamRPC", "TestGet", "TestServerBinaryLogClientStreamRPC", "TestJSONUnmarshal", "TestClientStatsClientStreamRPC", "TestOneServerDown", "TestBackendsRoundRobin", "TestFillMethodLoggerWithConfigStringPerService", "TestGRPCLBStatsStreamingFailedToSend", "TestGetServerSockets", "TestAppendToOutgoingContext_Repeated", "TestFillMethodLoggerWithConfigStringGlobal", "TestDisableServiceConfig", "TestConvertKnownError", "TestServerAndClientHandshake", "TestExample", "TestCopy", "TestFromContextError", "TestConcurrentUsage", "TestTLSOverrideServerName", "TestPeerNotResponding", "TestLoggerV2Severity", "TestAuthInfoFromPeer", "TestCloneClient", "TestParseMethodName", "TestTruncateMessageTruncated", "TestEDS_OneLocality", "TestInfo", "TestServerBinaryLogUnaryRPCError", "TestAES128GCMRekeyEncryptRoundtrip", "TestInfoServerName", "TestAppend", "TestGetMethodLogger", "TestTruncateMetadataTruncated", "TestTrace", "TestOverrideServerName", "TestLongMethodConfigRegexp", "TestClientBinaryLogUnaryRPC", "TestClientStatsFullDuplexRPCError", "TestTags", "TestClientHandshakeReturnsAuthInfo", "TestAES128GCMEncryptRoundtrip", "TestMessageConfigRegexp", "TestClientStatsFullDuplexRPC", "TestCheckRegisterIgnore", "TestPipe", "TestBalancerGroup_OneRR_AddRemoveBackend", "TestFrameTooLarge", "TestUnblocking", "TestJoin", "TestGRPCLBWeighted", "TestALTSAuthInfo", "TestFillMethodLoggerWithConfigStringPerMethod", "TestEventMultipleFires", "TestBasicProtoCodecMarshalAndUnmarshal", "TestWriteLargeData", "TestServerStatsUnaryRPCError", "TestCounterSides", "TestParseMethodConfigAndSuffix", "TestAES128GCMRekeyEncrypt", "TestFromError", "TestAppendToOutgoingContext", "TestUnmarshalJSON", "TestClientStatsUnaryRPC", "TestBalancerGroup_ThreeRR_RemoveBalancer", "TestEDS_TwoLocalities", "TestIPWatcher", "TestCheck", "TestStatus_WithDetails_Fail", "TestNewAddressWhileBlocking", "TestAddressesRemoved", "TestServerBinaryLogFullDuplex", "TestBalancerGroup_TwoRR_DifferentWeight_MoreBackends", "TestFileDescContainingExtension", "TestUnmarshalJSON_UnknownInput", "TestDropPicker", "TestGRPCLBStatsStreamingDrop", "TestStatus_ErrorDetails", "TestServerBinaryLogUnaryRPC", "TestGRPCLBPickFirst", "TestFromMetadata", "TestCheckRPCVersions", "TestReflectionEnd2end", "TestDropRequest", "TestFromToProto", "TestServerStatsClientStreamRPCError", "Test", "TestBufferBloat", "TestServerBinaryLogClientStreamRPCError", "TestGRPCLB", "TestServerStatsClientStreamRPC", "TestClientBinaryLogServerStreamRPCError", "TestBalancerDisconnects", "TestConn", "TestGRPCLBStatsUnaryFailedToSend", "TestLog", "TestStaggeredMarshalAndUnmarshalUsingSamePool", "TestGetChannel", "TestCounterInc", "TestClientBinaryLogClientStreamRPC", "TestTypeForName", "TestClientBinaryLogServerStreamRPC", "TestParseHeaderMessageLengthConfig", "TestCustomAuthority", "TestServerStatsServerStreamRPC", "TestLBCacheClientConnReuse", "TestFromErrorOK", "TestTLSClone", "TestTruncateMetadataNotTruncated", "TestShutdown", "TestParseHeaderMessageLengthConfigInvalid", "TestUnmarshalJSON_MarshalUnmarshal", "TestWrapSyscallConnNoWrap", "TestParseMethodConfigAndSuffixInvalid", "TestError", "TestGetTopChannels", "TestFillMethodLoggerWithConfigStringBlacklist", "TestCloseWhileDialing", "TestRolloverCounter", "TestCompileUpdate", "TestClientStatsClientStreamRPCError", "TestClientBinaryLogUnaryRPCError", "TestLargeMsg", "TestEventDoneChannel", "TestGRPCLBStatsUnarySuccess", "TestGetServerSocketsNonZeroStartID", "TestClientBinaryLogFullDuplexRPC", "TestTypeForNameNotFound", "TestGetSocket", "TestRunSubTests", "TestClientBinaryLogFullDuplexRPCError", "TestHeaderMessageConfigRegexp", "TestWrapSyscallConn", "TestGetSubChannel", "TestUnmarshalJSON_NilReceiver", "TestServerHandshake", "TestToMetadata"], "failed_tests": ["google.golang.org/grpc/internal", "google.golang.org/grpc"], "skipped_tests": []}