feat: tests: add TestCheckpointEvent and Context.trigger_checkpoint_event

This commit is contained in:
Simon Laux
2024-04-19 03:43:41 +02:00
parent 34f4ec02f6
commit 47bbcb3cae
4 changed files with 36 additions and 1 deletions

View File

@@ -152,6 +152,13 @@ impl CommandApi {
tokio::time::sleep(std::time::Duration::from_secs_f64(delay)).await tokio::time::sleep(std::time::Duration::from_secs_f64(delay)).await
} }
/// Emit the test checkpoint event, used for tests.
/// Returns a unique id of the emitted `TestCheckpointEvent`.
async fn trigger_checkpoint_event(&self, account_id: u32) -> Result<usize> {
let ctx = self.get_context(account_id).await?;
Ok(ctx.emit_test_checkpoint_event().await)
}
// --------------------------------------------- // ---------------------------------------------
// Misc top level functions // Misc top level functions
// --------------------------------------------- // ---------------------------------------------

View File

@@ -259,6 +259,13 @@ pub enum EventType {
/// If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache. /// If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
ChatlistItemChanged { chat_id: Option<u32> }, ChatlistItemChanged { chat_id: Option<u32> },
/// Tests can trigger this event and then wait for it, to make sure all events before it were consumed.
/// Useful for tests that test whether a specific event is emitted,
TestCheckpointEvent {
/// unique id to recognize the event
id: usize,
},
} }
impl From<CoreEventType> for EventType { impl From<CoreEventType> for EventType {
@@ -370,6 +377,7 @@ impl From<CoreEventType> for EventType {
chat_id: chat_id.map(|id| id.to_u32()), chat_id: chat_id.map(|id| id.to_u32()),
}, },
CoreEventType::ChatlistChanged => ChatlistChanged, CoreEventType::ChatlistChanged => ChatlistChanged,
CoreEventType::TestCheckpointEvent { id } => TestCheckpointEvent { id },
} }
} }
} }

View File

@@ -4,7 +4,7 @@ use std::collections::{BTreeMap, HashMap};
use std::ffi::OsString; use std::ffi::OsString;
use std::ops::Deref; use std::ops::Deref;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU64, Ordering};
use std::sync::Arc; use std::sync::Arc;
use std::time::Duration; use std::time::Duration;
@@ -288,6 +288,9 @@ pub struct InnerContext {
/// True if account has subscribed to push notifications via IMAP. /// True if account has subscribed to push notifications via IMAP.
pub(crate) push_subscribed: AtomicBool, pub(crate) push_subscribed: AtomicBool,
/// Counter for the id for the test checkpoint event that is used by tests.
pub(crate) test_event_checkpoint_counter: Mutex<usize>,
} }
/// The state of ongoing process. /// The state of ongoing process.
@@ -445,6 +448,7 @@ impl Context {
debug_logging: std::sync::RwLock::new(None), debug_logging: std::sync::RwLock::new(None),
push_subscriber, push_subscriber,
push_subscribed: AtomicBool::new(false), push_subscribed: AtomicBool::new(false),
test_event_checkpoint_counter: Mutex::new(0),
}; };
let ctx = Context { let ctx = Context {
@@ -1362,6 +1366,15 @@ impl Context {
wal_fname.push("-wal"); wal_fname.push("-wal");
dbfile.with_file_name(wal_fname) dbfile.with_file_name(wal_fname)
} }
/// Emit the test checkpoint event, used for tests.
/// Returns a unique id of the emitted `TestCheckpointEvent`.
pub async fn emit_test_checkpoint_event(&self) -> usize {
let mut counter = self.inner.test_event_checkpoint_counter.lock().await;
*counter = counter.wrapping_add(1);
self.emit_event(EventType::TestCheckpointEvent { id: *counter });
*counter
}
} }
/// Returns core version as a string. /// Returns core version as a string.

View File

@@ -302,4 +302,11 @@ pub enum EventType {
/// ID of the changed chat /// ID of the changed chat
chat_id: Option<ChatId>, chat_id: Option<ChatId>,
}, },
/// Tests can trigger this event and then wait for it, to make sure all events before it were consumed.
/// Useful for tests that test whether a specific event is emitted,
TestCheckpointEvent {
/// unique id to recognize the event
id: usize,
},
} }