Reset historian's hasher between events

Hasher will generate different hashes for the same input if it
had already generated a hash.

Also add a binary to ensure the example in the README works.
This commit is contained in:
Greg Fitzgerald
2018-02-19 12:00:56 -07:00
parent a7186328e0
commit d88d1b2a09
4 changed files with 84 additions and 20 deletions

28
src/bin/demo.rs Normal file
View File

@@ -0,0 +1,28 @@
extern crate silk;
use silk::historian::Historian;
use silk::log::{verify_slice, Entry, Event};
use std::{thread, time};
fn create_log(hist: &Historian) -> Vec<Entry> {
hist.sender.send(Event::Tick).unwrap();
thread::sleep(time::Duration::new(0, 100_000));
hist.sender.send(Event::UserDataKey(0xdeadbeef)).unwrap();
thread::sleep(time::Duration::new(0, 100_000));
hist.sender.send(Event::Tick).unwrap();
let entry0 = hist.receiver.recv().unwrap();
let entry1 = hist.receiver.recv().unwrap();
let entry2 = hist.receiver.recv().unwrap();
vec![entry0, entry1, entry2]
}
fn main() {
let seed = 0;
let hist = Historian::new(seed);
let entries = create_log(&hist);
for entry in &entries {
println!("{:?}", entry);
}
assert!(verify_slice(&entries, seed));
}

View File

@@ -73,7 +73,11 @@ pub fn create_logger(
let mut num_hashes = 0;
loop {
match log_events(&receiver, &sender, num_hashes, end_hash) {
Ok(n) => num_hashes = n,
Ok(0) => {
num_hashes = 0;
hasher = DefaultHasher::new();
}
Ok(_) => {}
Err(err) => return err,
}
end_hash.hash(&mut hasher);
@@ -104,17 +108,22 @@ mod tests {
#[test]
fn test_historian() {
use std::thread::sleep;
use std::time::Duration;
let hist = Historian::new(0);
let event = Event::Tick;
hist.sender.send(event.clone()).unwrap();
let entry0 = hist.receiver.recv().unwrap();
assert_eq!(entry0.event, event);
hist.sender.send(Event::Tick).unwrap();
sleep(Duration::new(0, 100_000));
hist.sender.send(Event::UserDataKey(0xdeadbeef)).unwrap();
sleep(Duration::new(0, 100_000));
hist.sender.send(Event::Tick).unwrap();
let event = Event::UserDataKey(0xdeadbeef);
hist.sender.send(event.clone()).unwrap();
let entry0 = hist.receiver.recv().unwrap();
let entry1 = hist.receiver.recv().unwrap();
assert_eq!(entry1.event, event);
let entry2 = hist.receiver.recv().unwrap();
assert!(entry1.num_hashes != 0);
assert!(entry2.num_hashes != 0);
drop(hist.sender);
assert_eq!(
@@ -122,7 +131,7 @@ mod tests {
ExitReason::RecvDisconnected
);
assert!(verify_slice(&[entry0, entry1], 0));
assert!(verify_slice(&[entry0, entry1, entry2], 0));
}
#[test]