From e4124e8f2eeb4b20cbffc5e8024db8242035ceb2 Mon Sep 17 00:00:00 2001 From: "A. Hobden" Date: Tue, 4 Sep 2018 10:24:47 -0700 Subject: [PATCH] Initialize the env_logger in tests for tracing. (#103) * Initialize the env_logger in tests for tracing. * fmt run * Log in unit tests as well. * Use extracted init function --- Cargo.toml | 3 + src/errors.rs | 3 + src/lib.rs | 8 ++ src/log_unstable.rs | 7 ++ src/progress.rs | 4 + src/raft_log.rs | 18 +++++ src/raw_node.rs | 2 + src/storage.rs | 9 +++ tests/cases/test_raft.rs | 111 ++++++++++++++++++++++++++ tests/cases/test_raft_flow_control.rs | 4 + tests/cases/test_raft_paper.rs | 27 +++++++ tests/cases/test_raft_snap.rs | 6 ++ tests/cases/test_raw_node.rs | 11 +++ tests/tests.rs | 6 ++ 14 files changed, 219 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 9c9fe7cbb..6e829363d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,9 @@ quick-error = "1.2.2" rand = "0.5.4" fxhash = "0.2.1" +[dev-dependencies] +env_logger = "0.5.12" + [badges] travis-ci = { repository = "pingcap/raft-rs" } diff --git a/src/errors.rs b/src/errors.rs index c76c44696..41ee32689 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -133,10 +133,12 @@ pub type Result = result::Result; #[cfg(test)] mod tests { use super::*; + use setup_for_test; use std::io; #[test] fn test_error_equal() { + setup_for_test(); assert_eq!(Error::StepPeerNotFound, Error::StepPeerNotFound); assert_eq!( Error::Store(StorageError::Compacted), @@ -175,6 +177,7 @@ mod tests { #[test] fn test_storage_error_equal() { + setup_for_test(); assert_eq!(StorageError::Compacted, StorageError::Compacted); assert_eq!(StorageError::Unavailable, StorageError::Unavailable); assert_eq!( diff --git a/src/lib.rs b/src/lib.rs index 1343d6325..475d0bab3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -223,6 +223,8 @@ extern crate log; extern crate protobuf; #[macro_use] extern crate quick_error; +#[cfg(test)] +extern crate env_logger; extern crate rand; mod config; @@ -284,3 +286,9 @@ pub mod prelude { pub use read_only::{ReadOnlyOption, ReadState}; } + +/// Do any common test initialization. Eg set up logging, setup fail-rs. +#[cfg(test)] +pub fn setup_for_test() { + let _ = env_logger::try_init(); +} diff --git a/src/log_unstable.rs b/src/log_unstable.rs index a16d2c34c..87d1a1c44 100644 --- a/src/log_unstable.rs +++ b/src/log_unstable.rs @@ -185,6 +185,7 @@ impl Unstable { mod test { use eraftpb::{Entry, Snapshot, SnapshotMetadata}; use log_unstable::Unstable; + use setup_for_test; fn new_entry(index: u64, term: u64) -> Entry { let mut e = Entry::new(); @@ -204,6 +205,7 @@ mod test { #[test] fn test_maybe_first_index() { + setup_for_test(); // entry, offset, snap, wok, windex, let tests = vec![ // no snapshot @@ -231,6 +233,7 @@ mod test { #[test] fn test_maybe_last_index() { + setup_for_test(); // entry, offset, snap, wok, windex, let tests = vec![ (Some(new_entry(5, 1)), 5, None, true, 5), @@ -258,6 +261,7 @@ mod test { #[test] fn test_maybe_term() { + setup_for_test(); // entry, offset, snap, index, wok, wterm let tests = vec![ // term from entries @@ -319,6 +323,7 @@ mod test { #[test] fn test_restore() { + setup_for_test(); let mut u = Unstable { entries: vec![new_entry(5, 1)], offset: 5, @@ -336,6 +341,7 @@ mod test { #[test] fn test_stable_to() { + setup_for_test(); // entries, offset, snap, index, term, woffset, wlen let tests = vec![ (vec![], 0, None, 5, 1, 0, 0), @@ -415,6 +421,7 @@ mod test { #[test] fn test_truncate_and_append() { + setup_for_test(); // entries, offset, snap, to_append, woffset, wentries let tests = vec![ // replace to the end diff --git a/src/progress.rs b/src/progress.rs index bceea8171..d2a87c2d5 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -417,9 +417,11 @@ impl Inflights { #[cfg(test)] mod test { use progress::Inflights; + use setup_for_test; #[test] fn test_inflight_add() { + setup_for_test(); let mut inflight = Inflights::new(10); for i in 0..5 { inflight.add(i); @@ -479,6 +481,7 @@ mod test { #[test] fn test_inflight_free_to() { + setup_for_test(); let mut inflight = Inflights::new(10); for i in 0..10 { inflight.add(i); @@ -531,6 +534,7 @@ mod test { #[test] fn test_inflight_free_first_one() { + setup_for_test(); let mut inflight = Inflights::new(10); for i in 0..10 { inflight.add(i); diff --git a/src/raft_log.rs b/src/raft_log.rs index 3fbaa1534..83d7f1c80 100644 --- a/src/raft_log.rs +++ b/src/raft_log.rs @@ -491,6 +491,7 @@ mod test { use errors::{Error, StorageError}; use protobuf; use raft_log::{self, RaftLog}; + use setup_for_test; use storage::MemStorage; fn new_raft_log(s: MemStorage) -> RaftLog { @@ -515,6 +516,7 @@ mod test { #[test] fn test_find_conflict() { + setup_for_test(); let previous_ents = vec![new_entry(1, 1), new_entry(2, 2), new_entry(3, 3)]; let tests = vec![ // no conflict, empty ent @@ -572,6 +574,7 @@ mod test { #[test] fn test_is_up_to_date() { + setup_for_test(); let previous_ents = vec![new_entry(1, 1), new_entry(2, 2), new_entry(3, 3)]; let store = MemStorage::new(); let mut raft_log = new_raft_log(store); @@ -600,6 +603,7 @@ mod test { #[test] fn test_append() { + setup_for_test(); let previous_ents = vec![new_entry(1, 1), new_entry(2, 2)]; let tests = vec![ (vec![], 2, vec![new_entry(1, 1), new_entry(2, 2)], 3), @@ -642,6 +646,7 @@ mod test { #[test] fn test_compaction_side_effects() { + setup_for_test(); let last_index = 1000u64; let unstable_index = 750u64; let last_term = last_index; @@ -694,6 +699,7 @@ mod test { #[test] fn test_term_with_unstable_snapshot() { + setup_for_test(); let storagesnapi = 10064; let unstablesnapi = storagesnapi + 5; let store = MemStorage::new(); @@ -724,6 +730,7 @@ mod test { #[test] fn test_term() { + setup_for_test(); let offset = 100u64; let num = 100u64; @@ -755,6 +762,7 @@ mod test { #[test] fn test_log_restore() { + setup_for_test(); let (index, term) = (1000u64, 1000u64); let store = MemStorage::new(); store @@ -773,6 +781,7 @@ mod test { #[test] fn test_stable_to_with_snap() { + setup_for_test(); let (snap_index, snap_term) = (5u64, 2u64); let tests = vec![ (snap_index + 1, snap_term, vec![], snap_index + 1), @@ -839,6 +848,7 @@ mod test { #[test] fn test_stable_to() { + setup_for_test(); let tests = vec![(1, 1, 2), (2, 2, 3), (2, 1, 1), (3, 1, 1)]; for (i, &(stablei, stablet, wunstable)) in tests.iter().enumerate() { let store = MemStorage::new(); @@ -858,6 +868,7 @@ mod test { // entries correctly. #[test] fn test_unstable_ents() { + setup_for_test(); let previous_ents = vec![new_entry(1, 1), new_entry(2, 2)]; let tests = vec![(3, vec![]), (1, previous_ents.clone())]; @@ -891,6 +902,7 @@ mod test { #[test] fn test_next_ents() { + setup_for_test(); let ents = [new_entry(4, 1), new_entry(5, 1), new_entry(6, 1)]; let tests = vec![ (0, Some(&ents[..2])), @@ -918,6 +930,7 @@ mod test { #[test] fn test_has_next_ents() { + setup_for_test(); let ents = [new_entry(4, 1), new_entry(5, 1), new_entry(6, 1)]; let tests = vec![(0, true), (3, true), (4, true), (5, false)]; @@ -938,6 +951,7 @@ mod test { #[test] fn test_slice() { + setup_for_test(); let (offset, num) = (100u64, 100u64); let (last, half) = (offset + num, offset + num / 2); let halfe = new_entry(half, half); @@ -1075,6 +1089,7 @@ mod test { /// return false #[test] fn test_log_maybe_append() { + setup_for_test(); let previous_ents = vec![new_entry(1, 1), new_entry(2, 2), new_entry(3, 3)]; let (last_index, last_term, commit) = (3u64, 3u64, 1u64); @@ -1253,6 +1268,7 @@ mod test { #[test] fn test_commit_to() { + setup_for_test(); let previous_ents = vec![new_entry(1, 1), new_entry(2, 2), new_entry(3, 3)]; let previous_commit = 2u64; let tests = vec![ @@ -1280,6 +1296,7 @@ mod test { // TestCompaction ensures that the number of log entries is correct after compactions. #[test] fn test_compaction() { + setup_for_test(); let tests = vec![ // out of upper bound (1000, vec![1001u64], vec![0usize], false), @@ -1329,6 +1346,7 @@ mod test { #[test] fn test_is_outofbounds() { + setup_for_test(); let (offset, num) = (100u64, 100u64); let store = MemStorage::new(); store diff --git a/src/raw_node.rs b/src/raw_node.rs index b7b7a88a3..18d83c49a 100644 --- a/src/raw_node.rs +++ b/src/raw_node.rs @@ -480,9 +480,11 @@ impl RawNode { mod test { use super::is_local_msg; use eraftpb::MessageType; + use setup_for_test; #[test] fn test_is_local_msg() { + setup_for_test(); let tests = vec![ (MessageType::MsgHup, true), (MessageType::MsgBeat, true), diff --git a/src/storage.rs b/src/storage.rs index a8809ef9c..d51565c8f 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -324,6 +324,7 @@ mod test { use protobuf; use errors::{Error as RaftError, StorageError}; + use setup_for_test; use storage::{MemStorage, Storage}; // TODO extract these duplicated utility functions for tests @@ -350,6 +351,7 @@ mod test { #[test] fn test_storage_term() { + setup_for_test(); let ents = vec![new_entry(3, 3), new_entry(4, 4), new_entry(5, 5)]; let mut tests = vec![ (2, Err(RaftError::Store(StorageError::Compacted))), @@ -372,6 +374,7 @@ mod test { #[test] fn test_storage_entries() { + setup_for_test(); let ents = vec![ new_entry(3, 3), new_entry(4, 4), @@ -441,6 +444,7 @@ mod test { #[test] fn test_storage_last_index() { + setup_for_test(); let ents = vec![new_entry(3, 3), new_entry(4, 4), new_entry(5, 5)]; let storage = MemStorage::new(); storage.wl().entries = ents; @@ -464,6 +468,7 @@ mod test { #[test] fn test_storage_first_index() { + setup_for_test(); let ents = vec![new_entry(3, 3), new_entry(4, 4), new_entry(5, 5)]; let storage = MemStorage::new(); storage.wl().entries = ents; @@ -484,6 +489,7 @@ mod test { #[test] fn test_storage_compact() { + setup_for_test(); let ents = vec![new_entry(3, 3), new_entry(4, 4), new_entry(5, 5)]; let mut tests = vec![ (2, Err(RaftError::Store(StorageError::Compacted)), 3, 3, 3), @@ -516,6 +522,7 @@ mod test { #[test] fn test_storage_create_snapshot() { + setup_for_test(); let ents = vec![new_entry(3, 3), new_entry(4, 4), new_entry(5, 5)]; let nodes = vec![1, 2, 3]; let mut cs = ConfState::new(); @@ -543,6 +550,7 @@ mod test { #[test] fn test_storage_append() { + setup_for_test(); let ents = vec![new_entry(3, 3), new_entry(4, 4), new_entry(5, 5)]; let mut tests = vec![ ( @@ -611,6 +619,7 @@ mod test { #[test] fn test_storage_apply_snapshot() { + setup_for_test(); let nodes = vec![1, 2, 3]; let data = b"data".to_vec(); diff --git a/tests/cases/test_raft.rs b/tests/cases/test_raft.rs index 291e0c368..1eea7ed4d 100644 --- a/tests/cases/test_raft.rs +++ b/tests/cases/test_raft.rs @@ -37,6 +37,7 @@ use raft::eraftpb::{ Snapshot, }; use rand; +use setup_for_test; use raft::storage::MemStorage; use raft::*; @@ -431,6 +432,7 @@ impl Network { #[test] fn test_progress_become_probe() { + setup_for_test(); let matched = 1u64; let mut tests = vec![ ( @@ -466,6 +468,7 @@ fn test_progress_become_probe() { #[test] fn test_progress_become_replicate() { + setup_for_test(); let mut p = new_progress(ProgressState::Probe, 1, 5, 0, 256); p.become_replicate(); @@ -476,6 +479,7 @@ fn test_progress_become_replicate() { #[test] fn test_progress_become_snapshot() { + setup_for_test(); let mut p = new_progress(ProgressState::Probe, 1, 5, 0, 256); p.become_snapshot(10); assert_eq!(p.state, ProgressState::Snapshot); @@ -485,6 +489,7 @@ fn test_progress_become_snapshot() { #[test] fn test_progress_update() { + setup_for_test(); let (prev_m, prev_n) = (3u64, 5u64); let tests = vec![ (prev_m - 1, prev_m, prev_n, false), @@ -513,6 +518,7 @@ fn test_progress_update() { #[test] fn test_progress_maybe_decr() { + setup_for_test(); let tests = vec![ // state replicate and rejected is not greater than match (ProgressState::Replicate, 5, 10, 5, 5, false, 10), @@ -552,6 +558,7 @@ fn test_progress_maybe_decr() { #[test] fn test_progress_is_paused() { + setup_for_test(); let tests = vec![ (ProgressState::Probe, false, false), (ProgressState::Probe, true, true), @@ -577,6 +584,7 @@ fn test_progress_is_paused() { // will reset progress.paused. #[test] fn test_progress_resume() { + setup_for_test(); let mut p = Progress { next_idx: 2, paused: true, @@ -593,6 +601,7 @@ fn test_progress_resume() { // heartbeat response. #[test] fn test_progress_resume_by_heartbeat_resp() { + setup_for_test(); let mut raft = new_test_raft(1, vec![1, 2], 5, 1, new_storage()); raft.become_candidate(); raft.become_leader(); @@ -610,6 +619,7 @@ fn test_progress_resume_by_heartbeat_resp() { #[test] fn test_progress_paused() { + setup_for_test(); let mut raft = new_test_raft(1, vec![1, 2], 5, 1, new_storage()); raft.become_candidate(); raft.become_leader(); @@ -629,11 +639,13 @@ fn test_progress_paused() { #[test] fn test_leader_election() { + setup_for_test(); test_leader_election_with_config(false); } #[test] fn test_leader_election_pre_vote() { + setup_for_test(); test_leader_election_with_config(true); } @@ -708,11 +720,13 @@ fn test_leader_election_with_config(pre_vote: bool) { #[test] fn test_leader_cycle() { + setup_for_test(); test_leader_cycle_with_config(false) } #[test] fn test_leader_cycle_pre_vote() { + setup_for_test(); test_leader_cycle_with_config(true) } @@ -749,11 +763,13 @@ fn test_leader_cycle_with_config(pre_vote: bool) { #[test] fn test_leader_election_overwrite_newer_logs() { + setup_for_test(); test_leader_election_overwrite_newer_logs_with_config(false); } #[test] fn test_leader_election_overwrite_newer_logs_pre_vote() { + setup_for_test(); test_leader_election_overwrite_newer_logs_with_config(true); } @@ -829,11 +845,13 @@ fn test_leader_election_overwrite_newer_logs_with_config(pre_vote: bool) { #[test] fn test_vote_from_any_state() { + setup_for_test(); test_vote_from_any_state_for_type(MessageType::MsgRequestVote); } #[test] fn test_prevote_from_any_state() { + setup_for_test(); test_vote_from_any_state_for_type(MessageType::MsgRequestPreVote); } @@ -941,6 +959,7 @@ fn test_vote_from_any_state_for_type(vt: MessageType) { #[test] fn test_log_replicatioin() { + setup_for_test(); let mut tests = vec![ ( Network::new(vec![None, None, None]), @@ -998,6 +1017,7 @@ fn test_log_replicatioin() { #[test] fn test_single_node_commit() { + setup_for_test(); let mut tt = Network::new(vec![None]); tt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); tt.send(vec![new_message(1, 1, MessageType::MsgPropose, 1)]); @@ -1011,6 +1031,7 @@ fn test_single_node_commit() { // filtered. #[test] fn test_cannot_commit_without_new_term_entry() { + setup_for_test(); let mut tt = Network::new(vec![None, None, None, None, None]); tt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -1048,6 +1069,7 @@ fn test_cannot_commit_without_new_term_entry() { // when leader changes, no new proposal comes in. #[test] fn test_commit_without_new_term_entry() { + setup_for_test(); let mut tt = Network::new(vec![None, None, None, None, None]); tt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -1074,6 +1096,7 @@ fn test_commit_without_new_term_entry() { #[test] fn test_dueling_candidates() { + setup_for_test(); let a = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let b = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let c = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -1127,6 +1150,7 @@ fn test_dueling_candidates() { #[test] fn test_dueling_pre_candidates() { + setup_for_test(); let a = new_test_raft_with_prevote(1, vec![1, 2, 3], 10, 1, new_storage(), true); let b = new_test_raft_with_prevote(2, vec![1, 2, 3], 10, 1, new_storage(), true); let c = new_test_raft_with_prevote(3, vec![1, 2, 3], 10, 1, new_storage(), true); @@ -1176,6 +1200,7 @@ fn test_dueling_pre_candidates() { #[test] fn test_candidate_concede() { + setup_for_test(); let mut tt = Network::new(vec![None, None, None]); tt.isolate(1); @@ -1210,6 +1235,7 @@ fn test_candidate_concede() { #[test] fn test_single_node_candidate() { + setup_for_test(); let mut tt = Network::new(vec![None]); tt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -1218,6 +1244,7 @@ fn test_single_node_candidate() { #[test] fn test_sinle_node_pre_candidate() { + setup_for_test(); let mut tt = Network::new_with_config(vec![None], true); tt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -1226,6 +1253,7 @@ fn test_sinle_node_pre_candidate() { #[test] fn test_old_messages() { + setup_for_test(); let mut tt = Network::new(vec![None, None, None]); // make 0 leader @ term 3 tt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -1259,6 +1287,7 @@ fn test_old_messages() { #[test] fn test_proposal() { + setup_for_test(); let mut tests = vec![ (Network::new(vec![None, None, None]), true), (Network::new(vec![None, None, NOP_STEPPER]), true), @@ -1305,6 +1334,7 @@ fn test_proposal() { #[test] fn test_proposal_by_proxy() { + setup_for_test(); let mut tests = vec![ Network::new(vec![None, None, None]), Network::new(vec![None, None, NOP_STEPPER]), @@ -1335,6 +1365,7 @@ fn test_proposal_by_proxy() { #[test] fn test_commit() { + setup_for_test(); let mut tests = vec![ // single (vec![1u64], vec![empty_entry(1, 1)], 1u64, 1u64), @@ -1428,6 +1459,7 @@ fn test_commit() { #[test] fn test_pass_election_timeout() { + setup_for_test(); let tests = vec![ (5, 0f64, false), (10, 0.1, true), @@ -1461,6 +1493,7 @@ fn test_pass_election_timeout() { // actual stepX function. #[test] fn test_step_ignore_old_term_msg() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1], 10, 1, new_storage()); let panic_before_step_state = Box::new(|_: &Message| panic!("before step state function hook called unexpectedly")); @@ -1479,6 +1512,7 @@ fn test_step_ignore_old_term_msg() { // 3. If leaderCommit > commitIndex, set commitIndex = min(leaderCommit, index of last new entry). #[test] fn test_handle_msg_append() { + setup_for_test(); let nm = |term, log_term, index, commit, ents: Option>| { let mut m = Message::new(); m.set_msg_type(MessageType::MsgAppend); @@ -1548,6 +1582,7 @@ fn test_handle_msg_append() { // test_handle_heartbeat ensures that the follower commits to the commit in the message. #[test] fn test_handle_heartbeat() { + setup_for_test(); let commit = 2u64; let nw = |f, to, term, commit| { let mut m = new_message(f, to, MessageType::MsgHeartbeat, 0); @@ -1592,6 +1627,7 @@ fn test_handle_heartbeat() { // test_handle_heartbeat_resp ensures that we re-send log entries when we get a heartbeat response. #[test] fn test_handle_heartbeat_resp() { + setup_for_test(); let store = new_storage(); store .wl() @@ -1635,6 +1671,7 @@ fn test_handle_heartbeat_resp() { // related issue: https://github.com/coreos/etcd/issues/7571 #[test] fn test_raft_frees_read_only_mem() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2], 5, 1, new_storage()); sm.become_candidate(); sm.become_leader(); @@ -1676,6 +1713,7 @@ fn test_raft_frees_read_only_mem() { // MsgAppResp. #[test] fn test_msg_append_response_wait_reset() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2, 3], 5, 1, new_storage()); sm.become_candidate(); sm.become_leader(); @@ -1721,6 +1759,7 @@ fn test_msg_append_response_wait_reset() { #[test] fn test_recv_msg_request_vote() { + setup_for_test(); test_recv_msg_request_vote_for_type(MessageType::MsgRequestVote); } @@ -1801,6 +1840,7 @@ fn test_recv_msg_request_vote_for_type(msg_type: MessageType) { #[test] fn test_state_transition() { + setup_for_test(); let mut tests = vec![ ( StateRole::Follower, @@ -1913,6 +1953,7 @@ fn test_state_transition() { #[test] fn test_all_server_stepdown() { + setup_for_test(); let mut tests = vec![ (StateRole::Follower, StateRole::Follower, 3, 0), (StateRole::PreCandidate, StateRole::Follower, 3, 0), @@ -1974,11 +2015,13 @@ fn test_all_server_stepdown() { #[test] fn test_candidate_reset_term_msg_heartbeat() { + setup_for_test(); test_candidate_reset_term(MessageType::MsgHeartbeat) } #[test] fn test_candidate_reset_term_msg_append() { + setup_for_test(); test_candidate_reset_term(MessageType::MsgAppend) } @@ -2039,6 +2082,7 @@ fn test_candidate_reset_term(message_type: MessageType) { #[test] fn test_leader_stepdown_when_quorum_active() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2, 3], 5, 1, new_storage()); sm.check_quorum = true; sm.become_candidate(); @@ -2056,6 +2100,7 @@ fn test_leader_stepdown_when_quorum_active() { #[test] fn test_leader_stepdown_when_quorum_lost() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2, 3], 5, 1, new_storage()); sm.check_quorum = true; @@ -2072,6 +2117,7 @@ fn test_leader_stepdown_when_quorum_lost() { #[test] fn test_leader_superseding_with_check_quorum() { + setup_for_test(); let mut a = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let mut b = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let mut c = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -2112,6 +2158,7 @@ fn test_leader_superseding_with_check_quorum() { #[test] fn test_leader_election_with_check_quorum() { + setup_for_test(); let mut a = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let mut b = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let mut c = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -2173,6 +2220,7 @@ fn test_leader_election_with_check_quorum() { // leader is expected to step down and adopt the candidate's term #[test] fn test_free_stuck_candidate_with_check_quorum() { + setup_for_test(); let mut a = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let mut b = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let mut c = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -2226,6 +2274,7 @@ fn test_free_stuck_candidate_with_check_quorum() { #[test] fn test_non_promotable_voter_which_check_quorum() { + setup_for_test(); let mut a = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); let mut b = new_test_raft(2, vec![1], 10, 1, new_storage()); @@ -2266,6 +2315,7 @@ fn test_non_promotable_voter_which_check_quorum() { /// to step down. #[test] fn test_disruptive_follower() { + setup_for_test(); let mut n1 = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let mut n2 = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let mut n3 = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -2356,6 +2406,7 @@ fn test_disruptive_follower() { /// current leader to step down, thus less disruptions. #[test] fn test_disruptive_follower_pre_vote() { + setup_for_test(); let mut n1 = new_test_raft_with_prevote(1, vec![1, 2, 3], 10, 1, new_storage(), true); let mut n2 = new_test_raft_with_prevote(2, vec![1, 2, 3], 10, 1, new_storage(), true); let mut n3 = new_test_raft_with_prevote(3, vec![1, 2, 3], 10, 1, new_storage(), true); @@ -2406,6 +2457,7 @@ fn test_disruptive_follower_pre_vote() { #[test] fn test_read_only_option_safe() { + setup_for_test(); let a = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let b = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let c = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -2476,6 +2528,7 @@ fn test_read_only_option_safe() { #[test] fn test_read_only_option_lease() { + setup_for_test(); let mut a = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let mut b = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let mut c = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -2552,6 +2605,7 @@ fn test_read_only_option_lease() { #[test] fn test_read_only_option_lease_without_check_quorum() { + setup_for_test(); let mut a = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let mut b = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let mut c = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -2583,6 +2637,7 @@ fn test_read_only_option_lease_without_check_quorum() { // when it commits at least one log entry at it term. #[test] fn test_read_only_for_new_leader() { + setup_for_test(); let heartbeat_ticks = 1; let node_configs = vec![(1, 1, 1, 0), (2, 2, 2, 2), (3, 2, 2, 2)]; let mut peers = vec![]; @@ -2660,6 +2715,7 @@ fn test_read_only_for_new_leader() { #[test] fn test_leader_append_response() { + setup_for_test(); // initial progress: match = 0; next = 3 let mut tests = vec![ (3, true, 0, 3, 0, 0, 0), // stale resp; no replies @@ -2728,6 +2784,7 @@ fn test_leader_append_response() { // send a MsgApp with m.Index = 0, m.LogTerm=0 and empty entries. #[test] fn test_bcast_beat() { + setup_for_test(); let offset = 1000u64; // make a state machine with log.offset = 1000 let s = new_snapshot(offset, 1, vec![1, 2, 3]); @@ -2803,6 +2860,7 @@ fn test_bcast_beat() { // tests the output of the statemachine when receiving MsgBeat #[test] fn test_recv_msg_beat() { + setup_for_test(); let mut tests = vec![ (StateRole::Leader, 2), // candidate and follower should ignore MsgBeat @@ -2837,6 +2895,7 @@ fn test_recv_msg_beat() { #[test] fn test_leader_increase_next() { + setup_for_test(); let previous_ents = vec![empty_entry(1, 1), empty_entry(1, 2), empty_entry(1, 3)]; let mut tests = vec![ // state replicate; optimistically increase next @@ -2872,6 +2931,7 @@ fn test_leader_increase_next() { #[test] fn test_send_append_for_progress_probe() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); r.become_candidate(); r.become_leader(); @@ -2922,6 +2982,7 @@ fn test_send_append_for_progress_probe() { #[test] fn test_send_append_for_progress_replicate() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); r.become_candidate(); r.become_leader(); @@ -2937,6 +2998,7 @@ fn test_send_append_for_progress_replicate() { #[test] fn test_send_append_for_progress_snapshot() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); r.become_candidate(); r.become_leader(); @@ -2952,6 +3014,7 @@ fn test_send_append_for_progress_snapshot() { #[test] fn test_recv_msg_unreachable() { + setup_for_test(); let previous_ents = vec![empty_entry(1, 1), empty_entry(1, 2), empty_entry(1, 3)]; let s = new_storage(); s.wl().append(&previous_ents).expect(""); @@ -2976,6 +3039,7 @@ fn test_recv_msg_unreachable() { #[test] fn test_restore() { + setup_for_test(); // magic number let s = new_snapshot(11, 11, vec![1, 2, 3]); @@ -2995,6 +3059,7 @@ fn test_restore() { #[test] fn test_restore_ignore_snapshot() { + setup_for_test(); let previous_ents = vec![empty_entry(1, 1), empty_entry(1, 2), empty_entry(1, 3)]; let commit = 1u64; let mut sm = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); @@ -3015,6 +3080,7 @@ fn test_restore_ignore_snapshot() { #[test] fn test_provide_snap() { + setup_for_test(); // restore the state machine from a snapshot so it has a compacted log and a snapshot let s = new_snapshot(11, 11, vec![1, 2]); // magic number @@ -3038,6 +3104,7 @@ fn test_provide_snap() { #[test] fn test_ignore_providing_snapshot() { + setup_for_test(); // restore the state machine from a snapshot so it has a compacted log and a snapshot let s = new_snapshot(11, 11, vec![1, 2]); // magic number let mut sm = new_test_raft(1, vec![1], 10, 1, new_storage()); @@ -3059,6 +3126,7 @@ fn test_ignore_providing_snapshot() { #[test] fn test_restore_from_snap_msg() { + setup_for_test(); let s = new_snapshot(11, 11, vec![1, 2]); // magic number let mut sm = new_test_raft(2, vec![1, 2], 10, 1, new_storage()); let mut m = new_message(1, 0, MessageType::MsgSnapshot, 0); @@ -3074,6 +3142,7 @@ fn test_restore_from_snap_msg() { #[test] fn test_slow_node_restore() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3118,6 +3187,7 @@ fn test_slow_node_restore() { // it appends the entry to log and sets pendingConf to be true. #[test] fn test_step_config() { + setup_for_test(); // a raft that cannot make progress let mut r = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); r.become_candidate(); @@ -3136,6 +3206,7 @@ fn test_step_config() { // the proposal to noop and keep its original state. #[test] fn test_step_ignore_config() { + setup_for_test(); // a raft that cannot make progress let mut r = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); r.become_candidate(); @@ -3162,6 +3233,7 @@ fn test_step_ignore_config() { // based on uncommitted entries. #[test] fn test_new_leader_pending_config() { + setup_for_test(); let mut tests = vec![(false, 0), (true, 1)]; for (i, (add_entry, wpending_index)) in tests.drain(..).enumerate() { let mut r = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); @@ -3185,6 +3257,7 @@ fn test_new_leader_pending_config() { // test_add_node tests that add_node could update nodes correctly. #[test] fn test_add_node() { + setup_for_test(); let mut r = new_test_raft(1, vec![1], 10, 1, new_storage()); r.add_node(2); assert_eq!(r.prs().nodes(), vec![1, 2]); @@ -3192,6 +3265,7 @@ fn test_add_node() { #[test] fn test_add_node_check_quorum() { + setup_for_test(); let mut r = new_test_raft(1, vec![1], 10, 1, new_storage()); r.check_quorum = true; @@ -3223,6 +3297,7 @@ fn test_add_node_check_quorum() { // and removed list correctly. #[test] fn test_remove_node() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); r.remove_node(2); assert_eq!(r.prs().nodes(), vec![1]); @@ -3234,6 +3309,7 @@ fn test_remove_node() { #[test] fn test_promotable() { + setup_for_test(); let id = 1u64; let mut tests = vec![ (vec![1], true), @@ -3251,6 +3327,7 @@ fn test_promotable() { #[test] fn test_raft_nodes() { + setup_for_test(); let mut tests = vec![ (vec![1, 2, 3], vec![1, 2, 3]), (vec![3, 2, 1], vec![1, 2, 3]), @@ -3265,11 +3342,13 @@ fn test_raft_nodes() { #[test] fn test_campaign_while_leader() { + setup_for_test(); test_campaign_while_leader_with_pre_vote(false); } #[test] fn test_pre_campaign_while_leader() { + setup_for_test(); test_campaign_while_leader_with_pre_vote(true); } @@ -3290,6 +3369,7 @@ fn test_campaign_while_leader_with_pre_vote(pre_vote: bool) { // committed when a config change reduces the quorum requirements. #[test] fn test_commit_after_remove_node() { + setup_for_test(); // Create a cluster with two nodes. let s = new_storage(); let mut r = new_test_raft(1, vec![1, 2], 5, 1, s.clone()); @@ -3340,6 +3420,7 @@ fn test_commit_after_remove_node() { // if the transferee has the most up-to-date log entries when transfer starts. #[test] fn test_leader_transfer_to_uptodate_node() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3363,6 +3444,7 @@ fn test_leader_transfer_to_uptodate_node() { // to the follower. #[test] fn test_leader_transfer_to_uptodate_node_from_follower() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3383,6 +3465,7 @@ fn test_leader_transfer_to_uptodate_node_from_follower() { // even the current leader is still under its leader lease #[test] fn test_leader_transfer_with_check_quorum() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); for i in 1..4 { let r = &mut nt.peers.get_mut(&i).unwrap(); @@ -3417,6 +3500,7 @@ fn test_leader_transfer_with_check_quorum() { #[test] fn test_leader_transfer_to_slow_follower() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3434,6 +3518,7 @@ fn test_leader_transfer_to_slow_follower() { #[test] fn test_leader_transfer_after_snapshot() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3470,6 +3555,7 @@ fn test_leader_transfer_after_snapshot() { #[test] fn test_leader_transfer_to_self() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3480,6 +3566,7 @@ fn test_leader_transfer_to_self() { #[test] fn test_leader_transfer_to_non_existing_node() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3490,6 +3577,7 @@ fn test_leader_transfer_to_non_existing_node() { #[test] fn test_leader_transfer_timeout() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3513,6 +3601,7 @@ fn test_leader_transfer_timeout() { #[test] fn test_leader_transfer_ignore_proposal() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3537,6 +3626,7 @@ fn test_leader_transfer_ignore_proposal() { #[test] fn test_leader_transfer_receive_higher_term_vote() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3558,6 +3648,7 @@ fn test_leader_transfer_receive_higher_term_vote() { #[test] fn test_leader_transfer_remove_node() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3576,6 +3667,7 @@ fn test_leader_transfer_remove_node() { // back to self when last transfer is pending. #[test] fn test_leader_transfer_back() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3594,6 +3686,7 @@ fn test_leader_transfer_back() { // when last transfer is pending. #[test] fn test_leader_transfer_second_transfer_to_another_node() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3612,6 +3705,7 @@ fn test_leader_transfer_second_transfer_to_another_node() { // to the same node should not extend the timeout while the first one is pending. #[test] fn test_leader_transfer_second_transfer_to_same_node() { + setup_for_test(); let mut nt = Network::new(vec![None, None, None]); nt.send(vec![new_message(1, 1, MessageType::MsgHup, 0)]); @@ -3652,6 +3746,7 @@ fn check_leader_transfer_state(r: &Raft, state: StateRole, lead: u64 // transitioned to StateRole::Leader) #[test] fn test_transfer_non_member() { + setup_for_test(); let mut raft = new_test_raft(1, vec![2, 3, 4], 5, 1, new_storage()); raft.step(new_message(2, 1, MessageType::MsgTimeoutNow, 0)) .expect("");; @@ -3670,6 +3765,7 @@ fn test_transfer_non_member() { // enabled. #[test] fn test_node_with_smaller_term_can_complete_election() { + setup_for_test(); let mut n1 = new_test_raft_with_prevote(1, vec![1, 2, 3], 10, 1, new_storage(), true); let mut n2 = new_test_raft_with_prevote(2, vec![1, 2, 3], 10, 1, new_storage(), true); let mut n3 = new_test_raft_with_prevote(3, vec![1, 2, 3], 10, 1, new_storage(), true); @@ -3743,6 +3839,7 @@ pub fn new_test_learner_raft( // even when times out. #[test] fn test_learner_election_timeout() { + setup_for_test(); let mut n1 = new_test_learner_raft(1, vec![1], vec![2], 10, 1, new_storage()); n1.become_follower(1, INVALID_ID); @@ -3763,6 +3860,7 @@ fn test_learner_election_timeout() { // it is promoted to a normal peer. #[test] fn test_learner_promotion() { + setup_for_test(); let mut n1 = new_test_learner_raft(1, vec![1], vec![2], 10, 1, new_storage()); n1.become_follower(1, INVALID_ID); @@ -3814,6 +3912,7 @@ fn test_learner_promotion() { // TestLearnerLogReplication tests that a learner can receive entries from the leader. #[test] fn test_learner_log_replication() { + setup_for_test(); let n1 = new_test_learner_raft(1, vec![1], vec![2], 10, 1, new_storage()); let n2 = new_test_learner_raft(2, vec![1], vec![2], 10, 1, new_storage()); let mut network = Network::new(vec![Some(n1), Some(n2)]); @@ -3869,6 +3968,7 @@ fn test_learner_log_replication() { // TestRestoreWithLearner restores a snapshot which contains learners. #[test] fn test_restore_with_learner() { + setup_for_test(); let mut s = new_snapshot(11, 11, vec![1, 2]); s.mut_metadata().mut_conf_state().mut_learners().push(3); @@ -3897,6 +3997,7 @@ fn test_restore_with_learner() { // when restores snapshot. #[test] fn test_restore_invalid_learner() { + setup_for_test(); let mut s = new_snapshot(11, 11, vec![1, 2]); s.mut_metadata().mut_conf_state().mut_learners().push(3); @@ -3909,6 +4010,7 @@ fn test_restore_invalid_learner() { // restoring snapshot. #[test] fn test_restore_learner_promotion() { + setup_for_test(); let s = new_snapshot(11, 11, vec![1, 2, 3]); let mut sm = new_test_learner_raft(3, vec![1, 2], vec![3], 10, 1, new_storage()); assert!(sm.is_learner); @@ -3919,6 +4021,7 @@ fn test_restore_learner_promotion() { // TestLearnerReceiveSnapshot tests that a learner can receive a snpahost from leader. #[test] fn test_learner_receive_snapshot() { + setup_for_test(); let mut s = new_snapshot(11, 11, vec![1]); s.mut_metadata().mut_conf_state().mut_learners().push(2); @@ -3956,6 +4059,7 @@ fn test_learner_receive_snapshot() { // TestAddLearner tests that addLearner could update nodes correctly. #[test] fn test_add_learner() { + setup_for_test(); let mut n1 = new_test_raft(1, vec![1], 10, 1, new_storage()); n1.add_learner(2); @@ -3967,6 +4071,7 @@ fn test_add_learner() { // and removed list correctly. #[test] fn test_remove_learner() { + setup_for_test(); let mut n1 = new_test_learner_raft(1, vec![1], vec![2], 10, 1, new_storage()); n1.remove_node(2); assert_eq!(n1.prs().nodes(), vec![1]); @@ -4029,6 +4134,7 @@ fn new_prevote_migration_cluster() -> Network { #[test] fn test_prevote_migration_can_complete_election() { + setup_for_test(); // n1 is leader with term 2 // n2 is follower with term 2 // n3 is pre-candidate with term 4, and less log @@ -4058,6 +4164,7 @@ fn test_prevote_migration_can_complete_election() { #[test] fn test_prevote_migration_with_free_stuck_pre_candidate() { + setup_for_test(); let mut nt = new_prevote_migration_cluster(); // n1 is leader with term 2 @@ -4087,6 +4194,7 @@ fn test_prevote_migration_with_free_stuck_pre_candidate() { #[test] fn test_learner_respond_vote() { + setup_for_test(); let mut n1 = new_test_learner_raft(1, vec![1, 2], vec![3], 10, 1, new_storage()); n1.become_follower(1, INVALID_ID); n1.reset_randomized_election_timeout(); @@ -4115,6 +4223,7 @@ fn test_learner_respond_vote() { #[test] fn test_election_tick_range() { + setup_for_test(); let mut cfg = new_test_config(1, vec![1, 2, 3], 10, 1); let mut raft = Raft::new(&cfg, new_storage()); for _ in 0..1000 { @@ -4150,6 +4259,7 @@ fn test_election_tick_range() { // election in next round. #[test] fn test_prevote_with_split_vote() { + setup_for_test(); let peers = (1..=3).map(|id| { let mut raft = new_test_raft_with_prevote(id, vec![1, 2, 3], 10, 1, new_storage(), true); raft.become_follower(1, INVALID_ID); @@ -4196,6 +4306,7 @@ fn test_prevote_with_split_vote() { // ensure that after a node become pre-candidate, it will checkQuorum correctly. #[test] fn test_prevote_with_check_quorum() { + setup_for_test(); let bootstrap = |id| { let mut cfg = new_test_config(id, vec![1, 2, 3], 10, 1); cfg.pre_vote = true; diff --git a/tests/cases/test_raft_flow_control.rs b/tests/cases/test_raft_flow_control.rs index 316445a3d..4e2c298a7 100644 --- a/tests/cases/test_raft_flow_control.rs +++ b/tests/cases/test_raft_flow_control.rs @@ -27,12 +27,14 @@ use super::test_raft::*; use raft::eraftpb::*; +use setup_for_test; // test_msg_app_flow_control_full ensures: // 1. msgApp can fill the sending window until full // 2. when the window is full, no more msgApp can be sent. #[test] fn test_msg_app_flow_control_full() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2], 5, 1, new_storage()); r.become_candidate(); r.become_leader(); @@ -69,6 +71,7 @@ fn test_msg_app_flow_control_full() { // 2. out-of-dated msgAppResp has no effect on the sliding window. #[test] fn test_msg_app_flow_control_move_forward() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2], 5, 1, new_storage()); r.become_candidate(); r.become_leader(); @@ -122,6 +125,7 @@ fn test_msg_app_flow_control_move_forward() { // frees one slot if the window is full. #[test] fn test_msg_app_flow_control_recv_heartbeat() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2], 5, 1, new_storage()); r.become_candidate(); r.become_leader(); diff --git a/tests/cases/test_raft_paper.rs b/tests/cases/test_raft_paper.rs index f8325b257..34e23666a 100644 --- a/tests/cases/test_raft_paper.rs +++ b/tests/cases/test_raft_paper.rs @@ -30,6 +30,7 @@ use protobuf::RepeatedField; use raft::eraftpb::*; use raft::storage::MemStorage; use raft::*; +use setup_for_test; pub fn hard_state(t: u64, c: u64, v: u64) -> HardState { let mut hs = HardState::new(); @@ -71,16 +72,19 @@ fn accept_and_reply(m: &Message) -> Message { #[test] fn test_follower_update_term_from_message() { + setup_for_test(); test_update_term_from_message(StateRole::Follower); } #[test] fn test_candidate_update_term_from_message() { + setup_for_test(); test_update_term_from_message(StateRole::Candidate); } #[test] fn test_leader_update_term_from_message() { + setup_for_test(); test_update_term_from_message(StateRole::Leader); } @@ -115,6 +119,7 @@ fn test_update_term_from_message(state: StateRole) { // Reference: section 5.1 #[test] fn test_reject_stale_term_message() { + setup_for_test(); let mut r = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let panic_before_step_state = Box::new(|_: &Message| panic!("before step state function hook called unexpectedly")); @@ -130,6 +135,7 @@ fn test_reject_stale_term_message() { // Reference: section 5.2 #[test] fn test_start_as_follower() { + setup_for_test(); let r = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); assert_eq!(r.state, StateRole::Follower); } @@ -140,6 +146,7 @@ fn test_start_as_follower() { // Reference: section 5.2 #[test] fn test_leader_bcast_beat() { + setup_for_test(); // heartbeat interval let hi = 1; let mut r = new_test_raft(1, vec![1, 2, 3], 10, hi, new_storage()); @@ -169,11 +176,13 @@ fn test_leader_bcast_beat() { #[test] fn test_follower_start_election() { + setup_for_test(); test_nonleader_start_election(StateRole::Follower); } #[test] fn test_candidate_start_new_election() { + setup_for_test(); test_nonleader_start_election(StateRole::Candidate); } @@ -225,6 +234,7 @@ fn test_nonleader_start_election(state: StateRole) { // Reference: section 5.2 #[test] fn test_leader_election_in_one_round_rpc() { + setup_for_test(); let mut tests = vec![ // win the election when receiving votes from a majority of the servers (1, map!(), StateRole::Leader), @@ -281,6 +291,7 @@ fn test_leader_election_in_one_round_rpc() { // Reference: section 5.2 #[test] fn test_follower_vote() { + setup_for_test(); let mut tests = vec![ (INVALID_ID, 1, false), (INVALID_ID, 2, false), @@ -316,6 +327,7 @@ fn test_follower_vote() { // Reference: section 5.2 #[test] fn test_candidate_fallback() { + setup_for_test(); let new_message_ext = |f, to, term| { let mut m = new_message(f, to, MessageType::MsgAppend, 0); m.set_term(term); @@ -346,11 +358,13 @@ fn test_candidate_fallback() { #[test] fn test_follower_election_timeout_randomized() { + setup_for_test(); test_non_leader_election_timeout_randomized(StateRole::Follower); } #[test] fn test_candidate_election_timeout_randomized() { + setup_for_test(); test_non_leader_election_timeout_randomized(StateRole::Candidate); } @@ -385,11 +399,13 @@ fn test_non_leader_election_timeout_randomized(state: StateRole) { #[test] fn test_follower_election_timeout_nonconflict() { + setup_for_test(); test_nonleaders_election_timeout_nonconfict(StateRole::Follower); } #[test] fn test_acandidates_election_timeout_nonconf() { + setup_for_test(); test_nonleaders_election_timeout_nonconfict(StateRole::Candidate); } @@ -444,6 +460,7 @@ fn test_nonleaders_election_timeout_nonconfict(state: StateRole) { // Reference: section 5.3 #[test] fn test_leader_start_replication() { + setup_for_test(); let s = new_storage(); let mut r = new_test_raft(1, vec![1, 2, 3], 10, 1, s.clone()); r.become_candidate(); @@ -485,6 +502,7 @@ fn test_leader_start_replication() { // Reference: section 5.3 #[test] fn test_leader_commit_entry() { + setup_for_test(); let s = new_storage(); let mut r = new_test_raft(1, vec![1, 2, 3], 10, 1, s.clone()); r.become_candidate(); @@ -515,6 +533,7 @@ fn test_leader_commit_entry() { // Reference: section 5.3 #[test] fn test_leader_acknowledge_commit() { + setup_for_test(); let mut tests = vec![ (1, map!(), true), (3, map!(), false), @@ -556,6 +575,7 @@ fn test_leader_acknowledge_commit() { // Reference: section 5.3 #[test] fn test_leader_commit_preceding_entries() { + setup_for_test(); let mut tests = vec![ vec![], vec![empty_entry(2, 1)], @@ -595,6 +615,7 @@ fn test_leader_commit_preceding_entries() { // Reference: section 5.3 #[test] fn test_follower_commit_entry() { + setup_for_test(); let mut tests = vec![ (vec![new_entry(1, 1, SOME_DATA)], 1), ( @@ -651,6 +672,7 @@ fn test_follower_commit_entry() { // Reference: section 5.3 #[test] fn test_follower_check_msg_append() { + setup_for_test(); let ents = vec![empty_entry(1, 1), empty_entry(2, 2)]; let mut tests = vec![ // match with committed entries @@ -710,6 +732,7 @@ fn test_follower_check_msg_append() { // Reference: section 5.3 #[test] fn test_follower_append_entries() { + setup_for_test(); let mut tests = vec![ ( 2, @@ -776,6 +799,7 @@ fn test_follower_append_entries() { // Reference: section 5.3, figure 7 #[test] fn test_leader_sync_follower_log() { + setup_for_test(); let ents = vec![ empty_entry(0, 0), empty_entry(1, 1), @@ -904,6 +928,7 @@ fn test_leader_sync_follower_log() { // Reference: section 5.4.1 #[test] fn test_vote_request() { + setup_for_test(); let mut tests = vec![ (vec![empty_entry(1, 1)], 2), (vec![empty_entry(1, 1), empty_entry(2, 2)], 3), @@ -966,6 +991,7 @@ fn test_vote_request() { // Reference: section 5.4.1 #[test] fn test_voter() { + setup_for_test(); let mut tests = vec![ // same logterm (vec![empty_entry(1, 1)], 1, 1, false), @@ -1019,6 +1045,7 @@ fn test_voter() { // Reference: section 5.4.2 #[test] fn test_leader_only_commits_log_from_current_term() { + setup_for_test(); let ents = vec![empty_entry(1, 1), empty_entry(2, 2)]; let mut tests = vec![ // do not commit log entries in previous terms diff --git a/tests/cases/test_raft_snap.rs b/tests/cases/test_raft_snap.rs index bcc5a947b..af7e24380 100644 --- a/tests/cases/test_raft_snap.rs +++ b/tests/cases/test_raft_snap.rs @@ -27,6 +27,7 @@ use super::test_raft::*; use raft::eraftpb::*; +use setup_for_test; fn testing_snap() -> Snapshot { new_snapshot(11, 11, vec![1, 2]) @@ -34,6 +35,7 @@ fn testing_snap() -> Snapshot { #[test] fn test_sending_snapshot_set_pending_snapshot() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1], 10, 1, new_storage()); sm.restore(testing_snap()); @@ -53,6 +55,7 @@ fn test_sending_snapshot_set_pending_snapshot() { #[test] fn test_pending_snapshot_pause_replication() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); sm.restore(testing_snap()); @@ -68,6 +71,7 @@ fn test_pending_snapshot_pause_replication() { #[test] fn test_snapshot_failure() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); sm.restore(testing_snap()); @@ -87,6 +91,7 @@ fn test_snapshot_failure() { #[test] fn test_snapshot_succeed() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); sm.restore(testing_snap()); @@ -106,6 +111,7 @@ fn test_snapshot_succeed() { #[test] fn test_snapshot_abort() { + setup_for_test(); let mut sm = new_test_raft(1, vec![1, 2], 10, 1, new_storage()); sm.restore(testing_snap()); diff --git a/tests/cases/test_raw_node.rs b/tests/cases/test_raw_node.rs index 3612de084..80e4279c2 100644 --- a/tests/cases/test_raw_node.rs +++ b/tests/cases/test_raw_node.rs @@ -31,6 +31,7 @@ use protobuf::{self, ProtobufEnum}; use raft::eraftpb::*; use raft::storage::MemStorage; use raft::*; +use setup_for_test; use std::sync::*; fn new_peer(id: u64) -> Peer { @@ -93,6 +94,7 @@ fn new_raw_node( // test_raw_node_step ensures that RawNode.Step ignore local message. #[test] fn test_raw_node_step() { + setup_for_test(); for msg_t in MessageType::values() { let mut raw_node = new_raw_node(1, vec![], 10, 1, new_storage(), vec![new_peer(1)]); let res = raw_node.step(new_message(0, 0, *msg_t, 0)); @@ -113,6 +115,7 @@ fn test_raw_node_step() { // forward to the new leader and 'send' method does not attach its term #[test] fn test_raw_node_read_index_to_old_leader() { + setup_for_test(); let r1 = new_test_raft(1, vec![1, 2, 3], 10, 1, new_storage()); let r2 = new_test_raft(2, vec![1, 2, 3], 10, 1, new_storage()); let r3 = new_test_raft(3, vec![1, 2, 3], 10, 1, new_storage()); @@ -174,6 +177,7 @@ fn test_raw_node_read_index_to_old_leader() { // RawNode.propose_conf_change send the given proposal and ConfChange to the underlying raft. #[test] fn test_raw_node_propose_and_conf_change() { + setup_for_test(); let s = new_storage(); let mut raw_node = new_raw_node(1, vec![], 10, 1, s.clone(), vec![new_peer(1)]); let rd = raw_node.ready(); @@ -217,6 +221,7 @@ fn test_raw_node_propose_and_conf_change() { // not affect the later propose to add new node. #[test] fn test_raw_node_propose_add_duplicate_node() { + setup_for_test(); let s = new_storage(); let mut raw_node = new_raw_node(1, vec![], 10, 1, s.clone(), vec![new_peer(1)]); let rd = raw_node.ready(); @@ -270,6 +275,7 @@ fn test_raw_node_propose_add_duplicate_node() { #[test] fn test_raw_node_propose_add_learner_node() { + setup_for_test(); let s = new_storage(); let mut raw_node = new_raw_node(1, vec![], 10, 1, s.clone(), vec![new_peer(1)]); let rd = raw_node.ready(); @@ -310,6 +316,7 @@ fn test_raw_node_propose_add_learner_node() { // to the underlying raft. It also ensures that ReadState can be read out. #[test] fn test_raw_node_read_index() { + setup_for_test(); let a = Arc::new(RwLock::new(Vec::new())); let b = Arc::clone(&a); let before_step_state = Box::new(move |m: &Message| { @@ -365,6 +372,7 @@ fn test_raw_node_read_index() { // proposals. #[test] fn test_raw_node_start() { + setup_for_test(); let cc = conf_change(ConfChangeType::AddNode, 1); let ccdata = protobuf::Message::write_to_bytes(&cc).unwrap(); let wants = vec![ @@ -421,6 +429,7 @@ fn test_raw_node_start() { #[test] fn test_raw_node_restart() { + setup_for_test(); let entries = vec![empty_entry(1, 1), new_entry(1, 2, Some("foo"))]; let st = hard_state(1, 1, 0); @@ -438,6 +447,7 @@ fn test_raw_node_restart() { #[test] fn test_raw_node_restart_from_snapshot() { + setup_for_test(); let snap = new_snapshot(2, 1, vec![1, 2]); let entries = vec![new_entry(1, 3, Some("foo"))]; let st = hard_state(1, 3, 0); @@ -459,6 +469,7 @@ fn test_raw_node_restart_from_snapshot() { // when skip_bcast_commit is true. #[test] fn test_skip_bcast_commit() { + setup_for_test(); let mut config = new_test_config(1, vec![1, 2, 3], 10, 1); config.skip_bcast_commit = true; let r1 = new_test_raft_with_config(&config, new_storage()); diff --git a/tests/tests.rs b/tests/tests.rs index 47d427152..de99854d1 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -17,6 +17,7 @@ #[macro_use] extern crate log; +extern crate env_logger; extern crate protobuf; extern crate raft; extern crate rand; @@ -83,4 +84,9 @@ macro_rules! map { }; } +/// Do any common test initialization. Eg set up logging, setup fail-rs. +pub fn setup_for_test() { + let _ = env_logger::try_init(); +} + mod cases;