Add test for tvu POH verification (#1844)

This commit is contained in:
Sagar Dhawan 2018-11-16 15:48:10 -08:00 committed by GitHub
parent 6ac5700f2e
commit 12ae7b9a6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 91 additions and 1 deletions

View File

@ -111,7 +111,7 @@ impl ReplicateStage {
if res.is_err() {
// TODO: This will return early from the first entry that has an erroneous
// transaction, instad of processing the rest of the entries in the vector
// transaction, instead of processing the rest of the entries in the vector
// of received entries. This is in line with previous behavior when
// bank.process_entries() was used to process the entries, but doesn't solve the
// issue that the bank state was still changed, leading to inconsistencies with the
@ -242,6 +242,7 @@ impl Service for ReplicateStage {
#[cfg(test)]
mod test {
use bank::Bank;
use cluster_info::{ClusterInfo, Node};
use entry::Entry;
use fullnode::Fullnode;
@ -249,6 +250,7 @@ mod test {
use leader_scheduler::{make_active_set_entries, LeaderScheduler, LeaderSchedulerConfig};
use ledger::{create_ticks, create_tmp_sample_ledger, LedgerWriter};
use logger;
use packet::BlobError;
use replicate_stage::{ReplicateStage, ReplicateStageReturnType};
use result::Error;
use service::Service;
@ -596,4 +598,92 @@ mod test {
assert_eq!(exit.load(Ordering::Relaxed), true);
let _ignored = remove_dir_all(&my_ledger_path);
}
#[test]
fn test_replicate_stage_poh_error_entry_receiver() {
// Set up dummy node to host a ReplicateStage
let my_keypair = Keypair::new();
let my_id = my_keypair.pubkey();
let vote_keypair = Keypair::new();
let my_node = Node::new_localhost_with_pubkey(my_id);
// Set up the cluster info
let cluster_info_me = Arc::new(RwLock::new(
ClusterInfo::new(my_node.info.clone()).expect("ClusterInfo::new"),
));
let (entry_sender, entry_receiver) = channel();
let (ledger_entry_sender, _ledger_entry_receiver) = channel();
let mut last_entry_id = Hash::default();
// Create keypair for the old leader
let old_leader_id = Keypair::new().pubkey();
let (_, my_ledger_path, _) = create_tmp_sample_ledger(
"test_replicate_stage_leader_rotation_exit",
10_000,
0,
old_leader_id,
500,
);
let mut entry_height = 0;
let mut last_id = Hash::default();
let mut entries = Vec::new();
for _ in 0..5 {
let entry = Entry::new(&mut last_id, 1, vec![]); //just ticks
last_id = entry.id;
entries.push(entry);
}
entry_sender
.send(entries.clone())
.expect("Expected to err out");
let res = ReplicateStage::replicate_requests(
&Arc::new(Bank::default()),
&cluster_info_me,
&entry_receiver,
&Arc::new(my_keypair),
&Arc::new(vote_keypair),
None,
&ledger_entry_sender,
&mut entry_height,
&mut last_entry_id,
);
match res {
Ok(_) => (),
Err(e) => assert!(false, "Entries were not sent correctly {:?}", e),
}
entries.clear();
for _ in 0..5 {
let entry = Entry::new(&mut Hash::default(), 0, vec![]); //just broken entries
entries.push(entry);
}
entry_sender
.send(entries.clone())
.expect("Expected to err out");
let res = ReplicateStage::replicate_requests(
&Arc::new(Bank::default()),
&cluster_info_me,
&entry_receiver,
&Arc::new(Keypair::new()),
&Arc::new(Keypair::new()),
None,
&ledger_entry_sender,
&mut entry_height,
&mut last_entry_id,
);
match res {
Ok(_) => assert!(false, "Should have failed because entries are broken"),
Err(Error::BlobError(BlobError::VerificationFailed)) => (),
Err(e) => assert!(
false,
"Should have failed because with blob error, instead, got {:?}",
e
),
}
let _ignored = remove_dir_all(&my_ledger_path);
}
}