openraft 0.10.0-alpha.18

Advanced Raft consensus
Documentation
use validit::Validate;

use crate::RaftState;
use crate::engine::LogIdList;
use crate::engine::testing::UTConfig;
use crate::type_config::alias::LogIdOf;
use crate::type_config::alias::SnapshotMetaOf;

fn log_id(term: u64, index: u64) -> LogIdOf<UTConfig> {
    crate::engine::testing::log_id(term, 0, index)
}

#[test]
fn test_raft_state_validate_snapshot_is_none() -> anyhow::Result<()> {
    // Some app does not persist snapshot, when restarted, purged is not None but snapshot_last_log_id
    // is None. This is a valid state and should not emit error.
    //
    // Last-per-leader: purged at 1, leader 3's logs at 2-4

    let mut rs = RaftState::<UTConfig> {
        log_ids: LogIdList::new(Some(log_id(1, 1)), vec![log_id(3, 4)]),
        purge_upto: Some(log_id(1, 1)),
        snapshot_meta: SnapshotMetaOf::<UTConfig>::default(),
        ..Default::default()
    };

    rs.apply_progress_mut().accept(log_id(1, 1));

    assert!(rs.validate().is_ok());

    Ok(())
}