From cb9577fc572e1b308f35c3be0e4d2fa8ba01ac6d Mon Sep 17 00:00:00 2001 From: Yaroslav Dynnikov <yaroslav.dynnikov@gmail.com> Date: Tue, 8 Nov 2022 11:16:16 +0300 Subject: [PATCH] test: add the first few conf_change unit tests --- src/traft/governor.rs | 91 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/traft/governor.rs b/src/traft/governor.rs index de05ad6f2c..0597022e21 100644 --- a/src/traft/governor.rs +++ b/src/traft/governor.rs @@ -115,3 +115,94 @@ pub(crate) fn raft_conf_change( Some(conf_change) } + +#[cfg(test)] +mod tests { + use ::raft::prelude as raft; + + use super::raft_conf_change as cc; + use crate::traft; + + macro_rules! p { + ( + $raft_id:literal, + $current_grade:ident -> + $target_grade:ident + ) => { + traft::Peer { + raft_id: $raft_id, + current_grade: traft::CurrentGrade::$current_grade, + target_grade: traft::TargetGrade::$target_grade, + ..traft::Peer::default() + } + }; + + ( + $raft_id:literal, + $grade:ident + ) => { + p!($raft_id, $grade -> $grade) + }; + } + + macro_rules! cc { + [$( + $change:ident($raft_id:literal) + ),*] => {{ + Some(raft::ConfChangeV2 { + changes: vec![$( + raft::ConfChangeSingle { + change_type: raft::ConfChangeType::$change, + node_id: $raft_id, + ..Default::default() + } + ),*].into(), + transition: raft::ConfChangeTransition::Auto, + ..Default::default() + }) + }}; + } + + #[test] + fn conf_change() { + assert_eq!( + cc(&[p!(1, Online), p!(2, Offline -> Online)], &[1], &[]), + // cc![AddLearnerNode(2)] // FIXME + cc![AddNode(2)] + ); + + assert_eq!( + cc(&[p!(1, Online), p!(2, Offline -> Online)], &[1], &[2]), + None + ); + + assert_eq!( + cc(&[p!(1, Online), p!(2, Online)], &[1], &[2]), + cc![AddNode(2)] + ); + + assert_eq!( + cc(&[p!(1, Online), p!(2, Online -> Offline)], &[1, 2], &[]), + // cc![RemoveNode(2)] // FIXME + None + ); + + assert_eq!( + cc(&[p!(1, Online), p!(2, Online -> Offline)], &[1], &[2]), + // cc![RemoveNode(2)] // FIXME + cc![AddNode(2)] + ); + + assert_eq!( + cc(&[p!(1, Online), p!(2, Offline)], &[1, 2], &[]), + // cc![RemoveNode(2)] // FIXME + cc![AddLearnerNode(2)] + ); + + assert_eq!( + cc(&[p!(1, Online), p!(2, Offline)], &[1], &[2]), + // cc![RemoveNode(2)] // FIXME + None + ); + } +} -- GitLab