in quic/s2n-quic-transport/src/connection/local_id_registry/tests.rs [135:263]
fn connection_mapper_test() {
let mut id_generator = InternalConnectionIdGenerator::new();
let mut random_generator = random::testing::Generator(123);
let mut mapper = ConnectionIdMapper::new(&mut random_generator, endpoint::Type::Server);
let id1 = id_generator.generate_id();
let id2 = id_generator.generate_id();
let ext_id_1 = id(b"id01");
let ext_id_2 = id(b"id02");
let ext_id_3 = id(b"id03");
let ext_id_4 = id(b"id04");
let now = time::now();
let handshake_id_expiration_time = now + Duration::from_secs(60);
let mut reg1 = mapper.create_local_id_registry(
id1,
&ext_id_1,
Some(handshake_id_expiration_time),
TEST_TOKEN_1,
true,
);
let mut reg2 = mapper.create_local_id_registry(
id2,
&ext_id_3,
Some(handshake_id_expiration_time),
TEST_TOKEN_3,
true,
);
reg1.set_active_connection_id_limit(3);
reg2.set_active_connection_id_limit(3);
assert_eq!(
0,
reg1.get_connection_id_info(&ext_id_1)
.unwrap()
.sequence_number
);
assert_eq!(
Some(handshake_id_expiration_time - EXPIRATION_BUFFER),
reg1.get_connection_id_info(&ext_id_1)
.unwrap()
.retirement_time
);
assert_eq!(
Some((id1, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_1)
);
assert_eq!(
TEST_TOKEN_1,
reg1.get_connection_id_info(&ext_id_1)
.unwrap()
.stateless_reset_token
);
assert_eq!(
Err(LocalIdRegistrationError::ConnectionIdInUse),
reg2.register_connection_id(&ext_id_1, None, TEST_TOKEN_1)
);
let exp_2 = now + Duration::from_secs(60);
assert!(reg1
.register_connection_id(&ext_id_2, Some(exp_2), TEST_TOKEN_2)
.is_ok());
assert_eq!(
Some(exp_2 - EXPIRATION_BUFFER),
reg1.get_connection_id_info(&ext_id_2)
.unwrap()
.retirement_time
);
assert!(reg2
.register_connection_id(&ext_id_4, None, TEST_TOKEN_4)
.is_ok());
assert_eq!(
Some((id1, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_2)
);
assert_eq!(
Some((id2, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_3)
);
assert_eq!(
Some((id2, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_4)
);
// Unregister id 3 (sequence number 0)
reg2.get_connection_id_info_mut(&ext_id_3).unwrap().status = PendingRemoval(now);
reg2.unregister_expired_ids(now);
assert_eq!(None, mapper.lookup_internal_connection_id(&ext_id_3));
assert_eq!(
Some((id2, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_4)
);
reg2.get_connection_id_info_mut(&ext_id_4).unwrap().status =
PendingRetirementConfirmation(Some(now));
reg2.unregister_expired_ids(now);
assert_eq!(None, mapper.lookup_internal_connection_id(&ext_id_4));
// Put back ID3 and ID4 to test drop behavior
assert!(reg1
.register_connection_id(&ext_id_3, None, TEST_TOKEN_3)
.is_ok());
assert!(reg2
.register_connection_id(&ext_id_4, None, TEST_TOKEN_4)
.is_ok());
assert_eq!(
Some((id1, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_3)
);
assert_eq!(
Some((id2, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_4)
);
// If a registration is dropped all entries are removed
drop(reg1);
assert_eq!(None, mapper.lookup_internal_connection_id(&ext_id_1));
assert_eq!(None, mapper.lookup_internal_connection_id(&ext_id_2));
assert_eq!(None, mapper.lookup_internal_connection_id(&ext_id_3));
assert_eq!(
Some((id2, connection::id::Classification::Local,)),
mapper.lookup_internal_connection_id(&ext_id_4)
);
}