@@ -3,8 +3,10 @@ package testpeer
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "errors"
6
7
"fmt"
7
8
"io"
9
+ "net"
8
10
"net/http"
9
11
"strings"
10
12
"testing"
@@ -87,7 +89,7 @@ func (g *TestPeerGenerator) Close() error {
87
89
// NextBitswap generates a new test peer with bitswap + dependencies
88
90
func (g * TestPeerGenerator ) NextBitswap () TestPeer {
89
91
g .seq ++
90
- p , err := p2ptestutil . RandTestBogusIdentity ()
92
+ p , err := RandTestPeerIdentity ()
91
93
require .NoError (g .t , err )
92
94
tp , err := NewTestBitswapPeer (g .ctx , g .mn , p , g .netOptions , g .bsOptions )
93
95
require .NoError (g .t , err )
@@ -457,4 +459,28 @@ func MockIpfsHandler(ctx context.Context, lsys linking.LinkSystem) func(http.Res
457
459
}
458
460
}
459
461
462
+ // RandTestPeerIdentity is a wrapper around
463
+ // github.com/libp2p/go-libp2p-testing/netutil/RandTestBogusIdentity that
464
+ // ensures the returned identity has an available port. The identity generated
465
+ // by netutil/RandTestBogusIdentity is not guaranteed to have an available port,
466
+ // so we use a net.Listen to check if the port is available and try again if
467
+ // it's not.
468
+ func RandTestPeerIdentity () (tnet.Identity , error ) {
469
+ for i := 0 ; i < 10 ; i ++ {
470
+ id , err := p2ptestutil .RandTestBogusIdentity ()
471
+ if err != nil {
472
+ return nil , err
473
+ }
474
+ addr := id .Address ()
475
+ port := strings .Split (addr .String (), "/" )[4 ]
476
+ // check if 127.0.0.1:port is available or not
477
+ ln , err := net .Listen ("tcp4" , "127.0.0.1:" + port )
478
+ if err == nil {
479
+ ln .Close ()
480
+ return id , nil
481
+ } // else assume it's in use and try again
482
+ }
483
+ return nil , errors .New ("failed to find an available port" )
484
+ }
485
+
460
486
func visitNoop (p traversal.Progress , n datamodel.Node , vr traversal.VisitReason ) error { return nil }
0 commit comments