From 2f4c016079727b96f51a602e86c16f7473a1f7a7 Mon Sep 17 00:00:00 2001 From: Suryakant Soni Date: Tue, 13 May 2025 17:06:42 +0530 Subject: [PATCH] tokio:issue-6374-demo : demoing issue 2 --- tokio/src/fs/file/tests.rs | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tokio/src/fs/file/tests.rs b/tokio/src/fs/file/tests.rs index e824876c131..5316dd24ed6 100644 --- a/tokio/src/fs/file/tests.rs +++ b/tokio/src/fs/file/tests.rs @@ -976,3 +976,56 @@ fn busy_file_seek_error() { let mut t = task::spawn(file.seek(SeekFrom::Start(0))); assert_ready_err!(t.poll()); } + +// issue 2 Demonstration +#[test] +fn open_write_old() { + let mut file = MockFile::default(); + file.expect_inner_write() + .once() + .with(eq(HELLO)) + .returning(|buf| Ok(buf.len())); + + let mut file = File::from_std(file); + + let mut t = task::spawn(file.write(HELLO)); + + assert_eq!(0, pool::len()); + + // This poll returns Ready even though the queued blocking write task hasn't run yet.`pool::run_one();` here + // This is the async contract violation we're fixing. + assert_ready_ok!(t.poll()); + + assert_eq!(1, pool::len()); + + pool::run_one(); + + assert!(!t.is_woken()); + + let mut t = task::spawn(file.flush()); + assert_ready_ok!(t.poll()); +} +#[test] +fn open_write_new() { + let mut file = MockFile::default(); + file.expect_inner_write() + .once() + .with(eq(HELLO)) + .returning(|buf| Ok(buf.len())); + + let mut file = File::from_std(file); + + let mut t = task::spawn(file.write(HELLO)); + + // In the fixed code, this returns Pending because spawn_blocking hasn't completed yet. + // This assertion fails in the old (broken) code, because it incorrectly returns Ready too early. + assert_pending!(t.poll()); + // running spawn task + pool::run_one(); + assert!(t.is_woken()); + // after spawn task is run - in the sequential polling iteration, ˝the poll status is set to ready + assert_ready_ok!(t.poll()); + + let mut t = task::spawn(file.flush()); + assert_ready_ok!(t.poll()); +}