use alloc::vec;
use super::support::{
assert_bound, closure_snapshot, detach_envelope, epoch, generation, leave_envelope,
marker_ack_envelope, marker_ack_proof, participant_ack_envelope, terminalized_detach_cell,
};
use super::super::{
AckCommitted, AckGap, AckNoOp, AckRegression, BindingRequiredEnvelope, ClientDiscriminant,
ClosureRefusalReason, CommonStaleAuthorityEnvelope, DetachCommitted, DetachInProgress,
DetachResponse, DetachStaleAuthority, LeaveCommitted, LeaveResponse, LeaveStaleAuthority,
MarkerAckCommitted, MarkerAckResponse, MarkerMismatch, MarkerMismatchBody, MarkerNotDelivered,
MarkerNotDeliveredReason, MarkerProofRequest, NoBinding, ObserverBackpressureState,
ParticipantAckResponse, ParticipantReferenceEnvelope, ParticipantUnknown, Retired,
ServerDiscriminant, ServerValue, StaleAuthority,
};
#[test]
fn detach_constructors_stay_inside_the_register_rows() {
let responses = vec![
(
DetachResponse::connection_conversation_capacity_exceeded(detach_envelope(), 4),
ServerDiscriminant::ConnectionConversationCapacityExceeded,
),
(
DetachResponse::participant_unknown(detach_envelope()),
ServerDiscriminant::ParticipantUnknown,
),
(
DetachResponse::no_binding(detach_envelope()),
ServerDiscriminant::NoBinding,
),
(
DetachResponse::stale_authority(DetachStaleAuthority::Live {
conversation_id: 7,
participant_id: 3,
capability_generation: generation(2),
detach_attempt_token: super::super::DetachAttemptToken::new([3; 16]),
current_generation: generation(3),
}),
ServerDiscriminant::StaleAuthority,
),
(
DetachResponse::stale_authority(DetachStaleAuthority::TerminalizedDetachCell(
terminalized_detach_cell(),
)),
ServerDiscriminant::StaleAuthority,
),
(
DetachResponse::retired(detach_envelope(), generation(3)),
ServerDiscriminant::Retired,
),
(
DetachResponse::detach_committed(DetachCommitted::new(
7,
3,
super::super::DetachAttemptToken::new([3; 16]),
epoch(2),
21,
)),
ServerDiscriminant::DetachCommitted,
),
(
DetachResponse::detach_in_progress(DetachInProgress {
conversation_id: 7,
participant_id: 3,
presented_token: super::super::DetachAttemptToken::new([9; 16]),
presented_generation: generation(2),
committed_binding_epoch: epoch(2),
}),
ServerDiscriminant::DetachInProgress,
),
(
DetachResponse::observer_backpressure(
detach_envelope(),
epoch(2),
ObserverBackpressureState::initial(5),
),
ServerDiscriminant::ObserverBackpressure,
),
];
for (response, discriminant) in responses {
assert_bound(
response.server_value(),
ClientDiscriminant::DetachRequest,
discriminant,
);
}
}
#[test]
fn participant_ack_constructors_stay_inside_the_register_rows() {
let responses = vec![
(
ParticipantAckResponse::connection_conversation_capacity_exceeded(
participant_ack_envelope(),
4,
),
ServerDiscriminant::ConnectionConversationCapacityExceeded,
),
(
ParticipantAckResponse::from_participant_unknown(ParticipantUnknown {
request: ParticipantReferenceEnvelope::ParticipantAck(participant_ack_envelope()),
}),
ServerDiscriminant::ParticipantUnknown,
),
(
ParticipantAckResponse::from_no_binding(NoBinding {
request: BindingRequiredEnvelope::ParticipantAck(participant_ack_envelope()),
}),
ServerDiscriminant::NoBinding,
),
(
ParticipantAckResponse::from_stale_authority(StaleAuthority::Live {
request: CommonStaleAuthorityEnvelope::ParticipantAck(participant_ack_envelope()),
current_generation: generation(3),
}),
ServerDiscriminant::StaleAuthority,
),
(
ParticipantAckResponse::ack_committed(AckCommitted::new(participant_ack_envelope())),
ServerDiscriminant::AckCommitted,
),
(
ParticipantAckResponse::ack_no_op(participant_ack_envelope()),
ServerDiscriminant::AckNoOp,
),
(
ParticipantAckResponse::ack_gap(
AckGap::new(participant_ack_envelope(), 4).expect("through_seq 9 above cursor 4"),
),
ServerDiscriminant::AckGap,
),
(
ParticipantAckResponse::ack_regression(
AckRegression::new(participant_ack_envelope(), 12)
.expect("through_seq 9 below cursor 12"),
),
ServerDiscriminant::AckRegression,
),
(
ParticipantAckResponse::from_retired(Retired::Participant {
request: ParticipantReferenceEnvelope::ParticipantAck(participant_ack_envelope()),
retired_generation: generation(3),
}),
ServerDiscriminant::Retired,
),
];
for (response, discriminant) in responses {
assert_bound(
response.server_value(),
ClientDiscriminant::ParticipantAck,
discriminant,
);
}
}
#[test]
fn leave_constructors_stay_inside_the_register_rows() {
let responses = vec![
(
LeaveResponse::attempt_token_body_conflict(
super::super::LeaveAttemptToken::new([4; 16]),
7,
3,
generation(2),
),
ServerDiscriminant::AttemptTokenBodyConflict,
),
(
LeaveResponse::connection_conversation_capacity_exceeded(leave_envelope(), 4),
ServerDiscriminant::ConnectionConversationCapacityExceeded,
),
(
LeaveResponse::participant_unknown(leave_envelope()),
ServerDiscriminant::ParticipantUnknown,
),
(
LeaveResponse::no_binding(leave_envelope()),
ServerDiscriminant::NoBinding,
),
(
LeaveResponse::stale_authority(LeaveStaleAuthority::Live {
conversation_id: 7,
participant_id: 3,
presented_generation: generation(2),
leave_attempt_token: super::super::LeaveAttemptToken::new([4; 16]),
current_generation: generation(3),
}),
ServerDiscriminant::StaleAuthority,
),
(
LeaveResponse::retired(leave_envelope(), generation(3)),
ServerDiscriminant::Retired,
),
(
LeaveResponse::marker_closure_capacity_exceeded(
leave_envelope(),
closure_snapshot(),
ClosureRefusalReason::DeliveredMarkerAwaitingAck,
),
ServerDiscriminant::MarkerClosureCapacityExceeded,
),
(
LeaveResponse::leave_committed(
LeaveCommitted::new(
7,
super::super::LeaveAttemptToken::new([4; 16]),
3,
generation(2),
Some(epoch(2)),
None,
33,
)
.expect("matching generation and ordered terminals"),
),
ServerDiscriminant::LeaveCommitted,
),
(
LeaveResponse::observer_backpressure(
leave_envelope(),
ObserverBackpressureState::initial(5),
true,
),
ServerDiscriminant::ObserverBackpressure,
),
];
for (response, discriminant) in responses {
assert_bound(
response.server_value(),
ClientDiscriminant::LeaveRequest,
discriminant,
);
}
}
#[test]
fn marker_ack_constructors_stay_inside_the_register_rows() {
let responses = vec![
(
MarkerAckResponse::connection_conversation_capacity_exceeded(marker_ack_envelope(), 4),
ServerDiscriminant::ConnectionConversationCapacityExceeded,
),
(
MarkerAckResponse::from_participant_unknown(ParticipantUnknown {
request: ParticipantReferenceEnvelope::MarkerAck(marker_ack_envelope()),
}),
ServerDiscriminant::ParticipantUnknown,
),
(
MarkerAckResponse::from_no_binding(NoBinding {
request: BindingRequiredEnvelope::MarkerAck(marker_ack_envelope()),
}),
ServerDiscriminant::NoBinding,
),
(
MarkerAckResponse::from_stale_authority(StaleAuthority::Live {
request: CommonStaleAuthorityEnvelope::MarkerAck(marker_ack_envelope()),
current_generation: generation(3),
}),
ServerDiscriminant::StaleAuthority,
),
(
MarkerAckResponse::marker_ack_committed(MarkerAckCommitted::new(marker_ack_envelope())),
ServerDiscriminant::MarkerAckCommitted,
),
(
MarkerAckResponse::from_ack_no_op(AckNoOp::marker_ack(marker_ack_envelope())),
ServerDiscriminant::AckNoOp,
),
(
MarkerAckResponse::from_marker_not_delivered(MarkerNotDelivered {
request: MarkerProofRequest::MarkerAck(marker_ack_proof()),
reason: MarkerNotDeliveredReason::NotDeliveredToProofEpoch,
expected_marker_delivery_seq: 12,
}),
ServerDiscriminant::MarkerNotDelivered,
),
(
MarkerAckResponse::from_marker_mismatch(MarkerMismatch {
request: MarkerProofRequest::MarkerAck(marker_ack_proof()),
mismatch: MarkerMismatchBody::NoMarkerExpected,
}),
ServerDiscriminant::MarkerMismatch,
),
(
MarkerAckResponse::from_retired(Retired::Participant {
request: ParticipantReferenceEnvelope::MarkerAck(marker_ack_envelope()),
retired_generation: generation(3),
}),
ServerDiscriminant::Retired,
),
];
for (response, discriminant) in responses {
assert_bound(
response.server_value(),
ClientDiscriminant::MarkerAck,
discriminant,
);
}
}
#[test]
fn narrow_constructors_embed_the_exact_origin_arm() {
let response = DetachResponse::no_binding(detach_envelope());
let ServerValue::NoBinding(no_binding) = response.server_value() else {
panic!("no-binding constructor selects the no-binding wire value");
};
assert_eq!(
no_binding.request,
BindingRequiredEnvelope::Detach(detach_envelope()),
);
}