From 978fd6858fb93e0f4abc837ff8c0d2c6b367773f Mon Sep 17 00:00:00 2001 From: Stephen Akridge Date: Thu, 29 Nov 2018 09:29:17 -0800 Subject: [PATCH] Move replicator_startup_test to integration test set Sometimes fails when run multithreaded with other tests. --- src/replicator.rs | 105 +----------------------------------------- tests/replicator.rs | 108 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 104 deletions(-) create mode 100644 tests/replicator.rs diff --git a/src/replicator.rs b/src/replicator.rs index e8c525532c..e8dd5d49c6 100644 --- a/src/replicator.rs +++ b/src/replicator.rs @@ -175,118 +175,15 @@ impl Replicator { #[cfg(test)] mod tests { - use client::mk_client; - use cluster_info::Node; - use db_ledger::DbLedger; - use fullnode::Fullnode; - use leader_scheduler::LeaderScheduler; - use ledger::{create_tmp_genesis, get_tmp_ledger_path, read_ledger}; use logger; use replicator::sample_file; - use replicator::Replicator; use signature::{Keypair, KeypairUtil}; use solana_sdk::hash::Hash; use std::fs::File; - use std::fs::{create_dir_all, remove_dir_all, remove_file}; + use std::fs::{create_dir_all, remove_file}; use std::io::Write; use std::mem::size_of; use std::path::PathBuf; - use std::sync::atomic::{AtomicBool, Ordering}; - use std::sync::Arc; - use std::thread::sleep; - use std::time::Duration; - - #[test] - fn test_replicator_startup() { - logger::setup(); - info!("starting replicator test"); - let entry_height = 0; - let replicator_ledger_path = &get_tmp_ledger_path("replicator_test_replicator_ledger"); - - let exit = Arc::new(AtomicBool::new(false)); - let done = Arc::new(AtomicBool::new(false)); - - info!("starting leader node"); - let leader_keypair = Arc::new(Keypair::new()); - let leader_node = Node::new_localhost_with_pubkey(leader_keypair.pubkey()); - let network_addr = leader_node.sockets.gossip.local_addr().unwrap(); - let leader_info = leader_node.info.clone(); - let vote_account_keypair = Arc::new(Keypair::new()); - - let leader_ledger_path = "replicator_test_leader_ledger"; - let (mint, leader_ledger_path) = - create_tmp_genesis(leader_ledger_path, 100, leader_info.id, 1); - - { - let leader = Fullnode::new( - leader_node, - &leader_ledger_path, - leader_keypair, - vote_account_keypair, - None, - false, - LeaderScheduler::from_bootstrap_leader(leader_info.id), - None, - ); - - let mut leader_client = mk_client(&leader_info); - - let bob = Keypair::new(); - - let last_id = leader_client.get_last_id(); - leader_client - .transfer(1, &mint.keypair(), bob.pubkey(), &last_id) - .unwrap(); - - let replicator_keypair = Keypair::new(); - - info!("starting replicator node"); - let replicator_node = Node::new_localhost_with_pubkey(replicator_keypair.pubkey()); - let (replicator, _leader_info) = Replicator::new( - entry_height, - 1, - &exit, - Some(replicator_ledger_path), - replicator_node, - Some(network_addr), - done.clone(), - ); - - let mut num_entries = 0; - for _ in 0..60 { - match read_ledger(replicator_ledger_path, true) { - Ok(entries) => { - for _ in entries { - num_entries += 1; - } - info!("{} entries", num_entries); - if num_entries > 0 { - break; - } - } - Err(e) => { - info!("error reading ledger: {:?}", e); - } - } - sleep(Duration::from_millis(300)); - let last_id = leader_client.get_last_id(); - leader_client - .transfer(1, &mint.keypair(), bob.pubkey(), &last_id) - .unwrap(); - } - assert_eq!(done.load(Ordering::Relaxed), true); - assert!(num_entries > 0); - exit.store(true, Ordering::Relaxed); - replicator.join(); - leader.exit(); - } - - DbLedger::destroy(&leader_ledger_path).expect("Expected successful database destuction"); - DbLedger::destroy(&replicator_ledger_path) - .expect("Expected successful database destuction"); - let _ignored = remove_dir_all(&leader_ledger_path); - let _ignored = remove_dir_all(&replicator_ledger_path); - } fn tmp_file_path(name: &str) -> PathBuf { use std::env; diff --git a/tests/replicator.rs b/tests/replicator.rs new file mode 100644 index 0000000000..8d3f8eecea --- /dev/null +++ b/tests/replicator.rs @@ -0,0 +1,108 @@ +#[macro_use] +extern crate log; +extern crate solana; + +use solana::client::mk_client; +use solana::cluster_info::Node; +use solana::db_ledger::DbLedger; +use solana::fullnode::Fullnode; +use solana::leader_scheduler::LeaderScheduler; +use solana::ledger::{create_tmp_genesis, get_tmp_ledger_path, read_ledger}; +use solana::logger; +use solana::replicator::Replicator; +use solana::signature::{Keypair, KeypairUtil}; +use std::fs::remove_dir_all; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; +use std::thread::sleep; +use std::time::Duration; + +#[test] +fn test_replicator_startup() { + logger::setup(); + info!("starting replicator test"); + let entry_height = 0; + let replicator_ledger_path = &get_tmp_ledger_path("replicator_test_replicator_ledger"); + + let exit = Arc::new(AtomicBool::new(false)); + let done = Arc::new(AtomicBool::new(false)); + + info!("starting leader node"); + let leader_keypair = Arc::new(Keypair::new()); + let leader_node = Node::new_localhost_with_pubkey(leader_keypair.pubkey()); + let network_addr = leader_node.sockets.gossip.local_addr().unwrap(); + let leader_info = leader_node.info.clone(); + let vote_account_keypair = Arc::new(Keypair::new()); + + let leader_ledger_path = "replicator_test_leader_ledger"; + let (mint, leader_ledger_path) = create_tmp_genesis(leader_ledger_path, 100, leader_info.id, 1); + + { + let leader = Fullnode::new( + leader_node, + &leader_ledger_path, + leader_keypair, + vote_account_keypair, + None, + false, + LeaderScheduler::from_bootstrap_leader(leader_info.id), + None, + ); + + let mut leader_client = mk_client(&leader_info); + + let bob = Keypair::new(); + + let last_id = leader_client.get_last_id(); + leader_client + .transfer(1, &mint.keypair(), bob.pubkey(), &last_id) + .unwrap(); + + let replicator_keypair = Keypair::new(); + + info!("starting replicator node"); + let replicator_node = Node::new_localhost_with_pubkey(replicator_keypair.pubkey()); + let (replicator, _leader_info) = Replicator::new( + entry_height, + 1, + &exit, + Some(replicator_ledger_path), + replicator_node, + Some(network_addr), + done.clone(), + ); + + let mut num_entries = 0; + for _ in 0..60 { + match read_ledger(replicator_ledger_path, true) { + Ok(entries) => { + for _ in entries { + num_entries += 1; + } + info!("{} entries", num_entries); + if num_entries > 0 { + break; + } + } + Err(e) => { + info!("error reading ledger: {:?}", e); + } + } + sleep(Duration::from_millis(300)); + let last_id = leader_client.get_last_id(); + leader_client + .transfer(1, &mint.keypair(), bob.pubkey(), &last_id) + .unwrap(); + } + assert_eq!(done.load(Ordering::Relaxed), true); + assert!(num_entries > 0); + exit.store(true, Ordering::Relaxed); + replicator.join(); + leader.exit(); + } + + DbLedger::destroy(&leader_ledger_path).expect("Expected successful database destuction"); + DbLedger::destroy(&replicator_ledger_path).expect("Expected successful database destuction"); + let _ignored = remove_dir_all(&leader_ledger_path); + let _ignored = remove_dir_all(&replicator_ledger_path); +}