lntest: make sure restored chans can't be closed
This commit is contained in:
2 files changed
+52
-2
No files matched your search
@@ -8,6 +8,8 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -18,6 +20,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/lnrpc"
|
"github.com/lightningnetwork/lnd/lnrpc"
|
||||||
"github.com/lightningnetwork/lnd/lntest"
|
"github.com/lightningnetwork/lnd/lntest"
|
||||||
"github.com/lightningnetwork/lnd/lntest/wait"
|
"github.com/lightningnetwork/lnd/lntest/wait"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
// testChannelBackupRestore tests that we're able to recover from, and initiate
|
// testChannelBackupRestore tests that we're able to recover from, and initiate
|
||||||
@@ -932,12 +935,15 @@ func testChanRestoreScenario(t *harnessTest, net *lntest.NetworkHarness,
|
|||||||
t.Fatalf("unable to prep node restoration: %v", err)
|
t.Fatalf("unable to prep node restoration: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(roasbeef): assert recovery state in channel
|
|
||||||
|
|
||||||
// Now that we're able to make our restored now, we'll shutdown the old
|
// Now that we're able to make our restored now, we'll shutdown the old
|
||||||
// Dave node as we'll be storing it shortly below.
|
// Dave node as we'll be storing it shortly below.
|
||||||
shutdownAndAssert(net, t, dave)
|
shutdownAndAssert(net, t, dave)
|
||||||
|
|
||||||
|
// To make sure the channel state is advanced correctly if the channel
|
||||||
|
// peer is not online at first, we also shutdown Carol.
|
||||||
|
restartCarol, err := net.SuspendNode(carol)
|
||||||
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
// Next, we'll make a new Dave and start the bulk of our recovery
|
// Next, we'll make a new Dave and start the bulk of our recovery
|
||||||
// workflow.
|
// workflow.
|
||||||
dave, err = restoredNodeFunc()
|
dave, err = restoredNodeFunc()
|
||||||
@@ -966,6 +972,49 @@ func testChanRestoreScenario(t *harnessTest, net *lntest.NetworkHarness,
|
|||||||
t.Fatalf("On-chain balance not restored: %v", err)
|
t.Fatalf("On-chain balance not restored: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We now check that the restored channel is in the proper state. It
|
||||||
|
// should not yet be force closing as no connection with the remote
|
||||||
|
// peer was established yet. We should also not be able to close the
|
||||||
|
// channel.
|
||||||
|
assertNumPendingChannels(t, dave, 1, 0)
|
||||||
|
ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
|
||||||
|
defer cancel()
|
||||||
|
pendingChanResp, err := dave.PendingChannels(
|
||||||
|
ctxt, &lnrpc.PendingChannelsRequest{},
|
||||||
|
)
|
||||||
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
|
// We also want to make sure we cannot force close in this state. That
|
||||||
|
// would get the state machine in a weird state.
|
||||||
|
chanPointParts := strings.Split(
|
||||||
|
pendingChanResp.WaitingCloseChannels[0].Channel.ChannelPoint,
|
||||||
|
":",
|
||||||
|
)
|
||||||
|
chanPointIndex, _ := strconv.ParseUint(chanPointParts[1], 10, 32)
|
||||||
|
resp, err := dave.CloseChannel(ctxt, &lnrpc.CloseChannelRequest{
|
||||||
|
ChannelPoint: &lnrpc.ChannelPoint{
|
||||||
|
FundingTxid: &lnrpc.ChannelPoint_FundingTxidStr{
|
||||||
|
FundingTxidStr: chanPointParts[0],
|
||||||
|
},
|
||||||
|
OutputIndex: uint32(chanPointIndex),
|
||||||
|
},
|
||||||
|
Force: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
// We don't get an error directly but only when reading the first
|
||||||
|
// message of the stream.
|
||||||
|
require.NoError(t.t, err)
|
||||||
|
_, err = resp.Recv()
|
||||||
|
require.Error(t.t, err)
|
||||||
|
require.Contains(t.t, err.Error(), "cannot close channel with state: ")
|
||||||
|
require.Contains(t.t, err.Error(), "ChanStatusRestored")
|
||||||
|
|
||||||
|
// Now that we have ensured that the channels restored by the backup are
|
||||||
|
// in the correct state even without the remote peer telling us so,
|
||||||
|
// let's start up Carol again.
|
||||||
|
err = restartCarol()
|
||||||
|
require.NoError(t.t, err)
|
||||||
|
|
||||||
// Now that we have our new node up, we expect that it'll re-connect to
|
// Now that we have our new node up, we expect that it'll re-connect to
|
||||||
// Carol automatically based on the restored backup.
|
// Carol automatically based on the restored backup.
|
||||||
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
|
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
|
||||||
|
|||||||
@@ -137,6 +137,7 @@
|
|||||||
<time> [ERR] RPCS: [/chainrpc.ChainNotifier/RegisterBlockEpochNtfn]: chain notifier shutting down
|
<time> [ERR] RPCS: [/chainrpc.ChainNotifier/RegisterBlockEpochNtfn]: chain notifier shutting down
|
||||||
<time> [ERR] RPCS: [/chainrpc.ChainNotifier/RegisterBlockEpochNtfn]: context canceled
|
<time> [ERR] RPCS: [/chainrpc.ChainNotifier/RegisterBlockEpochNtfn]: context canceled
|
||||||
<time> [ERR] RPCS: [/invoicesrpc.Invoices/SubscribeSingleInvoice]: rpc error: code = Canceled desc = context canceled
|
<time> [ERR] RPCS: [/invoicesrpc.Invoices/SubscribeSingleInvoice]: rpc error: code = Canceled desc = context canceled
|
||||||
|
<time> [ERR] RPCS: [/lnrpc.Lightning/CloseChannel]: cannot close channel with state: ChanStatusRestored
|
||||||
<time> [ERR] RPCS: [/lnrpc.Lightning/CloseChannel]: cannot co-op close frozen channel as initiator until height=<height>, (current_height=<height>)
|
<time> [ERR] RPCS: [/lnrpc.Lightning/CloseChannel]: cannot co-op close frozen channel as initiator until height=<height>, (current_height=<height>)
|
||||||
<time> [ERR] RPCS: [/lnrpc.Lightning/CloseChannel]: cannot co-op close frozen channel as initiator until height=3059, (current_height=3055)
|
<time> [ERR] RPCS: [/lnrpc.Lightning/CloseChannel]: cannot co-op close frozen channel as initiator until height=3059, (current_height=3055)
|
||||||
<time> [ERR] RPCS: [/lnrpc.Lightning/CloseChannel]: chain notifier shutting down
|
<time> [ERR] RPCS: [/lnrpc.Lightning/CloseChannel]: chain notifier shutting down
|
||||||
|
|||||||
Reference in new issue
Block a user