prikk-store 0.24.0

Prikk storage crate scaffold.
Documentation
use super::*;

#[test]
fn missing_sealed_replace_binary_new_blob_is_evidence_error() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "left.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "right.bin", blob(2), MODE_REGULAR);
    let left = replace_binary(1, node(1), blob(1), blob(3));
    let right = change_perm(2, node(2), MODE_REGULAR, MODE_EXECUTABLE);

    assert_evidence_error(
        commute_pair_result(
            &baseline,
            &TestTextResolver::empty(),
            EvidenceScope::SealedCandidateRequired,
            &left,
            &right,
        )
        .map(|result| match result {
            CommutationResult::DoesNotCommute { pair_class } => pair_class,
            CommutationResult::Commutes { .. } | CommutationResult::Unknown { .. } => {
                PairClass::Independent
            }
        }),
        EvidenceScope::SealedCandidateRequired,
        EvidenceFact::BlobKind,
    );
}

#[test]
fn missing_unsealed_replace_binary_new_blob_is_unknown() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "left.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "right.bin", blob(2), MODE_REGULAR);
    let left = replace_binary(1, node(1), blob(1), blob(3));
    let right = change_perm(2, node(2), MODE_REGULAR, MODE_EXECUTABLE);

    match commute_pair_result(
        &baseline,
        &TestTextResolver::empty(),
        EvidenceScope::UnsealedCandidateOptional,
        &left,
        &right,
    )
    .expect("unsealed missing replacement evidence remains algebraic")
    {
        CommutationResult::Unknown { reason } => {
            assert_eq!(reason, UnknownReason::MissingCandidateEvidence);
        }
        other => panic!("expected missing replacement evidence unknown, got {other:?}"),
    }
}

#[test]
fn non_binary_replace_binary_new_blob_is_evidence_error() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "left.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "right.bin", blob(2), MODE_REGULAR);
    let left = replace_binary(1, node(1), blob(1), blob(3));
    let right = change_perm(2, node(2), MODE_REGULAR, MODE_EXECUTABLE);
    let evidence = TestTextResolver::empty().with_blob(blob(3), BlobKind::Text, b"text".to_vec());

    match commute_pair_result(
        &baseline,
        &evidence,
        EvidenceScope::SealedCandidateRequired,
        &left,
        &right,
    ) {
        Err(EvidenceError::WrongBlobKind {
            scope,
            blob_id,
            expected,
            actual,
        }) => {
            assert_eq!(scope, EvidenceScope::SealedCandidateRequired);
            assert_eq!(blob_id, blob(3));
            assert_eq!(expected, BlobKind::Binary);
            assert_eq!(actual, BlobKind::Text);
        }
        other => panic!("expected wrong replacement blob kind, got {other:?}"),
    }
}

#[test]
fn wrong_object_type_replace_binary_new_blob_is_evidence_error() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "left.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "right.bin", blob(2), MODE_REGULAR);
    let left = replace_binary(1, node(1), blob(1), blob(3));
    let right = change_perm(2, node(2), MODE_REGULAR, MODE_EXECUTABLE);
    let evidence = TestTextResolver::empty().with_blob_kind_evidence(
        blob(3),
        Evidence::WrongObjectType {
            scope: EvidenceScope::SealedCandidateRequired,
            object_id: blob(3),
            expected: ObjectType::Blob,
            actual: ObjectType::Patch,
        },
    );

    match commute_pair_result(
        &baseline,
        &evidence,
        EvidenceScope::SealedCandidateRequired,
        &left,
        &right,
    ) {
        Err(EvidenceError::WrongObjectType {
            scope,
            object_id,
            expected,
            actual,
        }) => {
            assert_eq!(scope, EvidenceScope::SealedCandidateRequired);
            assert_eq!(object_id, blob(3));
            assert_eq!(expected, ObjectType::Blob);
            assert_eq!(actual, ObjectType::Patch);
        }
        other => panic!("expected wrong replacement object type, got {other:?}"),
    }
}

#[test]
fn malformed_replace_binary_new_blob_is_evidence_error() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "left.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "right.bin", blob(2), MODE_REGULAR);
    let left = replace_binary(1, node(1), blob(1), blob(3));
    let right = change_perm(2, node(2), MODE_REGULAR, MODE_EXECUTABLE);
    let evidence = TestTextResolver::empty().with_blob_kind_evidence(
        blob(3),
        Evidence::Malformed {
            scope: EvidenceScope::SealedCandidateRequired,
            fact: EvidenceFact::BlobKind,
            object_id: Some(blob(3)),
            reason: "bad blob payload".to_string(),
        },
    );

    match commute_pair_result(
        &baseline,
        &evidence,
        EvidenceScope::SealedCandidateRequired,
        &left,
        &right,
    ) {
        Err(EvidenceError::Malformed {
            scope,
            fact,
            object_id,
            ..
        }) => {
            assert_eq!(scope, EvidenceScope::SealedCandidateRequired);
            assert_eq!(fact, EvidenceFact::BlobKind);
            assert_eq!(object_id, Some(blob(3)));
        }
        other => panic!("expected malformed replacement blob evidence, got {other:?}"),
    }
}