diff --git a/Cargo.lock b/Cargo.lock index b4285a279..63933fa6e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1283,6 +1283,9 @@ dependencies = [ [[package]] name = "deltachat-time" version = "1.0.0" +dependencies = [ + "tokio", +] [[package]] name = "deltachat_derive" diff --git a/Cargo.toml b/Cargo.toml index 42743dad0..a94a1ea64 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,7 +92,7 @@ strum_macros = "0.26" tagger = "4.3.4" textwrap = "0.16.1" thiserror = "1" -tokio = { version = "1.37.0", features = ["fs", "rt-multi-thread", "macros"] } +tokio = { workspace = true } tokio-io-timeout = "1.2.0" tokio-stream = { version = "0.1.15", features = ["fs"] } tokio-tar = { version = "0.3" } # TODO: integrate tokio into async-tar @@ -162,6 +162,9 @@ harness = false name = "send_events" harness = false +[workspace.dependencies] +tokio = { version = "1.37.0", features = ["fs", "rt-multi-thread", "macros", "sync"] } + [features] default = ["vendored"] internals = [] diff --git a/deltachat-time/Cargo.toml b/deltachat-time/Cargo.toml index a2931d726..b796ec8e9 100644 --- a/deltachat-time/Cargo.toml +++ b/deltachat-time/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" license = "MPL-2.0" [dependencies] +tokio = { workspace = true } diff --git a/deltachat-time/src/lib.rs b/deltachat-time/src/lib.rs index c8d7d6f6c..3489c78e0 100644 --- a/deltachat-time/src/lib.rs +++ b/deltachat-time/src/lib.rs @@ -13,11 +13,11 @@ impl SystemTimeTools { pub const UNIX_EPOCH: SystemTime = SystemTime::UNIX_EPOCH; pub fn now() -> SystemTime { - return SystemTime::now() + *SYSTEM_TIME_SHIFT.read().unwrap(); + SystemTime::now() + *SYSTEM_TIME_SHIFT.read().unwrap() } /// Simulates a system clock forward adjustment by `duration`. - pub fn shift(duration: Duration) { + pub async fn shift(duration: Duration) { *SYSTEM_TIME_SHIFT.write().unwrap() += duration; } } @@ -26,9 +26,9 @@ impl SystemTimeTools { mod tests { use super::*; - #[test] - fn it_works() { - SystemTimeTools::shift(Duration::from_secs(60)); + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn it_works() { + SystemTimeTools::shift(Duration::from_secs(60)).await; let t = SystemTimeTools::now(); assert!(t > SystemTime::now()); } diff --git a/src/chat.rs b/src/chat.rs index edb7d8209..99be860eb 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -4831,7 +4831,7 @@ mod tests { // Bob receives a msg about Alice adding Claire to the group. bob.recv_msg(&alice_sent_add_msg).await; - SystemTime::shift(Duration::from_secs(3600)); + SystemTime::shift(Duration::from_secs(3600)).await; // This adds Bob because they left quite long ago. let alice_sent_msg = alice.send_text(alice_chat_id, "What a silence!").await; bob.recv_msg(&alice_sent_msg).await; @@ -4884,7 +4884,7 @@ mod tests { let sent_msg = alice.send_text(alice_chat_id, "Welcome, Fiona!").await; bob.recv_msg(&sent_msg).await; - SystemTime::shift(Duration::from_secs(3600)); + SystemTime::shift(Duration::from_secs(3600)).await; let sent_msg = alice.send_text(alice_chat_id, "Welcome back, Fiona!").await; bob.recv_msg(&sent_msg).await; bob.golden_test_chat(bob_chat_id, "chat_test_msg_with_implicit_member_add") diff --git a/src/contact.rs b/src/contact.rs index 2abcfab7d..e4c664572 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -2852,7 +2852,7 @@ Hi."#; // Wait for `was_seen_recently()` to turn off. while bob.evtracker.try_recv().is_ok() {} - SystemTime::shift(Duration::from_secs(SEEN_RECENTLY_SECONDS as u64 * 2)); + SystemTime::shift(Duration::from_secs(SEEN_RECENTLY_SECONDS as u64 * 2)).await; recently_seen_loop.interrupt(ContactId::UNDEFINED, 0).await; let contact = Contact::get_by_id(&bob, *contacts.first().unwrap()).await?; assert!(!contact.was_seen_recently()); diff --git a/src/reaction.rs b/src/reaction.rs index e3e2ec893..517b8e31c 100644 --- a/src/reaction.rs +++ b/src/reaction.rs @@ -644,7 +644,7 @@ Here's my footer -- bob@example.net" let bob_msg1 = bob.recv_msg(&alice_msg1).await; // Bob reacts to Alice's message, this is shown in the summaries - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; bob_msg1.chat_id.accept(&bob).await?; send_reaction(&bob, bob_msg1.id, "๐Ÿ‘").await?; let bob_send_reaction = bob.pop_sent_msg().await; @@ -661,7 +661,7 @@ Here's my footer -- bob@example.net" assert_summary(&alice, "BOB reacted ๐Ÿ‘ to \"Party?\"").await; // Alice reacts to own message as well - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; send_reaction(&alice, alice_msg1.sender_msg_id, "๐Ÿฟ").await?; let alice_send_reaction = alice.pop_sent_msg().await; bob.recv_msg(&alice_send_reaction).await; @@ -670,7 +670,7 @@ Here's my footer -- bob@example.net" assert_summary(&bob, "ALICE reacted ๐Ÿฟ to \"Party?\"").await; // Alice sends a newer message, this overwrites reaction summaries - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; let alice_msg2 = alice.send_text(alice_chat.id, "kewl").await; bob.recv_msg(&alice_msg2).await; @@ -678,7 +678,7 @@ Here's my footer -- bob@example.net" assert_summary(&bob, "kewl").await; // Reactions to older messages still overwrite newer messages - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; send_reaction(&alice, alice_msg1.sender_msg_id, "๐Ÿค˜").await?; let alice_send_reaction = alice.pop_sent_msg().await; bob.recv_msg(&alice_send_reaction).await; @@ -687,7 +687,7 @@ Here's my footer -- bob@example.net" assert_summary(&bob, "ALICE reacted ๐Ÿค˜ to \"Party?\"").await; // Retracted reactions remove all summary reactions - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; send_reaction(&alice, alice_msg1.sender_msg_id, "").await?; let alice_remove_reaction = alice.pop_sent_msg().await; bob.recv_msg(&alice_remove_reaction).await; @@ -696,7 +696,7 @@ Here's my footer -- bob@example.net" assert_summary(&bob, "kewl").await; // Alice adds another reaction and then deletes the message reacted to; this will also delete reaction summary - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; send_reaction(&alice, alice_msg1.sender_msg_id, "๐Ÿงน").await?; assert_summary(&alice, "You reacted ๐Ÿงน to \"Party?\"").await; @@ -718,7 +718,7 @@ Here's my footer -- bob@example.net" assert_summary(&alice, "foo").await; // Alice reacts to that message - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; send_reaction(&alice, msg_id, "๐Ÿซ").await?; assert_summary(&alice, "You reacted ๐Ÿซ to \"foo\"").await; let reactions = get_msg_reactions(&alice, msg_id).await?; @@ -736,7 +736,7 @@ Here's my footer -- bob@example.net" // Alice reacts to forwarded message: // For reaction summary neither original message author nor "Forwarded" prefix is shown - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; send_reaction(&alice, forwarded_msg_id, "๐Ÿณ").await?; assert_summary(&alice, "You reacted ๐Ÿณ to \"foo\"").await; let reactions = get_msg_reactions(&alice, msg_id).await?; @@ -754,7 +754,7 @@ Here's my footer -- bob@example.net" let msg_id = send_text_msg(&alice0, chat.id, "mom's birthday!".to_string()).await?; alice1.recv_msg(&alice0.pop_sent_msg().await).await; - SystemTime::shift(Duration::from_secs(10)); + SystemTime::shift(Duration::from_secs(10)).await; send_reaction(&alice0, msg_id, "๐Ÿ‘†").await?; let sync = alice0.pop_sent_msg().await; receive_imf(&alice1, sync.payload().as_bytes(), false).await?; diff --git a/src/receive_imf/tests.rs b/src/receive_imf/tests.rs index 8ea32a2a6..a8668c8dc 100644 --- a/src/receive_imf/tests.rs +++ b/src/receive_imf/tests.rs @@ -3664,7 +3664,7 @@ async fn test_ignore_outdated_membership_changes() -> Result<()> { send_text_msg(bob, bob_chat_id, "i'm bob".to_string()).await?; let msg = &bob.pop_sent_msg().await; - SystemTime::shift(Duration::from_secs(3600)); + SystemTime::shift(Duration::from_secs(3600)).await; // Alice leaves. remove_contact_from_chat(alice, alice_chat_id, ContactId::SELF).await?; @@ -3675,7 +3675,7 @@ async fn test_ignore_outdated_membership_changes() -> Result<()> { alice.recv_msg(msg).await; assert!(!is_contact_in_chat(alice, alice_chat_id, ContactId::SELF).await?); - SystemTime::shift(Duration::from_secs(3600)); + SystemTime::shift(Duration::from_secs(3600)).await; // Bob replies again adding Alice back. send_text_msg(bob, bob_chat_id, "i'm bob".to_string()).await?; @@ -3728,7 +3728,7 @@ async fn test_dont_recreate_contacts_on_add_remove() -> Result<()> { alice.recv_msg(&bob.pop_sent_msg().await).await; assert_eq!(get_chat_contacts(&alice, alice_chat_id).await?.len(), 3); - SystemTime::shift(Duration::from_secs(3600)); + SystemTime::shift(Duration::from_secs(3600)).await; send_text_msg( &alice, alice_chat_id, @@ -3811,7 +3811,7 @@ async fn test_dont_readd_with_normal_msg() -> Result<()> { remove_contact_from_chat(&bob, bob_chat_id, ContactId::SELF).await?; assert_eq!(get_chat_contacts(&bob, bob_chat_id).await?.len(), 1); - SystemTime::shift(Duration::from_secs(3600)); + SystemTime::shift(Duration::from_secs(3600)).await; add_contact_to_chat( &alice, alice_chat_id, diff --git a/src/securejoin.rs b/src/securejoin.rs index 0f1a7483d..f32d4074c 100644 --- a/src/securejoin.rs +++ b/src/securejoin.rs @@ -929,7 +929,7 @@ mod tests { assert_eq!(contact_bob.is_verified(&alice.ctx).await.unwrap(), false); if case == SetupContactCase::CheckProtectionTimestamp { - SystemTime::shift(Duration::from_secs(3600)); + SystemTime::shift(Duration::from_secs(3600)).await; } // Step 5+6: Alice receives vc-request-with-auth, sends vc-contact-confirm diff --git a/src/tests/verified_chats.rs b/src/tests/verified_chats.rs index 864c02b4c..96e697bb0 100644 --- a/src/tests/verified_chats.rs +++ b/src/tests/verified_chats.rs @@ -62,7 +62,7 @@ async fn check_verified_oneonone_chat(broken_by_classical_email: bool) { bob2.set_name("bob2"); bob2.configure_addr("bob@example.net").await; - SystemTime::shift(std::time::Duration::from_secs(3600)); + SystemTime::shift(std::time::Duration::from_secs(3600)).await; tcm.send_recv(&bob2, &alice, "Using another device now") .await; let contact = alice.add_or_lookup_contact(&bob).await; @@ -71,7 +71,7 @@ async fn check_verified_oneonone_chat(broken_by_classical_email: bool) { } tcm.section("Bob sends another message from DC"); - SystemTime::shift(std::time::Duration::from_secs(3600)); + SystemTime::shift(std::time::Duration::from_secs(3600)).await; tcm.send_recv(&bob, &alice, "Using DC again").await; // Bob's chat is marked as verified again @@ -797,7 +797,7 @@ async fn test_create_protected_grp_multidev() -> Result<()> { let sent = alice.send_text(group_id, "Hey").await; // This time shift is necessary to reproduce the bug when the original message is sorted over // the "protection enabled" message so that these messages have different timestamps. - SystemTime::shift(std::time::Duration::from_secs(3600)); + SystemTime::shift(std::time::Duration::from_secs(3600)).await; let msg = alice1.recv_msg(&sent).await; let group1 = Chat::load_from_db(alice1, msg.chat_id).await?; assert_eq!(group1.get_type(), Chattype::Group); diff --git a/src/webxdc.rs b/src/webxdc.rs index fc5f36b57..293ee03a2 100644 --- a/src/webxdc.rs +++ b/src/webxdc.rs @@ -2669,7 +2669,7 @@ sth_for_the = "future""# let alice_instance = send_webxdc_instance(alice, alice_chat.id).await?; let bob_instance = bob.recv_msg(&alice.pop_sent_msg().await).await; - SystemTime::shift(Duration::from_secs(1800)); + SystemTime::shift(Duration::from_secs(1800)).await; let mut update = Message { chat_id: alice_chat.id, viewtype: Viewtype::Text, @@ -2690,7 +2690,7 @@ sth_for_the = "future""# r#"[{"payload":{"foo":"bar"},"serial":1,"max_serial":1}]"# ); - SystemTime::shift(Duration::from_secs(2700)); + SystemTime::shift(Duration::from_secs(2700)).await; ephemeral::delete_expired_messages(bob, tools::time()).await?; let bob_instance = Message::load_from_db(bob, bob_instance.id).await?; assert_eq!(bob_instance.chat_id.is_trash(), false);