lntemp+itest: refactir testUnconfirmedChannelFunding

This commit is contained in:
yyforyongyu
2022-08-04 01:35:18 +08:00
parent 6a42270ba6
commit 6a66f3984f
3 changed files with 37 additions and 26 deletions

View File

@@ -123,4 +123,8 @@ var allTestCasesTemp = []*lntemp.TestCase{
Name: "basic funding flow with all input types", Name: "basic funding flow with all input types",
TestFunc: testChannelFundingInputTypes, TestFunc: testChannelFundingInputTypes,
}, },
{
Name: "unconfirmed channel funding",
TestFunc: testUnconfirmedChannelFunding,
},
} }

View File

@@ -218,31 +218,27 @@ func basicChannelFundingTest(ht *lntemp.HarnessTest,
// testUnconfirmedChannelFunding tests that our unconfirmed change outputs can // testUnconfirmedChannelFunding tests that our unconfirmed change outputs can
// be used to fund channels. // be used to fund channels.
func testUnconfirmedChannelFunding(net *lntest.NetworkHarness, t *harnessTest) { func testUnconfirmedChannelFunding(ht *lntemp.HarnessTest) {
const ( const (
chanAmt = funding.MaxBtcFundingAmount chanAmt = funding.MaxBtcFundingAmount
pushAmt = btcutil.Amount(100000) pushAmt = btcutil.Amount(100000)
) )
// We'll start off by creating a node for Carol. // We'll start off by creating a node for Carol.
carol := net.NewNode(t.t, "Carol", nil) carol := ht.NewNode("Carol", nil)
defer shutdownAndAssert(net, t, carol)
// We'll send her some confirmed funds. alice := ht.Alice
net.SendCoinsUnconfirmed(t.t, chanAmt*2, carol)
// Make sure the unconfirmed tx is seen in the mempool. // We'll send her some unconfirmed funds.
_, err := waitForTxInMempool(net.Miner.Client, minerMempoolTimeout) ht.FundCoinsUnconfirmed(2*chanAmt, carol)
require.NoError(t.t, err, "failed to find tx in miner mempool")
// Now, we'll connect her to Alice so that they can open a channel // Now, we'll connect her to Alice so that they can open a channel
// together. The funding flow should select Carol's unconfirmed output // together. The funding flow should select Carol's unconfirmed output
// as she doesn't have any other funds since it's a new node. // as she doesn't have any other funds since it's a new node.
net.ConnectNodes(t.t, carol, net.Alice) ht.ConnectNodes(carol, alice)
chanOpenUpdate := openChannelStream( chanOpenUpdate := ht.OpenChannelAssertPending(
t, net, carol, net.Alice, carol, alice, lntemp.OpenChannelParams{
lntest.OpenChannelParams{
Amt: chanAmt, Amt: chanAmt,
PushAmt: pushAmt, PushAmt: pushAmt,
SpendUnconfirmed: true, SpendUnconfirmed: true,
@@ -251,7 +247,7 @@ func testUnconfirmedChannelFunding(net *lntest.NetworkHarness, t *harnessTest) {
// Creates a helper closure to be used below which asserts the proper // Creates a helper closure to be used below which asserts the proper
// response to a channel balance RPC. // response to a channel balance RPC.
checkChannelBalance := func(node *lntest.HarnessNode, checkChannelBalance := func(node *node.HarnessNode,
local, remote, pendingLocal, pendingRemote btcutil.Amount) { local, remote, pendingLocal, pendingRemote btcutil.Amount) {
expectedResponse := &lnrpc.ChannelBalanceResponse{ expectedResponse := &lnrpc.ChannelBalanceResponse{
@@ -285,7 +281,7 @@ func testUnconfirmedChannelFunding(net *lntest.NetworkHarness, t *harnessTest) {
Balance: int64(local), Balance: int64(local),
PendingOpenBalance: int64(pendingLocal), PendingOpenBalance: int64(pendingLocal),
} }
assertChannelBalanceResp(t, node, expectedResponse) ht.AssertChannelBalanceResp(node, expectedResponse)
} }
// As the channel is pending open, it's expected Carol has both zero // As the channel is pending open, it's expected Carol has both zero
@@ -300,22 +296,37 @@ func testUnconfirmedChannelFunding(net *lntest.NetworkHarness, t *harnessTest) {
// For Alice, her local/remote balances should be zero, and the // For Alice, her local/remote balances should be zero, and the
// local/remote balances are the mirror of Carol's. // local/remote balances are the mirror of Carol's.
checkChannelBalance(net.Alice, 0, 0, pushAmt, carolLocalBalance) checkChannelBalance(alice, 0, 0, pushAmt, carolLocalBalance)
// Confirm the channel and wait for it to be recognized by both // Confirm the channel and wait for it to be recognized by both
// parties. Two transactions should be mined, the unconfirmed spend and // parties. For neutrino backend, the funding transaction should be
// the funding tx. // mined. Otherwise, two transactions should be mined, the unconfirmed
mineBlocks(t, net, 6, 2) // spend and the funding tx.
chanPoint, err := net.WaitForChannelOpen(chanOpenUpdate) if ht.IsNeutrinoBackend() {
require.NoError(t.t, err, "error while waitinng for channel open") ht.MineBlocksAndAssertNumTxes(6, 1)
} else {
ht.MineBlocksAndAssertNumTxes(6, 2)
}
chanPoint := ht.WaitForChannelOpenEvent(chanOpenUpdate)
// With the channel open, we'll check the balances on each side of the // With the channel open, we'll check the balances on each side of the
// channel as a sanity check to ensure things worked out as intended. // channel as a sanity check to ensure things worked out as intended.
checkChannelBalance(carol, carolLocalBalance, pushAmt, 0, 0) checkChannelBalance(carol, carolLocalBalance, pushAmt, 0, 0)
checkChannelBalance(net.Alice, pushAmt, carolLocalBalance, 0, 0) checkChannelBalance(alice, pushAmt, carolLocalBalance, 0, 0)
// TODO(yy): remove the sleep once the following bug is fixed.
//
// We may get the error `unable to gracefully close channel while peer
// is offline (try force closing it instead): channel link not found`.
// This happens because the channel link hasn't been added yet but we
// now proceed to closing the channel. We may need to revisit how the
// channel open event is created and make sure the event is only sent
// after all relevant states have been updated.
time.Sleep(2 * time.Second)
// Now that we're done with the test, the channel can be closed. // Now that we're done with the test, the channel can be closed.
closeChannelAndAssert(t, net, carol, chanPoint, false) ht.CloseChannel(carol, chanPoint)
} }
// testChannelFundingInputTypes tests that any type of supported input type can // testChannelFundingInputTypes tests that any type of supported input type can

View File

@@ -4,10 +4,6 @@
package itest package itest
var allTestCases = []*testCase{ var allTestCases = []*testCase{
{
name: "unconfirmed channel funding",
test: testUnconfirmedChannelFunding,
},
{ {
name: "update channel policy", name: "update channel policy",
test: testUpdateChannelPolicy, test: testUpdateChannelPolicy,