crypto: Test the session unwedging logic.
parent
59d7b53242
commit
b5c9473424
|
@ -315,7 +315,8 @@ mod test {
|
||||||
|
|
||||||
use matrix_sdk_common::{
|
use matrix_sdk_common::{
|
||||||
api::r0::keys::claim_keys::Response as KeyClaimResponse,
|
api::r0::keys::claim_keys::Response as KeyClaimResponse,
|
||||||
identifiers::{user_id, DeviceIdBox, UserId},
|
identifiers::{user_id, DeviceIdBox, DeviceKeyAlgorithm, UserId},
|
||||||
|
instant::{Duration, Instant},
|
||||||
};
|
};
|
||||||
use matrix_sdk_test::async_test;
|
use matrix_sdk_test::async_test;
|
||||||
|
|
||||||
|
@ -416,4 +417,79 @@ mod test {
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.is_none());
|
.is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This test doesn't run on macos because we're modifying the session
|
||||||
|
// creation time so we can get around the UNWEDGING_INTERVAL.
|
||||||
|
#[async_test]
|
||||||
|
#[cfg(not(target_os = "macos"))]
|
||||||
|
async fn session_unwedging() {
|
||||||
|
let manager = session_manager().await;
|
||||||
|
let bob = bob_account();
|
||||||
|
let (_, mut session) = bob.create_session_for(&manager.account).await;
|
||||||
|
|
||||||
|
let bob_device = ReadOnlyDevice::from_account(&bob).await;
|
||||||
|
session.creation_time = Arc::new(Instant::now() - Duration::from_secs(3601));
|
||||||
|
|
||||||
|
manager
|
||||||
|
.store
|
||||||
|
.save_devices(&[bob_device.clone()])
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
manager.store.save_sessions(&[session]).await.unwrap();
|
||||||
|
|
||||||
|
assert!(manager
|
||||||
|
.get_missing_sessions(&mut [bob.user_id().clone()].iter())
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.is_none());
|
||||||
|
|
||||||
|
let curve_key = bob_device.get_key(DeviceKeyAlgorithm::Curve25519).unwrap();
|
||||||
|
|
||||||
|
assert!(!manager.users_for_key_claim.contains_key(bob.user_id()));
|
||||||
|
assert!(!manager.is_device_wedged(&bob_device));
|
||||||
|
manager
|
||||||
|
.mark_device_as_wedged(bob_device.user_id(), &curve_key)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
assert!(manager.is_device_wedged(&bob_device));
|
||||||
|
assert!(manager.users_for_key_claim.contains_key(bob.user_id()));
|
||||||
|
|
||||||
|
let (_, request) = manager
|
||||||
|
.get_missing_sessions(&mut [bob.user_id().clone()].iter())
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert!(request.one_time_keys.contains_key(bob.user_id()));
|
||||||
|
|
||||||
|
bob.generate_one_time_keys_helper(1).await;
|
||||||
|
let one_time = bob.signed_one_time_keys_helper().await.unwrap();
|
||||||
|
bob.mark_keys_as_published().await;
|
||||||
|
|
||||||
|
let mut one_time_keys = BTreeMap::new();
|
||||||
|
one_time_keys
|
||||||
|
.entry(bob.user_id().clone())
|
||||||
|
.or_insert_with(BTreeMap::new)
|
||||||
|
.insert(bob.device_id().into(), one_time);
|
||||||
|
|
||||||
|
let response = KeyClaimResponse {
|
||||||
|
failures: BTreeMap::new(),
|
||||||
|
one_time_keys,
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(manager.outgoing_to_device_requests.is_empty());
|
||||||
|
|
||||||
|
manager
|
||||||
|
.receive_keys_claim_response(&response)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert!(!manager.is_device_wedged(&bob_device));
|
||||||
|
assert!(manager
|
||||||
|
.get_missing_sessions(&mut [bob.user_id().clone()].iter())
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.is_none());
|
||||||
|
assert!(!manager.outgoing_to_device_requests.is_empty())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue