Files
irtt-rs/crates/irtt-server/src/tests/tokens.rs
T

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);
}