#![allow(clippy::expect_used, clippy::panic, clippy::too_many_lines)]
mod lifecycle_matrix;
mod records_matrix;
mod support;
use alloc::{boxed::Box, vec};
use self::support::{
assert_bound, attach_bound, attach_envelope, attach_marker_proof, closure_capacity_exceeded,
closure_snapshot, enroll_bound, enrollment_envelope, generation, order_exhausted,
sequence_budget, sequence_exhausted,
};
use super::{
AttemptConflict, ClientDiscriminant, ClosureCheckedEnvelope, ClosureRefusalReason,
CredentialAttachResponse, EnrollmentKnown, EnrollmentReceiptCapacityScope, EnrollmentResponse,
EnrollmentToken, IdentityCapacityExceeded, IdentityCapacityScope, MarkerMismatchBody,
MarkerNotDeliveredReason, ObserverBackpressureState, OrderAllocatingEnvelope, ReceiptExpired,
Retired, SequenceAllocatingEnvelope, ServerDiscriminant, StaleOrUnknownReceipt,
};
#[test]
fn enrollment_constructors_stay_inside_the_register_rows() {
let responses = vec![
(
EnrollmentResponse::connection_conversation_capacity_exceeded(enrollment_envelope(), 4),
ServerDiscriminant::ConnectionConversationCapacityExceeded,
),
(
EnrollmentResponse::connection_conversation_binding_occupied(&enrollment_envelope()),
ServerDiscriminant::ConnectionConversationBindingOccupied,
),
(
EnrollmentResponse::from_conversation_order_exhausted(Box::new(order_exhausted(
OrderAllocatingEnvelope::Enrollment(enrollment_envelope()),
))),
ServerDiscriminant::ConversationOrderExhausted,
),
(
EnrollmentResponse::from_marker_closure_capacity_exceeded(Box::new(
closure_capacity_exceeded(
ClosureCheckedEnvelope::Enrollment(enrollment_envelope()),
),
)),
ServerDiscriminant::MarkerClosureCapacityExceeded,
),
(
EnrollmentResponse::enroll_bound(enroll_bound()),
ServerDiscriminant::EnrollBound,
),
(
EnrollmentResponse::enrollment_known(EnrollmentKnown {
conversation_id: 7,
token: EnrollmentToken::new([1; 16]),
participant_id: 3,
current_generation: generation(2),
}),
ServerDiscriminant::EnrollmentKnown,
),
(
EnrollmentResponse::from_receipt_expired(ReceiptExpired::Enrollment {
conversation_id: 7,
token: EnrollmentToken::new([1; 16]),
participant_id: 3,
result_generation: generation(1),
current_generation: generation(2),
reason: super::ReceiptExpiryReason::Deadline,
}),
ServerDiscriminant::ReceiptExpired,
),
(
EnrollmentResponse::receipt_expired(
&enrollment_envelope(),
3,
generation(1),
generation(2),
super::ReceiptExpiryReason::Deadline,
),
ServerDiscriminant::ReceiptExpired,
),
(
EnrollmentResponse::from_retired(Retired::Enrollment {
request: enrollment_envelope(),
participant_id: 3,
retired_generation: generation(2),
}),
ServerDiscriminant::Retired,
),
(
EnrollmentResponse::receipt_capacity_exceeded(
enrollment_envelope(),
EnrollmentReceiptCapacityScope::LiveReceiptServer,
8,
8,
),
ServerDiscriminant::ReceiptCapacityExceeded,
),
(
EnrollmentResponse::identity_capacity_exceeded(IdentityCapacityExceeded {
request: enrollment_envelope(),
scope: IdentityCapacityScope::Server,
limit: 8,
occupied: 8,
}),
ServerDiscriminant::IdentityCapacityExceeded,
),
(
EnrollmentResponse::observer_backpressure(
enrollment_envelope(),
ObserverBackpressureState::initial(5),
),
ServerDiscriminant::ObserverBackpressure,
),
(
EnrollmentResponse::from_conversation_sequence_exhausted(Box::new(sequence_exhausted(
SequenceAllocatingEnvelope::Enrollment(enrollment_envelope()),
))),
ServerDiscriminant::ConversationSequenceExhausted,
),
(
EnrollmentResponse::bound(enroll_bound()),
ServerDiscriminant::Bound,
),
(
EnrollmentResponse::unbound_receipt(enroll_bound()),
ServerDiscriminant::UnboundReceipt,
),
];
for (response, discriminant) in responses {
assert_bound(
response.server_value(),
ClientDiscriminant::EnrollmentRequest,
discriminant,
);
}
}
#[test]
fn enrollment_receipt_expired_public_form_matches_the_sealed_lookup_wrapper() {
let envelope = enrollment_envelope();
let public_form = EnrollmentResponse::receipt_expired(
&envelope,
3,
generation(1),
generation(2),
super::ReceiptExpiryReason::Deadline,
);
let sealed_form = EnrollmentResponse::from_receipt_expired(ReceiptExpired::Enrollment {
conversation_id: envelope.conversation_id,
token: envelope.enrollment_token,
participant_id: 3,
result_generation: generation(1),
current_generation: generation(2),
reason: super::ReceiptExpiryReason::Deadline,
});
assert_eq!(public_form, sealed_form);
}
#[test]
fn credential_attach_constructors_stay_inside_the_register_rows() {
let responses = vec![
(
CredentialAttachResponse::attempt_token_body_conflict(
&attach_envelope(),
AttemptConflict::Generation,
),
ServerDiscriminant::AttemptTokenBodyConflict,
),
(
CredentialAttachResponse::connection_conversation_capacity_exceeded(
attach_envelope(),
4,
),
ServerDiscriminant::ConnectionConversationCapacityExceeded,
),
(
CredentialAttachResponse::connection_conversation_binding_occupied(&attach_envelope()),
ServerDiscriminant::ConnectionConversationBindingOccupied,
),
(
CredentialAttachResponse::conversation_order_exhausted(
attach_envelope(),
9,
1,
4,
0,
4,
),
ServerDiscriminant::ConversationOrderExhausted,
),
(
CredentialAttachResponse::participant_unknown(attach_envelope()),
ServerDiscriminant::ParticipantUnknown,
),
(
CredentialAttachResponse::stale_authority(attach_envelope(), generation(3)),
ServerDiscriminant::StaleAuthority,
),
(
CredentialAttachResponse::retired(attach_envelope(), generation(3)),
ServerDiscriminant::Retired,
),
(
CredentialAttachResponse::marker_closure_capacity_exceeded(
attach_envelope(),
closure_snapshot(),
ClosureRefusalReason::DeliveredMarkerAwaitingAck,
),
ServerDiscriminant::MarkerClosureCapacityExceeded,
),
(
CredentialAttachResponse::attach_bound(attach_bound()),
ServerDiscriminant::AttachBound,
),
(
CredentialAttachResponse::receipt_expired(
&attach_envelope(),
generation(2),
generation(3),
super::ReceiptExpiryReason::Deadline,
),
ServerDiscriminant::ReceiptExpired,
),
(
CredentialAttachResponse::stale_or_unknown_receipt(StaleOrUnknownReceipt {
conversation_id: 7,
token: super::AttachAttemptToken::new([2; 16]),
participant_id: 3,
presented_generation: generation(2),
presented_marker_delivery_seq: None,
current_generation: generation(3),
}),
ServerDiscriminant::StaleOrUnknownReceipt,
),
(
CredentialAttachResponse::marker_not_delivered(
attach_marker_proof(),
MarkerNotDeliveredReason::NotDeliveredToProofEpoch,
12,
),
ServerDiscriminant::MarkerNotDelivered,
),
(
CredentialAttachResponse::marker_mismatch(
attach_marker_proof(),
MarkerMismatchBody::NoMarkerExpected,
),
ServerDiscriminant::MarkerMismatch,
),
(
CredentialAttachResponse::receipt_capacity_exceeded(
attach_envelope(),
super::ReceiptCapacityScope::LiveReceiptParticipant,
8,
8,
),
ServerDiscriminant::ReceiptCapacityExceeded,
),
(
CredentialAttachResponse::observer_backpressure(
attach_envelope(),
ObserverBackpressureState::initial(5),
),
ServerDiscriminant::ObserverBackpressure,
),
(
CredentialAttachResponse::conversation_sequence_exhausted(
attach_envelope(),
sequence_budget(),
),
ServerDiscriminant::ConversationSequenceExhausted,
),
(
CredentialAttachResponse::bound(attach_bound()),
ServerDiscriminant::Bound,
),
(
CredentialAttachResponse::unbound_receipt(attach_bound()),
ServerDiscriminant::UnboundReceipt,
),
];
for (response, discriminant) in responses {
assert_bound(
response.server_value(),
ClientDiscriminant::CredentialAttachRequest,
discriminant,
);
}
}