election_tests.rs 1.4 KB

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