finalize unit tests
This commit is contained in:
parent
8ed89bb74f
commit
f8ed5cf022
@ -130,8 +130,8 @@ impl Tendermint {
|
|||||||
fn update_sealing(&self) {
|
fn update_sealing(&self) {
|
||||||
if let Some(ref channel) = *self.message_channel.lock() {
|
if let Some(ref channel) = *self.message_channel.lock() {
|
||||||
match channel.send(ClientIoMessage::UpdateSealing) {
|
match channel.send(ClientIoMessage::UpdateSealing) {
|
||||||
Ok(_) => trace!(target: "poa", "update_sealing: UpdateSealing message sent."),
|
Ok(_) => trace!(target: "poa", "UpdateSealing message sent."),
|
||||||
Err(err) => warn!(target: "poa", "update_sealing: Could not send a sealing message {}.", err),
|
Err(err) => warn!(target: "poa", "Could not send a sealing message {}.", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,8 +139,8 @@ impl Tendermint {
|
|||||||
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>) {
|
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>) {
|
||||||
if let Some(ref channel) = *self.message_channel.lock() {
|
if let Some(ref channel) = *self.message_channel.lock() {
|
||||||
match channel.send(ClientIoMessage::SubmitSeal(block_hash, seal)) {
|
match channel.send(ClientIoMessage::SubmitSeal(block_hash, seal)) {
|
||||||
Ok(_) => trace!(target: "poa", "submit_seal: SubmitSeal message sent."),
|
Ok(_) => trace!(target: "poa", "SubmitSeal message sent."),
|
||||||
Err(err) => warn!(target: "poa", "submit_seal: Could not send a sealing message {}.", err),
|
Err(err) => warn!(target: "poa", "Could not send a sealing message {}.", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -149,7 +149,7 @@ impl Tendermint {
|
|||||||
let channel = self.message_channel.lock().clone();
|
let channel = self.message_channel.lock().clone();
|
||||||
if let Some(ref channel) = channel {
|
if let Some(ref channel) = channel {
|
||||||
match channel.send(ClientIoMessage::BroadcastMessage(message)) {
|
match channel.send(ClientIoMessage::BroadcastMessage(message)) {
|
||||||
Ok(_) => trace!(target: "poa", "broadcast_message: BroadcastMessage message sent."),
|
Ok(_) => trace!(target: "poa", "BroadcastMessage message sent."),
|
||||||
Err(err) => warn!(target: "poa", "broadcast_message: Could not send a sealing message {}.", err),
|
Err(err) => warn!(target: "poa", "broadcast_message: Could not send a sealing message {}.", err),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -175,12 +175,12 @@ impl Tendermint {
|
|||||||
Some(message_rlp)
|
Some(message_rlp)
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
trace!(target: "poa", "generate_message: Could not sign the message {}", e);
|
trace!(target: "poa", "Could not sign the message {}", e);
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
warn!(target: "poa", "generate_message: No AccountProvider available.");
|
warn!(target: "poa", "No AccountProvider available.");
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,9 +226,10 @@ impl Tendermint {
|
|||||||
self.generate_and_broadcast_message(block_hash);
|
self.generate_and_broadcast_message(block_hash);
|
||||||
},
|
},
|
||||||
Step::Precommit => {
|
Step::Precommit => {
|
||||||
|
trace!(target: "poa", "to_step: Precommit.");
|
||||||
let block_hash = match *self.lock_change.read() {
|
let block_hash = match *self.lock_change.read() {
|
||||||
Some(ref m) if self.is_round(m) && m.block_hash.is_some() => {
|
Some(ref m) if self.is_round(m) && m.block_hash.is_some() => {
|
||||||
trace!(target: "poa", "to_step: Setting last lock: {}", m.round);
|
trace!(target: "poa", "Setting last lock: {}", m.round);
|
||||||
self.last_lock.store(m.round, AtomicOrdering::SeqCst);
|
self.last_lock.store(m.round, AtomicOrdering::SeqCst);
|
||||||
m.block_hash
|
m.block_hash
|
||||||
},
|
},
|
||||||
@ -245,7 +246,7 @@ impl Tendermint {
|
|||||||
// Generate seal and remove old votes.
|
// Generate seal and remove old votes.
|
||||||
if self.is_proposer(&*self.authority.read()).is_ok() {
|
if self.is_proposer(&*self.authority.read()).is_ok() {
|
||||||
if let Some(seal) = self.votes.seal_signatures(height, round, block_hash) {
|
if let Some(seal) = self.votes.seal_signatures(height, round, block_hash) {
|
||||||
trace!(target: "poa", "to_step: Collected seal: {:?}", seal);
|
trace!(target: "poa", "Collected seal: {:?}", seal);
|
||||||
let seal = vec![
|
let seal = vec![
|
||||||
::rlp::encode(&round).to_vec(),
|
::rlp::encode(&round).to_vec(),
|
||||||
::rlp::encode(&seal.proposal).to_vec(),
|
::rlp::encode(&seal.proposal).to_vec(),
|
||||||
@ -331,10 +332,11 @@ impl Tendermint {
|
|||||||
Some(ref lock) => message > lock,
|
Some(ref lock) => message > lock,
|
||||||
None => true,
|
None => true,
|
||||||
};
|
};
|
||||||
if is_newer_than_lock
|
let lock_change = is_newer_than_lock
|
||||||
&& message.step == Step::Prevote
|
&& message.step == Step::Prevote
|
||||||
&& message.block_hash.is_some()
|
&& message.block_hash.is_some()
|
||||||
&& self.has_enough_aligned_votes(message) {
|
&& self.has_enough_aligned_votes(message);
|
||||||
|
if lock_change {
|
||||||
trace!(target: "poa", "handle_valid_message: Lock change.");
|
trace!(target: "poa", "handle_valid_message: Lock change.");
|
||||||
*self.lock_change.write() = Some(message.clone());
|
*self.lock_change.write() = Some(message.clone());
|
||||||
}
|
}
|
||||||
@ -353,6 +355,8 @@ impl Tendermint {
|
|||||||
self.increment_round(message.round - self.round.load(AtomicOrdering::SeqCst));
|
self.increment_round(message.round - self.round.load(AtomicOrdering::SeqCst));
|
||||||
Some(Step::Precommit)
|
Some(Step::Precommit)
|
||||||
},
|
},
|
||||||
|
// Avoid counting twice.
|
||||||
|
Step::Prevote if lock_change => Some(Step::Precommit),
|
||||||
Step::Prevote if self.has_enough_aligned_votes(message) => Some(Step::Precommit),
|
Step::Prevote if self.has_enough_aligned_votes(message) => Some(Step::Precommit),
|
||||||
Step::Prevote if self.has_enough_future_step_votes(message) => {
|
Step::Prevote if self.has_enough_future_step_votes(message) => {
|
||||||
self.increment_round(message.round - self.round.load(AtomicOrdering::SeqCst));
|
self.increment_round(message.round - self.round.load(AtomicOrdering::SeqCst));
|
||||||
@ -362,7 +366,7 @@ impl Tendermint {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if let Some(step) = next_step {
|
if let Some(step) = next_step {
|
||||||
trace!(target: "poa", "handle_valid_message: Transition to {:?} triggered.", step);
|
trace!(target: "poa", "Transition to {:?} triggered.", step);
|
||||||
self.to_step(step);
|
self.to_step(step);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -608,30 +612,30 @@ impl Engine for Tendermint {
|
|||||||
fn step(&self) {
|
fn step(&self) {
|
||||||
let next_step = match *self.step.read() {
|
let next_step = match *self.step.read() {
|
||||||
Step::Propose => {
|
Step::Propose => {
|
||||||
trace!(target: "poa", "timeout: Propose timeout.");
|
trace!(target: "poa", "Propose timeout.");
|
||||||
Step::Prevote
|
Step::Prevote
|
||||||
},
|
},
|
||||||
Step::Prevote if self.has_enough_any_votes() => {
|
Step::Prevote if self.has_enough_any_votes() => {
|
||||||
trace!(target: "poa", "timeout: Prevote timeout.");
|
trace!(target: "poa", "Prevote timeout.");
|
||||||
Step::Precommit
|
Step::Precommit
|
||||||
},
|
},
|
||||||
Step::Prevote => {
|
Step::Prevote => {
|
||||||
trace!(target: "poa", "timeout: Prevote timeout without enough votes.");
|
trace!(target: "poa", "Prevote timeout without enough votes.");
|
||||||
self.broadcast_old_messages();
|
self.broadcast_old_messages();
|
||||||
Step::Prevote
|
Step::Prevote
|
||||||
},
|
},
|
||||||
Step::Precommit if self.has_enough_any_votes() => {
|
Step::Precommit if self.has_enough_any_votes() => {
|
||||||
trace!(target: "poa", "timeout: Precommit timeout.");
|
trace!(target: "poa", "Precommit timeout.");
|
||||||
self.increment_round(1);
|
self.increment_round(1);
|
||||||
Step::Propose
|
Step::Propose
|
||||||
},
|
},
|
||||||
Step::Precommit => {
|
Step::Precommit => {
|
||||||
trace!(target: "poa", "timeout: Precommit timeout without enough votes.");
|
trace!(target: "poa", "Precommit timeout without enough votes.");
|
||||||
self.broadcast_old_messages();
|
self.broadcast_old_messages();
|
||||||
Step::Precommit
|
Step::Precommit
|
||||||
},
|
},
|
||||||
Step::Commit => {
|
Step::Commit => {
|
||||||
trace!(target: "poa", "timeout: Commit timeout.");
|
trace!(target: "poa", "Commit timeout.");
|
||||||
Step::Propose
|
Step::Propose
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -639,7 +643,7 @@ impl Engine for Tendermint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn register_message_channel(&self, message_channel: IoChannel<ClientIoMessage>) {
|
fn register_message_channel(&self, message_channel: IoChannel<ClientIoMessage>) {
|
||||||
trace!(target: "poa", "register_message_channel: Register the IoChannel.");
|
trace!(target: "poa", "Register the IoChannel.");
|
||||||
*self.message_channel.lock() = Some(message_channel);
|
*self.message_channel.lock() = Some(message_channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -910,6 +914,9 @@ mod tests {
|
|||||||
|
|
||||||
let prevote_future = vote(&engine, |mh| tap.sign(v0, None, mh).map(H520::from), h + 1, r, Step::Prevote, proposal);
|
let prevote_future = vote(&engine, |mh| tap.sign(v0, None, mh).map(H520::from), h + 1, r, Step::Prevote, proposal);
|
||||||
|
|
||||||
|
// Wait a bit for async stuff.
|
||||||
|
::std::thread::sleep(::std::time::Duration::from_millis(500));
|
||||||
|
|
||||||
// Relays all valid present and future messages.
|
// Relays all valid present and future messages.
|
||||||
assert!(test_io.received.read().contains(&ClientIoMessage::BroadcastMessage(prevote_current)));
|
assert!(test_io.received.read().contains(&ClientIoMessage::BroadcastMessage(prevote_current)));
|
||||||
assert!(test_io.received.read().contains(&ClientIoMessage::BroadcastMessage(precommit_current)));
|
assert!(test_io.received.read().contains(&ClientIoMessage::BroadcastMessage(precommit_current)));
|
||||||
@ -919,7 +926,6 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn seal_submission() {
|
fn seal_submission() {
|
||||||
::env_logger::init().unwrap();
|
|
||||||
let (spec, tap) = setup();
|
let (spec, tap) = setup();
|
||||||
let engine = spec.engine.clone();
|
let engine = spec.engine.clone();
|
||||||
let mut db_result = get_temp_state_db();
|
let mut db_result = get_temp_state_db();
|
||||||
@ -932,32 +938,27 @@ mod tests {
|
|||||||
let h = 1;
|
let h = 1;
|
||||||
let r = 0;
|
let r = 0;
|
||||||
|
|
||||||
// Propose
|
|
||||||
let (b, mut seal) = propose_default(&spec, v1.clone());
|
|
||||||
let proposal = Some(b.header().bare_hash());
|
|
||||||
|
|
||||||
let test_io = TestIo::new();
|
|
||||||
|
|
||||||
// Register IoHandler remembers messages.
|
// Register IoHandler remembers messages.
|
||||||
|
let test_io = TestIo::new();
|
||||||
let io_service = IoService::<ClientIoMessage>::start().unwrap();
|
let io_service = IoService::<ClientIoMessage>::start().unwrap();
|
||||||
io_service.register_handler(test_io.clone()).unwrap();
|
io_service.register_handler(test_io.clone()).unwrap();
|
||||||
engine.register_message_channel(io_service.channel());
|
engine.register_message_channel(io_service.channel());
|
||||||
|
|
||||||
|
// Propose
|
||||||
|
let (b, mut seal) = propose_default(&spec, v1.clone());
|
||||||
|
let proposal = Some(b.header().bare_hash());
|
||||||
|
engine.step();
|
||||||
|
|
||||||
// Prevote.
|
// Prevote.
|
||||||
vote(&engine, |mh| tap.sign(v1, None, mh).map(H520::from), h, r, Step::Prevote, proposal);
|
vote(&engine, |mh| tap.sign(v1, None, mh).map(H520::from), h, r, Step::Prevote, proposal);
|
||||||
println!("sending second prevote");
|
|
||||||
vote(&engine, |mh| tap.sign(v0, None, mh).map(H520::from), h, r, Step::Prevote, proposal);
|
vote(&engine, |mh| tap.sign(v0, None, mh).map(H520::from), h, r, Step::Prevote, proposal);
|
||||||
println!("sending first precommit");
|
|
||||||
vote(&engine, |mh| tap.sign(v1, None, mh).map(H520::from), h, r, Step::Precommit, proposal);
|
vote(&engine, |mh| tap.sign(v1, None, mh).map(H520::from), h, r, Step::Precommit, proposal);
|
||||||
println!("sending last precommit");
|
|
||||||
vote(&engine, |mh| tap.sign(v0, None, mh).map(H520::from), h, r, Step::Precommit, proposal);
|
vote(&engine, |mh| tap.sign(v0, None, mh).map(H520::from), h, r, Step::Precommit, proposal);
|
||||||
|
|
||||||
// Wait a bit for async stuff.
|
// Wait a bit for async stuff.
|
||||||
::std::thread::sleep(::std::time::Duration::from_millis(100));
|
::std::thread::sleep(::std::time::Duration::from_millis(500));
|
||||||
|
|
||||||
seal[2] = precommit_signatures(&tap, h, r, Some(b.header().bare_hash()), v1, v0);
|
seal[2] = precommit_signatures(&tap, h, r, Some(b.header().bare_hash()), v1, v0);
|
||||||
println!("should {:?}, {:?}", proposal.unwrap(), seal);
|
|
||||||
println!("{:?}", *test_io.received.read());
|
|
||||||
assert!(test_io.received.read().contains(&ClientIoMessage::SubmitSeal(proposal.unwrap(), seal)));
|
assert!(test_io.received.read().contains(&ClientIoMessage::SubmitSeal(proposal.unwrap(), seal)));
|
||||||
engine.stop();
|
engine.stop();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user