@@ -138,7 +138,7 @@ func addrsToDRAddrs(addrs []multiaddr.Multiaddr) (drmas []types.Multiaddr) {
138
138
return
139
139
}
140
140
141
- func makeBSReadProviderResp () types.PeerRecord {
141
+ func makePeerRecord () types.PeerRecord {
142
142
peerID , addrs , _ := makeProviderAndIdentity ()
143
143
return types.PeerRecord {
144
144
Schema : types .SchemaPeer ,
@@ -189,7 +189,7 @@ func (e *osErrContains) errContains(t *testing.T, err error) {
189
189
}
190
190
191
191
func TestClient_GetProviders (t * testing.T ) {
192
- bsReadProvResp := makeBSReadProviderResp ()
192
+ bsReadProvResp := makePeerRecord ()
193
193
bitswapProvs := []iter.Result [types.Record ]{
194
194
{Val : & bsReadProvResp },
195
195
}
@@ -198,26 +198,26 @@ func TestClient_GetProviders(t *testing.T) {
198
198
name string
199
199
httpStatusCode int
200
200
stopServer bool
201
- routerProvs []iter.Result [types.Record ]
201
+ routerResult []iter.Result [types.Record ]
202
202
routerErr error
203
203
clientRequiresStreaming bool
204
204
serverStreamingDisabled bool
205
205
206
206
expErrContains osErrContains
207
- expProvs []iter.Result [types.Record ]
207
+ expResult []iter.Result [types.Record ]
208
208
expStreamingResponse bool
209
209
expJSONResponse bool
210
210
}{
211
211
{
212
212
name : "happy case" ,
213
- routerProvs : bitswapProvs ,
214
- expProvs : bitswapProvs ,
213
+ routerResult : bitswapProvs ,
214
+ expResult : bitswapProvs ,
215
215
expStreamingResponse : true ,
216
216
},
217
217
{
218
218
name : "server doesn't support streaming" ,
219
- routerProvs : bitswapProvs ,
220
- expProvs : bitswapProvs ,
219
+ routerResult : bitswapProvs ,
220
+ expResult : bitswapProvs ,
221
221
serverStreamingDisabled : true ,
222
222
expJSONResponse : true ,
223
223
},
@@ -243,7 +243,7 @@ func TestClient_GetProviders(t *testing.T) {
243
243
{
244
244
name : "returns no providers if the HTTP server returns a 404 respones" ,
245
245
httpStatusCode : 404 ,
246
- expProvs : nil ,
246
+ expResult : nil ,
247
247
},
248
248
}
249
249
for _ , c := range cases {
@@ -268,6 +268,7 @@ func TestClient_GetProviders(t *testing.T) {
268
268
assert .Equal (t , mediaTypeNDJSON , r .Header .Get ("Content-Type" ))
269
269
})
270
270
}
271
+
271
272
if c .expJSONResponse {
272
273
onRespReceived = append (onRespReceived , func (r * http.Response ) {
273
274
assert .Equal (t , mediaTypeJSON , r .Header .Get ("Content-Type" ))
@@ -296,20 +297,146 @@ func TestClient_GetProviders(t *testing.T) {
296
297
}
297
298
cid := makeCID ()
298
299
299
- findProvsIter := iter .FromSlice (c .routerProvs )
300
-
300
+ routerResultIter := iter .FromSlice (c .routerResult )
301
301
if c .expStreamingResponse {
302
- router .On ("GetProviders" , mock .Anything , cid , 0 ).Return (findProvsIter , c .routerErr )
302
+ router .On ("GetProviders" , mock .Anything , cid , 0 ).Return (routerResultIter , c .routerErr )
303
303
} else {
304
- router .On ("GetProviders" , mock .Anything , cid , 20 ).Return (findProvsIter , c .routerErr )
304
+ router .On ("GetProviders" , mock .Anything , cid , 20 ).Return (routerResultIter , c .routerErr )
305
305
}
306
306
307
- provsIter , err := client .GetProviders (ctx , cid )
307
+ resultIter , err := client .GetProviders (ctx , cid )
308
+ c .expErrContains .errContains (t , err )
309
+
310
+ results := iter.ReadAll [iter.Result [types.Record ]](resultIter )
311
+ assert .Equal (t , c .expResult , results )
312
+ })
313
+ }
314
+ }
315
+
316
+ func TestClient_GetPeers (t * testing.T ) {
317
+ peerRecord := makePeerRecord ()
318
+ peerRecords := []iter.Result [types.Record ]{
319
+ {Val : & peerRecord },
320
+ }
321
+ pid := * peerRecord .ID
322
+
323
+ cases := []struct {
324
+ name string
325
+ httpStatusCode int
326
+ stopServer bool
327
+ routerResult []iter.Result [types.Record ]
328
+ routerErr error
329
+ clientRequiresStreaming bool
330
+ serverStreamingDisabled bool
331
+
332
+ expErrContains osErrContains
333
+ expResult []iter.Result [types.Record ]
334
+ expStreamingResponse bool
335
+ expJSONResponse bool
336
+ }{
337
+ {
338
+ name : "happy case" ,
339
+ routerResult : peerRecords ,
340
+ expResult : peerRecords ,
341
+ expStreamingResponse : true ,
342
+ },
343
+ {
344
+ name : "server doesn't support streaming" ,
345
+ routerResult : peerRecords ,
346
+ expResult : peerRecords ,
347
+ serverStreamingDisabled : true ,
348
+ expJSONResponse : true ,
349
+ },
350
+ {
351
+ name : "client requires streaming but server doesn't support it" ,
352
+ serverStreamingDisabled : true ,
353
+ clientRequiresStreaming : true ,
354
+ expErrContains : osErrContains {expContains : "HTTP error with StatusCode=400: no supported content types" },
355
+ },
356
+ {
357
+ name : "returns an error if there's a non-200 response" ,
358
+ httpStatusCode : 500 ,
359
+ expErrContains : osErrContains {expContains : "HTTP error with StatusCode=500" },
360
+ },
361
+ {
362
+ name : "returns an error if the HTTP client returns a non-HTTP error" ,
363
+ stopServer : true ,
364
+ expErrContains : osErrContains {
365
+ expContains : "connect: connection refused" ,
366
+ expContainsWin : "connectex: No connection could be made because the target machine actively refused it." ,
367
+ },
368
+ },
369
+ {
370
+ name : "returns no providers if the HTTP server returns a 404 respones" ,
371
+ httpStatusCode : 404 ,
372
+ expResult : nil ,
373
+ },
374
+ }
375
+ for _ , c := range cases {
376
+ t .Run (c .name , func (t * testing.T ) {
377
+ var (
378
+ clientOpts []Option
379
+ serverOpts []server.Option
380
+ onRespReceived []func (* http.Response )
381
+ onReqReceived []func (* http.Request )
382
+ )
383
+
384
+ if c .serverStreamingDisabled {
385
+ serverOpts = append (serverOpts , server .WithStreamingResultsDisabled ())
386
+ }
387
+
388
+ if c .clientRequiresStreaming {
389
+ clientOpts = append (clientOpts , WithStreamResultsRequired ())
390
+ onReqReceived = append (onReqReceived , func (r * http.Request ) {
391
+ assert .Equal (t , mediaTypeNDJSON , r .Header .Get ("Accept" ))
392
+ })
393
+ }
394
+
395
+ if c .expStreamingResponse {
396
+ onRespReceived = append (onRespReceived , func (r * http.Response ) {
397
+ assert .Equal (t , mediaTypeNDJSON , r .Header .Get ("Content-Type" ))
398
+ })
399
+ }
400
+
401
+ if c .expJSONResponse {
402
+ onRespReceived = append (onRespReceived , func (r * http.Response ) {
403
+ assert .Equal (t , mediaTypeJSON , r .Header .Get ("Content-Type" ))
404
+ })
405
+ }
406
+
407
+ deps := makeTestDeps (t , clientOpts , serverOpts )
408
+
409
+ deps .recordingHTTPClient .f = append (deps .recordingHTTPClient .f , onRespReceived ... )
410
+ deps .recordingHandler .f = append (deps .recordingHandler .f , onReqReceived ... )
411
+
412
+ client := deps .client
413
+ router := deps .router
414
+
415
+ ctx , cancel := context .WithCancel (context .Background ())
416
+ t .Cleanup (cancel )
417
+
418
+ if c .httpStatusCode != 0 {
419
+ deps .server .Config .Handler = http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
420
+ w .WriteHeader (c .httpStatusCode )
421
+ })
422
+ }
423
+
424
+ if c .stopServer {
425
+ deps .server .Close ()
426
+ }
427
+
428
+ routerResultIter := iter .FromSlice (c .routerResult )
429
+ if c .expStreamingResponse {
430
+ router .On ("GetPeers" , mock .Anything , pid , 0 ).Return (routerResultIter , c .routerErr )
431
+ } else {
432
+ router .On ("GetPeers" , mock .Anything , pid , 20 ).Return (routerResultIter , c .routerErr )
433
+ }
308
434
435
+ resultIter , err := client .GetPeers (ctx , pid )
309
436
c .expErrContains .errContains (t , err )
310
437
311
- provs := iter.ReadAll [iter.Result [types.Record ]](provsIter )
312
- assert .Equal (t , c .expProvs , provs )
438
+ results := iter.ReadAll [iter.Result [types.Record ]](resultIter )
439
+ assert .Equal (t , c .expResult , results )
313
440
})
314
441
}
315
442
}
0 commit comments