liminal-protocol 0.2.1

Shared participant-lifecycle protocol types for liminal
Documentation
use super::*;
use crate::wire::{ClientDiscriminant, ClientRequest, EnrollmentRequest, EnrollmentToken};

type TestResult<T = ()> = Result<T, &'static str>;

fn token_bearing_abandonment_record() -> TestResult<ClientResumeRecord> {
    let mut aggregate = ClientParticipantAggregate::new();
    aggregate.restored_abandonment = Some(RestoredExpectedOperationAbandonment {
        request: ClientRequest::Enrollment(EnrollmentRequest {
            conversation_id: 41,
            enrollment_token: EnrollmentToken::new([42; 16]),
        }),
        reason: RestoredExpectedOperationAbandonmentReason::TokenlessAfterCrash,
        was_issued: true,
    });
    aggregate
        .resume_record()
        .map_err(|_| "token-bearing abandonment fixture must encode canonically")
}

#[test]
fn canonical_decode_rejects_token_bearing_abandonment() -> TestResult {
    let record = token_bearing_abandonment_record()?;
    assert_eq!(
        ClientResumeRecord::decode_canonical(&record.encode_canonical()),
        Err(ClientResumeRecordDecodeError::InvalidAbandonmentRequest {
            request: ClientDiscriminant::EnrollmentRequest,
        })
    );
    Ok(())
}

#[test]
fn canonical_restore_rejects_token_bearing_abandonment() -> TestResult {
    let record = token_bearing_abandonment_record()?;
    assert_eq!(
        record.restore(),
        Err(ClientResumeRestoreError::CorruptRecord(
            ClientResumeRecordDecodeError::InvalidAbandonmentRequest {
                request: ClientDiscriminant::EnrollmentRequest,
            },
        ))
    );
    Ok(())
}