mkit-server 0.5.0

Runtime-agnostic core of the mkit server: operation model, errors, runtime and telemetry vocabulary
Documentation
use super::*;
use crate::memory::MemoryKv;
use crate::repo::NamespaceKey;
use crate::rt::ManualClock;
use futures_executor::block_on;
use std::sync::Arc;

#[test]
fn opaque_etag_facts_replay_without_changing_identity_and_fail_closed_on_corruption() {
    let store = MemoryKv::with_clock(Arc::new(ManualClock::new(100)));
    let partition = Partition::Namespace(NamespaceKey::deployment_default());
    let repo = RepoName::new("one").unwrap();
    let pack = [4; 32];
    let tag = "opaque".repeat(25_000);
    let token = block_on(capture(&store, &partition, &repo, &pack, &tag, 200)).unwrap();
    assert_eq!(token.len(), 64);
    assert_eq!(
        block_on(capture(&store, &partition, &repo, &pack, &tag, 200)).unwrap(),
        token
    );
    assert_eq!(
        block_on(resolve(&store, &partition, &repo, &pack, Some(&token))).unwrap(),
        Some(tag)
    );
    let key = keys::verify_row(
        &repo,
        &pack,
        keys::VC_CANDIDATE,
        Some(&from_hex(&token).unwrap()),
    );
    block_on(store.apply(
        &partition,
        Batch::new().put(key.clone(), Value::new(b"replacement".to_vec())),
    ))
    .unwrap();
    assert!(matches!(
        block_on(resolve(&store, &partition, &repo, &pack, Some(&token))),
        Err(StoreError::Corrupt(_))
    ));
    block_on(store.apply(&partition, Batch::new().delete(key))).unwrap();
    assert!(matches!(
        block_on(resolve(&store, &partition, &repo, &pack, Some(&token))),
        Err(StoreError::Corrupt(_))
    ));
    assert!(
        block_on(resolve(
            &store,
            &partition,
            &repo,
            &pack,
            Some("not-a-token")
        ))
        .is_err()
    );
}