Skip to content

Commit a482ffb

Browse files
committed
refactor(persist_test_utils)!: Rewrite persist_test_utils
Changed the definition of `persist_*` functions to take a `create_store` Fn (and no path) as the caller may want more control of the path to the database file. - deps: Make tempfile, anyhow dev-dependencies
1 parent 67ec82d commit a482ffb

3 files changed

Lines changed: 225 additions & 114 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ all-keys = ["keys-bip39"]
4141
keys-bip39 = ["bip39"]
4242
rusqlite = ["bdk_chain/rusqlite"]
4343
file_store = ["bdk_file_store"]
44-
test-utils = ["std", "anyhow", "tempfile"]
44+
test-utils = ["std"]
4545

4646
[dev-dependencies]
4747
anyhow = "1"

src/persist_test_utils.rs

Lines changed: 168 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ macro_rules! hash {
3434
}};
3535
}
3636

37-
use std::fmt::Debug;
38-
use std::path::Path;
3937
use std::str::FromStr;
4038
use 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>
8381
where
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>
330362
where
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>
366414
where
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>
408472
where
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

Comments
 (0)