diff --git a/src/ledger.rs b/src/ledger.rs index a3c291f260..d089f8a6c1 100644 --- a/src/ledger.rs +++ b/src/ledger.rs @@ -17,11 +17,15 @@ use std::path::Path; use transaction::Transaction; // ledger window +#[derive(Debug)] pub struct LedgerWindow { index: File, data: File, } +// use a CONST because there's a cast, and we don't want "sizeof:: as u64"... +const SIZEOF_U64: u64 = size_of::() as u64; + impl LedgerWindow { // opens a Ledger in directory, provides "infinite" window pub fn new(directory: String) -> io::Result { @@ -36,14 +40,14 @@ impl LedgerWindow { pub fn get_entry(&mut self, index: u64) -> io::Result { fn u64_at(file: &mut File, at: u64) -> io::Result { file.seek(SeekFrom::Start(at))?; - deserialize_from(file.take(size_of::() as u64)) + deserialize_from(file.take(SIZEOF_U64)) .map_err(|e| io::Error::new(ErrorKind::Other, e.to_string())) } - let end_offset = u64_at(&mut self.index, index * size_of::() as u64)?; + let end_offset = u64_at(&mut self.index, index * SIZEOF_U64)?; let start_offset = if index != 0 { - u64_at(&mut self.index, (index - 1) * size_of::() as u64)? + u64_at(&mut self.index, (index - 1) * SIZEOF_U64)? } else { 0u64 }; @@ -59,6 +63,7 @@ impl LedgerWindow { } } +#[derive(Debug)] pub struct LedgerWriter { index: File, data: File, @@ -106,6 +111,7 @@ impl LedgerWriter { } } +#[derive(Debug)] pub struct LedgerReader { offset: u64, // next start_offset index: File, @@ -117,7 +123,7 @@ impl Iterator for LedgerReader { fn next(&mut self) -> Option> { fn next_offset(file: &mut File) -> io::Result { - deserialize_from(file.take(size_of::() as u64)) + deserialize_from(file.take(SIZEOF_U64)) .map_err(|e| io::Error::new(ErrorKind::Other, e.to_string())) } @@ -338,7 +344,7 @@ mod tests { // V let mut transactions = vec![tx0; 362]; transactions.extend(vec![tx1; 100]); - next_entries(&zero, 0, transactions); + next_entries(&zero, 0, transactions) } #[test] @@ -414,23 +420,24 @@ mod tests { assert!(entries0.verify(&id)); } - #[test] - fn test_ledger_reader_writer() { + fn tmp_ledger_path() -> String { let keypair = KeyPair::new(); - let ledger_path = { - let id = { - let ids: Vec<_> = keypair - .pubkey() - .iter() - .map(|id| format!("{}", id)) - .collect(); - ids.join("") - }; - - format!("target/test_ledger_reader_writer_window-{}", id) + let id = { + let ids: Vec<_> = keypair + .pubkey() + .iter() + .map(|id| format!("{}", id)) + .collect(); + ids.join("") }; + format!("target/test_ledger_reader_writer_window-{}", id) + } + + #[test] + fn test_ledger_reader_writer() { + let ledger_path = tmp_ledger_path(); let entries = make_test_entries(); let mut writer = LedgerWriter::new(ledger_path.clone()).unwrap(); @@ -451,6 +458,11 @@ mod tests { assert_eq!(*entry, read_entry); } + std::fs::remove_file(Path::new(&ledger_path).join("data")).unwrap(); + // empty data file should fall over + assert!(LedgerWindow::new(ledger_path.clone()).is_err()); + assert!(read_ledger(ledger_path.clone()).is_err()); + std::fs::remove_dir_all(ledger_path).unwrap(); }