...
1
18
19 package grpc
20
21 import (
22 "fmt"
23 "strings"
24 "sync"
25 "testing"
26
27 "google.golang.org/grpc/balancer"
28 "google.golang.org/grpc/credentials/insecure"
29 "google.golang.org/grpc/internal/balancer/stub"
30 "google.golang.org/grpc/internal/grpcsync"
31 )
32
33
34
35
36 func (s) TestBalancer_StateListenerBeforeConnect(t *testing.T) {
37
38 started := grpcsync.NewEvent()
39 var cc *ClientConn
40
41 wg := sync.WaitGroup{}
42 wg.Add(2)
43
44
45
46 bf := stub.BalancerFuncs{
47 UpdateClientConnState: func(bd *stub.BalancerData, ccs balancer.ClientConnState) error {
48 go func() {
49
50 <-started.Done()
51
52 go func() {
53 _, err := bd.ClientConn.NewSubConn(ccs.ResolverState.Addresses, balancer.NewSubConnOptions{
54 StateListener: func(scs balancer.SubConnState) {
55 t.Error("Unexpected call to StateListener with:", scs)
56 },
57 })
58 if err != nil && !strings.Contains(err.Error(), "connection is closing") && !strings.Contains(err.Error(), "is deleted") && !strings.Contains(err.Error(), "is closed or idle") && !strings.Contains(err.Error(), "balancer is being closed") {
59 t.Error("Unexpected error creating subconn:", err)
60 }
61 wg.Done()
62 }()
63
64 cc.Close()
65 wg.Done()
66 }()
67 return nil
68 },
69 }
70 stub.Register(t.Name(), bf)
71 svcCfg := fmt.Sprintf(`{ "loadBalancingConfig": [{%q: {}}] }`, t.Name())
72
73 cc, err := Dial("fake", WithTransportCredentials(insecure.NewCredentials()), WithDefaultServiceConfig(svcCfg))
74 if err != nil {
75 t.Fatal("Error dialing:", err)
76 }
77 started.Fire()
78
79
80 wg.Wait()
81 }
82
View as plain text