snapshot_tests.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. extern crate kvraft;
  2. #[macro_use]
  3. extern crate scopeguard;
  4. use kvraft::testing_utils::config::{make_config, sleep_election_timeouts};
  5. use std::sync::Arc;
  6. #[test]
  7. fn install_snapshot_rpc() {
  8. const SERVERS: usize = 3;
  9. const MAX_RAFT_STATE: usize = 1000;
  10. const KEY: &str = "a";
  11. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  12. defer!(cfg.clean_up());
  13. let mut clerk = cfg.make_clerk();
  14. cfg.begin("Test: InstallSnapshot RPC (3B)");
  15. clerk.put("a", "A");
  16. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  17. let (majority, minority) = cfg.partition();
  18. {
  19. let mut clerk = cfg.make_limited_clerk(&majority);
  20. for i in 0..50 {
  21. let i_str = i.to_string();
  22. clerk.put(&i_str, &i_str);
  23. }
  24. sleep_election_timeouts(1);
  25. clerk.put("b", "B");
  26. }
  27. cfg.check_log_size(MAX_RAFT_STATE * 2).expect("Hi");
  28. // Swap majority and minority.
  29. let (mut majority, mut minority) = (minority, majority);
  30. majority.push(
  31. minority
  32. .pop()
  33. .expect("There should be at least one server in the majority."),
  34. );
  35. cfg.network_partition(&majority, &minority);
  36. {
  37. let mut clerk = cfg.make_limited_clerk(&majority);
  38. clerk.put("c", "C");
  39. clerk.put("d", "D");
  40. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  41. assert_eq!(clerk.get("b"), Some("B".to_owned()));
  42. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  43. assert_eq!(clerk.get("d"), Some("D".to_owned()));
  44. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  45. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  46. }
  47. cfg.connect_all();
  48. clerk.put("e", "E");
  49. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  50. assert_eq!(clerk.get("e"), Some("E".to_owned()));
  51. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  52. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  53. cfg.end();
  54. }