use std::sync::Arc;
use crate::MockRaftLog;
use d_engine_proto::common::Entry;
use d_engine_proto::common::EntryPayload;
pub struct MockReplicationTestContext {
pub id: u32,
pub raft_log: Arc<MockRaftLog>,
}
pub fn setup_mock_replication_test_context(node_id: u32) -> MockReplicationTestContext {
let raft_log = MockRaftLog::new();
MockReplicationTestContext {
id: node_id,
raft_log: Arc::new(raft_log),
}
}
pub fn mock_log_entries_exist(
raft_log: &mut MockRaftLog,
entries: Vec<Entry>,
) {
let entries_clone1 = entries.clone();
let entries_clone2 = entries.clone();
let entries_clone3 = entries.clone();
let last_index = entries.last().map(|e| e.index).unwrap_or(0);
raft_log.expect_last_entry_id().returning(move || last_index);
raft_log.expect_get_entries_range().returning(move |range| {
let start = *range.start();
let end = *range.end();
let filtered: Vec<Entry> = entries_clone1
.iter()
.filter(|e| e.index >= start && e.index <= end)
.cloned()
.collect();
Ok(filtered)
});
raft_log
.expect_entry()
.returning(move |index| Ok(entries_clone2.iter().find(|e| e.index == index).cloned()));
raft_log
.expect_entry_term()
.returning(move |index| entries_clone3.iter().find(|e| e.index == index).map(|e| e.term));
}
pub fn mock_insert_log_entries(
ids: Vec<u64>,
term: u64,
start_index: u64,
) -> Vec<Entry> {
use crate::test_utils::generate_insert_commands;
ids.into_iter()
.enumerate()
.map(|(offset, id)| Entry {
index: start_index + offset as u64,
term,
payload: Some(EntryPayload::command(generate_insert_commands(vec![id]))),
})
.collect()
}