election_tests.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #[macro_use]
  2. extern crate anyhow;
  3. extern crate bytes;
  4. extern crate labrpc;
  5. extern crate ruaft;
  6. mod config;
  7. #[test]
  8. fn initial_election() -> config::Result<()> {
  9. const SERVERS: usize = 3;
  10. let cfg = config::make_config(SERVERS, false);
  11. let guard = ruaft::utils::DropGuard::new(|| cfg.cleanup());
  12. cfg.begin("Test (2A): initial election");
  13. cfg.check_one_leader()?;
  14. config::sleep_millis(50);
  15. let first_term = cfg.check_terms()?;
  16. config::sleep_election_timeouts(2);
  17. let second_term = cfg.check_terms()?;
  18. if first_term != second_term {
  19. eprintln!("Warning: term change even though there were no failures");
  20. }
  21. cfg.check_one_leader()?;
  22. cfg.end();
  23. drop(guard);
  24. Ok(())
  25. }
  26. #[test]
  27. fn re_election() -> config::Result<()> {
  28. const SERVERS: usize = 3;
  29. let cfg = config::make_config(SERVERS, false);
  30. let _guard = cfg.deferred_cleanup();
  31. cfg.begin("Test (2A): election after network failure");
  32. let leader_one = cfg.check_one_leader()?;
  33. cfg.disconnect(leader_one);
  34. cfg.check_one_leader()?;
  35. cfg.connect(leader_one);
  36. let leader_two = cfg.check_one_leader()?;
  37. let other = (leader_two + 1) % SERVERS;
  38. cfg.disconnect(leader_two);
  39. cfg.disconnect(other);
  40. cfg.check_no_leader()?;
  41. cfg.connect(other);
  42. cfg.check_one_leader()?;
  43. cfg.connect(leader_two);
  44. cfg.check_one_leader()?;
  45. cfg.end();
  46. drop(_guard);
  47. Ok(())
  48. }