diff --git a/tokio-test/src/io.rs b/tokio-test/src/io.rs index f1ce77aa2..ac70a06f1 100644 --- a/tokio-test/src/io.rs +++ b/tokio-test/src/io.rs @@ -458,6 +458,21 @@ impl AsyncWrite for Mock { } } +/// Ensures that Mock isn't dropped with data "inside". +impl Drop for Mock { + fn drop(&mut self) { + // Avoid double panicking, since makes debugging much harder. + if std::thread::panicking() { + return; + } + + self.inner.actions.iter().for_each(|a| match a { + Action::Read(data) => assert!(data.is_empty(), "There is still data left to read."), + Action::Write(data) => assert!(data.is_empty(), "There is still data left to write."), + _ => (), + }) + } +} /* /// Returns `true` if called from the context of a futures-rs Task fn is_task_ctx() -> bool { diff --git a/tokio-test/tests/io.rs b/tokio-test/tests/io.rs index 948bc323c..f164abaf1 100644 --- a/tokio-test/tests/io.rs +++ b/tokio-test/tests/io.rs @@ -70,3 +70,17 @@ async fn write_error() { mock.write_all(b"world!").await.expect("write 2"); } + +#[tokio::test] +#[should_panic] +async fn mock_panics_read_data_left() { + use tokio_test::io::Builder; + Builder::new().read(b"read").build(); +} + +#[tokio::test] +#[should_panic] +async fn mock_panics_write_data_left() { + use tokio_test::io::Builder; + Builder::new().write(b"write").build(); +}