From 309ba1fcf4e396b509ab486d6522bc19c0203599 Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Thu, 11 Aug 2022 12:37:39 +0800 Subject: [PATCH] lntemp+itest: refactor `testCPFP` --- lntest/itest/list_on_test.go | 4 + lntest/itest/lnd_onchain_test.go | 122 ++++++++------------------ lntest/itest/lnd_test_list_on_test.go | 4 - 3 files changed, 39 insertions(+), 91 deletions(-) diff --git a/lntest/itest/list_on_test.go b/lntest/itest/list_on_test.go index 674cd96b8..c0a644aea 100644 --- a/lntest/itest/list_on_test.go +++ b/lntest/itest/list_on_test.go @@ -453,4 +453,8 @@ var allTestCasesTemp = []*lntemp.TestCase{ Name: "sign verify message", TestFunc: testSignVerifyMessage, }, + { + Name: "cpfp", + TestFunc: testCPFP, + }, } diff --git a/lntest/itest/lnd_onchain_test.go b/lntest/itest/lnd_onchain_test.go index a2d024aa6..2b6b3200e 100644 --- a/lntest/itest/lnd_onchain_test.go +++ b/lntest/itest/lnd_onchain_test.go @@ -2,7 +2,6 @@ package itest import ( "bytes" - "context" "fmt" "github.com/btcsuite/btcd/btcutil" @@ -14,7 +13,6 @@ import ( "github.com/lightningnetwork/lnd/lnrpc/walletrpc" "github.com/lightningnetwork/lnd/lntemp" "github.com/lightningnetwork/lnd/lntemp/node" - "github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/lntest/wait" "github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/sweep" @@ -80,35 +78,28 @@ func testChainKitGetBlockHash(ht *lntemp.HarnessTest) { // rate by broadcasting a Child-Pays-For-Parent (CPFP) transaction. // // TODO(wilmer): Add RBF case once btcd supports it. -func testCPFP(net *lntest.NetworkHarness, t *harnessTest) { - runCPFP(net, t, net.Alice, net.Bob) +func testCPFP(ht *lntemp.HarnessTest) { + runCPFP(ht, ht.Alice, ht.Bob) } // runCPFP ensures that the daemon can bump an unconfirmed transaction's fee // rate by broadcasting a Child-Pays-For-Parent (CPFP) transaction. -func runCPFP(net *lntest.NetworkHarness, t *harnessTest, - alice, bob *lntest.HarnessNode) { - +func runCPFP(ht *lntemp.HarnessTest, alice, bob *node.HarnessNode) { // Skip this test for neutrino, as it's not aware of mempool // transactions. - if net.BackendCfg.Name() == lntest.NeutrinoBackendName { - t.Skipf("skipping CPFP test for neutrino backend") + if ht.IsNeutrinoBackend() { + ht.Skipf("skipping CPFP test for neutrino backend") } - // We'll start the test by sending Alice some coins, which she'll use to - // send to Bob. - ctxb := context.Background() - net.SendCoins(t.t, btcutil.SatoshiPerBitcoin, alice) + // We'll start the test by sending Alice some coins, which she'll use + // to send to Bob. + ht.FundCoins(btcutil.SatoshiPerBitcoin, alice) // Create an address for Bob to send the coins to. - addrReq := &lnrpc.NewAddressRequest{ + req := &lnrpc.NewAddressRequest{ Type: lnrpc.AddressType_WITNESS_PUBKEY_HASH, } - ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) - resp, err := bob.NewAddress(ctxt, addrReq) - if err != nil { - t.Fatalf("unable to get new address for bob: %v", err) - } + resp := bob.RPC.NewAddress(req) // Send the coins from Alice to Bob. We should expect a transaction to // be broadcast and seen in the mempool. @@ -116,46 +107,33 @@ func runCPFP(net *lntest.NetworkHarness, t *harnessTest, Addr: resp.Address, Amount: btcutil.SatoshiPerBitcoin, } - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - if _, err = alice.SendCoins(ctxt, sendReq); err != nil { - t.Fatalf("unable to send coins to bob: %v", err) - } - - txid, err := waitForTxInMempool(net.Miner.Client, minerMempoolTimeout) - if err != nil { - t.Fatalf("expected one mempool transaction: %v", err) - } + alice.RPC.SendCoins(sendReq) + txid := ht.Miner.AssertNumTxsInMempool(1)[0] // We'll then extract the raw transaction from the mempool in order to // determine the index of Bob's output. - tx, err := net.Miner.Client.GetRawTransaction(txid) - if err != nil { - t.Fatalf("unable to extract raw transaction from mempool: %v", - err) - } + tx := ht.Miner.GetRawTransaction(txid) bobOutputIdx := -1 for i, txOut := range tx.MsgTx().TxOut { _, addrs, _, err := txscript.ExtractPkScriptAddrs( - txOut.PkScript, net.Miner.ActiveNet, + txOut.PkScript, ht.Miner.ActiveNet, ) - if err != nil { - t.Fatalf("unable to extract address from pkScript=%x: "+ - "%v", txOut.PkScript, err) - } + require.NoErrorf(ht, err, "unable to extract address "+ + "from pkScript=%x: %v", txOut.PkScript, err) + if addrs[0].String() == resp.Address { bobOutputIdx = i } } - if bobOutputIdx == -1 { - t.Fatalf("bob's output was not found within the transaction") - } + require.NotEqual(ht, -1, bobOutputIdx, "bob's output was not found "+ + "within the transaction") // Wait until bob has seen the tx and considers it as owned. op := &lnrpc.OutPoint{ TxidBytes: txid[:], OutputIndex: uint32(bobOutputIdx), } - assertWalletUnspent(t, bob, op, "") + ht.AssertUTXOInWallet(bob, op, "") // We'll attempt to bump the fee of this transaction by performing a // CPFP from Alice's point of view. @@ -165,68 +143,38 @@ func runCPFP(net *lntest.NetworkHarness, t *harnessTest, sweep.DefaultMaxFeeRate.FeePerKVByte() / 2000, ), } - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - _, err = bob.WalletKitClient.BumpFee(ctxt, bumpFeeReq) - if err != nil { - t.Fatalf("unable to bump fee: %v", err) - } + bob.RPC.BumpFee(bumpFeeReq) // We should now expect to see two transactions within the mempool, a // parent and its child. - _, err = waitForNTxsInMempool(net.Miner.Client, 2, minerMempoolTimeout) - if err != nil { - t.Fatalf("expected two mempool transactions: %v", err) - } + ht.Miner.AssertNumTxsInMempool(2) // We should also expect to see the output being swept by the // UtxoSweeper. We'll ensure it's using the fee rate specified. - pendingSweepsReq := &walletrpc.PendingSweepsRequest{} - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - pendingSweepsResp, err := bob.WalletKitClient.PendingSweeps( - ctxt, pendingSweepsReq, - ) - if err != nil { - t.Fatalf("unable to retrieve pending sweeps: %v", err) - } - if len(pendingSweepsResp.PendingSweeps) != 1 { - t.Fatalf("expected to find %v pending sweep(s), found %v", 1, - len(pendingSweepsResp.PendingSweeps)) - } + pendingSweepsResp := bob.RPC.PendingSweeps() + require.Len(ht, pendingSweepsResp.PendingSweeps, 1, + "expected to find 1 pending sweep") pendingSweep := pendingSweepsResp.PendingSweeps[0] - if !bytes.Equal(pendingSweep.Outpoint.TxidBytes, op.TxidBytes) { - t.Fatalf("expected output txid %x, got %x", op.TxidBytes, - pendingSweep.Outpoint.TxidBytes) - } - if pendingSweep.Outpoint.OutputIndex != op.OutputIndex { - t.Fatalf("expected output index %v, got %v", op.OutputIndex, - pendingSweep.Outpoint.OutputIndex) - } - if pendingSweep.SatPerVbyte != bumpFeeReq.SatPerVbyte { - t.Fatalf("expected sweep sat per vbyte %v, got %v", - bumpFeeReq.SatPerVbyte, pendingSweep.SatPerVbyte) - } + require.Equal(ht, pendingSweep.Outpoint.TxidBytes, op.TxidBytes, + "output txid not matched") + require.Equal(ht, pendingSweep.Outpoint.OutputIndex, op.OutputIndex, + "output index not matched") + require.Equal(ht, pendingSweep.SatPerVbyte, bumpFeeReq.SatPerVbyte, + "sweep sat per vbyte not matched") // Mine a block to clean up the unconfirmed transactions. - mineBlocks(t, net, 1, 2) + ht.MineBlocksAndAssertNumTxes(1, 2) // The input used to CPFP should no longer be pending. - err = wait.NoError(func() error { - req := &walletrpc.PendingSweepsRequest{} - ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) - resp, err := bob.WalletKitClient.PendingSweeps(ctxt, req) - if err != nil { - return fmt.Errorf("unable to retrieve bob's pending "+ - "sweeps: %v", err) - } + err := wait.NoError(func() error { + resp := bob.RPC.PendingSweeps() if len(resp.PendingSweeps) != 0 { return fmt.Errorf("expected 0 pending sweeps, found %d", len(resp.PendingSweeps)) } return nil }, defaultTimeout) - if err != nil { - t.Fatalf(err.Error()) - } + require.NoError(ht, err, "timeout checking bob's pending sweeps") } // testAnchorReservedValue tests that we won't allow sending transactions when diff --git a/lntest/itest/lnd_test_list_on_test.go b/lntest/itest/lnd_test_list_on_test.go index 09943e2c5..e8b160b81 100644 --- a/lntest/itest/lnd_test_list_on_test.go +++ b/lntest/itest/lnd_test_list_on_test.go @@ -12,10 +12,6 @@ var allTestCases = []*testCase{ name: "async bidirectional payments", test: testBidirectionalAsyncPayments, }, - { - name: "cpfp", - test: testCPFP, - }, { name: "psbt channel funding", test: testPsbtChanFunding,