use alloc::{boxed::Box, vec, vec::Vec};
use super::support::{
assert_bound, closure_capacity_exceeded, generation, order_exhausted, record_envelope,
sequence_exhausted,
};
use crate::algebra::{ResourceDimension, ResourceVector};
use super::super::{
BindingRequiredEnvelope, ClientDiscriminant, ClosureCheckedEnvelope,
CommonStaleAuthorityEnvelope, InvalidObserverEpoch, InvalidObserverEpochList, NoBinding,
ObserverBackpressure, ObserverBackpressureState, ObserverRecoveryAccepted,
ObserverRecoveryResponse, OrderAllocatingEnvelope, ParticipantReferenceEnvelope,
ParticipantUnknown, RecordAdmissionResponse, RecordCommitted, RecordTooLarge, Retired,
SequenceAllocatingEnvelope, ServerDiscriminant, StaleAuthority,
};
#[test]
fn record_admission_constructors_stay_inside_the_register_rows() {
let responses = vec![
(
RecordAdmissionResponse::connection_conversation_capacity_exceeded(
record_envelope(),
4,
),
ServerDiscriminant::ConnectionConversationCapacityExceeded,
),
(
RecordAdmissionResponse::from_conversation_order_exhausted(Box::new(order_exhausted(
OrderAllocatingEnvelope::RecordAdmission(record_envelope()),
))),
ServerDiscriminant::ConversationOrderExhausted,
),
(
RecordAdmissionResponse::from_participant_unknown(ParticipantUnknown {
request: ParticipantReferenceEnvelope::RecordAdmission(record_envelope()),
}),
ServerDiscriminant::ParticipantUnknown,
),
(
RecordAdmissionResponse::from_no_binding(NoBinding {
request: BindingRequiredEnvelope::RecordAdmission(record_envelope()),
}),
ServerDiscriminant::NoBinding,
),
(
RecordAdmissionResponse::from_stale_authority(StaleAuthority::Live {
request: CommonStaleAuthorityEnvelope::RecordAdmission(record_envelope()),
current_generation: generation(3),
}),
ServerDiscriminant::StaleAuthority,
),
(
RecordAdmissionResponse::from_retired(Retired::Participant {
request: ParticipantReferenceEnvelope::RecordAdmission(record_envelope()),
retired_generation: generation(3),
}),
ServerDiscriminant::Retired,
),
(
RecordAdmissionResponse::from_marker_closure_capacity_exceeded(Box::new(
closure_capacity_exceeded(ClosureCheckedEnvelope::RecordAdmission(
record_envelope(),
)),
)),
ServerDiscriminant::MarkerClosureCapacityExceeded,
),
(
RecordAdmissionResponse::record_committed(RecordCommitted::new(record_envelope(), 44)),
ServerDiscriminant::RecordCommitted,
),
(
RecordAdmissionResponse::record_too_large(RecordTooLarge {
request: record_envelope(),
dimension: ResourceDimension::Entries,
encoded_record_charge: ResourceVector::new(2, 10),
max_ordinary_record_charge: ResourceVector::new(1, 100),
}),
ServerDiscriminant::RecordTooLarge,
),
(
RecordAdmissionResponse::from_conversation_sequence_exhausted(Box::new(
sequence_exhausted(SequenceAllocatingEnvelope::RecordAdmission(
record_envelope(),
)),
)),
ServerDiscriminant::ConversationSequenceExhausted,
),
(
RecordAdmissionResponse::from_observer_backpressure(
ObserverBackpressure::RecordAdmission {
request: record_envelope(),
state: ObserverBackpressureState::initial(5),
},
),
ServerDiscriminant::ObserverBackpressure,
),
];
for (response, discriminant) in responses {
assert_bound(
response.server_value(),
ClientDiscriminant::RecordAdmission,
discriminant,
);
}
}
#[test]
fn observer_recovery_constructors_stay_inside_the_register_rows() {
let responses = [
ObserverRecoveryResponse::connection_capacity_exceeded(7, 4),
ObserverRecoveryResponse::accepted(ObserverRecoveryAccepted {
statuses: Vec::new(),
}),
ObserverRecoveryResponse::invalid_observer_epoch(
InvalidObserverEpoch::ConversationUnknown {
conversation_id: 7,
presented_epoch: 5,
},
),
ObserverRecoveryResponse::invalid_observer_epoch_list(
InvalidObserverEpochList::TooManyEntries {
presented_entries: 9,
max_entries: 8,
},
),
];
let expected = [
ServerDiscriminant::ObserverRecoveryConnectionCapacityExceeded,
ServerDiscriminant::ObserverRecoveryAccepted,
ServerDiscriminant::InvalidObserverEpoch,
ServerDiscriminant::InvalidObserverEpochList,
];
for (response, discriminant) in responses.iter().zip(expected) {
assert_eq!(response.server_value().originating_request(), None);
assert_eq!(response.discriminant(), discriminant);
}
}
#[test]
fn bound_values_move_out_intact() {
let response =
RecordAdmissionResponse::record_committed(RecordCommitted::new(record_envelope(), 44));
let observed = response.server_value().clone();
assert_eq!(response.discriminant(), ServerDiscriminant::RecordCommitted);
assert_eq!(response.into_server_value(), observed);
}