add test for populated window
This commit is contained in:
parent
ed0a590549
commit
412e15fbdc
|
@ -287,6 +287,94 @@ fn test_boot_validator_from_file() {
|
||||||
std::fs::remove_file(ledger_path).unwrap();
|
std::fs::remove_file(ledger_path).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn restart_leader(
|
||||||
|
exit: Option<Arc<AtomicBool>>,
|
||||||
|
leader_fullnode: Option<FullNode>,
|
||||||
|
ledger_path: String,
|
||||||
|
) -> (ReplicatedData, FullNode, Arc<AtomicBool>) {
|
||||||
|
if let (Some(exit), Some(leader_fullnode)) = (exit, leader_fullnode) {
|
||||||
|
// stop the leader
|
||||||
|
exit.store(true, Ordering::Relaxed);
|
||||||
|
leader_fullnode.join().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let leader = TestNode::new();
|
||||||
|
let leader_data = leader.data.clone();
|
||||||
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
|
let leader_fullnode = FullNode::new(
|
||||||
|
leader,
|
||||||
|
true,
|
||||||
|
InFile::Path(ledger_path.clone()),
|
||||||
|
None,
|
||||||
|
Some(OutFile::Path(ledger_path.clone())),
|
||||||
|
exit.clone(),
|
||||||
|
);
|
||||||
|
(leader_data, leader_fullnode, exit)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_leader_restart_validator_start_from_old_ledger() {
|
||||||
|
logger::setup();
|
||||||
|
|
||||||
|
let (alice, ledger_path) = genesis(100_000);
|
||||||
|
let bob_pubkey = KeyPair::new().pubkey();
|
||||||
|
|
||||||
|
let (leader_data, leader_fullnode, exit) = restart_leader(None, None, ledger_path.clone());
|
||||||
|
|
||||||
|
// lengthen the ledger
|
||||||
|
let leader_balance =
|
||||||
|
send_tx_and_retry_get_balance(&leader_data, &alice, &bob_pubkey, Some(500)).unwrap();
|
||||||
|
assert_eq!(leader_balance, 500);
|
||||||
|
|
||||||
|
// create a "stale" ledger by copying current ledger
|
||||||
|
let mut stale_ledger_path = ledger_path.clone();
|
||||||
|
stale_ledger_path.insert_str(ledger_path.rfind("/").unwrap() + 1, "stale_");
|
||||||
|
|
||||||
|
std::fs::copy(ledger_path.clone(), stale_ledger_path.clone())
|
||||||
|
.expect(format!("copy {} to {}", &ledger_path, &stale_ledger_path,).as_str());
|
||||||
|
|
||||||
|
// restart the leader
|
||||||
|
let (leader_data, leader_fullnode, exit) =
|
||||||
|
restart_leader(Some(exit), Some(leader_fullnode), ledger_path.clone());
|
||||||
|
|
||||||
|
// lengthen the ledger
|
||||||
|
let leader_balance =
|
||||||
|
send_tx_and_retry_get_balance(&leader_data, &alice, &bob_pubkey, Some(1000)).unwrap();
|
||||||
|
assert_eq!(leader_balance, 1000);
|
||||||
|
|
||||||
|
// restart the leader
|
||||||
|
let (leader_data, leader_fullnode, exit) =
|
||||||
|
restart_leader(Some(exit), Some(leader_fullnode), ledger_path.clone());
|
||||||
|
|
||||||
|
// start validator from old ledger
|
||||||
|
let validator = TestNode::new();
|
||||||
|
let validator_data = validator.data.clone();
|
||||||
|
let val_fullnode = FullNode::new(
|
||||||
|
validator,
|
||||||
|
false,
|
||||||
|
InFile::Path(stale_ledger_path.clone()),
|
||||||
|
Some(leader_data.gossip_addr),
|
||||||
|
None,
|
||||||
|
exit.clone(),
|
||||||
|
);
|
||||||
|
|
||||||
|
// trigger broadcast, validator should catch up from leader, whose window contains
|
||||||
|
// the entries missing from the stale ledger
|
||||||
|
let leader_balance =
|
||||||
|
send_tx_and_retry_get_balance(&leader_data, &alice, &bob_pubkey, Some(1500)).unwrap();
|
||||||
|
assert_eq!(leader_balance, 1500);
|
||||||
|
|
||||||
|
let mut client = mk_client(&validator_data);
|
||||||
|
let getbal = retry_get_balance(&mut client, &bob_pubkey, Some(leader_balance));
|
||||||
|
assert!(getbal == Some(leader_balance));
|
||||||
|
|
||||||
|
exit.store(true, Ordering::Relaxed);
|
||||||
|
leader_fullnode.join().unwrap();
|
||||||
|
val_fullnode.join().unwrap();
|
||||||
|
std::fs::remove_file(ledger_path).unwrap();
|
||||||
|
std::fs::remove_file(stale_ledger_path).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
//TODO: this test will run a long time so its disabled for CI
|
//TODO: this test will run a long time so its disabled for CI
|
||||||
#[test]
|
#[test]
|
||||||
#[ignore]
|
#[ignore]
|
||||||
|
|
Loading…
Reference in New Issue