election_tests.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. Ok(())
  24. }
  25. #[test]
  26. fn re_election() -> config::Result<()> {
  27. const SERVERS: usize = 3;
  28. let cfg = config::make_config(SERVERS, false);
  29. let _guard = cfg.deferred_cleanup();
  30. cfg.begin("Test (2A): election after network failure");
  31. let leader_one = cfg.check_one_leader()?;
  32. cfg.disconnect(leader_one);
  33. cfg.check_one_leader()?;
  34. cfg.connect(leader_one);
  35. let leader_two = cfg.check_one_leader()?;
  36. let other = (leader_two + 1) % SERVERS;
  37. cfg.disconnect(leader_two);
  38. cfg.disconnect(other);
  39. cfg.check_no_leader()?;
  40. cfg.connect(other);
  41. cfg.check_one_leader()?;
  42. cfg.connect(leader_two);
  43. cfg.check_one_leader()?;
  44. cfg.end();
  45. Ok(())
  46. }