فهرست منبع

Add a test for re_election.

Jing Yang 5 سال پیش
والد
کامیت
f0c6126caa
2فایلهای تغییر یافته به همراه48 افزوده شده و 1 حذف شده
  1. 17 0
      tests/config/mod.rs
  2. 31 1
      tests/election_tests.rs

+ 17 - 0
tests/config/mod.rs

@@ -68,6 +68,23 @@ impl Config {
         Err(anyhow!("expected one leader, got none"))
     }
 
+    pub fn check_no_leader(&self) -> Result<()> {
+        let state = self.state.lock();
+        for i in 0..self.server_count {
+            if state.connected[i] {
+                if let Some(raft) = &state.rafts[i] {
+                    if raft.get_state().1 {
+                        bail!(
+                            "expected no leader, but {} claims to be leader",
+                            i
+                        );
+                    }
+                }
+            }
+        }
+        Ok(())
+    }
+
     pub fn check_terms(&self) -> Result<()> {
         let mut term = None;
         let state = self.state.lock();

+ 31 - 1
tests/election_tests.rs

@@ -35,4 +35,34 @@ fn initial_election() -> config::Result<()> {
 }
 
 #[test]
-fn re_election() {}
+fn re_election() -> config::Result<()> {
+    const SERVERS: usize = 3;
+    let cfg = config::make_config(SERVERS, false);
+    let _guard = ruaft::utils::DropGuard::new(|| cfg.cleanup());
+
+    cfg.begin("Test (2A): election after network failure");
+
+    let leader_one = cfg.check_one_leader()?;
+
+    cfg.disconnect(leader_one);
+    cfg.check_one_leader()?;
+
+    cfg.connect(leader_one);
+
+    let leader_two = cfg.check_one_leader()?;
+    let other = (leader_two + 1) % SERVERS;
+
+    cfg.disconnect(leader_two);
+    cfg.disconnect(other);
+    cfg.check_no_leader()?;
+
+    cfg.connect(other);
+    cfg.check_one_leader()?;
+
+    cfg.connect(leader_two);
+    cfg.check_one_leader()?;
+
+    cfg.end();
+
+    Ok(())
+}