lntest: adds EnsureConnected helper method
This commit is contained in:
parent
82c1e9af92
commit
6a432c4be2
@ -3,6 +3,7 @@ package lntest
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -264,6 +265,67 @@ func (n *NetworkHarness) NewNode(extraArgs []string) (*HarnessNode, error) {
|
|||||||
return node, nil
|
return node, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EnsureConnected will try to connect to two nodes, returning no error if they
|
||||||
|
// are already connected. If the nodes were not connected previously, this will
|
||||||
|
// behave the same as ConnectNodes. If a pending connection request has already
|
||||||
|
// been made, the method will block until the two nodes appear in each other's
|
||||||
|
// peers list, or until the 15s timeout expires.
|
||||||
|
func (n *NetworkHarness) EnsureConnected(ctx context.Context, a, b *HarnessNode) error {
|
||||||
|
bobInfo, err := b.GetInfo(ctx, &lnrpc.GetInfoRequest{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
req := &lnrpc.ConnectPeerRequest{
|
||||||
|
Addr: &lnrpc.LightningAddress{
|
||||||
|
Pubkey: bobInfo.IdentityPubkey,
|
||||||
|
Host: b.cfg.P2PAddr(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = a.ConnectPeer(ctx, req)
|
||||||
|
switch {
|
||||||
|
|
||||||
|
// Request was successful, wait for both to display the connection.
|
||||||
|
case err == nil:
|
||||||
|
|
||||||
|
// If we already have pending connection, we will wait until bob appears
|
||||||
|
// in alice's peer list.
|
||||||
|
case strings.Contains(err.Error(), "connection attempt to ") &&
|
||||||
|
strings.Contains(err.Error(), " is pending"):
|
||||||
|
|
||||||
|
// If the two are already connected, we return early with no error.
|
||||||
|
case strings.Contains(err.Error(), "already connected to peer"):
|
||||||
|
return nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = WaitPredicate(func() bool {
|
||||||
|
// If node B is seen in the ListPeers response from node A,
|
||||||
|
// then we can exit early as the connection has been fully
|
||||||
|
// established.
|
||||||
|
resp, err := a.ListPeers(ctx, &lnrpc.ListPeersRequest{})
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, peer := range resp.Peers {
|
||||||
|
if peer.PubKey == b.PubKeyStr {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}, time.Second*15)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("peers not connected within 15 seconds")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ConnectNodes establishes an encrypted+authenticated p2p connection from node
|
// ConnectNodes establishes an encrypted+authenticated p2p connection from node
|
||||||
// a towards node b. The function will return a non-nil error if the connection
|
// a towards node b. The function will return a non-nil error if the connection
|
||||||
// was unable to be established.
|
// was unable to be established.
|
||||||
|
Loading…
Reference in New Issue
Block a user