};
use bdk_file_store::{FileError, IterError, KeychainStore, MAGIC_BYTES, MAGIC_BYTES_LEN};
use serde;
+use tempfile::NamedTempFile;
use std::{
- format,
- fs::{File, OpenOptions},
io::{Read, Write},
- path::{Path, PathBuf},
vec::Vec,
};
-
-struct TempPath(PathBuf);
-
-impl TempPath {
- fn new() -> Self {
- let now = std::time::UNIX_EPOCH
- .elapsed()
- .expect("must get epoch")
- .as_nanos();
- let mut file_path = std::env::temp_dir();
- file_path.push(format!("bdk_test_{}", now));
- Self(file_path)
- }
-
- fn open(&self) -> File {
- OpenOptions::new()
- .read(true)
- .write(true)
- .create(true)
- .open(self.0.as_path())
- .expect("must open")
- }
-}
-
-impl AsRef<Path> for TempPath {
- fn as_ref(&self) -> &Path {
- self.0.as_path()
- }
-}
-
-impl Drop for TempPath {
- fn drop(&mut self) {
- if let Err(e) = std::fs::remove_file(self.0.as_path()) {
- if e.kind() != std::io::ErrorKind::NotFound {
- panic!("remove file unexpected error: {}", e);
- }
- };
- }
-}
-
#[derive(
Debug, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize,
)]
#[test]
fn new_fails_if_file_is_too_short() {
- let path = TempPath::new();
- path.open()
- .write_all(&MAGIC_BYTES[..MAGIC_BYTES_LEN - 1])
+ let mut file = NamedTempFile::new().unwrap();
+ file.write_all(&MAGIC_BYTES[..MAGIC_BYTES_LEN - 1])
.expect("should write");
- match KeychainStore::<TestKeychain, TxHeight, Transaction>::new(path.open()) {
+ match KeychainStore::<TestKeychain, TxHeight, Transaction>::new(file.reopen().unwrap()) {
Err(FileError::Io(e)) => assert_eq!(e.kind(), std::io::ErrorKind::UnexpectedEof),
unexpected => panic!("unexpected result: {:?}", unexpected),
};
fn new_fails_if_magic_bytes_are_invalid() {
let invalid_magic_bytes = "ldkfs0000000";
- let path = TempPath::new();
- path.open()
+ let mut file = NamedTempFile::new().unwrap();
+ file
.write_all(invalid_magic_bytes.as_bytes())
.expect("should write");
- match KeychainStore::<TestKeychain, TxHeight, Transaction>::new(path.open()) {
+ match KeychainStore::<TestKeychain, TxHeight, Transaction>::new(file.reopen().unwrap()) {
Err(FileError::InvalidMagicBytes(b)) => {
assert_eq!(b, invalid_magic_bytes.as_bytes())
}
chain_graph: Default::default(),
};
- let path = TempPath::new();
- path.open().write_all(&data).expect("should write");
+ let mut file = NamedTempFile::new().unwrap();
+ file.write_all(&data).expect("should write");
- let mut store = KeychainStore::<TestKeychain, TxHeight, Transaction>::new(path.open())
+ let mut store = KeychainStore::<TestKeychain, TxHeight, Transaction>::new(file.reopen().unwrap())
.expect("should open");
match store.iter_changesets().expect("seek should succeed").next() {
Some(Err(IterError::Bincode(_))) => {}
let got_bytes = {
let mut buf = Vec::new();
- path.open().read_to_end(&mut buf).expect("should read");
+ file.reopen().unwrap().read_to_end(&mut buf).expect("should read");
buf
};