| 1 | #![cfg (all(feature = "compat" ))] |
| 2 | #![cfg (not(target_os = "wasi" ))] // WASI does not support all fs operations |
| 3 | #![warn (rust_2018_idioms)] |
| 4 | |
| 5 | use futures_io::SeekFrom; |
| 6 | use futures_util::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt}; |
| 7 | use tempfile::NamedTempFile; |
| 8 | use tokio::fs::OpenOptions; |
| 9 | use tokio_util::compat::TokioAsyncWriteCompatExt; |
| 10 | |
| 11 | #[tokio::test ] |
| 12 | async fn compat_file_seek() -> futures_util::io::Result<()> { |
| 13 | let temp_file = NamedTempFile::new()?; |
| 14 | let mut file = OpenOptions::new() |
| 15 | .read(true) |
| 16 | .write(true) |
| 17 | .create(true) |
| 18 | .open(temp_file) |
| 19 | .await? |
| 20 | .compat_write(); |
| 21 | |
| 22 | file.write_all(&[0, 1, 2, 3, 4, 5]).await?; |
| 23 | file.write_all(&[6, 7]).await?; |
| 24 | |
| 25 | assert_eq!(file.stream_position().await?, 8); |
| 26 | |
| 27 | // Modify elements at position 2. |
| 28 | assert_eq!(file.seek(SeekFrom::Start(2)).await?, 2); |
| 29 | file.write_all(&[8, 9]).await?; |
| 30 | |
| 31 | file.flush().await?; |
| 32 | |
| 33 | // Verify we still have 8 elements. |
| 34 | assert_eq!(file.seek(SeekFrom::End(0)).await?, 8); |
| 35 | // Seek back to the start of the file to read and verify contents. |
| 36 | file.seek(SeekFrom::Start(0)).await?; |
| 37 | |
| 38 | let mut buf = Vec::new(); |
| 39 | let num_bytes = file.read_to_end(&mut buf).await?; |
| 40 | assert_eq!(&buf[..num_bytes], &[0, 1, 8, 9, 4, 5, 6, 7]); |
| 41 | |
| 42 | Ok(()) |
| 43 | } |
| 44 | |