79 lines
2.4 KiB
Rust
79 lines
2.4 KiB
Rust
use super::support::{
|
|
client_params, core_with_tokens, expect_normal_open_reply, open_request, peer, ScriptedTokens,
|
|
};
|
|
use crate::{token::TOKEN_ATTEMPTS, ServerConfig, ServerError};
|
|
|
|
const TOKEN_A: u64 = 0x0102_0304_0506_0708;
|
|
const TOKEN_B: u64 = 0x1112_1314_1516_1718;
|
|
|
|
#[test]
|
|
fn a_zero_draw_is_discarded_and_redrawn() {
|
|
// Zero is reserved for no-test replies and is never issued to a session.
|
|
let mut core = core_with_tokens(
|
|
ServerConfig::default(),
|
|
ScriptedTokens::new([0, 0, TOKEN_A]),
|
|
);
|
|
|
|
let packet = core
|
|
.handle_datagram(peer(), &open_request(&client_params(), None))
|
|
.unwrap()
|
|
.expect("a zero draw must be retried, not surfaced");
|
|
|
|
assert_eq!(expect_normal_open_reply(&packet, None).token, TOKEN_A);
|
|
assert_eq!(core.session_count(), 1);
|
|
}
|
|
|
|
#[test]
|
|
fn a_colliding_draw_is_discarded_and_never_overwrites_the_live_session() {
|
|
let mut core = core_with_tokens(
|
|
ServerConfig::default(),
|
|
ScriptedTokens::new([TOKEN_A, TOKEN_A, TOKEN_B]),
|
|
);
|
|
let request = open_request(&client_params(), None);
|
|
|
|
core.handle_datagram(peer(), &request)
|
|
.unwrap()
|
|
.expect("first open must be answered");
|
|
|
|
let packet = core
|
|
.handle_datagram(peer(), &request)
|
|
.unwrap()
|
|
.expect("a collision must be retried, not surfaced");
|
|
|
|
assert_eq!(expect_normal_open_reply(&packet, None).token, TOKEN_B);
|
|
assert_eq!(core.session_count(), 2);
|
|
}
|
|
|
|
#[test]
|
|
fn exhausting_the_retry_budget_is_an_internal_error_that_creates_nothing() {
|
|
let mut core = core_with_tokens(
|
|
ServerConfig::default(),
|
|
ScriptedTokens::new([TOKEN_A, 0, 0, 0, 0, 0, 0, 0, 0]),
|
|
);
|
|
let request = open_request(&client_params(), None);
|
|
|
|
core.handle_datagram(peer(), &request)
|
|
.unwrap()
|
|
.expect("first open must be answered");
|
|
|
|
assert_eq!(
|
|
core.handle_datagram(peer(), &request),
|
|
Err(ServerError::TokenExhausted {
|
|
attempts: TOKEN_ATTEMPTS
|
|
})
|
|
);
|
|
|
|
assert_eq!(core.session_count(), 1, "no session may be half-created");
|
|
}
|
|
|
|
#[test]
|
|
fn a_failing_random_source_is_reported_and_creates_nothing() {
|
|
let mut core = core_with_tokens(ServerConfig::default(), ScriptedTokens::failing());
|
|
|
|
assert!(matches!(
|
|
core.handle_datagram(peer(), &open_request(&client_params(), None)),
|
|
Err(ServerError::RandomSource { .. })
|
|
));
|
|
assert_eq!(core.session_count(), 0);
|
|
}
|