Skip to content

Commit 885daaa

Browse files
authored
Merge pull request #449 from Migorithm/refact/election-test-revisited
refactor: improve testability
2 parents 26c0e2d + 91e4e2c commit 885daaa

1 file changed

Lines changed: 53 additions & 51 deletions

File tree

duva/tests/replication_ops/test_leader_election.rs

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,16 @@ async fn test_leader_election() {
2525
sleep(Duration::from_secs(2));
2626

2727
// THEN
28-
let mut handler = ClientStreamHandler::new(follower_p1.bind_addr()).await;
29-
let mut handler2 = ClientStreamHandler::new(follower_p2.bind_addr()).await;
30-
31-
let response1 = handler.send_and_get(&array(vec!["info", "replication"])).await;
32-
let response2 = handler2.send_and_get(&array(vec!["info", "replication"])).await;
33-
34-
// THEN - one of the replicas should become the leader
35-
assert!([response1, response2].iter().any(|d| d.contains("role:leader")));
28+
let mut flag = false;
29+
for f in [&follower_p1, &follower_p2] {
30+
let mut handler = ClientStreamHandler::new(f.bind_addr()).await;
31+
let response1 = handler.send_and_get(&array(vec!["info", "replication"])).await;
32+
if response1.contains("role:leader") {
33+
flag = true;
34+
break;
35+
}
36+
}
37+
assert!(flag, "No leader found after the first leader was killed");
3638
}
3739

3840
// ! EDGE case : when last_log_term is not updated, after the election, first write operation succeeds but second one doesn't
@@ -58,17 +60,20 @@ async fn test_set_twice_after_election() {
5860
// WHEN
5961
leader_p.kill().unwrap();
6062
sleep(Duration::from_secs(1));
61-
let mut handler = ClientStreamHandler::new(follower_p1.bind_addr()).await;
62-
let mut handler2 = ClientStreamHandler::new(follower_p2.bind_addr()).await;
63-
let response1 = handler.send_and_get(&array(vec!["info", "replication"])).await;
64-
65-
if response1.contains("role:leader") {
66-
let _ = handler.send_and_get(&array(vec!["set", "1", "2"])).await;
67-
let _ = handler.send_and_get(&array(vec!["set", "2", "3"])).await;
68-
} else {
69-
let _ = handler2.send_and_get(&array(vec!["set", "1", "2"])).await;
70-
let _ = handler2.send_and_get(&array(vec!["set", "2", "3"])).await;
71-
};
63+
64+
let mut flag = false;
65+
for f in [&follower_p1, &follower_p2] {
66+
let mut handler = ClientStreamHandler::new(f.bind_addr()).await;
67+
let res = handler.send_and_get(&array(vec!["info", "replication"])).await;
68+
if res.contains("role:leader") {
69+
// THEN - one of the replicas should become the leader
70+
let _ = handler.send_and_get(&array(vec!["set", "1", "2"])).await;
71+
let _ = handler.send_and_get(&array(vec!["set", "2", "3"])).await;
72+
flag = true;
73+
break;
74+
}
75+
}
76+
assert!(flag, "No leader found after the first leader was killed");
7277
}
7378

7479
/// following test is to see if election works even after the first election.
@@ -89,41 +94,38 @@ async fn test_leader_election_twice() {
8994
let processes = &mut [&mut leader_p, &mut follower_p1, &mut follower_p2];
9095
check_internodes_communication(processes, DEFAULT_HOP_COUNT, TIMEOUT_IN_MILLIS).unwrap();
9196

92-
// WHEN
97+
// !first leader is killed -> election happens
9398
leader_p.kill().unwrap();
9499
sleep(Duration::from_secs(1));
95-
let mut handler = ClientStreamHandler::new(follower_p1.bind_addr()).await;
96-
let mut handler2 = ClientStreamHandler::new(follower_p2.bind_addr()).await;
97-
let response1 = handler.send_and_get(&array(vec!["info", "replication"])).await;
98-
99-
if response1.contains("role:leader") {
100-
let follower_p3 = spawn_server_process(
101-
&ServerEnv::default().with_leader_bind_addr(follower_p1.bind_addr().into()),
102-
);
103-
sleep(Duration::from_secs(1));
104-
follower_p1.kill().unwrap();
105-
sleep(Duration::from_secs(1));
106-
let mut handler3 = ClientStreamHandler::new(follower_p3.bind_addr()).await;
107-
108-
let response2 = handler2.send_and_get(&array(vec!["info", "replication"])).await;
109-
let response3 = handler3.send_and_get(&array(vec!["info", "replication"])).await;
110-
// THEN - one of the replicas should become the leader
111100

112-
assert!([response2, response3].iter().any(|d| d.contains("role:leader")));
113-
} else {
114-
let follower_p3 = spawn_server_process(
115-
&ServerEnv::default().with_leader_bind_addr(follower_p2.bind_addr().into()),
116-
);
117-
sleep(Duration::from_secs(1));
118-
follower_p2.kill().unwrap();
101+
let mut processes = vec![];
102+
103+
for mut f in [follower_p1, follower_p2] {
104+
let mut handler = ClientStreamHandler::new(f.bind_addr()).await;
105+
let res = handler.send_and_get(&array(vec!["info", "replication"])).await;
106+
if !res.contains("role:leader") {
107+
processes.push(f);
108+
continue;
109+
}
110+
let new_process =
111+
spawn_server_process(&ServerEnv::default().with_leader_bind_addr(f.bind_addr().into()));
119112
sleep(Duration::from_secs(1));
120113

121-
let mut handler3 = ClientStreamHandler::new(follower_p3.bind_addr()).await;
122-
123-
let response1 = handler.send_and_get(&array(vec!["info", "replication"])).await;
124-
let response3 = handler3.send_and_get(&array(vec!["info", "replication"])).await;
125-
126-
// THEN - one of the replicas should become the leader
127-
assert!([response1, response3].iter().any(|d| d.contains("role:leader")));
128-
};
114+
// WHEN
115+
// ! second leader is killed -> election happens
116+
f.kill().unwrap();
117+
processes.push(new_process);
118+
}
119+
assert_eq!(processes.len(), 2);
120+
121+
let mut flag = false;
122+
for f in processes.iter() {
123+
let mut handler = ClientStreamHandler::new(f.bind_addr()).await;
124+
let res = handler.send_and_get(&array(vec!["info", "replication"])).await;
125+
if res.contains("role:leader") {
126+
flag = true;
127+
break;
128+
}
129+
}
130+
assert!(flag, "No leader found after the second leader was killed");
129131
}

0 commit comments

Comments
 (0)