multi: move WaitPredicate, WaitNoError, WaitInvariant to lntest/wait

This commit is contained in:
Conner Fromknecht 2019-09-19 12:46:29 -07:00
parent 003441d7e9
commit 1d41d4d666
No known key found for this signature in database
GPG Key ID: E7D737B67FA592C7
12 changed files with 193 additions and 180 deletions

@ -29,7 +29,7 @@ import (
"github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/htlcswitch"
"github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/input"
"github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/keychain"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/shachain" "github.com/lightningnetwork/lnd/shachain"
@ -1537,7 +1537,7 @@ func assertBrarCleanup(t *testing.T, brar *breachArbiter,
t.Helper() t.Helper()
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
isBreached, err := brar.IsBreached(chanPoint) isBreached, err := brar.IsBreached(chanPoint)
if err != nil { if err != nil {
return err return err

@ -24,7 +24,7 @@ import (
"github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/chainntnfs"
"github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/channeldb"
"github.com/lightningnetwork/lnd/lnpeer" "github.com/lightningnetwork/lnd/lnpeer"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/routing" "github.com/lightningnetwork/lnd/routing"
"github.com/lightningnetwork/lnd/routing/route" "github.com/lightningnetwork/lnd/routing/route"
@ -3432,7 +3432,7 @@ func TestSendChannelUpdateReliably(t *testing.T) {
// Since the messages above are now deemed as stale, they should be // Since the messages above are now deemed as stale, they should be
// removed from the message store. // removed from the message store.
err = lntest.WaitNoError(func() error { err = wait.NoError(func() error {
msgs, err := ctx.gossiper.cfg.MessageStore.Messages() msgs, err := ctx.gossiper.cfg.MessageStore.Messages()
if err != nil { if err != nil {
return fmt.Errorf("unable to retrieve pending "+ return fmt.Errorf("unable to retrieve pending "+
@ -3491,7 +3491,7 @@ func assertBroadcastMsg(t *testing.T, ctx *testCtx,
// predicate returns true for any of the messages, so we'll continue to // predicate returns true for any of the messages, so we'll continue to
// retry until either we hit our timeout, or it returns with no error // retry until either we hit our timeout, or it returns with no error
// (message found). // (message found).
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
select { select {
case msg := <-ctx.broadcastedMessage: case msg := <-ctx.broadcastedMessage:
return predicate(msg.msg) return predicate(msg.msg)

@ -8,7 +8,7 @@ import (
"github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/btcec"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/lightningnetwork/lnd/lnpeer" "github.com/lightningnetwork/lnd/lnpeer"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
) )
@ -244,7 +244,7 @@ func TestReliableSenderStaleMessages(t *testing.T) {
// message store since it is seen as stale and has been sent at least // message store since it is seen as stale and has been sent at least
// once. Once the message is removed, the peerHandler should be torn // once. Once the message is removed, the peerHandler should be torn
// down as there are no longer any pending messages within the store. // down as there are no longer any pending messages within the store.
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
msgs, err := reliableSender.cfg.MessageStore.MessagesForPeer( msgs, err := reliableSender.cfg.MessageStore.MessagesForPeer(
peerPubKey, peerPubKey,
) )

@ -9,7 +9,7 @@ import (
"time" "time"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/ticker" "github.com/lightningnetwork/lnd/ticker"
) )
@ -504,7 +504,7 @@ func assertSyncerStatus(t *testing.T, s *GossipSyncer, syncState syncerState,
// We'll check the status of our syncer within a WaitPredicate as some // We'll check the status of our syncer within a WaitPredicate as some
// sync transitions might cause this to be racy. // sync transitions might cause this to be racy.
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
state := s.syncState() state := s.syncState()
if s.syncState() != syncState { if s.syncState() != syncState {
return fmt.Errorf("expected syncState %v for peer "+ return fmt.Errorf("expected syncState %v for peer "+
@ -545,7 +545,7 @@ func assertTransitionToChansSynced(t *testing.T, s *GossipSyncer, peer *mockPeer
t.Fatal("expected to receive FilterKnownChanIDs request") t.Fatal("expected to receive FilterKnownChanIDs request")
} }
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
state := syncerState(atomic.LoadUint32(&s.state)) state := syncerState(atomic.LoadUint32(&s.state))
if state != chansSynced { if state != chansSynced {
return fmt.Errorf("expected syncerState %v, got %v", return fmt.Errorf("expected syncerState %v, got %v",

@ -22,6 +22,7 @@ import (
"github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil" "github.com/btcsuite/btcutil"
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
) )
@ -493,7 +494,7 @@ func (n *NetworkHarness) EnsureConnected(ctx context.Context, a, b *HarnessNode)
return false return false
} }
err := WaitPredicate(func() bool { err := wait.Predicate(func() bool {
return findSelfInPeerList(a, b) && findSelfInPeerList(b, a) return findSelfInPeerList(a, b) && findSelfInPeerList(b, a)
}, time.Second*15) }, time.Second*15)
if err != nil { if err != nil {
@ -526,7 +527,7 @@ func (n *NetworkHarness) ConnectNodes(ctx context.Context, a, b *HarnessNode) er
return err return err
} }
err = WaitPredicate(func() bool { err = wait.Predicate(func() bool {
// If node B is seen in the ListPeers response from node A, // If node B is seen in the ListPeers response from node A,
// then we can exit early as the connection has been fully // then we can exit early as the connection has been fully
// established. // established.
@ -1068,12 +1069,12 @@ func (n *NetworkHarness) CloseChannel(ctx context.Context,
// Before proceeding, we'll ensure that the channel is active // Before proceeding, we'll ensure that the channel is active
// for both nodes. // for both nodes.
err = WaitPredicate(activeChanPredicate(lnNode), timeout) err = wait.Predicate(activeChanPredicate(lnNode), timeout)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("channel of closing " + return nil, nil, fmt.Errorf("channel of closing " +
"node not active in time") "node not active in time")
} }
err = WaitPredicate(activeChanPredicate(receivingNode), timeout) err = wait.Predicate(activeChanPredicate(receivingNode), timeout)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("channel of receiving " + return nil, nil, fmt.Errorf("channel of receiving " +
"node not active in time") "node not active in time")
@ -1194,85 +1195,13 @@ func (n *NetworkHarness) AssertChannelExists(ctx context.Context,
return false return false
} }
if err := WaitPredicate(pred, time.Second*15); err != nil { if err := wait.Predicate(pred, time.Second*15); err != nil {
return fmt.Errorf("channel not found: %v", predErr) return fmt.Errorf("channel not found: %v", predErr)
} }
return nil return nil
} }
// WaitPredicate is a helper test function that will wait for a timeout period
// of time until the passed predicate returns true. This function is helpful as
// timing doesn't always line up well when running integration tests with
// several running lnd nodes. This function gives callers a way to assert that
// some property is upheld within a particular time frame.
func WaitPredicate(pred func() bool, timeout time.Duration) error {
const pollInterval = 20 * time.Millisecond
exitTimer := time.After(timeout)
for {
<-time.After(pollInterval)
select {
case <-exitTimer:
return fmt.Errorf("predicate not satisfied after time out")
default:
}
if pred() {
return nil
}
}
}
// WaitNoError is a wrapper around WaitPredicate that waits for the passed
// method f to execute without error, and returns the last error encountered if
// this doesn't happen within the timeout.
func WaitNoError(f func() error, timeout time.Duration) error {
var predErr error
pred := func() bool {
if err := f(); err != nil {
predErr = err
return false
}
return true
}
// If f() doesn't succeed within the timeout, return the last
// encountered error.
if err := WaitPredicate(pred, timeout); err != nil {
return predErr
}
return nil
}
// WaitInvariant is a helper test function that will wait for a timeout period
// of time, verifying that a statement remains true for the entire duration.
// This function is helpful as timing doesn't always line up well when running
// integration tests with several running lnd nodes. This function gives callers
// a way to assert that some property is maintained over a particular time
// frame.
func WaitInvariant(statement func() bool, timeout time.Duration) error {
const pollInterval = 20 * time.Millisecond
exitTimer := time.After(timeout)
for {
<-time.After(pollInterval)
// Fail if the invariant is broken while polling.
if !statement() {
return fmt.Errorf("invariant broken before time out")
}
select {
case <-exitTimer:
return nil
default:
}
}
}
// DumpLogs reads the current logs generated by the passed node, and returns // DumpLogs reads the current logs generated by the passed node, and returns
// the logs as a single string. This function is useful for examining the logs // the logs as a single string. This function is useful for examining the logs
// of a particular node in the case of a test failure. // of a particular node in the case of a test failure.
@ -1373,7 +1302,7 @@ func (n *NetworkHarness) sendCoins(ctx context.Context, amt btcutil.Amount,
// Now, wait for ListUnspent to show the unconfirmed transaction // Now, wait for ListUnspent to show the unconfirmed transaction
// containing the correct pkscript. // containing the correct pkscript.
err = WaitNoError(func() error { err = wait.NoError(func() error {
// Since neutrino doesn't support unconfirmed outputs, skip // Since neutrino doesn't support unconfirmed outputs, skip
// this check. // this check.
if target.cfg.BackendCfg.Name() == "neutrino" { if target.cfg.BackendCfg.Name() == "neutrino" {

@ -13,6 +13,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/invoicesrpc" "github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest"
"github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
) )
@ -73,7 +74,7 @@ func testMultiHopHtlcLocalChainClaim(net *lntest.NetworkHarness, t *harnessTest)
// the created HTLC pending on all of them. // the created HTLC pending on all of them.
var predErr error var predErr error
nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol} nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertActiveHtlcs(nodes, payHash[:]) predErr = assertActiveHtlcs(nodes, payHash[:])
if predErr != nil { if predErr != nil {
return false return false
@ -229,7 +230,7 @@ func testMultiHopHtlcLocalChainClaim(net *lntest.NetworkHarness, t *harnessTest)
// At this point, Bob should have broadcast his second layer success // At this point, Bob should have broadcast his second layer success
// transaction, and should have sent it to the nursery for incubation. // transaction, and should have sent it to the nursery for incubation.
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -321,7 +322,7 @@ func testMultiHopHtlcLocalChainClaim(net *lntest.NetworkHarness, t *harnessTest)
block = mineBlocks(t, net, 1, 1)[0] block = mineBlocks(t, net, 1, 1)[0]
assertTxInBlock(t, block, bobSweep) assertTxInBlock(t, block, bobSweep)
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -357,7 +358,7 @@ func testMultiHopHtlcLocalChainClaim(net *lntest.NetworkHarness, t *harnessTest)
} }
// Also Carol should have no channels left (open nor pending). // Also Carol should have no channels left (open nor pending).
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := carol.PendingChannels( pendingChanResp, err := carol.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,

@ -14,6 +14,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/invoicesrpc" "github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest"
"github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
) )
@ -75,7 +76,7 @@ func testMultiHopReceiverChainClaim(net *lntest.NetworkHarness, t *harnessTest)
// the created HTLC pending on all of them. // the created HTLC pending on all of them.
var predErr error var predErr error
nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol} nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertActiveHtlcs(nodes, payHash[:]) predErr = assertActiveHtlcs(nodes, payHash[:])
if predErr != nil { if predErr != nil {
return false return false
@ -230,7 +231,7 @@ func testMultiHopReceiverChainClaim(net *lntest.NetworkHarness, t *harnessTest)
// extracted the preimage from the chain, and sent it back to Alice, // extracted the preimage from the chain, and sent it back to Alice,
// clearing the HTLC off-chain. // clearing the HTLC off-chain.
nodes = []*lntest.HarnessNode{net.Alice} nodes = []*lntest.HarnessNode{net.Alice}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, 0) predErr = assertNumActiveHtlcs(nodes, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -259,7 +260,7 @@ func testMultiHopReceiverChainClaim(net *lntest.NetworkHarness, t *harnessTest)
if _, err := net.Miner.Node.Generate(1); err != nil { if _, err := net.Miner.Node.Generate(1); err != nil {
t.Fatalf("unable to mine block: %v", err) t.Fatalf("unable to mine block: %v", err)
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err = carol.PendingChannels(ctxt, pendingChansRequest) pendingChanResp, err = carol.PendingChannels(ctxt, pendingChansRequest)
if err != nil { if err != nil {

@ -13,6 +13,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/invoicesrpc" "github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest"
"github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
) )
@ -72,7 +73,7 @@ func testMultiHopHtlcRemoteChainClaim(net *lntest.NetworkHarness, t *harnessTest
// the created HTLC pending on all of them. // the created HTLC pending on all of them.
var predErr error var predErr error
nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol} nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertActiveHtlcs(nodes, payHash[:]) predErr = assertActiveHtlcs(nodes, payHash[:])
if predErr != nil { if predErr != nil {
return false return false
@ -252,7 +253,7 @@ func testMultiHopHtlcRemoteChainClaim(net *lntest.NetworkHarness, t *harnessTest
// recognize that all contracts have been fully resolved, and show no // recognize that all contracts have been fully resolved, and show no
// pending close channels. // pending close channels.
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -291,7 +292,7 @@ func testMultiHopHtlcRemoteChainClaim(net *lntest.NetworkHarness, t *harnessTest
assertTxInBlock(t, block, carolSweep) assertTxInBlock(t, block, carolSweep)
pendingChansRequest = &lnrpc.PendingChannelsRequest{} pendingChansRequest = &lnrpc.PendingChannelsRequest{}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := carol.PendingChannels( pendingChanResp, err := carol.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,

@ -37,6 +37,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc" "github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc"
"github.com/lightningnetwork/lnd/lnrpc/wtclientrpc" "github.com/lightningnetwork/lnd/lnrpc/wtclientrpc"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest"
"github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/routing" "github.com/lightningnetwork/lnd/routing"
@ -366,7 +367,7 @@ func assertChannelClosed(ctx context.Context, t *harnessTest,
// Finally, the transaction should no longer be in the waiting close // Finally, the transaction should no longer be in the waiting close
// state as we've just mined a block that should include the closing // state as we've just mined a block that should include the closing
// transaction. // transaction.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
pendingChanResp, err := node.PendingChannels( pendingChanResp, err := node.PendingChannels(
ctx, pendingChansRequest, ctx, pendingChansRequest,
@ -406,7 +407,7 @@ func waitForChannelPendingForceClose(ctx context.Context,
} }
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
pendingChanResp, err := node.PendingChannels( pendingChanResp, err := node.PendingChannels(
ctx, pendingChansRequest, ctx, pendingChansRequest,
@ -480,7 +481,7 @@ func numOpenChannelsPending(ctxt context.Context, node *lntest.HarnessNode) (int
func assertNumOpenChannelsPending(ctxt context.Context, t *harnessTest, func assertNumOpenChannelsPending(ctxt context.Context, t *harnessTest,
alice, bob *lntest.HarnessNode, expected int) { alice, bob *lntest.HarnessNode, expected int) {
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
aliceNumChans, err := numOpenChannelsPending(ctxt, alice) aliceNumChans, err := numOpenChannelsPending(ctxt, alice)
if err != nil { if err != nil {
return fmt.Errorf("error fetching alice's node (%v) "+ return fmt.Errorf("error fetching alice's node (%v) "+
@ -643,7 +644,7 @@ func completePaymentRequests(ctx context.Context, client lnrpc.LightningClient,
// should still wait long enough for the server to receive and handle // should still wait long enough for the server to receive and handle
// the send before cancelling the request. We wait for the number of // the send before cancelling the request. We wait for the number of
// updates to one of our channels has increased before we return. // updates to one of our channels has increased before we return.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctx, defaultTimeout) ctxt, _ = context.WithTimeout(ctx, defaultTimeout)
newListResp, err := client.ListChannels(ctxt, req) newListResp, err := client.ListChannels(ctxt, req)
if err != nil { if err != nil {
@ -783,7 +784,7 @@ func testOnchainFundRecovery(net *lntest.NetworkHarness, t *harnessTest) {
currBalance int64 currBalance int64
currNumUTXOs uint32 currNumUTXOs uint32
) )
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
req := &lnrpc.WalletBalanceRequest{} req := &lnrpc.WalletBalanceRequest{}
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
resp, err := node.WalletBalance(ctxt, req) resp, err := node.WalletBalance(ctxt, req)
@ -1741,7 +1742,7 @@ func testUpdateChannelPolicy(net *lntest.NetworkHarness, t *harnessTest) {
func waitForNodeBlockHeight(ctx context.Context, node *lntest.HarnessNode, func waitForNodeBlockHeight(ctx context.Context, node *lntest.HarnessNode,
height int32) error { height int32) error {
var predErr error var predErr error
err := lntest.WaitPredicate(func() bool { err := wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctx, 10*time.Second) ctxt, _ := context.WithTimeout(ctx, 10*time.Second)
info, err := node.GetInfo(ctxt, &lnrpc.GetInfoRequest{}) info, err := node.GetInfo(ctxt, &lnrpc.GetInfoRequest{})
if err != nil { if err != nil {
@ -1769,7 +1770,7 @@ func assertMinerBlockHeightDelta(t *harnessTest,
// Ensure the chain lengths are what we expect. // Ensure the chain lengths are what we expect.
var predErr error var predErr error
err := lntest.WaitPredicate(func() bool { err := wait.Predicate(func() bool {
_, tempMinerHeight, err := tempMiner.Node.GetBestBlock() _, tempMinerHeight, err := tempMiner.Node.GetBestBlock()
if err != nil { if err != nil {
predErr = fmt.Errorf("unable to get current "+ predErr = fmt.Errorf("unable to get current "+
@ -2003,7 +2004,7 @@ func testOpenChannelAfterReorg(net *lntest.NetworkHarness, t *harnessTest) {
} }
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
chanGraph, err = net.Alice.DescribeGraph(ctxt, req) chanGraph, err = net.Alice.DescribeGraph(ctxt, req)
if err != nil { if err != nil {
@ -2132,7 +2133,7 @@ func testDisconnectingTargetPeer(net *lntest.NetworkHarness, t *harnessTest) {
// Disconnect Alice-peer from Bob-peer without getting error // Disconnect Alice-peer from Bob-peer without getting error
// about existing channels. // about existing channels.
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
if err := net.DisconnectNodes(ctxt, net.Alice, net.Bob); err != nil { if err := net.DisconnectNodes(ctxt, net.Alice, net.Bob); err != nil {
predErr = err predErr = err
return false return false
@ -2442,7 +2443,7 @@ func testChannelUnsettledBalance(net *lntest.NetworkHarness, t *harnessTest) {
// is equal to the amount of invoices * payAmt. // is equal to the amount of invoices * payAmt.
var unsettledErr error var unsettledErr error
nodes := []*lntest.HarnessNode{net.Alice, carol} nodes := []*lntest.HarnessNode{net.Alice, carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
// There should be a number of PendingHtlcs equal // There should be a number of PendingHtlcs equal
// to the amount of Invoices sent. // to the amount of Invoices sent.
unsettledErr = assertNumActiveHtlcs(nodes, numInvoices) unsettledErr = assertNumActiveHtlcs(nodes, numInvoices)
@ -2715,7 +2716,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// show that the HTLC has been locked in. // show that the HTLC has been locked in.
nodes := []*lntest.HarnessNode{net.Alice, carol} nodes := []*lntest.HarnessNode{net.Alice, carol}
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, numInvoices) predErr = assertNumActiveHtlcs(nodes, numInvoices)
if predErr != nil { if predErr != nil {
return false return false
@ -2818,7 +2819,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// Now that the commitment has been confirmed, the channel should be // Now that the commitment has been confirmed, the channel should be
// marked as force closed. // marked as force closed.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels( pendingChanResp, err := net.Alice.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -2902,7 +2903,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// Alice should see the channel in her set of pending force closed // Alice should see the channel in her set of pending force closed
// channels with her funds still in limbo. // channels with her funds still in limbo.
err = lntest.WaitNoError(func() error { err = wait.NoError(func() error {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels( pendingChanResp, err := net.Alice.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -3006,7 +3007,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("unable to get best block height") t.Fatalf("unable to get best block height")
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
// Now that the commit output has been fully swept, check to see // Now that the commit output has been fully swept, check to see
// that the channel remains open for the pending htlc outputs. // that the channel remains open for the pending htlc outputs.
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
@ -3079,7 +3080,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// Alice should now see the channel in her set of pending force closed // Alice should now see the channel in her set of pending force closed
// channels with one pending HTLC. // channels with one pending HTLC.
err = lntest.WaitNoError(func() error { err = wait.NoError(func() error {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels( pendingChanResp, err := net.Alice.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -3207,7 +3208,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// Now that the channel has been fully swept, it should no longer show // Now that the channel has been fully swept, it should no longer show
// incubated, check to see that Alice's node still reports the channel // incubated, check to see that Alice's node still reports the channel
// as pending force closed. // as pending force closed.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err = net.Alice.PendingChannels( pendingChanResp, err = net.Alice.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -3308,7 +3309,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// Now that the channel has been fully swept, it should no longer show // Now that the channel has been fully swept, it should no longer show
// incubated, check to see that Alice's node still reports the channel // incubated, check to see that Alice's node still reports the channel
// as pending force closed. // as pending force closed.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels( pendingChanResp, err := net.Alice.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -3357,7 +3358,7 @@ func testChannelForceClosure(net *lntest.NetworkHarness, t *harnessTest) {
// Now that the channel has been fully swept, it should no longer show // Now that the channel has been fully swept, it should no longer show
// up within the pending channels RPC. // up within the pending channels RPC.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels( pendingChanResp, err := net.Alice.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -4798,7 +4799,7 @@ func testUnannouncedChannels(net *lntest.NetworkHarness, t *harnessTest) {
// Give the network a chance to learn that auth proof is confirmed. // Give the network a chance to learn that auth proof is confirmed.
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
// The channel should now be announced. Check that Alice has 1 // The channel should now be announced. Check that Alice has 1
// announced edge. // announced edge.
req.IncludeUnannounced = false req.IncludeUnannounced = false
@ -5126,7 +5127,7 @@ func testPrivateChannels(net *lntest.NetworkHarness, t *harnessTest) {
} }
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
aliceChans := numChannels(net.Alice, true) aliceChans := numChannels(net.Alice, true)
if aliceChans != 4 { if aliceChans != 4 {
predErr = fmt.Errorf("expected Alice to know 4 edges, "+ predErr = fmt.Errorf("expected Alice to know 4 edges, "+
@ -5319,7 +5320,7 @@ func testInvoiceRoutingHints(net *lntest.NetworkHarness, t *harnessTest) {
// Alice and Bob should be the only channel used as a routing hint. // Alice and Bob should be the only channel used as a routing hint.
var predErr error var predErr error
var decoded *lnrpc.PayReq var decoded *lnrpc.PayReq
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
resp, err := net.Alice.AddInvoice(ctxt, invoice) resp, err := net.Alice.AddInvoice(ctxt, invoice)
if err != nil { if err != nil {
@ -6329,7 +6330,7 @@ func testFailingChannel(net *lntest.NetworkHarness, t *harnessTest) {
// Since Alice detects that Carol is trying to trick her by providing a // Since Alice detects that Carol is trying to trick her by providing a
// fake preimage, she should fail and force close the channel. // fake preimage, she should fail and force close the channel.
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels(ctxt, pendingChanResp, err := net.Alice.PendingChannels(ctxt,
@ -6359,7 +6360,7 @@ func testFailingChannel(net *lntest.NetworkHarness, t *harnessTest) {
// The channel should now show up as force closed both for Alice and // The channel should now show up as force closed both for Alice and
// Carol. // Carol.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels(ctxt, pendingChanResp, err := net.Alice.PendingChannels(ctxt,
@ -6387,7 +6388,7 @@ func testFailingChannel(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("%v", predErr) t.Fatalf("%v", predErr)
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := carol.PendingChannels(ctxt, pendingChanResp, err := carol.PendingChannels(ctxt,
@ -6435,7 +6436,7 @@ func testFailingChannel(net *lntest.NetworkHarness, t *harnessTest) {
} }
// No pending channels should be left. // No pending channels should be left.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels(ctxt, pendingChanResp, err := net.Alice.PendingChannels(ctxt,
@ -6545,13 +6546,13 @@ func testGarbageCollectLinkNodes(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("unable to restart carol's node: %v", err) t.Fatalf("unable to restart carol's node: %v", err)
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
return isConnected(net.Bob.PubKeyStr) return isConnected(net.Bob.PubKeyStr)
}, 15*time.Second) }, 15*time.Second)
if err != nil { if err != nil {
t.Fatalf("alice did not reconnect to bob") t.Fatalf("alice did not reconnect to bob")
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
return isConnected(carol.PubKeyStr) return isConnected(carol.PubKeyStr)
}, 15*time.Second) }, 15*time.Second)
if err != nil { if err != nil {
@ -6564,19 +6565,19 @@ func testGarbageCollectLinkNodes(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("unable to restart alice's node: %v", err) t.Fatalf("unable to restart alice's node: %v", err)
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
return isConnected(net.Bob.PubKeyStr) return isConnected(net.Bob.PubKeyStr)
}, 15*time.Second) }, 15*time.Second)
if err != nil { if err != nil {
t.Fatalf("alice did not reconnect to bob") t.Fatalf("alice did not reconnect to bob")
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
return isConnected(carol.PubKeyStr) return isConnected(carol.PubKeyStr)
}, 15*time.Second) }, 15*time.Second)
if err != nil { if err != nil {
t.Fatalf("alice did not reconnect to carol") t.Fatalf("alice did not reconnect to carol")
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
return isConnected(dave.PubKeyStr) return isConnected(dave.PubKeyStr)
}, 15*time.Second) }, 15*time.Second)
if err != nil { if err != nil {
@ -6604,7 +6605,7 @@ func testGarbageCollectLinkNodes(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("unable to restart %v's node: %v", node.Name(), t.Fatalf("unable to restart %v's node: %v", node.Name(),
err) err)
} }
err = lntest.WaitInvariant(func() bool { err = wait.Invariant(func() bool {
return !isConnected(node.PubKeyStr) return !isConnected(node.PubKeyStr)
}, 5*time.Second) }, 5*time.Second)
if err != nil { if err != nil {
@ -6614,14 +6615,14 @@ func testGarbageCollectLinkNodes(net *lntest.NetworkHarness, t *harnessTest) {
if err := net.RestartNode(net.Alice, nil); err != nil { if err := net.RestartNode(net.Alice, nil); err != nil {
t.Fatalf("unable to restart alice's node: %v", err) t.Fatalf("unable to restart alice's node: %v", err)
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
return isConnected(dave.PubKeyStr) return isConnected(dave.PubKeyStr)
}, 20*time.Second) }, 20*time.Second)
if err != nil { if err != nil {
t.Fatalf("alice didn't reconnect to Dave") t.Fatalf("alice didn't reconnect to Dave")
} }
err = lntest.WaitInvariant(func() bool { err = wait.Invariant(func() bool {
return !isConnected(node.PubKeyStr) return !isConnected(node.PubKeyStr)
}, 5*time.Second) }, 5*time.Second)
if err != nil { if err != nil {
@ -6656,7 +6657,7 @@ func testGarbageCollectLinkNodes(net *lntest.NetworkHarness, t *harnessTest) {
// fully cleaned up for both Carol and Alice. // fully cleaned up for both Carol and Alice.
var predErr error var predErr error
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Alice.PendingChannels( pendingChanResp, err := net.Alice.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -6801,7 +6802,7 @@ func testRevokedCloseRetribution(net *lntest.NetworkHarness, t *harnessTest) {
// satoshis each, Bob should now see his balance as being 30k satoshis. // satoshis each, Bob should now see his balance as being 30k satoshis.
var bobChan *lnrpc.Channel var bobChan *lnrpc.Channel
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
bChan, err := getChanInfo(ctxt, net.Bob) bChan, err := getChanInfo(ctxt, net.Bob)
if err != nil { if err != nil {
@ -6884,7 +6885,7 @@ func testRevokedCloseRetribution(net *lntest.NetworkHarness, t *harnessTest) {
// feel the wrath of Carol's retribution. // feel the wrath of Carol's retribution.
var closeUpdates lnrpc.Lightning_CloseChannelClient var closeUpdates lnrpc.Lightning_CloseChannelClient
force := true force := true
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctxb, channelCloseTimeout) ctxt, _ := context.WithTimeout(ctxb, channelCloseTimeout)
closeUpdates, _, err = net.CloseChannel(ctxt, net.Bob, chanPoint, force) closeUpdates, _, err = net.CloseChannel(ctxt, net.Bob, chanPoint, force)
if err != nil { if err != nil {
@ -7129,7 +7130,7 @@ func testRevokedCloseRetributionZeroValueRemoteOutput(net *lntest.NetworkHarness
closeErr error closeErr error
force bool = true force bool = true
) )
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctxb, channelCloseTimeout) ctxt, _ := context.WithTimeout(ctxb, channelCloseTimeout)
closeUpdates, closeTxId, closeErr = net.CloseChannel( closeUpdates, closeTxId, closeErr = net.CloseChannel(
ctxt, carol, chanPoint, force, ctxt, carol, chanPoint, force,
@ -7532,7 +7533,7 @@ func testRevokedCloseRetributionRemoteHodl(net *lntest.NetworkHarness,
return nil, errNotFound return nil, errNotFound
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
txid, err := findJusticeTx() txid, err := findJusticeTx()
if err != nil { if err != nil {
predErr = err predErr = err
@ -7552,7 +7553,7 @@ func testRevokedCloseRetributionRemoteHodl(net *lntest.NetworkHarness,
// as the last argument, indicating we don't care what's in the // as the last argument, indicating we don't care what's in the
// mempool. // mempool.
mineBlocks(t, net, 1, 0) mineBlocks(t, net, 1, 0)
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
txid, err := findJusticeTx() txid, err := findJusticeTx()
if err != nil { if err != nil {
predErr = err predErr = err
@ -7938,7 +7939,7 @@ func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
// Ensure that Willy doesn't get any funds, as he is acting as an // Ensure that Willy doesn't get any funds, as he is acting as an
// altruist watchtower. // altruist watchtower.
var predErr error var predErr error
err = lntest.WaitInvariant(func() bool { err = wait.Invariant(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
willyBalReq := &lnrpc.WalletBalanceRequest{} willyBalReq := &lnrpc.WalletBalanceRequest{}
willyBalResp, err := willy.WalletBalance(ctxt, willyBalReq) willyBalResp, err := willy.WalletBalance(ctxt, willyBalReq)
@ -7967,7 +7968,7 @@ func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
t.Fatalf("unable to restart dave: %v", err) t.Fatalf("unable to restart dave: %v", err)
} }
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
daveBalReq := &lnrpc.ChannelBalanceRequest{} daveBalReq := &lnrpc.ChannelBalanceRequest{}
daveBalResp, err := dave.ChannelBalance(ctxt, daveBalReq) daveBalResp, err := dave.ChannelBalance(ctxt, daveBalReq)
@ -7990,7 +7991,7 @@ func testRevokedCloseRetributionAltruistWatchtower(net *lntest.NetworkHarness,
assertNumPendingChannels(t, dave, 0, 0) assertNumPendingChannels(t, dave, 0, 0)
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
daveBalReq := &lnrpc.WalletBalanceRequest{} daveBalReq := &lnrpc.WalletBalanceRequest{}
daveBalResp, err := dave.WalletBalance(ctxt, daveBalReq) daveBalResp, err := dave.WalletBalance(ctxt, daveBalReq)
@ -8023,7 +8024,7 @@ func assertNumPendingChannels(t *harnessTest, node *lntest.HarnessNode,
ctxb := context.Background() ctxb := context.Background()
var predErr error var predErr error
err := lntest.WaitPredicate(func() bool { err := wait.Predicate(func() bool {
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := node.PendingChannels(ctxt, pendingChanResp, err := node.PendingChannels(ctxt,
@ -8256,7 +8257,7 @@ func testDataLossProtection(net *lntest.NetworkHarness, t *harnessTest) {
// as being 30k satoshis. // as being 30k satoshis.
var nodeChan *lnrpc.Channel var nodeChan *lnrpc.Channel
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
bChan, err := getChanInfo(ctxt, node) bChan, err := getChanInfo(ctxt, node)
if err != nil { if err != nil {
@ -8455,7 +8456,7 @@ func testDataLossProtection(net *lntest.NetworkHarness, t *harnessTest) {
mineBlocks(t, net, 1, 1) mineBlocks(t, net, 1, 1)
assertNodeNumChannels(t, dave, 0) assertNodeNumChannels(t, dave, 0)
err = lntest.WaitNoError(func() error { err = wait.NoError(func() error {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
daveBalResp, err := dave.WalletBalance(ctxt, balReq) daveBalResp, err := dave.WalletBalance(ctxt, balReq)
if err != nil { if err != nil {
@ -8507,7 +8508,7 @@ func assertNodeNumChannels(t *harnessTest, node *lntest.HarnessNode,
return true return true
} }
if err := lntest.WaitPredicate(pred, time.Second*15); err != nil { if err := wait.Predicate(pred, time.Second*15); err != nil {
t.Fatalf("node has incorrect number of channels: %v", predErr) t.Fatalf("node has incorrect number of channels: %v", predErr)
} }
} }
@ -9591,7 +9592,7 @@ func testAsyncPayments(net *lntest.NetworkHarness, t *harnessTest) {
// Wait for the revocation to be received so alice no longer has pending // Wait for the revocation to be received so alice no longer has pending
// htlcs listed and has correct balances. This is needed due to the fact // htlcs listed and has correct balances. This is needed due to the fact
// that we now pipeline the settles. // that we now pipeline the settles.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
aliceChan, err := getChanInfo(ctxt, net.Alice) aliceChan, err := getChanInfo(ctxt, net.Alice)
if err != nil { if err != nil {
@ -10124,7 +10125,7 @@ func testMultiHopHtlcLocalTimeout(net *lntest.NetworkHarness, t *harnessTest) {
// proper parameters. // proper parameters.
var predErr error var predErr error
nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol} nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertActiveHtlcs(nodes, dustPayHash, payHash) predErr = assertActiveHtlcs(nodes, dustPayHash, payHash)
if predErr != nil { if predErr != nil {
return false return false
@ -10170,7 +10171,7 @@ func testMultiHopHtlcLocalTimeout(net *lntest.NetworkHarness, t *harnessTest) {
// that we sent earlier. This means Alice should now only have a single // that we sent earlier. This means Alice should now only have a single
// HTLC on her channel. // HTLC on her channel.
nodes = []*lntest.HarnessNode{net.Alice} nodes = []*lntest.HarnessNode{net.Alice}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertActiveHtlcs(nodes, payHash) predErr = assertActiveHtlcs(nodes, payHash)
if predErr != nil { if predErr != nil {
return false return false
@ -10236,7 +10237,7 @@ func testMultiHopHtlcLocalTimeout(net *lntest.NetworkHarness, t *harnessTest) {
// Therefore, at this point, there should be no active HTLC's on the // Therefore, at this point, there should be no active HTLC's on the
// commitment transaction from Alice -> Bob. // commitment transaction from Alice -> Bob.
nodes = []*lntest.HarnessNode{net.Alice} nodes = []*lntest.HarnessNode{net.Alice}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, 0) predErr = assertNumActiveHtlcs(nodes, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -10267,7 +10268,7 @@ func testMultiHopHtlcLocalTimeout(net *lntest.NetworkHarness, t *harnessTest) {
// Once this transaction has been confirmed, Bob should detect that he // Once this transaction has been confirmed, Bob should detect that he
// no longer has any pending channels. // no longer has any pending channels.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err = net.Bob.PendingChannels(ctxt, pendingChansRequest) pendingChanResp, err = net.Bob.PendingChannels(ctxt, pendingChansRequest)
if err != nil { if err != nil {
@ -10343,7 +10344,7 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// have the it locked in. // have the it locked in.
var predErr error var predErr error
nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol} nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertActiveHtlcs(nodes, payHash) predErr = assertActiveHtlcs(nodes, payHash)
if predErr != nil { if predErr != nil {
return false return false
@ -10364,7 +10365,7 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// At this point, Bob should have a pending force close channel as he // At this point, Bob should have a pending force close channel as he
// just went to chain. // just went to chain.
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels(ctxt, pendingChanResp, err := net.Bob.PendingChannels(ctxt,
pendingChansRequest) pendingChansRequest)
@ -10413,7 +10414,7 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// Bob's pending channel report should show that he has a single HTLC // Bob's pending channel report should show that he has a single HTLC
// that's now in stage one. // that's now in stage one.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -10463,7 +10464,7 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// With the second layer timeout transaction confirmed, Bob should have // With the second layer timeout transaction confirmed, Bob should have
// cancelled backwards the HTLC that carol sent. // cancelled backwards the HTLC that carol sent.
nodes = []*lntest.HarnessNode{net.Alice} nodes = []*lntest.HarnessNode{net.Alice}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, 0) predErr = assertNumActiveHtlcs(nodes, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -10476,7 +10477,7 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// Additionally, Bob should now show that HTLC as being advanced to the // Additionally, Bob should now show that HTLC as being advanced to the
// second stage. // second stage.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -10530,7 +10531,7 @@ func testMultiHopLocalForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// At this point, Bob should no longer show any channels as pending // At this point, Bob should no longer show any channels as pending
// close. // close.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -10607,7 +10608,7 @@ func testMultiHopRemoteForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// show that the HTLC has been locked in. // show that the HTLC has been locked in.
var predErr error var predErr error
nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol} nodes := []*lntest.HarnessNode{net.Alice, net.Bob, carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertActiveHtlcs(nodes, payHash) predErr = assertActiveHtlcs(nodes, payHash)
if predErr != nil { if predErr != nil {
return false return false
@ -10628,7 +10629,7 @@ func testMultiHopRemoteForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// At this point, Bob should have a pending force close channel as // At this point, Bob should have a pending force close channel as
// Carol has gone directly to chain. // Carol has gone directly to chain.
pendingChansRequest := &lnrpc.PendingChannelsRequest{} pendingChansRequest := &lnrpc.PendingChannelsRequest{}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -10668,7 +10669,7 @@ func testMultiHopRemoteForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// If we check Bob's pending channel report, it should show that he has // If we check Bob's pending channel report, it should show that he has
// a single HTLC that's now in the second stage, as skip the initial // a single HTLC that's now in the second stage, as skip the initial
// first stage since this is a direct HTLC. // first stage since this is a direct HTLC.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -10734,7 +10735,7 @@ func testMultiHopRemoteForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// cancel back that HTLC. As a result, Alice should not know of any // cancel back that HTLC. As a result, Alice should not know of any
// active HTLC's. // active HTLC's.
nodes = []*lntest.HarnessNode{net.Alice} nodes = []*lntest.HarnessNode{net.Alice}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, 0) predErr = assertNumActiveHtlcs(nodes, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -10748,7 +10749,7 @@ func testMultiHopRemoteForceCloseOnChainHtlcTimeout(net *lntest.NetworkHarness,
// Now we'll check Bob's pending channel report. Since this was Carol's // Now we'll check Bob's pending channel report. Since this was Carol's
// commitment, he doesn't have to wait for any CSV delays. As a result, // commitment, he doesn't have to wait for any CSV delays. As a result,
// he should show no additional pending transactions. // he should show no additional pending transactions.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
pendingChanResp, err := net.Bob.PendingChannels( pendingChanResp, err := net.Bob.PendingChannels(
ctxt, pendingChansRequest, ctxt, pendingChansRequest,
@ -10952,7 +10953,7 @@ func testSwitchCircuitPersistence(net *lntest.NetworkHarness, t *harnessTest) {
// Wait until all nodes in the network have 5 outstanding htlcs. // Wait until all nodes in the network have 5 outstanding htlcs.
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, numPayments) predErr = assertNumActiveHtlcs(nodes, numPayments)
if predErr != nil { if predErr != nil {
return false return false
@ -10990,7 +10991,7 @@ func testSwitchCircuitPersistence(net *lntest.NetworkHarness, t *harnessTest) {
} }
// Ensure all nodes in the network still have 5 outstanding htlcs. // Ensure all nodes in the network still have 5 outstanding htlcs.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, numPayments) predErr = assertNumActiveHtlcs(nodes, numPayments)
if predErr != nil { if predErr != nil {
return false return false
@ -11017,7 +11018,7 @@ func testSwitchCircuitPersistence(net *lntest.NetworkHarness, t *harnessTest) {
// After the payments settle, there should be no active htlcs on any of // After the payments settle, there should be no active htlcs on any of
// the nodes in the network. // the nodes in the network.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, 0) predErr = assertNumActiveHtlcs(nodes, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -11275,7 +11276,7 @@ func testSwitchOfflineDelivery(net *lntest.NetworkHarness, t *harnessTest) {
// Wait for all of the payments to reach Carol. // Wait for all of the payments to reach Carol.
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, numPayments) predErr = assertNumActiveHtlcs(nodes, numPayments)
if predErr != nil { if predErr != nil {
return false return false
@ -11301,7 +11302,7 @@ func testSwitchOfflineDelivery(net *lntest.NetworkHarness, t *harnessTest) {
// Wait to ensure that the payment remain are not failed back after // Wait to ensure that the payment remain are not failed back after
// reconnecting. All node should report the number payments initiated // reconnecting. All node should report the number payments initiated
// for the duration of the interval. // for the duration of the interval.
err = lntest.WaitInvariant(func() bool { err = wait.Invariant(func() bool {
predErr = assertNumActiveHtlcs(nodes, numPayments) predErr = assertNumActiveHtlcs(nodes, numPayments)
if predErr != nil { if predErr != nil {
return false return false
@ -11328,7 +11329,7 @@ func testSwitchOfflineDelivery(net *lntest.NetworkHarness, t *harnessTest) {
// Wait for Carol to report no outstanding htlcs. // Wait for Carol to report no outstanding htlcs.
carolNode := []*lntest.HarnessNode{carol} carolNode := []*lntest.HarnessNode{carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(carolNode, 0) predErr = assertNumActiveHtlcs(carolNode, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -11347,7 +11348,7 @@ func testSwitchOfflineDelivery(net *lntest.NetworkHarness, t *harnessTest) {
} }
// Wait until all outstanding htlcs in the network have been settled. // Wait until all outstanding htlcs in the network have been settled.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, 0) predErr = assertNumActiveHtlcs(nodes, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -11603,7 +11604,7 @@ func testSwitchOfflineDeliveryPersistence(net *lntest.NetworkHarness, t *harness
} }
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, numPayments) predErr = assertNumActiveHtlcs(nodes, numPayments)
if predErr != nil { if predErr != nil {
return false return false
@ -11640,7 +11641,7 @@ func testSwitchOfflineDeliveryPersistence(net *lntest.NetworkHarness, t *harness
// Wait for Carol to report no outstanding htlcs, and also for Dav to // Wait for Carol to report no outstanding htlcs, and also for Dav to
// receive all the settles from Carol. // receive all the settles from Carol.
carolNode := []*lntest.HarnessNode{carol} carolNode := []*lntest.HarnessNode{carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(carolNode, 0) predErr = assertNumActiveHtlcs(carolNode, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -11675,7 +11676,7 @@ func testSwitchOfflineDeliveryPersistence(net *lntest.NetworkHarness, t *harness
// After reconnection succeeds, the settles should be propagated all // After reconnection succeeds, the settles should be propagated all
// the way back to the sender. All nodes should report no active htlcs. // the way back to the sender. All nodes should report no active htlcs.
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, 0) predErr = assertNumActiveHtlcs(nodes, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -11938,7 +11939,7 @@ func testSwitchOfflineDeliveryOutgoingOffline(
// Wait for all payments to reach Carol. // Wait for all payments to reach Carol.
var predErr error var predErr error
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodes, numPayments) predErr = assertNumActiveHtlcs(nodes, numPayments)
if predErr != nil { if predErr != nil {
return false return false
@ -11965,7 +11966,7 @@ func testSwitchOfflineDeliveryOutgoingOffline(
// Wait for Carol to report no outstanding htlcs. // Wait for Carol to report no outstanding htlcs.
carolNode := []*lntest.HarnessNode{carol} carolNode := []*lntest.HarnessNode{carol}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(carolNode, 0) predErr = assertNumActiveHtlcs(carolNode, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -12016,7 +12017,7 @@ func testSwitchOfflineDeliveryOutgoingOffline(
// Since Carol has been shutdown permanently, we will wait until all // Since Carol has been shutdown permanently, we will wait until all
// other nodes in the network report no active htlcs. // other nodes in the network report no active htlcs.
nodesMinusCarol := []*lntest.HarnessNode{net.Bob, net.Alice, dave} nodesMinusCarol := []*lntest.HarnessNode{net.Bob, net.Alice, dave}
err = lntest.WaitPredicate(func() bool { err = wait.Predicate(func() bool {
predErr = assertNumActiveHtlcs(nodesMinusCarol, 0) predErr = assertNumActiveHtlcs(nodesMinusCarol, 0)
if predErr != nil { if predErr != nil {
return false return false
@ -13110,7 +13111,7 @@ func testChannelBackupUpdates(net *lntest.NetworkHarness, t *harnessTest) {
// assertBackupFileState is a helper function that we'll use to compare // assertBackupFileState is a helper function that we'll use to compare
// the on disk back up file to our currentBackup pointer above. // the on disk back up file to our currentBackup pointer above.
assertBackupFileState := func() { assertBackupFileState := func() {
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
packedBackup, err := ioutil.ReadFile(backupFilePath) packedBackup, err := ioutil.ReadFile(backupFilePath)
if err != nil { if err != nil {
return fmt.Errorf("unable to read backup "+ return fmt.Errorf("unable to read backup "+
@ -13254,7 +13255,7 @@ func testExportChannelBackup(net *lntest.NetworkHarness, t *harnessTest) {
// Before we proceed, we'll make two utility methods we'll use below // Before we proceed, we'll make two utility methods we'll use below
// for our primary assertions. // for our primary assertions.
assertNumSingleBackups := func(numSingles int) { assertNumSingleBackups := func(numSingles int) {
err := lntest.WaitNoError(func() error { err := wait.NoError(func() error {
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
req := &lnrpc.ChanBackupExportRequest{} req := &lnrpc.ChanBackupExportRequest{}
chanSnapshot, err := carol.ExportAllChannelBackups( chanSnapshot, err := carol.ExportAllChannelBackups(
@ -13896,7 +13897,7 @@ func testHoldInvoicePersistence(net *lntest.NetworkHarness, t *harnessTest) {
// The payments should now show up in Alice's ListInvoices, with a zero // The payments should now show up in Alice's ListInvoices, with a zero
// preimage, indicating they are not yet settled. // preimage, indicating they are not yet settled.
err = lntest.WaitNoError(func() error { err = wait.NoError(func() error {
req := &lnrpc.ListPaymentsRequest{ req := &lnrpc.ListPaymentsRequest{
IncludeIncomplete: true, IncludeIncomplete: true,
} }

@ -12,6 +12,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/walletrpc" "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
"github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest"
"github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/sweep" "github.com/lightningnetwork/lnd/sweep"
) )
@ -140,7 +141,7 @@ func testCPFP(net *lntest.NetworkHarness, t *harnessTest) {
mineBlocks(t, net, 1, 2) mineBlocks(t, net, 1, 2)
// The input used to CPFP should no longer be pending. // The input used to CPFP should no longer be pending.
err = lntest.WaitNoError(func() error { err = wait.NoError(func() error {
req := &walletrpc.PendingSweepsRequest{} req := &walletrpc.PendingSweepsRequest{}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
resp, err := net.Bob.WalletKitClient.PendingSweeps(ctxt, req) resp, err := net.Bob.WalletKitClient.PendingSweeps(ctxt, req)

@ -27,6 +27,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc/walletrpc" "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
"github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc" "github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc"
"github.com/lightningnetwork/lnd/lnrpc/wtclientrpc" "github.com/lightningnetwork/lnd/lnrpc/wtclientrpc"
"github.com/lightningnetwork/lnd/lntest/wait"
"github.com/lightningnetwork/lnd/macaroons" "github.com/lightningnetwork/lnd/macaroons"
"golang.org/x/net/context" "golang.org/x/net/context"
"google.golang.org/grpc" "google.golang.org/grpc"
@ -468,7 +469,7 @@ func (hn *HarnessNode) initClientWhenReady() error {
conn *grpc.ClientConn conn *grpc.ClientConn
connErr error connErr error
) )
if err := WaitNoError(func() error { if err := wait.NoError(func() error {
conn, connErr = hn.ConnectRPC(true) conn, connErr = hn.ConnectRPC(true)
return connErr return connErr
}, 5*time.Second); err != nil { }, 5*time.Second); err != nil {
@ -543,7 +544,7 @@ func (hn *HarnessNode) initLightningClient(conn *grpc.ClientConn) error {
// until then, we'll create a dummy subscription to ensure we can do so // until then, we'll create a dummy subscription to ensure we can do so
// successfully before proceeding. We use a dummy subscription in order // successfully before proceeding. We use a dummy subscription in order
// to not consume an update from the real one. // to not consume an update from the real one.
err = WaitNoError(func() error { err = wait.NoError(func() error {
req := &lnrpc.GraphTopologySubscription{} req := &lnrpc.GraphTopologySubscription{}
ctx, cancelFunc := context.WithCancel(context.Background()) ctx, cancelFunc := context.WithCancel(context.Background())
topologyClient, err := hn.SubscribeChannelGraph(ctx, req) topologyClient, err := hn.SubscribeChannelGraph(ctx, req)
@ -1064,7 +1065,7 @@ func (hn *HarnessNode) WaitForBalance(expectedBalance btcutil.Amount, confirmed
return btcutil.Amount(balance.UnconfirmedBalance) == expectedBalance return btcutil.Amount(balance.UnconfirmedBalance) == expectedBalance
} }
err := WaitPredicate(doesBalanceMatch, 30*time.Second) err := wait.Predicate(doesBalanceMatch, 30*time.Second)
if err != nil { if err != nil {
return fmt.Errorf("balances not synced after deadline: "+ return fmt.Errorf("balances not synced after deadline: "+
"expected %v, only have %v", expectedBalance, lastBalance) "expected %v, only have %v", expectedBalance, lastBalance)

78
lntest/wait/wait.go Normal file

@ -0,0 +1,78 @@
package wait
import (
"fmt"
"time"
)
// Predicate is a helper test function that will wait for a timeout period of
// time until the passed predicate returns true. This function is helpful as
// timing doesn't always line up well when running integration tests with
// several running lnd nodes. This function gives callers a way to assert that
// some property is upheld within a particular time frame.
func Predicate(pred func() bool, timeout time.Duration) error {
const pollInterval = 20 * time.Millisecond
exitTimer := time.After(timeout)
for {
<-time.After(pollInterval)
select {
case <-exitTimer:
return fmt.Errorf("predicate not satisfied after time out")
default:
}
if pred() {
return nil
}
}
}
// NoError is a wrapper around Predicate that waits for the passed method f to
// execute without error, and returns the last error encountered if this doesn't
// happen within the timeout.
func NoError(f func() error, timeout time.Duration) error {
var predErr error
pred := func() bool {
if err := f(); err != nil {
predErr = err
return false
}
return true
}
// If f() doesn't succeed within the timeout, return the last
// encountered error.
if err := Predicate(pred, timeout); err != nil {
return predErr
}
return nil
}
// Invariant is a helper test function that will wait for a timeout period of
// time, verifying that a statement remains true for the entire duration. This
// function is helpful as timing doesn't always line up well when running
// integration tests with several running lnd nodes. This function gives callers
// a way to assert that some property is maintained over a particular time
// frame.
func Invariant(statement func() bool, timeout time.Duration) error {
const pollInterval = 20 * time.Millisecond
exitTimer := time.After(timeout)
for {
<-time.After(pollInterval)
// Fail if the invariant is broken while polling.
if !statement() {
return fmt.Errorf("invariant broken before time out")
}
select {
case <-exitTimer:
return nil
default:
}
}
}