election_tests.rs 1.4 KB

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