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:
28
src/bin/demo.rs
Normal file
28
src/bin/demo.rs
Normal 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));
|
||||
}
|
@@ -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]
|
||||
|
Reference in New Issue
Block a user