From 7c419351558d20ad4db0c47907daa92c7f4a8d1c Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Wed, 30 Oct 2024 16:13:53 +0100 Subject: [PATCH] test: Testing the cross-process event cache store. --- .../event_cache_store/integration_tests.rs | 75 +++++++++++++++++++ .../src/event_cache_store/memory_store.rs | 1 + .../src/event_cache_store.rs | 5 +- 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/crates/matrix-sdk-base/src/event_cache_store/integration_tests.rs b/crates/matrix-sdk-base/src/event_cache_store/integration_tests.rs index ccb92f05005..850325bcbe4 100644 --- a/crates/matrix-sdk-base/src/event_cache_store/integration_tests.rs +++ b/crates/matrix-sdk-base/src/event_cache_store/integration_tests.rs @@ -233,3 +233,78 @@ macro_rules! event_cache_store_integration_tests { } }; } + +/// Macro generating tests for the event cache store, related to time (mostly +/// for the cross-process lock). +#[allow(unused_macros)] +#[macro_export] +macro_rules! event_cache_store_integration_tests_time { + () => { + mod event_cache_store_integration_tests_time { + use std::time::Duration; + + use matrix_sdk_test::async_test; + use $crate::event_cache_store::IntoEventCacheStore; + + use super::get_event_cache_store; + + #[async_test] + async fn test_lease_locks() { + let store = get_event_cache_store().await.unwrap().into_event_cache_store(); + + let acquired0 = store.try_take_leased_lock(0, "key", "alice").await.unwrap(); + assert!(acquired0); + + // Should extend the lease automatically (same holder). + let acquired2 = store.try_take_leased_lock(300, "key", "alice").await.unwrap(); + assert!(acquired2); + + // Should extend the lease automatically (same holder + time is ok). + let acquired3 = store.try_take_leased_lock(300, "key", "alice").await.unwrap(); + assert!(acquired3); + + // Another attempt at taking the lock should fail, because it's taken. + let acquired4 = store.try_take_leased_lock(300, "key", "bob").await.unwrap(); + assert!(!acquired4); + + // Even if we insist. + let acquired5 = store.try_take_leased_lock(300, "key", "bob").await.unwrap(); + assert!(!acquired5); + + // That's a nice test we got here, go take a little nap. + tokio::time::sleep(Duration::from_millis(50)).await; + + // Still too early. + let acquired55 = store.try_take_leased_lock(300, "key", "bob").await.unwrap(); + assert!(!acquired55); + + // Ok you can take another nap then. + tokio::time::sleep(Duration::from_millis(250)).await; + + // At some point, we do get the lock. + let acquired6 = store.try_take_leased_lock(0, "key", "bob").await.unwrap(); + assert!(acquired6); + + tokio::time::sleep(Duration::from_millis(1)).await; + + // The other gets it almost immediately too. + let acquired7 = store.try_take_leased_lock(0, "key", "alice").await.unwrap(); + assert!(acquired7); + + tokio::time::sleep(Duration::from_millis(1)).await; + + // But when we take a longer lease... + let acquired8 = store.try_take_leased_lock(300, "key", "bob").await.unwrap(); + assert!(acquired8); + + // It blocks the other user. + let acquired9 = store.try_take_leased_lock(300, "key", "alice").await.unwrap(); + assert!(!acquired9); + + // We can hold onto our lease. + let acquired10 = store.try_take_leased_lock(300, "key", "bob").await.unwrap(); + assert!(acquired10); + } + } + }; +} diff --git a/crates/matrix-sdk-base/src/event_cache_store/memory_store.rs b/crates/matrix-sdk-base/src/event_cache_store/memory_store.rs index 0cad147a664..6ea0608e1f4 100644 --- a/crates/matrix-sdk-base/src/event_cache_store/memory_store.rs +++ b/crates/matrix-sdk-base/src/event_cache_store/memory_store.rs @@ -185,4 +185,5 @@ mod tests { } event_cache_store_integration_tests!(); + event_cache_store_integration_tests_time!(); } diff --git a/crates/matrix-sdk-sqlite/src/event_cache_store.rs b/crates/matrix-sdk-sqlite/src/event_cache_store.rs index a3567caf8fa..a4cc7e0e374 100644 --- a/crates/matrix-sdk-sqlite/src/event_cache_store.rs +++ b/crates/matrix-sdk-sqlite/src/event_cache_store.rs @@ -276,7 +276,7 @@ mod tests { use matrix_sdk_base::{ event_cache_store::{EventCacheStore, EventCacheStoreError}, - event_cache_store_integration_tests, + event_cache_store_integration_tests, event_cache_store_integration_tests_time, media::{MediaFormat, MediaRequest, MediaThumbnailSettings}, }; use matrix_sdk_test::async_test; @@ -300,6 +300,7 @@ mod tests { } event_cache_store_integration_tests!(); + event_cache_store_integration_tests_time!(); async fn get_event_cache_store_content_sorted_by_last_access( event_cache_store: &SqliteEventCacheStore, @@ -381,6 +382,7 @@ mod encrypted_tests { use matrix_sdk_base::{ event_cache_store::EventCacheStoreError, event_cache_store_integration_tests, + event_cache_store_integration_tests_time, }; use once_cell::sync::Lazy; use tempfile::{tempdir, TempDir}; @@ -405,4 +407,5 @@ mod encrypted_tests { } event_cache_store_integration_tests!(); + event_cache_store_integration_tests_time!(); }