agreement_tests.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. extern crate labrpc;
  2. extern crate ruaft;
  3. #[macro_use]
  4. extern crate anyhow;
  5. mod config;
  6. #[test]
  7. fn basic_agreement() -> config::Result<()> {
  8. const SERVERS: usize = 5;
  9. let cfg = config::make_config(SERVERS, false);
  10. let _guard = cfg.deferred_cleanup();
  11. cfg.begin("Test (2B): basic agreement");
  12. for index in 1..4 {
  13. let committed = cfg.committed_count(index)?;
  14. assert_eq!(0, committed.0, "some have committed before start()");
  15. let commit_index = cfg.one(index as i32 * 100, SERVERS, false)?;
  16. assert_eq!(
  17. index, commit_index,
  18. "got index {} but expected {}",
  19. commit_index, index
  20. );
  21. }
  22. Ok(())
  23. }
  24. #[test]
  25. fn fail_agree() -> config::Result<()> {
  26. const SERVERS: usize = 3;
  27. let cfg = config::make_config(SERVERS, false);
  28. let _guard = cfg.deferred_cleanup();
  29. cfg.begin("Test (2B): agreement despite follower disconnection");
  30. cfg.one(101, SERVERS, false)?;
  31. // follower network disconnection
  32. let leader = cfg.check_one_leader()?;
  33. cfg.disconnect((leader + 1) % SERVERS);
  34. // agree despite one disconnected server?
  35. cfg.one(102, SERVERS - 1, false)?;
  36. cfg.one(103, SERVERS - 1, false)?;
  37. config::sleep_election_timeouts(1);
  38. cfg.one(104, SERVERS - 1, false)?;
  39. cfg.one(105, SERVERS - 1, false)?;
  40. // re-connect
  41. cfg.connect((leader + 1) % SERVERS);
  42. // agree with full set of servers?
  43. cfg.one(106, SERVERS, true)?;
  44. config::sleep_election_timeouts(1);
  45. cfg.one(107, SERVERS, true)?;
  46. cfg.end();
  47. Ok(())
  48. }