liminal-protocol 0.3.2

Shared participant-lifecycle protocol types for liminal
Documentation
#![allow(clippy::expect_used, clippy::panic)]

use crate::wire::{
    AttachAttemptToken, AttachEnvelope, BindingEpoch, ConnectionIncarnation, DetachAttemptToken,
    DetachEnvelope, EnrollmentEnvelope, EnrollmentToken, Generation, LeaveAttemptToken,
    LeaveEnvelope, ObserverBackpressure, RecordAdmissionEnvelope,
};

use super::observer::{ObserverCheckedOperation, ObserverFloorDecision, check_observer_floor};

const OBSERVER_PROGRESS: u64 = 40;
const BLOCKING_FLOOR: u128 = 42;

fn generation(value: u64) -> Generation {
    Generation::new(value).expect("test generation is nonzero")
}

fn binding_epoch() -> BindingEpoch {
    BindingEpoch::new(ConnectionIncarnation::new(7, 9), generation(3))
}

fn enrollment() -> EnrollmentEnvelope {
    EnrollmentEnvelope {
        conversation_id: 11,
        enrollment_token: EnrollmentToken::new([0x11; 16]),
    }
}

fn attach() -> AttachEnvelope {
    AttachEnvelope {
        conversation_id: 12,
        participant_id: 2,
        capability_generation: generation(3),
        attach_attempt_token: AttachAttemptToken::new([0x12; 16]),
        accept_marker_delivery_seq: Some(30),
    }
}

fn detach() -> DetachEnvelope {
    DetachEnvelope {
        conversation_id: 13,
        participant_id: 3,
        capability_generation: generation(4),
        detach_attempt_token: DetachAttemptToken::new([0x13; 16]),
    }
}

fn leave() -> LeaveEnvelope {
    LeaveEnvelope {
        conversation_id: 14,
        participant_id: 4,
        capability_generation: generation(5),
        leave_attempt_token: LeaveAttemptToken::new([0x14; 16]),
    }
}

fn record() -> RecordAdmissionEnvelope {
    RecordAdmissionEnvelope {
        conversation_id: 15,
        participant_id: 5,
        capability_generation: generation(6),
        record_admission_attempt_token: crate::wire::RecordAdmissionAttemptToken::new([0xA7; 16]),
    }
}

fn refused(operation: ObserverCheckedOperation) -> ObserverBackpressure {
    match check_observer_floor(operation, OBSERVER_PROGRESS, BLOCKING_FLOOR) {
        ObserverFloorDecision::Respond(response) => response,
        ObserverFloorDecision::Eligible(_) => panic!("strict excess must refuse"),
    }
}

fn assert_state(state: crate::wire::ObserverBackpressureState) {
    assert_eq!(state.backpressure_epoch(), OBSERVER_PROGRESS);
    assert_eq!(state.observer_progress(), OBSERVER_PROGRESS);
}

#[test]
fn every_eligible_operation_constructs_its_exact_refusal() {
    let enrollment_request = enrollment();
    let ObserverBackpressure::Enrollment { request, state } = refused(
        ObserverCheckedOperation::Enrollment(enrollment_request.clone()),
    ) else {
        panic!("enrollment must retain its variant");
    };
    assert_eq!(request, enrollment_request);
    assert_state(state);

    let attach_request = attach();
    let ObserverBackpressure::CredentialAttach { request, state } = refused(
        ObserverCheckedOperation::CredentialAttach(attach_request.clone()),
    ) else {
        panic!("attach must retain its variant");
    };
    assert_eq!(request, attach_request);
    assert_state(state);

    let detach_request = detach();
    let committed_binding_epoch = binding_epoch();
    let ObserverBackpressure::Detach {
        request,
        committed_binding_epoch: response_epoch,
        state,
    } = refused(ObserverCheckedOperation::InitialDetach {
        request: detach_request.clone(),
        committed_binding_epoch,
    })
    else {
        panic!("detach must retain its variant");
    };
    assert_eq!(request, detach_request);
    assert_eq!(response_epoch, committed_binding_epoch);
    assert_state(state);

    let leave_request = leave();
    let ObserverBackpressure::Leave {
        request,
        state,
        prior_terminal_cell_exists,
    } = refused(ObserverCheckedOperation::Leave {
        request: leave_request.clone(),
        prior_terminal_cell_exists: true,
    })
    else {
        panic!("Leave must retain its variant");
    };
    assert_eq!(request, leave_request);
    assert!(prior_terminal_cell_exists);
    assert_state(state);

    let record_request = record();
    let ObserverBackpressure::RecordAdmission { request, state } = refused(
        ObserverCheckedOperation::RecordAdmission(record_request.clone()),
    ) else {
        panic!("record admission must retain its variant");
    };
    assert_eq!(request, record_request);
    assert_state(state);
}

#[test]
fn equality_passes_and_returns_the_exact_opaque_permit() {
    let decision = check_observer_floor(
        ObserverCheckedOperation::RecordAdmission(record()),
        OBSERVER_PROGRESS,
        u128::from(OBSERVER_PROGRESS) + 1,
    );
    let ObserverFloorDecision::Eligible(permit) = decision else {
        panic!("equality must pass");
    };
    assert_eq!(permit.observer_progress(), OBSERVER_PROGRESS);
    assert_eq!(permit.cap_floor(), u128::from(OBSERVER_PROGRESS) + 1);
}

#[test]
fn lower_floor_passes_without_recalculating_it() {
    let decision = check_observer_floor(
        ObserverCheckedOperation::Enrollment(enrollment()),
        OBSERVER_PROGRESS,
        7,
    );
    let ObserverFloorDecision::Eligible(permit) = decision else {
        panic!("floor below the observer boundary must pass");
    };
    assert_eq!(permit.observer_progress(), OBSERVER_PROGRESS);
    assert_eq!(permit.cap_floor(), 7);
}

#[test]
fn checked_one_past_maximum_progress_is_representable() {
    let one_past_max = u128::from(u64::MAX) + 1;
    let eligible = check_observer_floor(
        ObserverCheckedOperation::RecordAdmission(record()),
        u64::MAX,
        one_past_max,
    );
    assert!(matches!(eligible, ObserverFloorDecision::Eligible(_)));

    let refused = check_observer_floor(
        ObserverCheckedOperation::RecordAdmission(record()),
        u64::MAX,
        one_past_max + 1,
    );
    let ObserverFloorDecision::Respond(ObserverBackpressure::RecordAdmission { state, .. }) =
        refused
    else {
        panic!("strict excess above checked one-past MAX must refuse");
    };
    assert_eq!(state.observer_progress(), u64::MAX);
    assert_eq!(state.backpressure_epoch(), u64::MAX);
}

#[test]
fn refusal_echoes_inputs_without_exposing_a_commit_permit() {
    let request = leave();
    let original = request.clone();
    let decision = check_observer_floor(
        ObserverCheckedOperation::Leave {
            request,
            prior_terminal_cell_exists: false,
        },
        6,
        8,
    );
    let ObserverFloorDecision::Respond(ObserverBackpressure::Leave {
        request,
        state,
        prior_terminal_cell_exists,
    }) = decision
    else {
        panic!("blocking Leave must return only its refusal");
    };
    assert_eq!(request, original);
    assert!(!prior_terminal_cell_exists);
    assert_eq!(state.observer_progress(), 6);
    assert_eq!(state.backpressure_epoch(), 6);
}