rls: Manually implement equality of key builder maps.
cmp.Equal is not supposed to be used in production code because of its
propensity towards panicking.

This equality will eventually be checked from the LB policy when it gets
a service config update.

Fixes #3472
Currently, `rls/internal/keys/builder.go` uses `cmp.Equal`.

The `cmp` package documentation says the following:
It is intended to only be used in tests, as performance is not a goal and it may panic if it cannot compare the values. Its propensity towards panicking means that its unsuitable for production environments where a spurious panic may be fatal.
rls: Do not use `cmp` package in non-test code
diff --git a/balancer/rls/internal/keys/builder.go b/balancer/rls/internal/keys/builder.go
index a606155f4c9d..abc076ab4da3 100644
--- a/balancer/rls/internal/keys/builder.go
+++ b/balancer/rls/internal/keys/builder.go
@@ -27,7 +27,6 @@ import (
 	"sort"
 	"strings"
 
-	"github.com/google/go-cmp/cmp"
 	rlspb "google.golang.org/grpc/balancer/rls/internal/proto/grpc_lookup_v1"
 	"google.golang.org/grpc/metadata"
 )
@@ -123,9 +122,25 @@ func (bm BuilderMap) RLSKey(md metadata.MD, path string) KeyMap {
 	return b.keys(md)
 }
 
-// BuilderMapEqual returns true if the provided BuilderMap objects are equal.
-func BuilderMapEqual(a, b BuilderMap) bool {
-	return cmp.Equal(a, b, cmp.AllowUnexported(builder{}, matcher{}))
+// Equal reports whether bm and am represent equivalent BuilderMaps.
+func (bm BuilderMap) Equal(am BuilderMap) bool {
+	if (bm == nil) != (am == nil) {
+		return false
+	}
+	if len(bm) != len(am) {
+		return false
+	}
+
+	for key, bBuilder := range bm {
+		aBuilder, ok := am[key]
+		if !ok {
+			return false
+		}
+		if !bBuilder.Equal(aBuilder) {
+			return false
+		}
+	}
+	return true
 }
 
 // builder provides the actual functionality of building RLS keys. These are
@@ -142,6 +157,28 @@ type builder struct {
 	matchers []matcher
 }
 
+// Equal reports whether b and a represent equivalent key builders.
+func (b builder) Equal(a builder) bool {
+	if (b.matchers == nil) != (a.matchers == nil) {
+		return false
+	}
+	if len(b.matchers) != len(a.matchers) {
+		return false
+	}
+	// Protobuf serialization maintains the order of repeated fields. Matchers
+	// are specified as a repeated field inside the KeyBuilder proto. If the
+	// order changes, it means that the order in the protobuf changed. We report
+	// this case as not being equal even though the builders could possible be
+	// functionally equal.
+	for i, bMatcher := range b.matchers {
+		aMatcher := a.matchers[i]
+		if !bMatcher.Equal(aMatcher) {
+			return false
+		}
+	}
+	return true
+}
+
 // matcher helps extract a key from request headers based on a given name.
 type matcher struct {
 	// The key used in the keyMap sent as part of the RLS request.
@@ -150,6 +187,25 @@ type matcher struct {
 	names []string
 }
 
+// Equal reports if m and are are equivalent matchers.
+func (m matcher) Equal(a matcher) bool {
+	if m.key != a.key {
+		return false
+	}
+	if (m.names == nil) != (a.names == nil) {
+		return false
+	}
+	if len(m.names) != len(a.names) {
+		return false
+	}
+	for i := 0; i < len(m.names); i++ {
+		if m.names[i] != a.names[i] {
+			return false
+		}
+	}
+	return true
+}
+
 func (b builder) keys(md metadata.MD) KeyMap {
 	kvMap := make(map[string]string)
 	for _, m := range b.matchers {

diff --git a/balancer/rls/internal/keys/builder_test.go b/balancer/rls/internal/keys/builder_test.go
index 09a392ea1810..f5e03ac51dd7 100644
--- a/balancer/rls/internal/keys/builder_test.go
+++ b/balancer/rls/internal/keys/builder_test.go
@@ -85,7 +85,7 @@ func TestMakeBuilderMap(t *testing.T) {
 	for _, test := range tests {
 		t.Run(test.desc, func(t *testing.T) {
 			builderMap, err := MakeBuilderMap(test.cfg)
-			if err != nil || !BuilderMapEqual(builderMap, test.wantBuilderMap) {
+			if err != nil || !builderMap.Equal(test.wantBuilderMap) {
 				t.Errorf("MakeBuilderMap(%+v) returned {%v, %v}, want: {%v, nil}", test.cfg, builderMap, err, test.wantBuilderMap)
 			}
 		})
@@ -330,3 +330,201 @@ func TestMapToString(t *testing.T) {
 		})
 	}
 }
+
+func TestBuilderMapEqual(t *testing.T) {
+	tests := []struct {
+		desc      string
+		a         BuilderMap
+		b         BuilderMap
+		wantEqual bool
+	}{
+		{
+			desc:      "nil builder maps",
+			a:         nil,
+			b:         nil,
+			wantEqual: true,
+		},
+		{
+			desc:      "empty builder maps",
+			a:         make(map[string]builder),
+			b:         make(map[string]builder),
+			wantEqual: true,
+		},
+		{
+			desc:      "nil and non-nil builder maps",
+			a:         nil,
+			b:         map[string]builder{"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}}},
+			wantEqual: false,
+		},
+		{
+			desc:      "empty and non-empty builder maps",
+			a:         make(map[string]builder),
+			b:         map[string]builder{"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}}},
+			wantEqual: false,
+		},
+		{
+			desc: "different number of map keys",
+			a: map[string]builder{
+				"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+				"/gBar/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+			},
+			b: map[string]builder{
+				"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+			},
+			wantEqual: false,
+		},
+		{
+			desc: "different map keys",
+			a: map[string]builder{
+				"/gBar/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+			},
+			b: map[string]builder{
+				"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+			},
+			wantEqual: false,
+		},
+		{
+			desc: "equal keys different values",
+			a: map[string]builder{
+				"/gBar/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+				"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1", "n2"}}}},
+			},
+			b: map[string]builder{
+				"/gBar/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+				"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+			},
+			wantEqual: false,
+		},
+		{
+			desc: "good match",
+			a: map[string]builder{
+				"/gBar/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+				"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+			},
+			b: map[string]builder{
+				"/gBar/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+				"/gFoo/": {matchers: []matcher{{key: "k1", names: []string{"n1"}}}},
+			},
+			wantEqual: true,
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.desc, func(t *testing.T) {
+			if gotEqual := test.a.Equal(test.b); gotEqual != test.wantEqual {
+				t.Errorf("BuilderMap.Equal(%v, %v) = %v, want %v", test.a, test.b, gotEqual, test.wantEqual)
+			}
+		})
+	}
+}
+
+func TestBuilderEqual(t *testing.T) {
+	tests := []struct {
+		desc      string
+		a         builder
+		b         builder
+		wantEqual bool
+	}{
+		{
+			desc:      "nil builders",
+			a:         builder{matchers: nil},
+			b:         builder{matchers: nil},
+			wantEqual: true,
+		},
+		{
+			desc:      "empty builders",
+			a:         builder{matchers: []matcher{}},
+			b:         builder{matchers: []matcher{}},
+			wantEqual: true,
+		},
+		{
+			desc:      "nil and non-nil builders",
+			a:         builder{matchers: nil},
+			b:         builder{matchers: []matcher{}},
+			wantEqual: false,
+		},
+		{
+			desc:      "empty and non-empty builders",
+			a:         builder{matchers: []matcher{}},
+			b:         builder{matchers: []matcher{{key: "foo"}}},
+			wantEqual: false,
+		},
+		{
+			desc:      "different number of matchers",
+			a:         builder{matchers: []matcher{{key: "foo"}, {key: "bar"}}},
+			b:         builder{matchers: []matcher{{key: "foo"}}},
+			wantEqual: false,
+		},
+		{
+			desc:      "equal number but differing matchers",
+			a:         builder{matchers: []matcher{{key: "bar"}}},
+			b:         builder{matchers: []matcher{{key: "foo"}}},
+			wantEqual: false,
+		},
+		{
+			desc:      "good match",
+			a:         builder{matchers: []matcher{{key: "foo"}}},
+			b:         builder{matchers: []matcher{{key: "foo"}}},
+			wantEqual: true,
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.desc, func(t *testing.T) {
+			t.Run(test.desc, func(t *testing.T) {
+				if gotEqual := test.a.Equal(test.b); gotEqual != test.wantEqual {
+					t.Errorf("builder.Equal(%v, %v) = %v, want %v", test.a, test.b, gotEqual, test.wantEqual)
+				}
+			})
+		})
+	}
+}
+
+// matcher helps extract a key from request headers based on a given name.
+func TestMatcherEqual(t *testing.T) {
+	tests := []struct {
+		desc      string
+		a         matcher
+		b         matcher
+		wantEqual bool
+	}{
+		{
+			desc:      "different keys",
+			a:         matcher{key: "foo"},
+			b:         matcher{key: "bar"},
+			wantEqual: false,
+		},
+		{
+			desc:      "different number of names",
+			a:         matcher{key: "foo", names: []string{"v1", "v2"}},
+			b:         matcher{key: "foo", names: []string{"v1"}},
+			wantEqual: false,
+		},
+		{
+			desc:      "equal number but differing names",
+			a:         matcher{key: "foo", names: []string{"v1", "v2"}},
+			b:         matcher{key: "foo", names: []string{"v1", "v22"}},
+			wantEqual: false,
+		},
+		{
+			desc:      "same names in different order",
+			a:         matcher{key: "foo", names: []string{"v2", "v1"}},
+			b:         matcher{key: "foo", names: []string{"v1", "v3"}},
+			wantEqual: false,
+		},
+		{
+			desc:      "good match",
+			a:         matcher{key: "foo", names: []string{"v1", "v2"}},
+			b:         matcher{key: "foo", names: []string{"v1", "v2"}},
+			wantEqual: true,
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.desc, func(t *testing.T) {
+			if gotEqual := test.a.Equal(test.b); gotEqual != test.wantEqual {
+				t.Errorf("matcher.Equal(%v, %v) = %v, want %v", test.a, test.b, gotEqual, test.wantEqual)
+			}
+		})
+	}
+}

{"TestMakeBuilderMapErrors": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/nil_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/equal_number_but_differing_matchers": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/different_number_of_matchers": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/good_match": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestMatcherEqual": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/empty_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/empty_and_non-empty_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestMakeBuilderMap": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestMapToString": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestRLSKey": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestBuilderMapEqual": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/nil_and_non-nil_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}}
{"TestMatchTypeForDomain": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestXDSResolverBadServiceUpdate": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ExampleAttributes_WithValues": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ExampleAttributes": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/ClientHandshakeReturnsAuthInfo": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestXDSResolverGoodServiceUpdate": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseConfigErrors": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLRUResize": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/IsRoundRobin": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test_lrsStore_buildStats_drops": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/EDSHandleResponse": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/AppendH2ToNextProtos": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/EDSParseRespProto": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/New": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCheckRegisterIgnore": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/RDSHandleResponse": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/ToMetadata": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/FromMetadata": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/Dropper": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/LDSGetRouteConfig": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestTXTError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRateLimitedResolve": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/ParseConfig": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/NewConfig": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLookupFailure": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/EdfWrrNext": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/CDSHandleResponse": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPick": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestDial": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestDNSResolverRetry": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCheck": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestAddCausesMultipleEvictions": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestXDSResolverGoodUpdateAfterError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/ChildIsPickFirst": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseTarget": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestPickKeyBuilder": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/LDSHandleResponse": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRegisterBackendResponse": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestResolverBuilder": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/LoadbalancingConfigParsing": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/ClientWrapperWatchEDS": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test_lrsStore_ReportTo": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/RDSGetClusterFromRouteConfiguration": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestResolve": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseTargetString": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestXDSResolverWatchCallbackAfterClose": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestResolveFunc": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/HandleClusterUpdate": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRemove": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestValidateChildPolicyConfig": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestNoSetupOrTeardown": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/DropPicker": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/Parse": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestMatch": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestCustomAuthority": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/RandomWRRNext": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestFindBestMatchingVirtualHost": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLookupSuccess": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestGet": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParseConfig": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/EqualStringPointers": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/XDSBalancerConfigParsing": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test_lrsStore_buildStats_rpcCounts": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLookupDeadlineExceeded": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLookback": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/MethodFamily": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestParallel": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestDisableServiceConfig": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestModifyCausesMultipleEvictions": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestExceedingSizeCausesEviction": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestShouldThrottleOptions": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestExample": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/ValidateCluster": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestValidateChildPolicyConfigErrors": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestRunSubTests": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestLoggerV2Severity": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "TestReportError": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "Test/UpdateClientConnState": {"run": "PASS", "test": "PASS", "fix": "PASS"}}
{"TestMakeBuilderMapErrors": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/nil_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/equal_number_but_differing_matchers": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/different_number_of_matchers": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/good_match": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestMatcherEqual": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/empty_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/empty_and_non-empty_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestMakeBuilderMap": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestMapToString": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestRLSKey": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "TestBuilderMapEqual": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "TestBuilderEqual/nil_and_non-nil_builders": {"run": "NONE", "test": "NONE", "fix": "PASS"}}
{"passed_count": 83, "failed_count": 1, "skipped_count": 0, "passed_tests": ["TestMakeBuilderMapErrors", "TestXDSResolverGoodServiceUpdate", "TestParseConfigErrors", "TestLRUResize", "Test/IsRoundRobin", "Test/EDSHandleResponse", "Test/FromMetadata", "Test/LDSGetRouteConfig", "TestRateLimitedResolve", "Test/ParseConfig", "TestLookupFailure", "TestDial", "TestDNSResolverRetry", "TestXDSResolverGoodUpdateAfterError", "TestParseTarget", "TestPickKeyBuilder", "Test/LDSHandleResponse", "TestResolverBuilder", "Test_lrsStore_ReportTo", "TestResolve", "TestParseTargetString", "TestXDSResolverWatchCallbackAfterClose", "TestResolveFunc", "TestRemove", "TestNoSetupOrTeardown", "TestMatch", "TestMapToString", "Test/RandomWRRNext", "TestGet", "TestParseConfig", "Test/EqualStringPointers", "Test_lrsStore_buildStats_rpcCounts", "TestLookupDeadlineExceeded", "TestLookback", "TestDisableServiceConfig", "TestExceedingSizeCausesEviction", "TestShouldThrottleOptions", "TestExample", "TestValidateChildPolicyConfigErrors", "TestLoggerV2Severity", "TestReportError", "Test/UpdateClientConnState", "TestXDSResolverBadServiceUpdate", "ExampleAttributes_WithValues", "ExampleAttributes", "Test/ClientHandshakeReturnsAuthInfo", "Test_lrsStore_buildStats_drops", "Test/AppendH2ToNextProtos", "Test/EDSParseRespProto", "Test/New", "TestCheckRegisterIgnore", "Test/RDSHandleResponse", "Test/ToMetadata", "Test/Dropper", "TestTXTError", "Test/NewConfig", "Test/EdfWrrNext", "Test/CDSHandleResponse", "TestPick", "TestCheck", "TestAddCausesMultipleEvictions", "Test/ChildIsPickFirst", "TestRegisterBackendResponse", "Test/LoadbalancingConfigParsing", "Test/ClientWrapperWatchEDS", "Test/RDSGetClusterFromRouteConfiguration", "Test/HandleClusterUpdate", "Test", "TestValidateChildPolicyConfig", "Test/DropPicker", "Test/Parse", "TestMakeBuilderMap", "TestRLSKey", "TestCustomAuthority", "TestFindBestMatchingVirtualHost", "TestLookupSuccess", "Test/XDSBalancerConfigParsing", "Test/MethodFamily", "TestParallel", "TestModifyCausesMultipleEvictions", "Test/ValidateCluster", "TestRunSubTests", "TestMatchTypeForDomain"], "failed_tests": ["google.golang.org/grpc/internal"], "skipped_tests": []}
{"passed_count": 79, "failed_count": 2, "skipped_count": 0, "passed_tests": ["TestXDSResolverGoodServiceUpdate", "TestParseConfigErrors", "TestLRUResize", "Test/IsRoundRobin", "Test/EDSHandleResponse", "Test/FromMetadata", "Test/LDSGetRouteConfig", "TestRateLimitedResolve", "Test/ParseConfig", "TestLookupFailure", "TestDial", "TestDNSResolverRetry", "TestXDSResolverGoodUpdateAfterError", "TestParseTarget", "TestPickKeyBuilder", "Test/LDSHandleResponse", "TestResolverBuilder", "Test_lrsStore_ReportTo", "TestResolve", "TestParseTargetString", "TestXDSResolverWatchCallbackAfterClose", "TestResolveFunc", "TestRemove", "TestNoSetupOrTeardown", "TestMatch", "Test/RandomWRRNext", "TestGet", "TestParseConfig", "Test/EqualStringPointers", "Test_lrsStore_buildStats_rpcCounts", "TestLookupDeadlineExceeded", "TestLookback", "TestDisableServiceConfig", "TestExceedingSizeCausesEviction", "TestShouldThrottleOptions", "TestExample", "TestValidateChildPolicyConfigErrors", "TestLoggerV2Severity", "TestReportError", "Test/UpdateClientConnState", "TestXDSResolverBadServiceUpdate", "ExampleAttributes_WithValues", "ExampleAttributes", "Test/ClientHandshakeReturnsAuthInfo", "Test_lrsStore_buildStats_drops", "Test/AppendH2ToNextProtos", "Test/EDSParseRespProto", "Test/New", "TestCheckRegisterIgnore", "Test/RDSHandleResponse", "Test/ToMetadata", "Test/Dropper", "TestTXTError", "Test/NewConfig", "Test/EdfWrrNext", "Test/CDSHandleResponse", "TestPick", "TestCheck", "TestAddCausesMultipleEvictions", "Test/ChildIsPickFirst", "TestRegisterBackendResponse", "Test/LoadbalancingConfigParsing", "Test/ClientWrapperWatchEDS", "Test/RDSGetClusterFromRouteConfiguration", "Test/HandleClusterUpdate", "Test", "TestValidateChildPolicyConfig", "Test/DropPicker", "Test/Parse", "TestCustomAuthority", "TestFindBestMatchingVirtualHost", "TestLookupSuccess", "Test/XDSBalancerConfigParsing", "Test/MethodFamily", "TestParallel", "TestModifyCausesMultipleEvictions", "Test/ValidateCluster", "TestRunSubTests", "TestMatchTypeForDomain"], "failed_tests": ["google.golang.org/grpc/balancer/rls/internal", "google.golang.org/grpc/internal"], "skipped_tests": []}
{"passed_count": 93, "failed_count": 1, "skipped_count": 0, "passed_tests": ["TestMakeBuilderMapErrors", "TestXDSResolverGoodServiceUpdate", "TestParseConfigErrors", "TestLRUResize", "Test/IsRoundRobin", "Test/EDSHandleResponse", "Test/FromMetadata", "Test/LDSGetRouteConfig", "TestMatcherEqual", "TestRateLimitedResolve", "Test/ParseConfig", "TestLookupFailure", "TestBuilderEqual/empty_builders", "TestDial", "TestDNSResolverRetry", "TestXDSResolverGoodUpdateAfterError", "TestParseTarget", "TestPickKeyBuilder", "Test/LDSHandleResponse", "TestResolverBuilder", "Test_lrsStore_ReportTo", "TestResolve", "TestParseTargetString", "TestXDSResolverWatchCallbackAfterClose", "TestResolveFunc", "TestRemove", "TestNoSetupOrTeardown", "TestMatch", "TestMapToString", "Test/RandomWRRNext", "TestBuilderMapEqual", "TestGet", "TestParseConfig", "Test/EqualStringPointers", "Test_lrsStore_buildStats_rpcCounts", "TestLookupDeadlineExceeded", "TestLookback", "TestDisableServiceConfig", "TestExceedingSizeCausesEviction", "TestShouldThrottleOptions", "TestBuilderEqual/nil_and_non-nil_builders", "TestExample", "TestValidateChildPolicyConfigErrors", "TestLoggerV2Severity", "TestReportError", "Test/UpdateClientConnState", "TestXDSResolverBadServiceUpdate", "ExampleAttributes_WithValues", "ExampleAttributes", "Test/ClientHandshakeReturnsAuthInfo", "TestBuilderEqual/nil_builders", "TestBuilderEqual", "Test_lrsStore_buildStats_drops", "TestBuilderEqual/equal_number_but_differing_matchers", "Test/AppendH2ToNextProtos", "Test/EDSParseRespProto", "Test/New", "TestBuilderEqual/different_number_of_matchers", "TestCheckRegisterIgnore", "Test/RDSHandleResponse", "Test/ToMetadata", "TestBuilderEqual/good_match", "Test/Dropper", "TestTXTError", "Test/NewConfig", "Test/EdfWrrNext", "Test/CDSHandleResponse", "TestPick", "TestCheck", "TestAddCausesMultipleEvictions", "Test/ChildIsPickFirst", "TestRegisterBackendResponse", "Test/LoadbalancingConfigParsing", "Test/ClientWrapperWatchEDS", "Test/RDSGetClusterFromRouteConfiguration", "TestBuilderEqual/empty_and_non-empty_builders", "Test/HandleClusterUpdate", "Test", "TestValidateChildPolicyConfig", "Test/DropPicker", "Test/Parse", "TestMakeBuilderMap", "TestRLSKey", "TestCustomAuthority", "TestFindBestMatchingVirtualHost", "TestLookupSuccess", "Test/XDSBalancerConfigParsing", "Test/MethodFamily", "TestParallel", "TestModifyCausesMultipleEvictions", "Test/ValidateCluster", "TestRunSubTests", "TestMatchTypeForDomain"], "failed_tests": ["google.golang.org/grpc/internal"], "skipped_tests": []}