Skip to content

Commit a44de72

Browse files
committed
test: set twice after election
1 parent a001763 commit a44de72

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

duva/tests/test_leader_election.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,42 @@ async fn test_leader_election() {
3636
assert!([response1, response2].iter().any(|d| d.contains("role:leader")));
3737
}
3838

39+
// ! EDGE case : when last_log_term is not updated, after the election, first write operation succeeds but second one doesn't
40+
// ! This is because the leader doesn't have the last_log_term of the first write operation
41+
// ! This test is to see if the leader can set the value twice after the election
42+
#[tokio::test]
43+
async fn test_set_twice_after_election() {
44+
// GIVEN
45+
let mut leader_p = spawn_server_process(&ServerEnv::default());
46+
47+
let mut follower_p1 = spawn_server_process(
48+
&ServerEnv::default().with_leader_bind_addr(leader_p.bind_addr().into()),
49+
);
50+
51+
let mut follower_p2 = spawn_server_process(
52+
&ServerEnv::default().with_leader_bind_addr(leader_p.bind_addr().into()),
53+
);
54+
const DEFAULT_HOP_COUNT: usize = 0;
55+
const TIMEOUT_IN_MILLIS: u128 = 2000;
56+
let processes = &mut [&mut leader_p, &mut follower_p1, &mut follower_p2];
57+
check_internodes_communication(processes, DEFAULT_HOP_COUNT, TIMEOUT_IN_MILLIS).unwrap();
58+
59+
// WHEN
60+
leader_p.kill().unwrap();
61+
sleep(Duration::from_secs(1));
62+
let mut handler = ClientStreamHandler::new(follower_p1.bind_addr()).await;
63+
let mut handler2 = ClientStreamHandler::new(follower_p2.bind_addr()).await;
64+
let response1 = handler.send_and_get(&array(vec!["info", "replication"])).await;
65+
66+
if response1.contains("role:leader") {
67+
let _ = handler.send_and_get(&array(vec!["set", "1", "2"])).await;
68+
let _ = handler.send_and_get(&array(vec!["set", "2", "3"])).await;
69+
} else {
70+
let _ = handler2.send_and_get(&array(vec!["set", "1", "2"])).await;
71+
let _ = handler2.send_and_get(&array(vec!["set", "2", "3"])).await;
72+
};
73+
}
74+
3975
/// following test is to see if election works even after the first election.
4076
#[tokio::test]
4177
async fn test_leader_election_twice() {

0 commit comments

Comments
 (0)