diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f0284db4..f6a9c0786 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,10 @@ - Do not emit "Failed to run incremental vacuum" warnings on success. #4160 - Ability to send backup over network and QR code to setup second device #4007 - Disable buffering during STARTTLS setup. #4190 +- Add `DC_EVENT_IMAP_INBOX_IDLE` event to wait until the account + is ready for testing. + It is used to fix race condition between fetching + existing messages and starting the test. ## [1.111.0] - 2023-03-05 diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 92f30e66c..cfd0822e7 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -5705,6 +5705,14 @@ void dc_event_unref(dc_event_t* event); */ #define DC_EVENT_IMAP_MESSAGE_MOVED 105 +/** + * Emitted before going into IDLE on the Inbox folder. + * + * @param data1 0 + * @param data2 0 + */ +#define DC_EVENT_IMAP_INBOX_IDLE 106 + /** * Emitted when a new blob file was successfully written * diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 4e431391f..09ec1a805 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -500,6 +500,7 @@ pub unsafe extern "C" fn dc_event_get_id(event: *mut dc_event_t) -> libc::c_int EventType::SmtpMessageSent(_) => 103, EventType::ImapMessageDeleted(_) => 104, EventType::ImapMessageMoved(_) => 105, + EventType::ImapInboxIdle => 106, EventType::NewBlobFile(_) => 150, EventType::DeletedBlobFile(_) => 151, EventType::Warning(_) => 300, @@ -544,6 +545,7 @@ pub unsafe extern "C" fn dc_event_get_data1_int(event: *mut dc_event_t) -> libc: | EventType::SmtpMessageSent(_) | EventType::ImapMessageDeleted(_) | EventType::ImapMessageMoved(_) + | EventType::ImapInboxIdle | EventType::NewBlobFile(_) | EventType::DeletedBlobFile(_) | EventType::Warning(_) @@ -594,6 +596,7 @@ pub unsafe extern "C" fn dc_event_get_data2_int(event: *mut dc_event_t) -> libc: | EventType::SmtpMessageSent(_) | EventType::ImapMessageDeleted(_) | EventType::ImapMessageMoved(_) + | EventType::ImapInboxIdle | EventType::NewBlobFile(_) | EventType::DeletedBlobFile(_) | EventType::Warning(_) @@ -653,6 +656,7 @@ pub unsafe extern "C" fn dc_event_get_data2_str(event: *mut dc_event_t) -> *mut EventType::MsgsChanged { .. } | EventType::ReactionsChanged { .. } | EventType::IncomingMsg { .. } + | EventType::ImapInboxIdle | EventType::MsgsNoticed(_) | EventType::MsgDelivered { .. } | EventType::MsgFailed { .. } diff --git a/deltachat-jsonrpc/src/api/events.rs b/deltachat-jsonrpc/src/api/events.rs index 70dadb52e..ddbbcebca 100644 --- a/deltachat-jsonrpc/src/api/events.rs +++ b/deltachat-jsonrpc/src/api/events.rs @@ -47,6 +47,9 @@ pub enum JSONRPCEventType { msg: String, }, + /// Emitted before going into IDLE on the Inbox folder. + ImapInboxIdle, + /// Emitted when an new file in the $BLOBDIR was created NewBlobFile { file: String, @@ -293,6 +296,7 @@ impl From for JSONRPCEventType { EventType::SmtpMessageSent(msg) => SmtpMessageSent { msg }, EventType::ImapMessageDeleted(msg) => ImapMessageDeleted { msg }, EventType::ImapMessageMoved(msg) => ImapMessageMoved { msg }, + EventType::ImapInboxIdle => ImapInboxIdle, EventType::NewBlobFile(file) => NewBlobFile { file }, EventType::DeletedBlobFile(file) => DeletedBlobFile { file }, EventType::Warning(msg) => Warning { msg }, diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/const.py b/deltachat-rpc-client/src/deltachat_rpc_client/const.py index b2a4e7f12..3ca606617 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/const.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/const.py @@ -31,6 +31,7 @@ class EventType(str, Enum): SMTP_MESSAGE_SENT = "SmtpMessageSent" IMAP_MESSAGE_DELETED = "ImapMessageDeleted" IMAP_MESSAGE_MOVED = "ImapMessageMoved" + IMAP_INBOX_IDLE = "ImapInboxIdle" NEW_BLOB_FILE = "NewBlobFile" DELETED_BLOB_FILE = "DeletedBlobFile" WARNING = "Warning" diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py b/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py index 065f7744e..86ae86afd 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/pytestplugin.py @@ -55,6 +55,11 @@ class ACFactory: async def get_online_account(self) -> Account: account = await self.new_configured_account() await account.start_io() + while True: + event = await account.wait_for_event() + print(event) + if event.type == EventType.IMAP_INBOX_IDLE: + break return account async def get_online_accounts(self, num: int) -> List[Account]: diff --git a/python/src/deltachat/events.py b/python/src/deltachat/events.py index 38f6e2698..0ae86a9ad 100644 --- a/python/src/deltachat/events.py +++ b/python/src/deltachat/events.py @@ -190,7 +190,7 @@ class FFIEventTracker: - ac2 is still running FetchExsistingMsgs job and thinks it's an existing, old message - therefore no DC_EVENT_INCOMING_MSG is sent """ - self.get_info_contains("INBOX: Idle entering") + self.get_matching("DC_EVENT_IMAP_INBOX_IDLE") def wait_next_incoming_message(self): """wait for and return next incoming message.""" diff --git a/src/events.rs b/src/events.rs index 78e373657..ebb1d299f 100644 --- a/src/events.rs +++ b/src/events.rs @@ -133,6 +133,9 @@ pub enum EventType { /// Emitted when an IMAP message has been moved ImapMessageMoved(String), + /// Emitted before going into IDLE on the Inbox folder. + ImapInboxIdle, + /// Emitted when an new file in the $BLOBDIR was created NewBlobFile(String), diff --git a/src/scheduler.rs b/src/scheduler.rs index dada92f9c..8d8118dd8 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -13,6 +13,7 @@ use crate::config::Config; use crate::contact::{ContactId, RecentlySeenLoop}; use crate::context::Context; use crate::ephemeral::{self, delete_expired_imap_messages}; +use crate::events::EventType; use crate::imap::{FolderMeaning, Imap}; use crate::job; use crate::location; @@ -477,6 +478,7 @@ async fn fetch_idle( connection.connectivity.set_connected(ctx).await; + ctx.emit_event(EventType::ImapInboxIdle); if let Some(session) = connection.session.take() { if !session.can_idle() { info!(