ic-backup 0.63.2

Host-side snapshot backup and same-release recovery for Internet Computer canisters
Documentation
use super::*;
use crate::{model::settlement::SettlementContext, tests::support::operation_plan::hash};

#[test]
fn every_original_identity_field_and_rejection_order_is_bound() {
    let expected = IcInventorySettlement {
        context: SettlementContext {
            authority: hash("12"),
            mutation_attempt: 1,
            observation_attempt: 2,
            challenge: hash("34"),
            observation_evidence: hash("56"),
            evidence: hash("78"),
        },
        baseline: hash("90"),
        inventory: hash("ab"),
        attribution: IcInventoryAttribution::Unresolved {
            uncertainty: hash("cd"),
        },
    };
    let change = |claim: &mut IcInventorySettlement, field| match field {
        0 => claim.context.authority = hash("ef"),
        1 => claim.context.mutation_attempt = 3,
        2 => claim.context.observation_attempt = 3,
        3 => claim.context.challenge = hash("ef"),
        4 => claim.baseline = hash("ef"),
        5 => claim.inventory = hash("ef"),
        _ => claim.context.observation_evidence = hash("ef"),
    };
    for (field, error) in [
        InventorySettlementMismatch::Authority,
        InventorySettlementMismatch::Attempt,
        InventorySettlementMismatch::Attempt,
        InventorySettlementMismatch::Challenge,
        InventorySettlementMismatch::Baseline,
        InventorySettlementMismatch::Inventory,
        InventorySettlementMismatch::ObservationEvidence,
    ]
    .into_iter()
    .enumerate()
    {
        // Prove each field alone, then its precedence over every later mismatch.
        for combined in [false, true] {
            let mut changed = expected.clone();
            let end = if combined { 7 } else { field + 1 };
            for index in field..end {
                change(&mut changed, index);
            }
            assert_eq!(
                compare_identity(
                    &changed,
                    &SettlementIdentity::from(&expected.context),
                    &expected.baseline,
                    &expected.inventory,
                    &expected.context.observation_evidence
                )
                .unwrap_err(),
                error
            );
        }
    }
    assert_eq!(
        compare_identity(
            &expected,
            &SettlementIdentity::from(&expected.context),
            &expected.baseline,
            &expected.inventory,
            &expected.context.observation_evidence
        ),
        Ok(())
    );
}