tracing and vote test

This commit is contained in:
keorn 2016-11-25 16:45:32 +00:00
parent 8f72017bcc
commit a7afbf4d25
1 changed files with 27 additions and 19 deletions

View File

@ -140,8 +140,6 @@ impl Tendermint {
Err(err) => warn!(target: "poa", "timeout: Could not send a sealing message {}.", err),
}
}
} else {
warn!(target: "poa", "broadcast_message: Message could not be generated.");
}
}
@ -155,6 +153,7 @@ impl Tendermint {
block_hash
)
} else {
warn!(target: "poa", "generate_message: No AccountProvider available.");
None
}
}
@ -163,10 +162,12 @@ impl Tendermint {
*self.step.write() = step;
match step {
Step::Propose => {
trace!(target: "poa", "to_step: Transitioning to Propose.");
*self.proposal.write() = None;
self.update_sealing()
},
Step::Prevote => {
trace!(target: "poa", "to_step: Transitioning to Prevote.");
let block_hash = match *self.lock_change.read() {
Some(ref m) if self.should_unlock(m.round) => self.proposal.read().clone(),
Some(ref m) => m.block_hash,
@ -175,6 +176,7 @@ impl Tendermint {
self.broadcast_message(block_hash)
},
Step::Precommit => {
trace!(target: "poa", "to_step: Transitioning to Precommit.");
let block_hash = match *self.lock_change.read() {
Some(ref m) if self.is_round(m) => {
self.last_lock.store(m.round, AtomicOrdering::SeqCst);
@ -185,6 +187,7 @@ impl Tendermint {
self.broadcast_message(block_hash);
},
Step::Commit => {
trace!(target: "poa", "to_step: Transitioning to Commit.");
// Commit the block using a complete signature set.
let round = self.round.load(AtomicOrdering::SeqCst);
if let Some(seal) = self.votes.seal_signatures(self.height.load(AtomicOrdering::SeqCst), round, *self.proposal.read()) {
@ -348,6 +351,7 @@ impl Engine for Tendermint {
// Check if the message is known.
if self.votes.vote(message.clone(), sender).is_none() {
trace!(target: "poa", "handle_message: Processing new authorized message: {:?}", &message);
let is_newer_than_lock = match *self.lock_change.read() {
Some(ref lock) => &message > lock,
None => true,
@ -355,6 +359,7 @@ impl Engine for Tendermint {
if is_newer_than_lock
&& message.step == Step::Prevote
&& self.has_enough_aligned_votes(&message) {
trace!(target: "poa", "handle_message: Lock change.");
*self.lock_change.write() = Some(message.clone());
}
// Check if it can affect the step transition.
@ -409,6 +414,7 @@ impl Engine for Tendermint {
self.votes.vote(proposal, proposer);
let block_info_hash = try!(message_info_rlp_from_header(header)).sha3();
// TODO: use addresses recovered during precommit vote
let mut signature_count = 0;
for rlp in UntrustedRlp::new(&header.seal()[2]).iter() {
let signature: H520 = try!(rlp.as_val());
@ -508,8 +514,8 @@ mod tests {
(b, seal)
}
fn vote_default<F>(engine: &Arc<Engine>, signer: F, height: usize, round: usize, step: Step) where F: FnOnce(H256) -> Option<H520> {
let m = message_full_rlp(signer, height, round, step, Some(Default::default())).unwrap();
fn vote<F>(engine: &Arc<Engine>, signer: F, height: usize, round: usize, step: Step, block_hash: Option<H256>) where F: FnOnce(H256) -> Option<H520> {
let m = message_full_rlp(signer, height, round, step, block_hash).unwrap();
engine.handle_message(UntrustedRlp::new(&m)).unwrap();
}
@ -531,15 +537,13 @@ mod tests {
addr
}
struct TestIo;
struct TestIo(ClientIoMessage);
impl IoHandler<ClientIoMessage> for TestIo {
fn message(&self, _io: &IoContext<ClientIoMessage>, net_message: &ClientIoMessage) {
match *net_message {
ClientIoMessage::UpdateSealing => {},
ClientIoMessage::SubmitSeal(ref block_hash, ref seal) => {},
ClientIoMessage::BroadcastMessage(ref message) => {},
_ => {} // ignore other messages
let TestIo(ref expected) = *self;
if net_message == expected {
panic!()
}
}
}
@ -655,31 +659,35 @@ mod tests {
}
#[test]
#[should_panic]
fn prevote_step() {
::env_logger::init().unwrap();
let (spec, tap) = setup();
let engine = spec.engine.clone();
let mut db_result = get_temp_state_db();
let mut db = db_result.take();
spec.ensure_db_good(&mut db).unwrap();
let io_service = IoService::<ClientIoMessage>::start().unwrap();
io_service.register_handler(Arc::new(TestIo));
engine.register_message_channel(io_service.channel());
let v0 = insert_and_unlock(&tap, "0");
let v1 = insert_and_unlock(&tap, "1");
// Propose
propose_default(&spec, v0.clone());
let (b, seal) = propose_default(&spec, v0.clone());
let proposal = Some(b.header().bare_hash());
let h = 0;
// Register IoHandler that panics on correct message.
let io_service = IoService::<ClientIoMessage>::start().unwrap();
io_service.register_handler(Arc::new(TestIo(ClientIoMessage::SubmitSeal(Default::default(), seal)))).unwrap();
engine.register_message_channel(io_service.channel());
let h = 1;
let r = 0;
// Prevote.
vote_default(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote);
vote(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote, proposal);
vote_default(&engine, |mh| tap.sign(v0, None, mh).ok().map(H520::from), h, r, Step::Prevote);
vote_default(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote);
vote(&engine, |mh| tap.sign(v0, None, mh).ok().map(H520::from), h, r, Step::Prevote, proposal);
vote(&engine, |mh| tap.sign(v1, None, mh).ok().map(H520::from), h, r, Step::Prevote, proposal);
}
#[test]