@@ -24,8 +24,13 @@ import (
2424 "net"
2525 "testing"
2626
27+ "github.com/google/go-cmp/cmp"
28+ "google.golang.org/grpc/attributes"
29+ "google.golang.org/grpc/balancer"
2730 "google.golang.org/grpc/credentials/insecure"
31+ "google.golang.org/grpc/internal/balancer/stub"
2832 "google.golang.org/grpc/resolver"
33+ "google.golang.org/grpc/resolver/manual"
2934)
3035
3136type wrapResolverBuilder struct {
@@ -91,3 +96,49 @@ func (s) TestResolverCaseSensitivity(t *testing.T) {
9196 }
9297 cc .Close ()
9398}
99+
100+ // TestResolverAddressesToEndpoints ensures one Endpoint is created for each
101+ // entry in resolver.State.Addresses automatically.
102+ func (s ) TestResolverAddressesToEndpoints (t * testing.T ) {
103+ ctx , cancel := context .WithTimeout (context .Background (), defaultTestTimeout )
104+ defer cancel ()
105+
106+ const scheme = "testresolveraddressestoendpoints"
107+ r := manual .NewBuilderWithScheme (scheme )
108+
109+ stateCh := make (chan balancer.ClientConnState , 1 )
110+ bf := stub.BalancerFuncs {
111+ UpdateClientConnState : func (_ * stub.BalancerData , ccs balancer.ClientConnState ) error {
112+ stateCh <- ccs
113+ return nil
114+ },
115+ }
116+ balancerName := "stub-balancer-" + scheme
117+ stub .Register (balancerName , bf )
118+
119+ a1 := attributes .New ("x" , "y" )
120+ a2 := attributes .New ("a" , "b" )
121+ r .InitialState (resolver.State {Addresses : []resolver.Address {{Addr : "addr1" , BalancerAttributes : a1 }, {Addr : "addr2" , BalancerAttributes : a2 }}})
122+
123+ cc , err := Dial (r .Scheme ()+ ":///" ,
124+ WithTransportCredentials (insecure .NewCredentials ()),
125+ WithResolvers (r ),
126+ WithDefaultServiceConfig (fmt .Sprintf (`{"loadBalancingConfig": [{"%s":{}}]}` , balancerName )))
127+ if err != nil {
128+ t .Fatalf ("Unexpected error dialing: %v" , err )
129+ }
130+ defer cc .Close ()
131+
132+ select {
133+ case got := <- stateCh :
134+ want := []resolver.Endpoint {
135+ {Addresses : []resolver.Address {{Addr : "addr1" }}, Attributes : a1 },
136+ {Addresses : []resolver.Address {{Addr : "addr2" }}, Attributes : a2 },
137+ }
138+ if diff := cmp .Diff (got .ResolverState .Endpoints , want ); diff != "" {
139+ t .Errorf ("Did not receive expected endpoints. Diff (-got +want):\n %v" , diff )
140+ }
141+ case <- ctx .Done ():
142+ t .Fatalf ("timed out waiting for endpoints" )
143+ }
144+ }
0 commit comments