From 7629a1b76fe4ed2a5efebc8456cfce8c7f814815 Mon Sep 17 00:00:00 2001 From: Abdo Date: Tue, 5 Nov 2024 11:23:50 +0300 Subject: [PATCH] Fix flaky tests (#3541) * Fix flaky state_application() test * Try to fix flaky unicode_normalization() test --- rslib/io/src/lib.rs | 16 +++++++++ rslib/src/media/check.rs | 3 +- rslib/src/scheduler/answering/mod.rs | 49 ++++++++++++---------------- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/rslib/io/src/lib.rs b/rslib/io/src/lib.rs index 100d397d3..c1d4c0205 100644 --- a/rslib/io/src/lib.rs +++ b/rslib/io/src/lib.rs @@ -8,6 +8,7 @@ use std::fs::FileTimes; use std::fs::OpenOptions; use std::io::Read; use std::io::Seek; +use std::io::Write; use std::path::Component; use std::path::Path; use std::path::PathBuf; @@ -54,6 +55,21 @@ pub fn write_file(path: impl AsRef, contents: impl AsRef<[u8]>) -> Result< }) } +pub fn write_file_and_flush( + path: impl AsRef + Clone, + contents: impl AsRef<[u8]>, +) -> Result<()> { + let mut file = create_file(path.clone())?; + file.write_all(contents.as_ref()).context(FileIoSnafu { + path: path.clone().as_ref(), + op: FileOp::Write, + })?; + file.sync_all().context(FileIoSnafu { + path: path.as_ref(), + op: FileOp::Sync, + }) +} + /// See [File::set_times]. pub fn set_file_times(path: impl AsRef, times: FileTimes) -> Result<()> { #[cfg(not(windows))] diff --git a/rslib/src/media/check.rs b/rslib/src/media/check.rs index c87fadb91..bc85b177b 100644 --- a/rslib/src/media/check.rs +++ b/rslib/src/media/check.rs @@ -546,6 +546,7 @@ pub(crate) mod test { use anki_io::create_dir; use anki_io::read_to_string; use anki_io::write_file; + use anki_io::write_file_and_flush; use tempfile::tempdir; use tempfile::TempDir; @@ -696,7 +697,7 @@ Unused: unused.jpg fn unicode_normalization() -> Result<()> { let (_dir, mgr, mut col) = common_setup()?; - write_file(mgr.media_folder.join("ぱぱ.jpg"), "nfd encoding")?; + write_file_and_flush(mgr.media_folder.join("ぱぱ.jpg"), "nfd encoding")?; let mut output = { let mut checker = col.media_checker()?; diff --git a/rslib/src/scheduler/answering/mod.rs b/rslib/src/scheduler/answering/mod.rs index 61ff13fbb..2d3c34a28 100644 --- a/rslib/src/scheduler/answering/mod.rs +++ b/rslib/src/scheduler/answering/mod.rs @@ -644,10 +644,9 @@ mod test { // new->learning let post_answer = col.answer_again(); - assert_eq!( - post_answer.new_state, - current_state(&mut col, post_answer.card_id) - ); + let mut current = current_state(&mut col, post_answer.card_id); + col.set_elapsed_secs_equal(&post_answer.new_state, &mut current); + assert_eq!(post_answer.new_state, current); let card = col.storage.get_card(post_answer.card_id)?.unwrap(); assert_eq!(card.queue, CardQueue::Learn); assert_eq!(card.remaining_steps, 2); @@ -656,10 +655,9 @@ mod test { col.storage.db.execute_batch("update cards set due=0")?; col.clear_study_queues(); let post_answer = col.answer_good(); - assert_eq!( - post_answer.new_state, - current_state(&mut col, post_answer.card_id) - ); + let mut current = current_state(&mut col, post_answer.card_id); + col.set_elapsed_secs_equal(&post_answer.new_state, &mut current); + assert_eq!(post_answer.new_state, current); let card = col.storage.get_card(post_answer.card_id)?.unwrap(); assert_eq!(card.queue, CardQueue::Learn); assert_eq!(card.remaining_steps, 1); @@ -672,10 +670,9 @@ mod test { if let CardState::Normal(NormalState::Review(state)) = &mut post_answer.new_state { state.elapsed_days = 1; }; - assert_eq!( - post_answer.new_state, - current_state(&mut col, post_answer.card_id) - ); + let mut current = current_state(&mut col, post_answer.card_id); + col.set_elapsed_secs_equal(&post_answer.new_state, &mut current); + assert_eq!(post_answer.new_state, current); let card = col.storage.get_card(post_answer.card_id)?.unwrap(); assert_eq!(card.queue, CardQueue::Review); assert_eq!(card.interval, 1); @@ -688,10 +685,9 @@ mod test { if let CardState::Normal(NormalState::Review(state)) = &mut post_answer.new_state { state.elapsed_days = 4; }; - assert_eq!( - post_answer.new_state, - current_state(&mut col, post_answer.card_id) - ); + let mut current = current_state(&mut col, post_answer.card_id); + col.set_elapsed_secs_equal(&post_answer.new_state, &mut current); + assert_eq!(post_answer.new_state, current); let card = col.storage.get_card(post_answer.card_id)?.unwrap(); assert_eq!(card.queue, CardQueue::Review); assert_eq!(card.interval, 4); @@ -704,10 +700,9 @@ mod test { if let CardState::Normal(NormalState::Relearning(state)) = &mut post_answer.new_state { state.review.elapsed_days = 1; }; - assert_eq!( - post_answer.new_state, - current_state(&mut col, post_answer.card_id) - ); + let mut current = current_state(&mut col, post_answer.card_id); + col.set_elapsed_secs_equal(&post_answer.new_state, &mut current); + assert_eq!(post_answer.new_state, current); let card = col.storage.get_card(post_answer.card_id)?.unwrap(); assert_eq!(card.queue, CardQueue::Learn); assert_eq!(card.ctype, CardType::Relearn); @@ -722,10 +717,9 @@ mod test { if let CardState::Normal(NormalState::Relearning(state)) = &mut post_answer.new_state { state.review.elapsed_days = 1; }; - assert_eq!( - post_answer.new_state, - current_state(&mut col, post_answer.card_id) - ); + let mut current = current_state(&mut col, post_answer.card_id); + col.set_elapsed_secs_equal(&post_answer.new_state, &mut current); + assert_eq!(post_answer.new_state, current); let card = col.storage.get_card(post_answer.card_id)?.unwrap(); assert_eq!(card.queue, CardQueue::Learn); assert_eq!(card.lapses, 1); @@ -737,10 +731,9 @@ mod test { if let CardState::Normal(NormalState::Review(state)) = &mut post_answer.new_state { state.elapsed_days = 1; }; - assert_eq!( - post_answer.new_state, - current_state(&mut col, post_answer.card_id) - ); + let mut current = current_state(&mut col, post_answer.card_id); + col.set_elapsed_secs_equal(&post_answer.new_state, &mut current); + assert_eq!(post_answer.new_state, current); let card = col.storage.get_card(post_answer.card_id)?.unwrap(); assert_eq!(card.queue, CardQueue::Review); assert_eq!(card.interval, 1);