2020-04-30 09:08:12 +02:00
|
|
|
package wallet
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/btcsuite/btcd/chaincfg"
|
|
|
|
"github.com/btcsuite/btcutil/hdkeychain"
|
2021-02-17 02:03:37 +01:00
|
|
|
"github.com/btcsuite/btcwallet/waddrmgr"
|
|
|
|
"github.com/btcsuite/btcwallet/walletdb"
|
2020-04-30 09:08:12 +02:00
|
|
|
)
|
|
|
|
|
2020-08-11 21:53:04 +02:00
|
|
|
// defaultDBTimeout specifies the timeout value when opening the wallet
|
|
|
|
// database.
|
|
|
|
var defaultDBTimeout = 10 * time.Second
|
|
|
|
|
2020-04-30 09:08:12 +02:00
|
|
|
// testWallet creates a test wallet and unlocks it.
|
|
|
|
func testWallet(t *testing.T) (*Wallet, func()) {
|
|
|
|
// Set up a wallet.
|
|
|
|
dir, err := ioutil.TempDir("", "test_wallet")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Failed to create db dir: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup := func() {
|
|
|
|
if err := os.RemoveAll(dir); err != nil {
|
|
|
|
t.Fatalf("could not cleanup test: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
seed, err := hdkeychain.GenerateSeed(hdkeychain.MinSeedBytes)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unable to create seed: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
pubPass := []byte("hello")
|
|
|
|
privPass := []byte("world")
|
|
|
|
|
2020-08-11 21:53:04 +02:00
|
|
|
loader := NewLoader(
|
|
|
|
&chaincfg.TestNet3Params, dir, true, defaultDBTimeout, 250,
|
|
|
|
)
|
2020-04-30 09:08:12 +02:00
|
|
|
w, err := loader.CreateNewWallet(pubPass, privPass, seed, time.Now())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unable to create wallet: %v", err)
|
|
|
|
}
|
|
|
|
chainClient := &mockChainClient{}
|
|
|
|
w.chainClient = chainClient
|
|
|
|
if err := w.Unlock(privPass, time.After(10*time.Minute)); err != nil {
|
|
|
|
t.Fatalf("unable to unlock wallet: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return w, cleanup
|
|
|
|
}
|
2021-02-17 02:03:37 +01:00
|
|
|
|
|
|
|
// testWalletWatchingOnly creates a test watch only wallet and unlocks it.
|
|
|
|
func testWalletWatchingOnly(t *testing.T) (*Wallet, func()) {
|
|
|
|
// Set up a wallet.
|
|
|
|
dir, err := ioutil.TempDir("", "test_wallet_watch_only")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Failed to create db dir: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup := func() {
|
|
|
|
if err := os.RemoveAll(dir); err != nil {
|
|
|
|
t.Fatalf("could not cleanup test: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pubPass := []byte("hello")
|
|
|
|
loader := NewLoader(
|
|
|
|
&chaincfg.TestNet3Params, dir, true, defaultDBTimeout, 250,
|
|
|
|
)
|
|
|
|
w, err := loader.CreateNewWatchingOnlyWallet(pubPass, time.Now())
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unable to create wallet: %v", err)
|
|
|
|
}
|
|
|
|
chainClient := &mockChainClient{}
|
|
|
|
w.chainClient = chainClient
|
|
|
|
|
|
|
|
err = walletdb.Update(w.Database(), func(tx walletdb.ReadWriteTx) error {
|
|
|
|
ns := tx.ReadWriteBucket(waddrmgrNamespaceKey)
|
|
|
|
for scope, schema := range waddrmgr.ScopeAddrMap {
|
|
|
|
_, err := w.Manager.NewScopedKeyManager(
|
|
|
|
ns, scope, schema,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("unable to create default scopes: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return w, cleanup
|
|
|
|
}
|