ic-backup 0.12.0

Host-side snapshot backup and same-release recovery for Internet Computer canisters
Documentation
use super::*;
use crate::test_support::{fence_acquisition::original, membership::hash};

#[test]
fn acknowledgement_association_preserves_pending_mutation_and_consumed_spending() {
    let original = original(true);
    let request = FenceAcquisitionRequest::new(
        &original.plan,
        &original.obligation,
        &original.journal,
        &original.payload,
    )
    .unwrap();
    let acknowledgement = FenceAcquisitionAcknowledgement::new(
        request.authority().digest(),
        request.mutation_attempt(),
        hash("12"),
    )
    .unwrap();
    let before = original.journal.clone();
    let associated =
        validate_acknowledgement(&request, &original.journal, &acknowledgement).unwrap();
    assert_eq!(associated.evidence, hash("12"));
    assert_eq!(original.journal, before);
    assert_eq!(original.journal.view().pending_mutation, Some(1));
    assert!(!original.journal.view().applied);
    assert_eq!(original.journal.view().mutations_remaining, 0);
}

#[test]
fn changed_reply_authority_attempt_and_current_recovery_evidence_reject() {
    let mut original = original(false);
    let request = FenceAcquisitionRequest::new(
        &original.plan,
        &original.obligation,
        &original.journal,
        &original.payload,
    )
    .unwrap();
    let acknowledgement = FenceAcquisitionAcknowledgement::new(
        request.authority().digest(),
        request.mutation_attempt(),
        hash("12"),
    )
    .unwrap();
    let mut changed = acknowledgement.clone();
    changed.authority = hash("90");
    assert!(matches!(
        validate_acknowledgement(&request, &original.journal, &changed),
        Err(FenceAcquisitionAcknowledgementError::AuthorityMismatch)
    ));
    let mut changed = acknowledgement.clone();
    changed.mutation_attempt = 2;
    assert!(matches!(
        validate_acknowledgement(&request, &original.journal, &changed),
        Err(FenceAcquisitionAcknowledgementError::AttemptMismatch)
    ));
    original
        .journal
        .reserve_observation(1, hash("34").hash())
        .unwrap();
    assert!(matches!(
        validate_acknowledgement(&request, &original.journal, &acknowledgement),
        Err(FenceAcquisitionAcknowledgementError::Reservation(
            FenceAcquisitionError::ObservationPending
        ))
    ));
}