diff --git a/README.md b/README.md index 236edf56b..074643e85 100644 --- a/README.md +++ b/README.md @@ -24,28 +24,27 @@ Create a *Historian* and send it *events* to generate an *event log*, where each is tagged with the historian's latest *hash*. Then ensure the order of events was not tampered with by verifying each entry's hash can be generated from the hash in the previous entry: -![historian](https://user-images.githubusercontent.com/55449/36492930-97a572be-16eb-11e8-8289-358e9507189e.png) +![historian](https://user-images.githubusercontent.com/55449/36499105-7c8db6a0-16fd-11e8-8b88-c6e0f52d7a50.png) ```rust extern crate silk; use silk::historian::Historian; use silk::log::{verify_slice, Entry, Event, Sha256Hash}; -use std::{thread, time}; +use std::thread::sleep; +use std::time::Duration; use std::sync::mpsc::SendError; fn create_log(hist: &Historian) -> Result<(), SendError> { - hist.sender.send(Event::Tick)?; - thread::sleep(time::Duration::new(0, 100_000)); + sleep(Duration::from_millis(15)); hist.sender.send(Event::UserDataKey(Sha256Hash::default()))?; - thread::sleep(time::Duration::new(0, 100_000)); - hist.sender.send(Event::Tick)?; + sleep(Duration::from_millis(10)); Ok(()) } fn main() { let seed = Sha256Hash::default(); - let hist = Historian::new(&seed, None); + let hist = Historian::new(&seed, Some(10)); create_log(&hist).expect("send error"); drop(hist.sender); let entries: Vec = hist.receiver.iter().collect(); diff --git a/diagrams/historian.msc b/diagrams/historian.msc index 703c51bb2..ee67f49d1 100644 --- a/diagrams/historian.msc +++ b/diagrams/historian.msc @@ -1,8 +1,6 @@ msc { client,historian,logger; - client=>historian [ label = "Tick" ] ; - historian=>logger [ label = "Tick" ] ; logger=>historian [ label = "e0 = Entry{hash: h0, n: 0, event: Tick}" ] ; logger=>logger [ label = "h1 = hash(h0)" ] ; logger=>logger [ label = "h2 = hash(h1)" ] ; @@ -13,8 +11,6 @@ msc { logger=>logger [ label = "h4 = hash(h3)" ] ; logger=>logger [ label = "h5 = hash(h4)" ] ; logger=>logger [ label = "h6 = hash(h5)" ] ; - client=>historian [ label = "Tick" ] ; - historian=>logger [ label = "Tick" ] ; logger=>historian [ label = "e2 = Entry{hash: h6, n: 3, event: Tick}" ] ; client=>historian [ label = "collect()" ] ; historian=>client [ label = "entries = [e0, e1, e2]" ] ; diff --git a/src/bin/demo.rs b/src/bin/demo.rs index 0799faa93..e4930521a 100644 --- a/src/bin/demo.rs +++ b/src/bin/demo.rs @@ -2,21 +2,20 @@ extern crate silk; use silk::historian::Historian; use silk::log::{verify_slice, Entry, Event, Sha256Hash}; -use std::{thread, time}; +use std::thread::sleep; +use std::time::Duration; use std::sync::mpsc::SendError; fn create_log(hist: &Historian) -> Result<(), SendError> { - hist.sender.send(Event::Tick)?; - thread::sleep(time::Duration::new(0, 100_000)); + sleep(Duration::from_millis(15)); hist.sender.send(Event::UserDataKey(Sha256Hash::default()))?; - thread::sleep(time::Duration::new(0, 100_000)); - hist.sender.send(Event::Tick)?; + sleep(Duration::from_millis(10)); Ok(()) } fn main() { let seed = Sha256Hash::default(); - let hist = Historian::new(&seed, None); + let hist = Historian::new(&seed, Some(10)); create_log(&hist).expect("send error"); drop(hist.sender); let entries: Vec = hist.receiver.iter().collect(); diff --git a/src/historian.rs b/src/historian.rs index 09815790a..41843a3de 100644 --- a/src/historian.rs +++ b/src/historian.rs @@ -129,12 +129,11 @@ impl Historian { mod tests { use super::*; use log::*; + use std::thread::sleep; + use std::time::Duration; #[test] fn test_historian() { - use std::thread::sleep; - use std::time::Duration; - let zero = Sha256Hash::default(); let hist = Historian::new(&zero, None); @@ -168,4 +167,21 @@ mod tests { ExitReason::SendDisconnected ); } + + #[test] + fn test_ticking_historian() { + let zero = Sha256Hash::default(); + let hist = Historian::new(&zero, Some(2)); + sleep(Duration::from_millis(3)); + hist.sender.send(Event::UserDataKey(zero)).unwrap(); + sleep(Duration::from_millis(1)); + drop(hist.sender); + assert_eq!( + hist.thread_hdl.join().unwrap().1, + ExitReason::RecvDisconnected + ); + + let entries: Vec = hist.receiver.iter().collect(); + assert!(verify_slice(&entries, &zero)); + } }