fixups, tests

This commit is contained in:
Rob Walker 2018-08-01 10:01:17 -07:00 committed by Grimes
parent cae88c90b1
commit fef93958c8
1 changed files with 30 additions and 18 deletions

View File

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