1+ use std:: str:: FromStr ;
2+
13use assert_matches:: assert_matches;
24use bdk:: descriptor:: calc_checksum;
35use bdk:: psbt:: PsbtUtils ;
@@ -17,7 +19,6 @@ use bitcoin::{
1719} ;
1820use bitcoin:: { psbt, Network } ;
1921use bitcoin:: { BlockHash , Txid } ;
20- use core:: str:: FromStr ;
2122
2223mod common;
2324use common:: * ;
@@ -60,6 +61,101 @@ fn receive_output_in_latest_block(wallet: &mut Wallet, value: u64) -> OutPoint {
6061// OP_PUSH.
6162const P2WPKH_FAKE_WITNESS_SIZE : usize = 106 ;
6263
64+ const DB_MAGIC : & [ u8 ] = & [ 0x21 , 0x24 , 0x48 ] ;
65+
66+ #[ test]
67+ fn load_recovers_wallet ( ) {
68+ let temp_dir = tempfile:: tempdir ( ) . expect ( "must create tempdir" ) ;
69+ let file_path = temp_dir. path ( ) . join ( "store.db" ) ;
70+
71+ // create new wallet
72+ let wallet_keychains = {
73+ let db = bdk_file_store:: Store :: create_new ( DB_MAGIC , & file_path) . expect ( "must create db" ) ;
74+ let wallet =
75+ Wallet :: new ( get_test_wpkh ( ) , None , db, Network :: Testnet ) . expect ( "must init wallet" ) ;
76+ wallet. keychains ( ) . clone ( )
77+ } ;
78+
79+ // recover wallet
80+ {
81+ let db = bdk_file_store:: Store :: open ( DB_MAGIC , & file_path) . expect ( "must recover db" ) ;
82+ let wallet = Wallet :: load ( get_test_wpkh ( ) , None , db) . expect ( "must recover wallet" ) ;
83+ assert_eq ! ( wallet. network( ) , Network :: Testnet ) ;
84+ assert_eq ! ( wallet. spk_index( ) . keychains( ) , & wallet_keychains) ;
85+ }
86+ }
87+
88+ #[ test]
89+ fn new_or_load ( ) {
90+ let temp_dir = tempfile:: tempdir ( ) . expect ( "must create tempdir" ) ;
91+ let file_path = temp_dir. path ( ) . join ( "store.db" ) ;
92+
93+ // init wallet when non-existant
94+ let wallet_keychains = {
95+ let db = bdk_file_store:: Store :: open_or_create_new ( DB_MAGIC , & file_path)
96+ . expect ( "must create db" ) ;
97+ let wallet = Wallet :: new_or_load ( get_test_wpkh ( ) , None , db, Network :: Testnet )
98+ . expect ( "must init wallet" ) ;
99+ wallet. keychains ( ) . clone ( )
100+ } ;
101+
102+ // wrong network
103+ {
104+ let db =
105+ bdk_file_store:: Store :: open_or_create_new ( DB_MAGIC , & file_path) . expect ( "must open db" ) ;
106+ let err = Wallet :: new_or_load ( get_test_wpkh ( ) , None , db, Network :: Bitcoin )
107+ . expect_err ( "wrong network" ) ;
108+ assert ! (
109+ matches!(
110+ err,
111+ bdk:: wallet:: NewOrLoadError :: LoadedNetworkDoesNotMatch {
112+ got: Some ( Network :: Testnet ) ,
113+ expected: Network :: Bitcoin
114+ }
115+ ) ,
116+ "err: {}" ,
117+ err,
118+ ) ;
119+ }
120+
121+ // wrong genesis hash
122+ {
123+ let exp_blockhash = BlockHash :: all_zeros ( ) ;
124+ let got_blockhash =
125+ bitcoin:: blockdata:: constants:: genesis_block ( Network :: Testnet ) . block_hash ( ) ;
126+
127+ let db =
128+ bdk_file_store:: Store :: open_or_create_new ( DB_MAGIC , & file_path) . expect ( "must open db" ) ;
129+ let err = Wallet :: new_or_load_with_genesis_hash (
130+ get_test_wpkh ( ) ,
131+ None ,
132+ db,
133+ Network :: Testnet ,
134+ exp_blockhash,
135+ )
136+ . expect_err ( "wrong genesis hash" ) ;
137+ assert ! (
138+ matches!(
139+ err,
140+ bdk:: wallet:: NewOrLoadError :: LoadedGenesisDoesNotMatch { got, expected }
141+ if got == Some ( got_blockhash) && expected == exp_blockhash
142+ ) ,
143+ "err: {}" ,
144+ err,
145+ ) ;
146+ }
147+
148+ // all parameters match
149+ {
150+ let db =
151+ bdk_file_store:: Store :: open_or_create_new ( DB_MAGIC , & file_path) . expect ( "must open db" ) ;
152+ let wallet = Wallet :: new_or_load ( get_test_wpkh ( ) , None , db, Network :: Testnet )
153+ . expect ( "must recover wallet" ) ;
154+ assert_eq ! ( wallet. network( ) , Network :: Testnet ) ;
155+ assert_eq ! ( wallet. keychains( ) , & wallet_keychains) ;
156+ }
157+ }
158+
63159#[ test]
64160fn test_descriptor_checksum ( ) {
65161 let ( wallet, _) = get_funded_wallet ( get_test_wpkh ( ) ) ;
0 commit comments