@@ -32,6 +32,8 @@ import (
32
32
"google.golang.org/grpc/credentials"
33
33
"google.golang.org/grpc/keepalive"
34
34
"google.golang.org/grpc/naming"
35
+ "google.golang.org/grpc/resolver"
36
+ "google.golang.org/grpc/resolver/manual"
35
37
_ "google.golang.org/grpc/resolver/passthrough"
36
38
"google.golang.org/grpc/test/leakcheck"
37
39
"google.golang.org/grpc/testdata"
@@ -46,6 +48,77 @@ func assertState(wantState connectivity.State, cc *ClientConn) (connectivity.Sta
46
48
return state , state == wantState
47
49
}
48
50
51
+ func TestDialWithMultipleBackendsNotSendingServerPreface (t * testing.T ) {
52
+ defer leakcheck .Check (t )
53
+ numServers := 2
54
+ servers := make ([]net.Listener , numServers )
55
+ var err error
56
+ for i := 0 ; i < numServers ; i ++ {
57
+ servers [i ], err = net .Listen ("tcp" , "localhost:0" )
58
+ if err != nil {
59
+ t .Fatalf ("Error while listening. Err: %v" , err )
60
+ }
61
+ }
62
+ dones := make ([]chan struct {}, numServers )
63
+ for i := 0 ; i < numServers ; i ++ {
64
+ dones [i ] = make (chan struct {})
65
+ }
66
+ for i := 0 ; i < numServers ; i ++ {
67
+ go func (i int ) {
68
+ defer func () {
69
+ close (dones [i ])
70
+ }()
71
+ conn , err := servers [i ].Accept ()
72
+ if err != nil {
73
+ t .Errorf ("Error while accepting. Err: %v" , err )
74
+ return
75
+ }
76
+ defer conn .Close ()
77
+ switch i {
78
+ case 0 : // 1st server accepts the connection and immediately closes it.
79
+ case 1 : // 2nd server accepts the connection and sends settings frames.
80
+ framer := http2 .NewFramer (conn , conn )
81
+ if err := framer .WriteSettings (http2.Setting {}); err != nil {
82
+ t .Errorf ("Error while writing settings frame. %v" , err )
83
+ return
84
+ }
85
+ conn .SetDeadline (time .Now ().Add (time .Second ))
86
+ buf := make ([]byte , 1024 )
87
+ for { // Make sure the connection stays healthy.
88
+ _ , err = conn .Read (buf )
89
+ if err == nil {
90
+ continue
91
+ }
92
+ if nerr , ok := err .(net.Error ); ! ok || ! nerr .Timeout () {
93
+ t .Errorf ("Server expected the conn.Read(_) to timeout instead got error: %v" , err )
94
+ }
95
+ return
96
+ }
97
+ }
98
+ }(i )
99
+ }
100
+ r , cleanup := manual .GenerateAndRegisterManualResolver ()
101
+ defer cleanup ()
102
+ resolvedAddrs := make ([]resolver.Address , numServers )
103
+ for i := 0 ; i < numServers ; i ++ {
104
+ resolvedAddrs [i ] = resolver.Address {Addr : servers [i ].Addr ().String ()}
105
+ }
106
+ r .BootstrapWithAddrs (resolvedAddrs )
107
+ client , err := Dial (r .Scheme ()+ ":///test.server" , WithInsecure ())
108
+ if err != nil {
109
+ t .Errorf ("Dial failed. Err: %v" , err )
110
+ } else {
111
+ defer client .Close ()
112
+ }
113
+ time .Sleep (time .Second ) // Close the servers after a second for cleanup.
114
+ for _ , s := range servers {
115
+ s .Close ()
116
+ }
117
+ for _ , done := range dones {
118
+ <- done
119
+ }
120
+ }
121
+
49
122
func TestDialWaitsForServerSettings (t * testing.T ) {
50
123
defer leakcheck .Check (t )
51
124
server , err := net .Listen ("tcp" , "localhost:0" )
@@ -78,7 +151,7 @@ func TestDialWaitsForServerSettings(t *testing.T) {
78
151
<- dialDone // Close conn only after dial returns.
79
152
}()
80
153
ctx , cancel := context .WithTimeout (context .Background (), 500 * time .Millisecond )
81
- client , err := DialContext (ctx , server .Addr ().String (), WithInsecure (), WithWaitForServerSettings ())
154
+ client , err := DialContext (ctx , server .Addr ().String (), WithInsecure (), WithWaitForServerSettings (), WithBlock () )
82
155
close (dialDone )
83
156
if err != nil {
84
157
cancel ()
@@ -197,15 +270,15 @@ func TestBackoffWhenNoServerPrefaceReceived(t *testing.T) {
197
270
t .Errorf ("Error while accepting. Err: %v" , err )
198
271
return
199
272
}
200
- now := time .Now ()
273
+ meow := time .Now ()
201
274
conn .Close ()
202
- dr := now .Sub (prevAt )
275
+ dr := meow .Sub (prevAt )
203
276
if dr <= prevDuration {
204
277
t .Errorf ("Client backoff did not increase with retries. Previoud duration: %v, current duration: %v" , prevDuration , dr )
205
278
return
206
279
}
207
280
prevDuration = dr
208
- prevAt = now
281
+ prevAt = meow
209
282
}
210
283
}()
211
284
client , err := Dial (server .Addr ().String (), WithInsecure ())
0 commit comments