election_tests.rs 1.3 KB

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