@@ -29,6 +29,7 @@ import (
29
29
anypb "github.com/golang/protobuf/ptypes/any"
30
30
"github.com/google/go-cmp/cmp"
31
31
"google.golang.org/grpc"
32
+ "google.golang.org/grpc/codes"
32
33
"google.golang.org/grpc/internal/testutils"
33
34
xdsclient "google.golang.org/grpc/xds/internal/client"
34
35
"google.golang.org/grpc/xds/internal/testutils/fakeserver"
@@ -73,7 +74,7 @@ func startXDSV2Client(t *testing.T, cc *grpc.ClientConn) (v2c *client, cbLDS, cb
73
74
}
74
75
75
76
// compareXDSRequest reads requests from channel, compare it with want.
76
- func compareXDSRequest (ch * testutils.Channel , want * xdspb.DiscoveryRequest , ver , nonce string ) error {
77
+ func compareXDSRequest (ch * testutils.Channel , want * xdspb.DiscoveryRequest , ver , nonce string , wantErr bool ) error {
77
78
ctx , cancel := context .WithTimeout (context .Background (), defaultTestTimeout )
78
79
defer cancel ()
79
80
val , err := ch .Receive (ctx )
@@ -84,11 +85,22 @@ func compareXDSRequest(ch *testutils.Channel, want *xdspb.DiscoveryRequest, ver,
84
85
if req .Err != nil {
85
86
return fmt .Errorf ("unexpected error from request: %v" , req .Err )
86
87
}
88
+
89
+ xdsReq := req .Req .(* xdspb.DiscoveryRequest )
90
+ if (xdsReq .ErrorDetail != nil ) != wantErr {
91
+ return fmt .Errorf ("received request with error details: %v, wantErr: %v" , xdsReq .ErrorDetail , wantErr )
92
+ }
93
+ // All NACK request.ErrorDetails have hardcoded status code InvalidArguments.
94
+ if xdsReq .ErrorDetail != nil && xdsReq .ErrorDetail .Code != int32 (codes .InvalidArgument ) {
95
+ return fmt .Errorf ("received request with error details: %v, want status with code: %v" , xdsReq .ErrorDetail , codes .InvalidArgument )
96
+ }
97
+
98
+ xdsReq .ErrorDetail = nil // Clear the error details field before comparing.
87
99
wantClone := proto .Clone (want ).(* xdspb.DiscoveryRequest )
88
100
wantClone .VersionInfo = ver
89
101
wantClone .ResponseNonce = nonce
90
- if ! cmp .Equal (req . Req , wantClone , cmp .Comparer (proto .Equal )) {
91
- return fmt .Errorf ("received request different from want, diff: %s" , cmp .Diff (req .Req , wantClone ))
102
+ if ! cmp .Equal (xdsReq , wantClone , cmp .Comparer (proto .Equal )) {
103
+ return fmt .Errorf ("received request different from want, diff: %s" , cmp .Diff (req .Req , wantClone , cmp . Comparer ( proto . Equal ) ))
92
104
}
93
105
return nil
94
106
}
@@ -118,7 +130,7 @@ func startXDS(t *testing.T, rType xdsclient.ResourceType, v2c *client, reqChan *
118
130
}
119
131
v2c .AddWatch (rType , nameToWatch )
120
132
121
- if err := compareXDSRequest (reqChan , req , preVersion , preNonce ); err != nil {
133
+ if err := compareXDSRequest (reqChan , req , preVersion , preNonce , false ); err != nil {
122
134
t .Fatalf ("Failed to receive %v request: %v" , rType , err )
123
135
}
124
136
t .Logf ("FakeServer received %v request..." , rType )
@@ -133,7 +145,7 @@ func sendGoodResp(t *testing.T, rType xdsclient.ResourceType, fakeServer *fakese
133
145
nonce := sendXDSRespWithVersion (fakeServer .XDSResponseChan , goodResp , ver )
134
146
t .Logf ("Good %v response pushed to fakeServer..." , rType )
135
147
136
- if err := compareXDSRequest (fakeServer .XDSRequestChan , wantReq , strconv .Itoa (ver ), nonce ); err != nil {
148
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , wantReq , strconv .Itoa (ver ), nonce , false ); err != nil {
137
149
return "" , fmt .Errorf ("failed to receive %v request: %v" , rType , err )
138
150
}
139
151
t .Logf ("Good %v response acked" , rType )
@@ -168,7 +180,7 @@ func sendBadResp(t *testing.T, rType xdsclient.ResourceType, fakeServer *fakeser
168
180
TypeUrl : typeURL ,
169
181
}, ver )
170
182
t .Logf ("Bad %v response pushed to fakeServer..." , rType )
171
- if err := compareXDSRequest (fakeServer .XDSRequestChan , wantReq , strconv .Itoa (ver - 1 ), nonce ); err != nil {
183
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , wantReq , strconv .Itoa (ver - 1 ), nonce , true ); err != nil {
172
184
return fmt .Errorf ("failed to receive %v request: %v" , rType , err )
173
185
}
174
186
t .Logf ("Bad %v response nacked" , rType )
@@ -274,7 +286,7 @@ func (s) TestV2ClientAckFirstIsNack(t *testing.T) {
274
286
275
287
// The expected version string is an empty string, because this is the first
276
288
// response, and it's nacked (so there's no previous ack version).
277
- if err := compareXDSRequest (fakeServer .XDSRequestChan , goodLDSRequest , "" , nonce ); err != nil {
289
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , goodLDSRequest , "" , nonce , true ); err != nil {
278
290
t .Errorf ("Failed to receive request: %v" , err )
279
291
}
280
292
t .Logf ("Bad response nacked" )
@@ -314,7 +326,7 @@ func (s) TestV2ClientAckNackAfterNewWatch(t *testing.T) {
314
326
t .Logf ("Bad response pushed to fakeServer..." )
315
327
316
328
// The expected version string is the previous acked version.
317
- if err := compareXDSRequest (fakeServer .XDSRequestChan , goodLDSRequest , strconv .Itoa (versionLDS - 1 ), nonce ); err != nil {
329
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , goodLDSRequest , strconv .Itoa (versionLDS - 1 ), nonce , true ); err != nil {
318
330
t .Errorf ("Failed to receive request: %v" , err )
319
331
}
320
332
t .Logf ("Bad response nacked" )
@@ -339,7 +351,7 @@ func (s) TestV2ClientAckNewWatchAfterCancel(t *testing.T) {
339
351
340
352
// Start a CDS watch.
341
353
v2c .AddWatch (xdsclient .ClusterResource , goodClusterName1 )
342
- if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , "" , "" ); err != nil {
354
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , "" , "" , false ); err != nil {
343
355
t .Fatal (err )
344
356
}
345
357
t .Logf ("FakeServer received %v request..." , xdsclient .ClusterResource )
@@ -356,12 +368,12 @@ func (s) TestV2ClientAckNewWatchAfterCancel(t *testing.T) {
356
368
// Wait for a request with no resource names, because the only watch was
357
369
// removed.
358
370
emptyReq := & xdspb.DiscoveryRequest {Node : goodNodeProto , TypeUrl : version .V2ClusterURL }
359
- if err := compareXDSRequest (fakeServer .XDSRequestChan , emptyReq , strconv .Itoa (versionCDS ), nonce ); err != nil {
371
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , emptyReq , strconv .Itoa (versionCDS ), nonce , false ); err != nil {
360
372
t .Fatalf ("Failed to receive %v request: %v" , xdsclient .ClusterResource , err )
361
373
}
362
374
v2c .AddWatch (xdsclient .ClusterResource , goodClusterName1 )
363
375
// Wait for a request with correct resource names and version.
364
- if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , strconv .Itoa (versionCDS ), nonce ); err != nil {
376
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , strconv .Itoa (versionCDS ), nonce , false ); err != nil {
365
377
t .Fatalf ("Failed to receive %v request: %v" , xdsclient .ClusterResource , err )
366
378
}
367
379
versionCDS ++
@@ -394,7 +406,7 @@ func (s) TestV2ClientAckCancelResponseRace(t *testing.T) {
394
406
395
407
// Start a CDS watch.
396
408
v2c .AddWatch (xdsclient .ClusterResource , goodClusterName1 )
397
- if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , "" , "" ); err != nil {
409
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , "" , "" , false ); err != nil {
398
410
t .Fatalf ("Failed to receive %v request: %v" , xdsclient .ClusterResource , err )
399
411
}
400
412
t .Logf ("FakeServer received %v request..." , xdsclient .ClusterResource )
@@ -410,7 +422,7 @@ func (s) TestV2ClientAckCancelResponseRace(t *testing.T) {
410
422
// Wait for a request with no resource names, because the only watch was
411
423
// removed.
412
424
emptyReq := & xdspb.DiscoveryRequest {Node : goodNodeProto , TypeUrl : version .V2ClusterURL }
413
- if err := compareXDSRequest (fakeServer .XDSRequestChan , emptyReq , strconv .Itoa (versionCDS ), nonce ); err != nil {
425
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , emptyReq , strconv .Itoa (versionCDS ), nonce , false ); err != nil {
414
426
t .Fatalf ("Failed to receive %v request: %v" , xdsclient .ClusterResource , err )
415
427
}
416
428
versionCDS ++
@@ -440,7 +452,7 @@ func (s) TestV2ClientAckCancelResponseRace(t *testing.T) {
440
452
// Start a new watch. The new watch should have the nonce from the response
441
453
// above, and version from the first good response.
442
454
v2c .AddWatch (xdsclient .ClusterResource , goodClusterName1 )
443
- if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , strconv .Itoa (versionCDS - 1 ), nonce ); err != nil {
455
+ if err := compareXDSRequest (fakeServer .XDSRequestChan , goodCDSRequest , strconv .Itoa (versionCDS - 1 ), nonce , false ); err != nil {
444
456
t .Fatalf ("Failed to receive %v request: %v" , xdsclient .ClusterResource , err )
445
457
}
446
458
0 commit comments