Skip to content

Commit aa0cf8b

Browse files
author
Shrey Patel
committed
Split SqliteMediaStore from SqliteEventCacheStore.
Split `MemoryMediaStore` from `MemoryStore`. Split `IndexeddbMediaStore` from `IndexxeddbEventCacheStore`.
1 parent 7d3c4ad commit aa0cf8b

File tree

30 files changed

+3042
-1612
lines changed

30 files changed

+3042
-1612
lines changed

crates/matrix-sdk-base/src/event_cache/store/memory_store.rs

Lines changed: 3 additions & 351 deletions
Large diffs are not rendered by default.

crates/matrix-sdk-base/src/event_cache/store/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
//! The event cache stores holds events and downloaded media when the cache was
15+
//! The event cache stores holds events when the cache was
1616
//! activated to save bandwidth at the cost of increased storage space usage.
1717
//!
1818
//! Implementing the `EventCacheStore` trait, you can plug any storage backend

crates/matrix-sdk-base/src/media/store/integration_tests.rs

Lines changed: 101 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -972,24 +972,24 @@ where
972972
/// recommended to run those in encrypted stores because the size of the
973973
/// encrypted content may vary compared to what the tests expect.
974974
///
975-
/// You need to provide an `async fn get_event_cache_store() ->
976-
/// event_cache::store::Result<Store>` that provides a fresh event cache store
975+
/// You need to provide an `async fn get_media_store() ->
976+
/// media::store::Result<Store>` that provides a fresh media store
977977
/// that implements `MediaStoreInner` on the same level you invoke the
978978
/// macro.
979979
///
980980
/// ## Usage Example:
981981
/// ```no_run
982-
/// # use matrix_sdk_base::event_cache::store::{
983-
/// # EventCacheStore,
982+
/// # use matrix_sdk_base::media::store::{
983+
/// # MediaStore,
984984
/// # MemoryStore as MyStore,
985-
/// # Result as EventCacheStoreResult,
985+
/// # Result as MediaStoreResult,
986986
/// # };
987987
///
988988
/// #[cfg(test)]
989989
/// mod tests {
990-
/// use super::{EventCacheStoreResult, MyStore};
990+
/// use super::{MediaStoreResult, MyStore};
991991
///
992-
/// async fn get_event_cache_store() -> EventCacheStoreResult<MyStore> {
992+
/// async fn get_media_store() -> MediaStoreResult<MyStore> {
993993
/// Ok(MyStore::new())
994994
/// }
995995
///
@@ -1005,19 +1005,19 @@ macro_rules! media_store_inner_integration_tests {
10051005

10061006
#[async_test]
10071007
async fn test_media_max_file_size() {
1008-
let media_store_inner = get_event_cache_store().await.unwrap();
1008+
let media_store_inner = get_media_store().await.unwrap();
10091009
media_store_inner.test_media_max_file_size().await;
10101010
}
10111011

10121012
#[async_test]
10131013
async fn test_media_max_cache_size() {
1014-
let media_store_inner = get_event_cache_store().await.unwrap();
1014+
let media_store_inner = get_media_store().await.unwrap();
10151015
media_store_inner.test_media_max_cache_size().await;
10161016
}
10171017

10181018
#[async_test]
10191019
async fn test_media_ignore_max_size() {
1020-
let media_store_inner = get_event_cache_store().await.unwrap();
1020+
let media_store_inner = get_media_store().await.unwrap();
10211021
media_store_inner.test_media_ignore_max_size().await;
10221022
}
10231023
}
@@ -1033,29 +1033,29 @@ macro_rules! media_store_inner_integration_tests {
10331033
use matrix_sdk_test::async_test;
10341034
use $crate::media::store::MediaStoreInnerIntegrationTests;
10351035

1036-
use super::get_event_cache_store;
1036+
use super::get_media_store;
10371037

10381038
#[async_test]
10391039
async fn test_store_media_retention_policy() {
1040-
let media_store_inner = get_event_cache_store().await.unwrap();
1040+
let media_store_inner = get_media_store().await.unwrap();
10411041
media_store_inner.test_store_media_retention_policy().await;
10421042
}
10431043

10441044
#[async_test]
10451045
async fn test_media_expiry() {
1046-
let media_store_inner = get_event_cache_store().await.unwrap();
1046+
let media_store_inner = get_media_store().await.unwrap();
10471047
media_store_inner.test_media_expiry().await;
10481048
}
10491049

10501050
#[async_test]
10511051
async fn test_media_ignore_expiry() {
1052-
let media_store_inner = get_event_cache_store().await.unwrap();
1052+
let media_store_inner = get_media_store().await.unwrap();
10531053
media_store_inner.test_media_ignore_expiry().await;
10541054
}
10551055

10561056
#[async_test]
10571057
async fn test_store_last_media_cleanup_time() {
1058-
let media_store_inner = get_event_cache_store().await.unwrap();
1058+
let media_store_inner = get_media_store().await.unwrap();
10591059
media_store_inner.test_store_last_media_cleanup_time().await;
10601060
}
10611061
};
@@ -1267,13 +1267,13 @@ where
12671267
/// the entire tests suite locally.
12681268
///
12691269
/// You need to provide an `async fn get_media_store() ->
1270-
/// event_cache::store::media::Result<Store>` that provides a fresh media store
1270+
/// media::store::Result<Store>` that provides a fresh media store
12711271
/// that implements `MediaStoreInner` on the same level you invoke the
12721272
/// macro.
12731273
///
12741274
/// ## Usage Example:
12751275
/// ```no_run
1276-
/// # use matrix_sdk_base::event_cache::store::media{
1276+
/// # use matrix_sdk_base::media::store::{
12771277
/// # MediaStore,
12781278
/// # MemoryStore as MyStore,
12791279
/// # Result as MediaStoreResult,
@@ -1296,19 +1296,99 @@ macro_rules! media_store_integration_tests {
12961296
() => {
12971297
mod media_store_integration_tests {
12981298
use matrix_sdk_test::async_test;
1299+
use $crate::media::store::integration_tests::MediaStoreIntegrationTests;
12991300

13001301
use super::get_media_store;
13011302

13021303
#[async_test]
13031304
async fn test_media_content() {
1304-
let event_cache_store = get_media_store().await.unwrap().into_event_cache_store();
1305-
event_cache_store.test_media_content().await;
1305+
let media_store = get_media_store().await.unwrap();
1306+
media_store.test_media_content().await;
13061307
}
13071308

13081309
#[async_test]
13091310
async fn test_replace_media_key() {
1310-
let event_cache_store = get_media_store().await.unwrap().into_event_cache_store();
1311-
event_cache_store.test_replace_media_key().await;
1311+
let media_store = get_media_store().await.unwrap();
1312+
media_store.test_replace_media_key().await;
1313+
}
1314+
}
1315+
};
1316+
}
1317+
1318+
/// Macro generating tests for the media store, related to time (mostly
1319+
/// for the cross-process lock).
1320+
#[allow(unused_macros)]
1321+
#[macro_export]
1322+
macro_rules! media_store_integration_tests_time {
1323+
() => {
1324+
mod media_store_integration_tests_time {
1325+
use std::time::Duration;
1326+
1327+
#[cfg(all(target_family = "wasm", target_os = "unknown"))]
1328+
use gloo_timers::future::sleep;
1329+
use matrix_sdk_test::async_test;
1330+
#[cfg(not(all(target_family = "wasm", target_os = "unknown")))]
1331+
use tokio::time::sleep;
1332+
use $crate::media::store::MediaStore;
1333+
1334+
use super::get_media_store;
1335+
1336+
#[async_test]
1337+
async fn test_lease_locks() {
1338+
let store = get_media_store().await.unwrap();
1339+
1340+
let acquired0 = store.try_take_leased_lock(0, "key", "alice").await.unwrap();
1341+
assert!(acquired0);
1342+
1343+
// Should extend the lease automatically (same holder).
1344+
let acquired2 = store.try_take_leased_lock(300, "key", "alice").await.unwrap();
1345+
assert!(acquired2);
1346+
1347+
// Should extend the lease automatically (same holder + time is ok).
1348+
let acquired3 = store.try_take_leased_lock(300, "key", "alice").await.unwrap();
1349+
assert!(acquired3);
1350+
1351+
// Another attempt at taking the lock should fail, because it's taken.
1352+
let acquired4 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
1353+
assert!(!acquired4);
1354+
1355+
// Even if we insist.
1356+
let acquired5 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
1357+
assert!(!acquired5);
1358+
1359+
// That's a nice test we got here, go take a little nap.
1360+
sleep(Duration::from_millis(50)).await;
1361+
1362+
// Still too early.
1363+
let acquired55 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
1364+
assert!(!acquired55);
1365+
1366+
// Ok you can take another nap then.
1367+
sleep(Duration::from_millis(250)).await;
1368+
1369+
// At some point, we do get the lock.
1370+
let acquired6 = store.try_take_leased_lock(0, "key", "bob").await.unwrap();
1371+
assert!(acquired6);
1372+
1373+
sleep(Duration::from_millis(1)).await;
1374+
1375+
// The other gets it almost immediately too.
1376+
let acquired7 = store.try_take_leased_lock(0, "key", "alice").await.unwrap();
1377+
assert!(acquired7);
1378+
1379+
sleep(Duration::from_millis(1)).await;
1380+
1381+
// But when we take a longer lease...
1382+
let acquired8 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
1383+
assert!(acquired8);
1384+
1385+
// It blocks the other user.
1386+
let acquired9 = store.try_take_leased_lock(300, "key", "alice").await.unwrap();
1387+
assert!(!acquired9);
1388+
1389+
// We can hold onto our lease.
1390+
let acquired10 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
1391+
assert!(acquired10);
13121392
}
13131393
}
13141394
};

crates/matrix-sdk-base/src/media/store/media_service.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ use tokio::sync::Mutex as AsyncMutex;
2525
use tracing::error;
2626

2727
use super::{MediaRetentionPolicy, MediaStoreError};
28-
use crate::{event_cache::store::EventCacheStoreError, media::MediaRequestParameters};
28+
use crate::media::MediaRequestParameters;
2929

30-
/// API for implementors of [`EventCacheStore`] to manage their media through
30+
/// API for implementors of [`MediaStore`] to manage their media through
3131
/// their implementation of [`MediaStoreInner`].
3232
///
33-
/// [`EventCacheStore`]: crate::event_cache::store::EventCacheStore
33+
/// [`MediaStore`]: crate::media::store::MediaStore
3434
#[derive(Debug)]
3535
pub struct MediaService<Time: TimeProvider = DefaultTimeProvider> {
3636
inner: Arc<MediaServiceInner<Time>>,
@@ -350,11 +350,11 @@ where
350350
}
351351

352352
/// An abstract trait that can be used to implement different store backends
353-
/// for the event cache of the SDK.
353+
/// for the media store of the SDK.
354354
#[cfg_attr(target_family = "wasm", async_trait(?Send))]
355355
#[cfg_attr(not(target_family = "wasm"), async_trait)]
356356
pub trait MediaStore: AsyncTraitDeps {
357-
/// The error type used by this event cache store.
357+
/// The error type used by this media store.
358358
type Error: fmt::Debug + Into<MediaStoreError>;
359359

360360
/// Try to take a lock using the given store.
@@ -500,7 +500,7 @@ pub trait MediaStore: AsyncTraitDeps {
500500
#[cfg_attr(not(target_family = "wasm"), async_trait)]
501501
pub trait MediaStoreInner: AsyncTraitDeps + Clone {
502502
/// The error type used by this media cache store.
503-
type Error: fmt::Debug + fmt::Display + Into<EventCacheStoreError>;
503+
type Error: fmt::Debug + fmt::Display + Into<MediaStoreError>;
504504

505505
/// The persisted media retention policy in the media cache.
506506
async fn media_retention_policy_inner(
@@ -685,13 +685,10 @@ mod tests {
685685
};
686686

687687
use super::{
688-
IgnoreMediaRetentionPolicy, MediaRetentionPolicy, MediaService, MediaStoreInner,
689-
TimeProvider,
690-
};
691-
use crate::{
692-
event_cache::store::EventCacheStoreError,
693-
media::{MediaFormat, MediaRequestParameters, UniqueKey},
688+
IgnoreMediaRetentionPolicy, MediaRetentionPolicy, MediaService, MediaStoreError,
689+
MediaStoreInner, TimeProvider,
694690
};
691+
use crate::media::{MediaFormat, MediaRequestParameters, UniqueKey};
695692

696693
#[derive(Debug, Default, Clone)]
697694
struct MockMediaStoreInner {
@@ -767,7 +764,7 @@ mod tests {
767764

768765
impl std::error::Error for MockMediaStoreInnerError {}
769766

770-
impl From<MockMediaStoreInnerError> for EventCacheStoreError {
767+
impl From<MockMediaStoreInnerError> for MediaStoreError {
771768
fn from(value: MockMediaStoreInnerError) -> Self {
772769
Self::backend(value)
773770
}

0 commit comments

Comments
 (0)