use ruma::{
events::room::MediaSource,
media::Method,
mxc_uri, owned_mxc_uri,
time::{Duration, SystemTime},
uint,
};
use super::{MediaRetentionPolicy, MediaStoreInner, media_service::IgnoreMediaRetentionPolicy};
use crate::media::{
MediaFormat, MediaRequestParameters, MediaThumbnailSettings, store::MediaStore,
};
#[allow(async_fn_in_trait)]
pub trait MediaStoreInnerIntegrationTests {
async fn test_store_media_retention_policy(&self);
async fn test_media_max_file_size(&self);
async fn test_media_max_cache_size(&self);
async fn test_media_expiry(&self);
async fn test_media_ignore_max_size(&self);
async fn test_media_ignore_expiry(&self);
async fn test_store_last_media_cleanup_time(&self);
}
impl<Store> MediaStoreInnerIntegrationTests for Store
where
Store: MediaStoreInner + std::fmt::Debug,
{
async fn test_store_media_retention_policy(&self) {
let stored = self.media_retention_policy_inner().await.unwrap();
assert!(stored.is_none());
let policy = MediaRetentionPolicy::default();
self.set_media_retention_policy_inner(policy).await.unwrap();
let stored = self.media_retention_policy_inner().await.unwrap();
assert_eq!(stored, Some(policy));
}
async fn test_media_max_file_size(&self) {
let time = SystemTime::now();
let content_big = vec![0; 256];
let uri_big = owned_mxc_uri!("mxc://localhost/big-media");
let request_big = MediaRequestParameters {
source: MediaSource::Plain(uri_big),
format: MediaFormat::File,
};
let content_avg = vec![0; 128];
let uri_avg = owned_mxc_uri!("mxc://localhost/average-media");
let request_avg = MediaRequestParameters {
source: MediaSource::Plain(uri_avg),
format: MediaFormat::File,
};
let content_small = vec![0; 64];
let uri_small = owned_mxc_uri!("mxc://localhost/small-media");
let request_small = MediaRequestParameters {
source: MediaSource::Plain(uri_small),
format: MediaFormat::File,
};
let policy = MediaRetentionPolicy::empty().with_max_file_size(Some(200));
self.add_media_content_inner(
&request_big,
content_big.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
self.add_media_content_inner(
&request_avg,
content_avg.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
self.add_media_content_inner(
&request_small,
content_small,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_some());
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_some());
self.clean_inner(policy, time).await.unwrap();
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_some());
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_some());
let policy = MediaRetentionPolicy::empty().with_max_file_size(Some(100));
self.clean_inner(policy, time).await.unwrap();
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_none());
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_some());
self.add_media_content_inner(
&request_big,
content_big.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
self.add_media_content_inner(
&request_avg,
content_avg.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_none());
let policy = MediaRetentionPolicy::empty()
.with_max_cache_size(Some(200))
.with_max_file_size(Some(1000));
self.add_media_content_inner(
&request_big,
content_big.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
self.add_media_content_inner(
&request_avg,
content_avg.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_some());
let policy = MediaRetentionPolicy::empty()
.with_max_cache_size(Some(100))
.with_max_file_size(Some(1000));
self.clean_inner(policy, time).await.unwrap();
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_none());
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_some());
self.add_media_content_inner(
&request_big,
content_big,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
self.add_media_content_inner(
&request_avg,
content_avg,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_none());
}
async fn test_media_max_cache_size(&self) {
let content_big = vec![0; 256];
let uri_big = owned_mxc_uri!("mxc://localhost/big-media");
let request_big = MediaRequestParameters {
source: MediaSource::Plain(uri_big),
format: MediaFormat::File,
};
let content_avg = vec![0; 128];
let uri_avg = mxc_uri!("mxc://localhost/average-media");
let request_avg = MediaRequestParameters {
source: MediaSource::Plain(uri_avg.to_owned()),
format: MediaFormat::File,
};
let content_small = vec![0; 64];
let uri_small_1 = owned_mxc_uri!("mxc://localhost/small-media-1");
let request_small_1 = MediaRequestParameters {
source: MediaSource::Plain(uri_small_1),
format: MediaFormat::File,
};
let uri_small_2 = owned_mxc_uri!("mxc://localhost/small-media-2");
let request_small_2 = MediaRequestParameters {
source: MediaSource::Plain(uri_small_2),
format: MediaFormat::File,
};
let uri_small_3 = owned_mxc_uri!("mxc://localhost/small-media-3");
let request_small_3 = MediaRequestParameters {
source: MediaSource::Plain(uri_small_3),
format: MediaFormat::File,
};
let uri_small_4 = owned_mxc_uri!("mxc://localhost/small-media-4");
let request_small_4 = MediaRequestParameters {
source: MediaSource::Plain(uri_small_4),
format: MediaFormat::File,
};
let uri_small_5 = owned_mxc_uri!("mxc://localhost/small-media-5");
let request_small_5 = MediaRequestParameters {
source: MediaSource::Plain(uri_small_5),
format: MediaFormat::File,
};
let policy = MediaRetentionPolicy::empty().with_max_cache_size(Some(200));
let mut time = SystemTime::UNIX_EPOCH;
self.add_media_content_inner(
&request_big,
content_big,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_1,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_2,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_3,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_4,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_5,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_avg,
content_avg,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_1, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_2, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_3, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_4, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_5, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_for_uri_inner(uri_avg, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_1, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_2, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_3, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_4, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_5, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_1,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_2,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_3,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small_4,
content_small,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_1, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_2, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_3, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_4, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_5, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
tracing::info!(?self, "before");
self.clean_inner(policy, time).await.unwrap();
tracing::info!(?self, "after");
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_1, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_2, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_3, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_4, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small_5, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_avg, time).await.unwrap();
assert!(stored.is_none());
}
async fn test_media_expiry(&self) {
let content = vec![0; 64];
let uri_1 = owned_mxc_uri!("mxc://localhost/media-1");
let request_1 =
MediaRequestParameters { source: MediaSource::Plain(uri_1), format: MediaFormat::File };
let uri_2 = owned_mxc_uri!("mxc://localhost/media-2");
let request_2 =
MediaRequestParameters { source: MediaSource::Plain(uri_2), format: MediaFormat::File };
let uri_3 = owned_mxc_uri!("mxc://localhost/media-3");
let request_3 =
MediaRequestParameters { source: MediaSource::Plain(uri_3), format: MediaFormat::File };
let uri_4 = owned_mxc_uri!("mxc://localhost/media-4");
let request_4 =
MediaRequestParameters { source: MediaSource::Plain(uri_4), format: MediaFormat::File };
let uri_5 = owned_mxc_uri!("mxc://localhost/media-5");
let request_5 =
MediaRequestParameters { source: MediaSource::Plain(uri_5), format: MediaFormat::File };
let policy =
MediaRetentionPolicy::empty().with_last_access_expiry(Some(Duration::from_secs(30)));
let mut time = SystemTime::UNIX_EPOCH;
self.add_media_content_inner(
&request_1,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_2,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_3,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_4,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_5,
content,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_1, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_2, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_3, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_4, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_5, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
assert_eq!(time, SystemTime::UNIX_EPOCH + Duration::from_secs(10));
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_1, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_2, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_3, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_4, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_5, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
assert_eq!(time, SystemTime::UNIX_EPOCH + Duration::from_secs(16));
time += Duration::from_secs(26);
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_1, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_2, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_3, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_4, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_5, time).await.unwrap();
assert!(stored.is_some());
}
async fn test_media_ignore_max_size(&self) {
let content_big = vec![0; 256];
let uri_big = owned_mxc_uri!("mxc://localhost/big-media");
let request_big = MediaRequestParameters {
source: MediaSource::Plain(uri_big),
format: MediaFormat::File,
};
let content_avg = vec![0; 128];
let uri_avg = mxc_uri!("mxc://localhost/average-media");
let request_avg = MediaRequestParameters {
source: MediaSource::Plain(uri_avg.to_owned()),
format: MediaFormat::File,
};
let content_small = vec![0; 64];
let uri_small = owned_mxc_uri!("mxc://localhost/small-media-1");
let request_small = MediaRequestParameters {
source: MediaSource::Plain(uri_small),
format: MediaFormat::File,
};
let policy = MediaRetentionPolicy::empty().with_max_cache_size(Some(150));
let mut time = SystemTime::UNIX_EPOCH;
self.add_media_content_inner(
&request_big,
content_big.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_big,
content_big,
time,
policy,
IgnoreMediaRetentionPolicy::Yes,
)
.await
.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_small,
content_small.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_avg,
content_avg,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_for_uri_inner(uri_avg, time).await.unwrap();
assert!(stored.is_some());
self.set_ignore_media_retention_policy_inner(&request_avg, IgnoreMediaRetentionPolicy::Yes)
.await
.unwrap();
time += Duration::from_secs(1);
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_for_uri_inner(uri_avg, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_some());
self.set_ignore_media_retention_policy_inner(&request_big, IgnoreMediaRetentionPolicy::No)
.await
.unwrap();
time += Duration::from_secs(1);
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_for_uri_inner(uri_avg, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
self.set_ignore_media_retention_policy_inner(&request_avg, IgnoreMediaRetentionPolicy::No)
.await
.unwrap();
time += Duration::from_secs(1);
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_small, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_for_uri_inner(uri_avg, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_big, time).await.unwrap();
assert!(stored.is_none());
}
async fn test_media_ignore_expiry(&self) {
let content = vec![0; 64];
let uri_1 = owned_mxc_uri!("mxc://localhost/media-1");
let request_1 =
MediaRequestParameters { source: MediaSource::Plain(uri_1), format: MediaFormat::File };
let uri_2 = owned_mxc_uri!("mxc://localhost/media-2");
let request_2 =
MediaRequestParameters { source: MediaSource::Plain(uri_2), format: MediaFormat::File };
let uri_3 = owned_mxc_uri!("mxc://localhost/media-3");
let request_3 =
MediaRequestParameters { source: MediaSource::Plain(uri_3), format: MediaFormat::File };
let uri_4 = owned_mxc_uri!("mxc://localhost/media-4");
let request_4 =
MediaRequestParameters { source: MediaSource::Plain(uri_4), format: MediaFormat::File };
let uri_5 = owned_mxc_uri!("mxc://localhost/media-5");
let request_5 =
MediaRequestParameters { source: MediaSource::Plain(uri_5), format: MediaFormat::File };
let policy =
MediaRetentionPolicy::empty().with_last_access_expiry(Some(Duration::from_secs(30)));
let mut time = SystemTime::UNIX_EPOCH;
self.add_media_content_inner(
&request_1,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::Yes,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_2,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::Yes,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_3,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_4,
content.clone(),
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
self.add_media_content_inner(
&request_5,
content,
time,
policy,
IgnoreMediaRetentionPolicy::No,
)
.await
.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_1, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_2, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_3, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_4, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_5, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(120);
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_1, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_2, time).await.unwrap();
assert!(stored.is_some());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_3, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_4, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_5, time).await.unwrap();
assert!(stored.is_none());
self.set_ignore_media_retention_policy_inner(&request_1, IgnoreMediaRetentionPolicy::No)
.await
.unwrap();
self.set_ignore_media_retention_policy_inner(&request_2, IgnoreMediaRetentionPolicy::No)
.await
.unwrap();
time += Duration::from_secs(120);
self.clean_inner(policy, time).await.unwrap();
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_1, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_2, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_3, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_4, time).await.unwrap();
assert!(stored.is_none());
time += Duration::from_secs(1);
let stored = self.get_media_content_inner(&request_5, time).await.unwrap();
assert!(stored.is_none());
}
async fn test_store_last_media_cleanup_time(&self) {
let initial = self.last_media_cleanup_time_inner().await.unwrap();
let new_time = initial.unwrap_or_else(SystemTime::now) + Duration::from_secs(60);
let policy = MediaRetentionPolicy::empty();
self.clean_inner(policy, new_time).await.unwrap();
let stored = self.last_media_cleanup_time_inner().await.unwrap();
assert_eq!(stored, initial);
let policy = MediaRetentionPolicy::default();
self.clean_inner(policy, new_time).await.unwrap();
let stored = self.last_media_cleanup_time_inner().await.unwrap();
assert_eq!(stored, Some(new_time));
}
}
#[allow(unused_macros, unused_extern_crates)]
#[macro_export]
macro_rules! media_store_inner_integration_tests {
(with_media_size_tests) => {
mod media_store_inner_integration_tests {
$crate::media_store_inner_integration_tests!(@inner);
#[async_test]
async fn test_media_max_file_size() {
let media_store_inner = get_media_store().await.unwrap();
media_store_inner.test_media_max_file_size().await;
}
#[async_test]
async fn test_media_max_cache_size() {
let media_store_inner = get_media_store().await.unwrap();
media_store_inner.test_media_max_cache_size().await;
}
#[async_test]
async fn test_media_ignore_max_size() {
let media_store_inner = get_media_store().await.unwrap();
media_store_inner.test_media_ignore_max_size().await;
}
}
};
() => {
mod media_store_inner_integration_tests {
$crate::media_store_inner_integration_tests!(@inner);
}
};
(@inner) => {
use matrix_sdk_test::async_test;
use $crate::media::store::MediaStoreInnerIntegrationTests;
use super::get_media_store;
#[async_test]
async fn test_store_media_retention_policy() {
let media_store_inner = get_media_store().await.unwrap();
media_store_inner.test_store_media_retention_policy().await;
}
#[async_test]
async fn test_media_expiry() {
let media_store_inner = get_media_store().await.unwrap();
media_store_inner.test_media_expiry().await;
}
#[async_test]
async fn test_media_ignore_expiry() {
let media_store_inner = get_media_store().await.unwrap();
media_store_inner.test_media_ignore_expiry().await;
}
#[async_test]
async fn test_store_last_media_cleanup_time() {
let media_store_inner = get_media_store().await.unwrap();
media_store_inner.test_store_last_media_cleanup_time().await;
}
};
}
#[allow(async_fn_in_trait)]
pub trait MediaStoreIntegrationTests {
async fn test_media_content(&self);
async fn test_replace_media_key(&self);
}
impl<Store> MediaStoreIntegrationTests for Store
where
Store: MediaStore + std::fmt::Debug,
{
async fn test_media_content(&self) {
let uri = mxc_uri!("mxc://localhost/media");
let request_file = MediaRequestParameters {
source: MediaSource::Plain(uri.to_owned()),
format: MediaFormat::File,
};
let request_thumbnail = MediaRequestParameters {
source: MediaSource::Plain(uri.to_owned()),
format: MediaFormat::Thumbnail(MediaThumbnailSettings::with_method(
Method::Crop,
uint!(100),
uint!(100),
)),
};
let other_uri = mxc_uri!("mxc://localhost/media-other");
let request_other_file = MediaRequestParameters {
source: MediaSource::Plain(other_uri.to_owned()),
format: MediaFormat::File,
};
let content: Vec<u8> = "hello".into();
let thumbnail_content: Vec<u8> = "world".into();
let other_content: Vec<u8> = "foo".into();
assert!(
self.get_media_content(&request_file).await.unwrap().is_none(),
"unexpected media found"
);
assert!(
self.get_media_content(&request_thumbnail).await.unwrap().is_none(),
"media not found"
);
self.add_media_content(&request_file, content.clone(), IgnoreMediaRetentionPolicy::No)
.await
.expect("adding media failed");
assert_eq!(
self.get_media_content(&request_file).await.unwrap().as_ref(),
Some(&content),
"media not found though added"
);
assert_eq!(
self.get_media_content_for_uri(uri).await.unwrap().as_ref(),
Some(&content),
"media not found by URI though added"
);
self.remove_media_content(&request_file).await.expect("removing media failed");
assert!(
self.get_media_content(&request_file).await.unwrap().is_none(),
"media still there after removing"
);
assert!(
self.get_media_content_for_uri(uri).await.unwrap().is_none(),
"media still found by URI after removing"
);
self.add_media_content(&request_file, content.clone(), IgnoreMediaRetentionPolicy::No)
.await
.expect("adding media again failed");
assert_eq!(
self.get_media_content(&request_file).await.unwrap().as_ref(),
Some(&content),
"media not found after adding again"
);
self.add_media_content(
&request_thumbnail,
thumbnail_content.clone(),
IgnoreMediaRetentionPolicy::No,
)
.await
.expect("adding thumbnail failed");
assert_eq!(
self.get_media_content(&request_thumbnail).await.unwrap().as_ref(),
Some(&thumbnail_content),
"thumbnail not found"
);
assert!(
self.get_media_content_for_uri(uri).await.unwrap().is_some(),
"media not found by URI though two where added"
);
self.add_media_content(
&request_other_file,
other_content.clone(),
IgnoreMediaRetentionPolicy::No,
)
.await
.expect("adding other media failed");
assert_eq!(
self.get_media_content(&request_other_file).await.unwrap().as_ref(),
Some(&other_content),
"other file not found"
);
assert_eq!(
self.get_media_content_for_uri(other_uri).await.unwrap().as_ref(),
Some(&other_content),
"other file not found by URI"
);
self.remove_media_content_for_uri(uri).await.expect("removing all media for uri failed");
assert!(
self.get_media_content(&request_file).await.unwrap().is_none(),
"media wasn't removed"
);
assert!(
self.get_media_content(&request_thumbnail).await.unwrap().is_none(),
"thumbnail wasn't removed"
);
assert!(
self.get_media_content(&request_other_file).await.unwrap().is_some(),
"other media was removed"
);
assert!(
self.get_media_content_for_uri(uri).await.unwrap().is_none(),
"media found by URI wasn't removed"
);
assert!(
self.get_media_content_for_uri(other_uri).await.unwrap().is_some(),
"other media found by URI was removed"
);
}
async fn test_replace_media_key(&self) {
let uri = mxc_uri!("mxc://sendqueue.local/tr4n-s4ct-10n1-d");
let req = MediaRequestParameters {
source: MediaSource::Plain(uri.to_owned()),
format: MediaFormat::File,
};
let content = "hello".as_bytes().to_owned();
assert!(self.get_media_content(&req).await.unwrap().is_none(), "unexpected media found");
self.add_media_content(&req, content.clone(), IgnoreMediaRetentionPolicy::No)
.await
.expect("adding media failed");
assert_eq!(self.get_media_content(&req).await.unwrap().unwrap(), b"hello");
let new_uri = mxc_uri!("mxc://matrix.org/tr4n-s4ct-10n1-d");
let new_req = MediaRequestParameters {
source: MediaSource::Plain(new_uri.to_owned()),
format: MediaFormat::File,
};
self.replace_media_key(&req, &new_req)
.await
.expect("replacing the media request key failed");
assert!(
self.get_media_content(&req).await.unwrap().is_none(),
"unexpected media found with the old key"
);
assert_eq!(self.get_media_content(&new_req).await.unwrap().unwrap(), b"hello");
}
}
#[allow(unused_macros, unused_extern_crates)]
#[macro_export]
macro_rules! media_store_integration_tests {
() => {
mod media_store_integration_tests {
use matrix_sdk_test::async_test;
use $crate::media::store::integration_tests::MediaStoreIntegrationTests;
use super::get_media_store;
#[async_test]
async fn test_media_content() {
let media_store = get_media_store().await.unwrap();
media_store.test_media_content().await;
}
#[async_test]
async fn test_replace_media_key() {
let media_store = get_media_store().await.unwrap();
media_store.test_replace_media_key().await;
}
}
};
}
#[allow(unused_macros)]
#[macro_export]
macro_rules! media_store_integration_tests_time {
() => {
mod media_store_integration_tests_time {
use std::time::Duration;
#[cfg(all(target_family = "wasm", target_os = "unknown"))]
use gloo_timers::future::sleep;
use matrix_sdk_test::async_test;
#[cfg(not(all(target_family = "wasm", target_os = "unknown")))]
use tokio::time::sleep;
use $crate::media::store::MediaStore;
use super::get_media_store;
#[async_test]
async fn test_lease_locks() {
let store = get_media_store().await.unwrap();
let acquired0 = store.try_take_leased_lock(0, "key", "alice").await.unwrap();
assert_eq!(acquired0, Some(1));
let acquired2 = store.try_take_leased_lock(300, "key", "alice").await.unwrap();
assert_eq!(acquired2, Some(1));
let acquired3 = store.try_take_leased_lock(300, "key", "alice").await.unwrap();
assert_eq!(acquired3, Some(1));
let acquired4 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
assert!(acquired4.is_none());
let acquired5 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
assert!(acquired5.is_none());
sleep(Duration::from_millis(50)).await;
let acquired55 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
assert!(acquired55.is_none());
sleep(Duration::from_millis(250)).await;
let acquired6 = store.try_take_leased_lock(0, "key", "bob").await.unwrap();
assert_eq!(acquired6, Some(2));
sleep(Duration::from_millis(1)).await;
let acquired7 = store.try_take_leased_lock(0, "key", "alice").await.unwrap();
assert_eq!(acquired7, Some(3));
sleep(Duration::from_millis(1)).await;
let acquired8 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
assert_eq!(acquired8, Some(4));
let acquired9 = store.try_take_leased_lock(300, "key", "alice").await.unwrap();
assert!(acquired9.is_none());
let acquired10 = store.try_take_leased_lock(300, "key", "bob").await.unwrap();
assert_eq!(acquired10, Some(4)); }
}
};
}