github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/grpc/balancer/base/balancer_test.go (about) 1 /* 2 * 3 * Copyright 2020 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 package base 20 21 import ( 22 "testing" 23 24 "github.com/hxx258456/ccgo/grpc/attributes" 25 "github.com/hxx258456/ccgo/grpc/balancer" 26 "github.com/hxx258456/ccgo/grpc/connectivity" 27 "github.com/hxx258456/ccgo/grpc/resolver" 28 ) 29 30 type testClientConn struct { 31 balancer.ClientConn 32 newSubConn func([]resolver.Address, balancer.NewSubConnOptions) (balancer.SubConn, error) 33 } 34 35 func (c *testClientConn) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) { 36 return c.newSubConn(addrs, opts) 37 } 38 39 func (c *testClientConn) UpdateState(balancer.State) {} 40 41 type testSubConn struct{} 42 43 func (sc *testSubConn) UpdateAddresses(addresses []resolver.Address) {} 44 45 func (sc *testSubConn) Connect() {} 46 47 // testPickBuilder creates balancer.Picker for test. 48 type testPickBuilder struct { 49 validate func(info PickerBuildInfo) 50 } 51 52 func (p *testPickBuilder) Build(info PickerBuildInfo) balancer.Picker { 53 p.validate(info) 54 return nil 55 } 56 57 func TestBaseBalancerReserveAttributes(t *testing.T) { 58 var v = func(info PickerBuildInfo) { 59 for _, sc := range info.ReadySCs { 60 if sc.Address.Addr == "1.1.1.1" { 61 if sc.Address.Attributes == nil { 62 t.Errorf("in picker.validate, got address %+v with nil attributes, want not nil", sc.Address) 63 } 64 foo, ok := sc.Address.Attributes.Value("foo").(string) 65 if !ok || foo != "2233niang" { 66 t.Errorf("in picker.validate, got address[1.1.1.1] with invalid attributes value %v, want 2233niang", sc.Address.Attributes.Value("foo")) 67 } 68 } else if sc.Address.Addr == "2.2.2.2" { 69 if sc.Address.Attributes != nil { 70 t.Error("in b.subConns, got address[2.2.2.2] with not nil attributes, want nil") 71 } 72 } 73 } 74 } 75 pickBuilder := &testPickBuilder{validate: v} 76 b := (&baseBuilder{pickerBuilder: pickBuilder}).Build(&testClientConn{ 77 newSubConn: func(addrs []resolver.Address, _ balancer.NewSubConnOptions) (balancer.SubConn, error) { 78 return &testSubConn{}, nil 79 }, 80 }, balancer.BuildOptions{}).(*baseBalancer) 81 82 b.UpdateClientConnState(balancer.ClientConnState{ 83 ResolverState: resolver.State{ 84 Addresses: []resolver.Address{ 85 {Addr: "1.1.1.1", Attributes: attributes.New("foo", "2233niang")}, 86 {Addr: "2.2.2.2", Attributes: nil}, 87 }, 88 }, 89 }) 90 91 for sc := range b.scStates { 92 b.UpdateSubConnState(sc, balancer.SubConnState{ConnectivityState: connectivity.Ready, ConnectionError: nil}) 93 } 94 }