@@ -34,8 +34,6 @@ macro_rules! hash {
3434 } } ;
3535}
3636
37- use std:: fmt:: Debug ;
38- use std:: path:: Path ;
3937use std:: str:: FromStr ;
4038use std:: sync:: Arc ;
4139
@@ -79,21 +77,26 @@ fn spk_at_index(descriptor: &Descriptor<DescriptorPublicKey>, index: u32) -> Scr
7977/// We create a dummy [`ChangeSet`], persist it and check if loaded [`ChangeSet`] matches
8078/// the persisted one. We then create another such dummy [`ChangeSet`], persist it and load it to
8179/// check if merged [`ChangeSet`] is returned.
82- pub fn persist_wallet_changeset < Store , CreateStore > ( filename : & str , create_store : CreateStore )
80+ pub fn persist_wallet_changeset < F , P > ( create_store : F ) -> Result < ( ) , PersistError >
8381where
84- CreateStore : Fn ( & Path ) -> anyhow :: Result < Store > ,
85- Store : WalletPersister ,
86- Store :: Error : Debug ,
82+ F : Fn ( ) -> Result < P , P :: Error > ,
83+ P : WalletPersister ,
84+ P :: Error : StdErr + ' static ,
8785{
86+ use PersistError as E ;
87+
8888 // create store
89- let temp_dir = tempfile:: tempdir ( ) . expect ( "must create tempdir" ) ;
90- let file_path = temp_dir. path ( ) . join ( filename) ;
91- let mut store = create_store ( & file_path) . expect ( "store should get created" ) ;
89+ let mut store = create_store ( ) . map_err ( E :: persister) ?;
9290
9391 // initialize store
94- let changeset =
95- WalletPersister :: initialize ( & mut store) . expect ( "empty changeset should get loaded" ) ;
96- assert_eq ! ( changeset, ChangeSet :: default ( ) ) ;
92+ let changeset = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
93+
94+ if changeset != ChangeSet :: default ( ) {
95+ return Err ( PersistError :: ChangeSetMismatch {
96+ got : Box :: new ( changeset) ,
97+ expected : Box :: new ( ChangeSet :: default ( ) ) ,
98+ } ) ;
99+ }
97100
98101 // create changeset
99102 let descriptor: Descriptor < DescriptorPublicKey > = DESCRIPTORS [ 0 ] . parse ( ) . unwrap ( ) ;
@@ -180,12 +183,16 @@ where
180183 } ;
181184
182185 // persist and load
183- WalletPersister :: persist ( & mut store, & changeset) . expect ( "changeset should get persisted" ) ;
186+ WalletPersister :: persist ( & mut store, & changeset) . map_err ( E :: persister ) ? ;
184187
185- let changeset_read =
186- WalletPersister :: initialize ( & mut store) . expect ( "changeset should get loaded" ) ;
188+ let changeset_read = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
187189
188- assert_eq ! ( changeset, changeset_read) ;
190+ if changeset != changeset_read {
191+ return Err ( PersistError :: ChangeSetMismatch {
192+ got : Box :: new ( changeset_read) ,
193+ expected : Box :: new ( changeset. clone ( ) ) ,
194+ } ) ;
195+ }
189196
190197 // create another changeset
191198 let local_chain_changeset = local_chain:: ChangeSet {
@@ -239,12 +246,19 @@ where
239246 } ;
240247
241248 // persist, load and check if same as merged
242- WalletPersister :: persist ( & mut store, & changeset_new) . expect ( "changeset should get persisted" ) ;
243- let changeset_read_new = WalletPersister :: initialize ( & mut store) . unwrap ( ) ;
249+ WalletPersister :: persist ( & mut store, & changeset_new) . map_err ( E :: persister ) ? ;
250+ let changeset_read_new = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister ) ? ;
244251
245252 changeset. merge ( changeset_new) ;
246253
247- assert_eq ! ( changeset, changeset_read_new) ;
254+ if changeset != changeset_read_new {
255+ return Err ( PersistError :: ChangeSetMismatch {
256+ got : Box :: new ( changeset_read_new) ,
257+ expected : Box :: new ( changeset) ,
258+ } ) ;
259+ }
260+
261+ Ok ( ( ) )
248262}
249263
250264/// tests if multiple [`Wallet`]s can be persisted in a single file correctly
@@ -255,25 +269,26 @@ where
255269/// We create a dummy [`ChangeSet`] for first wallet and persist it then we create a dummy
256270/// [`ChangeSet`] for second wallet and persist that. Finally we load these two [`ChangeSet`]s and
257271/// check if they were persisted correctly.
258- pub fn persist_multiple_wallet_changesets < Store , CreateStores > (
259- filename : & str ,
260- create_dbs : CreateStores ,
261- ) where
262- CreateStores : Fn ( & Path ) -> anyhow:: Result < ( Store , Store ) > ,
263- Store : WalletPersister ,
264- Store :: Error : Debug ,
272+ pub fn persist_multiple_wallet_changesets < F , P > ( create_stores : F ) -> Result < ( ) , PersistError >
273+ where
274+ F : Fn ( ) -> Result < ( P , P ) , P :: Error > ,
275+ P : WalletPersister ,
276+ P :: Error : StdErr + ' static ,
265277{
266- // create stores
267- let temp_dir = tempfile:: tempdir ( ) . expect ( "must create tempdir" ) ;
268- let file_path = temp_dir. path ( ) . join ( filename) ;
278+ use PersistError as E ;
269279
270- let ( mut store_first , mut store_sec ) =
271- create_dbs ( & file_path ) . expect ( "store should get created" ) ;
280+ // create stores
281+ let ( mut store_first , mut store_sec ) = create_stores ( ) . map_err ( E :: persister ) ? ;
272282
273283 // initialize first store
274- let changeset =
275- WalletPersister :: initialize ( & mut store_first) . expect ( "should load empty changeset" ) ;
276- assert_eq ! ( changeset, ChangeSet :: default ( ) ) ;
284+ let changeset = WalletPersister :: initialize ( & mut store_first) . map_err ( E :: persister) ?;
285+
286+ if changeset != ChangeSet :: default ( ) {
287+ return Err ( PersistError :: ChangeSetMismatch {
288+ got : Box :: new ( changeset) ,
289+ expected : Box :: new ( ChangeSet :: default ( ) ) ,
290+ } ) ;
291+ }
277292
278293 // create first changeset
279294 let descriptor: Descriptor < DescriptorPublicKey > = DESCRIPTORS [ 0 ] . parse ( ) . unwrap ( ) ;
@@ -287,12 +302,17 @@ pub fn persist_multiple_wallet_changesets<Store, CreateStores>(
287302 } ;
288303
289304 // persist first changeset
290- WalletPersister :: persist ( & mut store_first, & changeset1) . expect ( "should persist changeset" ) ;
305+ WalletPersister :: persist ( & mut store_first, & changeset1) . map_err ( E :: persister ) ? ;
291306
292307 // initialize second store
293- let changeset =
294- WalletPersister :: initialize ( & mut store_sec) . expect ( "should load empty changeset" ) ;
295- assert_eq ! ( changeset, ChangeSet :: default ( ) ) ;
308+ let changeset = WalletPersister :: initialize ( & mut store_sec) . map_err ( E :: persister) ?;
309+
310+ if changeset != ChangeSet :: default ( ) {
311+ return Err ( PersistError :: ChangeSetMismatch {
312+ got : Box :: new ( changeset) ,
313+ expected : Box :: new ( ChangeSet :: default ( ) ) ,
314+ } ) ;
315+ }
296316
297317 // create second changeset
298318 let descriptor: Descriptor < DescriptorPublicKey > = DESCRIPTORS [ 2 ] . parse ( ) . unwrap ( ) ;
@@ -306,17 +326,29 @@ pub fn persist_multiple_wallet_changesets<Store, CreateStores>(
306326 } ;
307327
308328 // persist second changeset
309- WalletPersister :: persist ( & mut store_sec, & changeset2) . expect ( "should persist changeset" ) ;
329+ WalletPersister :: persist ( & mut store_sec, & changeset2) . map_err ( E :: persister ) ? ;
310330
311331 // load first changeset
312- let changeset_read =
313- WalletPersister :: initialize ( & mut store_first) . expect ( "should load persisted changeset1" ) ;
314- assert_eq ! ( changeset_read, changeset1) ;
332+ let changeset_read = WalletPersister :: initialize ( & mut store_first) . map_err ( E :: persister) ?;
333+
334+ if changeset_read != changeset1 {
335+ return Err ( PersistError :: ChangeSetMismatch {
336+ got : Box :: new ( changeset_read) ,
337+ expected : Box :: new ( changeset1) ,
338+ } ) ;
339+ }
315340
316341 // load second changeset
317- let changeset_read =
318- WalletPersister :: initialize ( & mut store_sec) . expect ( "should load persisted changeset2" ) ;
319- assert_eq ! ( changeset_read, changeset2) ;
342+ let changeset_read = WalletPersister :: initialize ( & mut store_sec) . map_err ( E :: persister) ?;
343+
344+ if changeset_read != changeset2 {
345+ return Err ( PersistError :: ChangeSetMismatch {
346+ got : Box :: new ( changeset_read) ,
347+ expected : Box :: new ( changeset2) ,
348+ } ) ;
349+ }
350+
351+ Ok ( ( ) )
320352}
321353
322354/// tests if [`Network`] is being persisted correctly
@@ -326,34 +358,50 @@ pub fn persist_multiple_wallet_changesets<Store, CreateStores>(
326358///
327359/// We create a dummy [`ChangeSet`] with only network field populated, persist it and check if
328360/// loaded [`ChangeSet`] has the same [`Network`] as what we persisted.
329- pub fn persist_network < Store , CreateStore > ( filename : & str , create_store : CreateStore )
361+ pub fn persist_network < F , P > ( create_store : F ) -> Result < ( ) , PersistError >
330362where
331- CreateStore : Fn ( & Path ) -> anyhow :: Result < Store > ,
332- Store : WalletPersister ,
333- Store :: Error : Debug ,
363+ F : Fn ( ) -> Result < P , P :: Error > ,
364+ P : WalletPersister ,
365+ P :: Error : StdErr + ' static ,
334366{
367+ use PersistError as E ;
368+
335369 // create store
336- let temp_dir = tempfile:: tempdir ( ) . expect ( "must create tempdir" ) ;
337- let file_path = temp_dir. path ( ) . join ( filename) ;
338- let mut store = create_store ( & file_path) . expect ( "store should get created" ) ;
370+ let mut store = create_store ( ) . map_err ( E :: persister) ?;
339371
340372 // initialize store
341- let changeset = WalletPersister :: initialize ( & mut store)
342- . expect ( "should initialize and load empty changeset" ) ;
343- assert_eq ! ( changeset, ChangeSet :: default ( ) ) ;
373+ let changeset = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
374+
375+ if changeset != ChangeSet :: default ( ) {
376+ return Err ( PersistError :: ChangeSetMismatch {
377+ got : Box :: new ( changeset) ,
378+ expected : Box :: new ( ChangeSet :: default ( ) ) ,
379+ } ) ;
380+ }
344381
345382 // persist the network
346383 let changeset = ChangeSet {
347384 network : Some ( Network :: Bitcoin ) ,
348385 ..ChangeSet :: default ( )
349386 } ;
350- WalletPersister :: persist ( & mut store, & changeset) . expect ( "should persist changeset" ) ;
387+ WalletPersister :: persist ( & mut store, & changeset) . map_err ( E :: persister ) ? ;
351388
352389 // read the persisted network
353- let changeset_read =
354- WalletPersister :: initialize ( & mut store) . expect ( "should load persisted changeset" ) ;
390+ let changeset_read = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
355391
356- assert_eq ! ( changeset_read. network, Some ( Network :: Bitcoin ) ) ;
392+ let expected_changeset = ChangeSet {
393+ network : Some ( Network :: Bitcoin ) ,
394+ ..ChangeSet :: default ( )
395+ } ;
396+
397+ if changeset_read != expected_changeset {
398+ return Err ( PersistError :: ChangeSetMismatch {
399+ got : Box :: new ( changeset_read) ,
400+ expected : Box :: new ( expected_changeset) ,
401+ } ) ;
402+ }
403+
404+ Ok ( ( ) )
357405}
358406
359407/// tests if descriptors are being persisted correctly
@@ -362,21 +410,26 @@ where
362410///
363411/// We create a dummy [`ChangeSet`] with only descriptor fields populated, persist it and check if
364412/// loaded [`ChangeSet`] has the same descriptors as what we persisted.
365- pub fn persist_keychains < Store , CreateStore > ( filename : & str , create_store : CreateStore )
413+ pub fn persist_keychains < F , P > ( create_store : F ) -> Result < ( ) , PersistError >
366414where
367- CreateStore : Fn ( & Path ) -> anyhow :: Result < Store > ,
368- Store : WalletPersister ,
369- Store :: Error : Debug ,
415+ F : Fn ( ) -> Result < P , P :: Error > ,
416+ P : WalletPersister ,
417+ P :: Error : StdErr + ' static ,
370418{
419+ use PersistError as E ;
420+
371421 // create store
372- let temp_dir = tempfile:: tempdir ( ) . expect ( "must create tempdir" ) ;
373- let file_path = temp_dir. path ( ) . join ( filename) ;
374- let mut store = create_store ( & file_path) . expect ( "store should get created" ) ;
422+ let mut store = create_store ( ) . map_err ( E :: persister) ?;
375423
376424 // initialize store
377- let changeset = WalletPersister :: initialize ( & mut store)
378- . expect ( "should initialize and load empty changeset" ) ;
379- assert_eq ! ( changeset, ChangeSet :: default ( ) ) ;
425+ let changeset = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
426+
427+ if changeset != ChangeSet :: default ( ) {
428+ return Err ( PersistError :: ChangeSetMismatch {
429+ got : Box :: new ( changeset) ,
430+ expected : Box :: new ( ChangeSet :: default ( ) ) ,
431+ } ) ;
432+ }
380433
381434 // persist the descriptors
382435 let descriptor: Descriptor < DescriptorPublicKey > = DESCRIPTORS [ 1 ] . parse ( ) . unwrap ( ) ;
@@ -388,14 +441,25 @@ where
388441 ..ChangeSet :: default ( )
389442 } ;
390443
391- WalletPersister :: persist ( & mut store, & changeset) . expect ( "should persist descriptors" ) ;
444+ WalletPersister :: persist ( & mut store, & changeset) . map_err ( E :: persister ) ? ;
392445
393446 // load the descriptors
394- let changeset_read =
395- WalletPersister :: initialize ( & mut store) . expect ( "should read persisted changeset" ) ;
447+ let changeset_read = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
396448
397- assert_eq ! ( changeset_read. descriptor. unwrap( ) , descriptor) ;
398- assert_eq ! ( changeset_read. change_descriptor. unwrap( ) , change_descriptor) ;
449+ let expected_changeset = ChangeSet {
450+ descriptor : Some ( descriptor. clone ( ) ) ,
451+ change_descriptor : Some ( change_descriptor. clone ( ) ) ,
452+ ..ChangeSet :: default ( )
453+ } ;
454+
455+ if changeset_read != expected_changeset {
456+ return Err ( PersistError :: ChangeSetMismatch {
457+ got : Box :: new ( changeset_read) ,
458+ expected : Box :: new ( expected_changeset) ,
459+ } ) ;
460+ }
461+
462+ Ok ( ( ) )
399463}
400464
401465/// tests if descriptor(in a single keychain wallet) is being persisted correctly
@@ -404,21 +468,26 @@ where
404468///
405469/// We create a dummy [`ChangeSet`] with only descriptor field populated, persist it and check if
406470/// loaded [`ChangeSet`] has the same descriptor as what we persisted.
407- pub fn persist_single_keychain < Store , CreateStore > ( filename : & str , create_store : CreateStore )
471+ pub fn persist_single_keychain < F , P > ( create_store : F ) -> Result < ( ) , PersistError >
408472where
409- CreateStore : Fn ( & Path ) -> anyhow :: Result < Store > ,
410- Store : WalletPersister ,
411- Store :: Error : Debug ,
473+ F : Fn ( ) -> Result < P , P :: Error > ,
474+ P : WalletPersister ,
475+ P :: Error : StdErr + ' static ,
412476{
477+ use PersistError as E ;
478+
413479 // create store
414- let temp_dir = tempfile:: tempdir ( ) . expect ( "must create tempdir" ) ;
415- let file_path = temp_dir. path ( ) . join ( filename) ;
416- let mut store = create_store ( & file_path) . expect ( "store should get created" ) ;
480+ let mut store = create_store ( ) . map_err ( E :: persister) ?;
417481
418482 // initialize store
419- let changeset = WalletPersister :: initialize ( & mut store)
420- . expect ( "should initialize and load empty changeset" ) ;
421- assert_eq ! ( changeset, ChangeSet :: default ( ) ) ;
483+ let changeset = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
484+
485+ if changeset != ChangeSet :: default ( ) {
486+ return Err ( PersistError :: ChangeSetMismatch {
487+ got : Box :: new ( changeset) ,
488+ expected : Box :: new ( ChangeSet :: default ( ) ) ,
489+ } ) ;
490+ }
422491
423492 // persist descriptor
424493 let descriptor: Descriptor < DescriptorPublicKey > = DESCRIPTORS [ 0 ] . parse ( ) . unwrap ( ) ;
@@ -428,14 +497,24 @@ where
428497 ..ChangeSet :: default ( )
429498 } ;
430499
431- WalletPersister :: persist ( & mut store, & changeset) . expect ( "should persist descriptors" ) ;
500+ WalletPersister :: persist ( & mut store, & changeset) . map_err ( E :: persister ) ? ;
432501
433502 // load the descriptor
434- let changeset_read =
435- WalletPersister :: initialize ( & mut store) . expect ( "should read persisted changeset" ) ;
503+ let changeset_read = WalletPersister :: initialize ( & mut store) . map_err ( E :: persister) ?;
436504
437- assert_eq ! ( changeset_read. descriptor. unwrap( ) , descriptor) ;
438- assert_eq ! ( changeset_read. change_descriptor, None ) ;
505+ let expected_changeset = ChangeSet {
506+ descriptor : Some ( descriptor. clone ( ) ) ,
507+ ..ChangeSet :: default ( )
508+ } ;
509+
510+ if changeset_read != expected_changeset {
511+ return Err ( PersistError :: ChangeSetMismatch {
512+ got : Box :: new ( changeset_read) ,
513+ expected : Box :: new ( expected_changeset) ,
514+ } ) ;
515+ }
516+
517+ Ok ( ( ) )
439518}
440519
441520/// Creates a [`ChangeSet`].
0 commit comments