lnd/itest/lnd_wallet.go
2025-04-17 09:32:28 +08:00

121 lines
3.2 KiB
Go

package itest
import (
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/wire"
"github.com/lightningnetwork/lnd/lntest"
"github.com/lightningnetwork/lnd/lntest/node"
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/stretchr/testify/require"
)
// walletTestCases defines a set of tests aiming at asserting functionalities
// provided by the wallerpc.
var walletTestCases = []*lntest.TestCase{
{
Name: "listunspent P2WPKH",
TestFunc: func(ht *lntest.HarnessTest) {
runTestListUnspent(ht, ht.FundCoins)
},
},
{
Name: "listunspent NP2WPKH",
TestFunc: func(ht *lntest.HarnessTest) {
runTestListUnspent(ht, ht.FundCoinsNP2WKH)
},
},
{
Name: "listunspent P2TR",
TestFunc: func(ht *lntest.HarnessTest) {
runTestListUnspent(ht, ht.FundCoinsP2TR)
},
},
{
Name: "listunspent P2WPKH restart",
TestFunc: func(ht *lntest.HarnessTest) {
runTestListUnspentRestart(ht, ht.FundCoins)
},
},
{
Name: "listunspent NP2WPKH restart",
TestFunc: func(ht *lntest.HarnessTest) {
runTestListUnspentRestart(ht, ht.FundCoinsNP2WKH)
},
},
{
Name: "listunspent P2TR restart",
TestFunc: func(ht *lntest.HarnessTest) {
runTestListUnspentRestart(ht, ht.FundCoinsP2TR)
},
},
}
type fundMethod func(amt btcutil.Amount, hn *node.HarnessNode) *wire.MsgTx
// testListUnspent checks that once Alice sends all coins to Bob, her wallet
// balances are updated and the ListUnspent returns no UTXO.
func runTestListUnspent(ht *lntest.HarnessTest, fundCoins fundMethod) {
// Create two test nodes.
alice := ht.NewNode("Alice", nil)
bob := ht.NewNode("Bob", nil)
// Fund Alice one UTXO.
coin := btcutil.Amount(100_000)
fundCoins(coin, alice)
// Log Alice's wallet balance for debug.
balance := alice.RPC.WalletBalance()
ht.Logf("Alice has balance: %v", balance)
// Send all Alice's balance to Bob.
ht.SendAllCoins(alice, bob)
// Mine Alice's send coin tx.
ht.MineBlocksAndAssertNumTxes(1, 1)
// Alice wallet should be empty now, assert that all her balance fields
// are zero.
ht.AssertWalletAccountBalance(alice, lnwallet.DefaultAccountName, 0, 0)
ht.AssertWalletLockedBalance(alice, 0)
// Alice should have no UTXO.
ht.AssertNumUTXOs(alice, 0)
}
// testListUnspentRestart checks that once Alice sends all coins to Bob, then
// restarts, her wallet balances are updated and the ListUnspent returns no
// UTXO.
func runTestListUnspentRestart(ht *lntest.HarnessTest, fundCoins fundMethod) {
// Create two test nodes.
alice := ht.NewNode("Alice", nil)
bob := ht.NewNode("Bob", nil)
// Fund Alice one UTXO.
coin := btcutil.Amount(100_000)
fundCoins(coin, alice)
// Log Alice's wallet balance for debug.
balance := alice.RPC.WalletBalance()
ht.Logf("Alice has balance: %v", balance)
// Send all Alice's balance to Bob.
ht.SendAllCoins(alice, bob)
// Shutdown Alice.
restart := ht.SuspendNode(alice)
// Mine Alice's send coin tx.
ht.MineBlocksAndAssertNumTxes(1, 1)
// Restart Alice.
require.NoError(ht, restart())
// Alice wallet should be empty now, assert that all her balance fields
// are zero.
ht.AssertWalletAccountBalance(alice, lnwallet.DefaultAccountName, 0, 0)
ht.AssertWalletLockedBalance(alice, 0)
// Alice should have no UTXO.
ht.AssertNumUTXOs(alice, 0)
}