fn connection_mapper_test()

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