1 use futures::join; 2 use test_programs::p3::wasi::filesystem::types::{DescriptorFlags, OpenFlags, PathFlags}; 3 use test_programs::p3::{wasi, wit_stream}; 4 5 struct Component; 6 7 test_programs::p3::export!(Component); 8 9 impl test_programs::p3::exports::wasi::cli::run::Guest for Component { 10 async fn run() -> Result<(), ()> { 11 let preopens = wasi::filesystem::preopens::get_directories(); 12 let (dir, _) = &preopens[0]; 13 14 let filename = "test.txt"; 15 let file = dir 16 .open_at( 17 PathFlags::empty(), 18 filename.to_string(), 19 OpenFlags::CREATE, 20 DescriptorFlags::READ | DescriptorFlags::WRITE, 21 ) 22 .await 23 .unwrap(); 24 let (mut data_tx, data_rx) = wit_stream::new(); 25 join!( 26 async { 27 file.write_via_stream(data_rx, 5).await.unwrap(); 28 }, 29 async { 30 let remaining = data_tx.write_all(b"Hello, ".to_vec()).await; 31 assert!(remaining.is_empty()); 32 let remaining = data_tx.write_all(b"World!".to_vec()).await; 33 assert!(remaining.is_empty()); 34 drop(data_tx); 35 }, 36 ); 37 let (data_rx, data_fut) = file.read_via_stream(0); 38 let contents = data_rx.collect().await; 39 data_fut.await.unwrap(); 40 assert_eq!( 41 String::from_utf8_lossy(&contents), 42 "\0\0\0\0\0Hello, World!" 43 ); 44 45 // Test that file read streams behave like other read streams. 46 let (data_rx, data_fut) = file.read_via_stream(5); 47 let contents = data_rx.collect().await; 48 data_fut.await.unwrap(); 49 assert_eq!(String::from_utf8_lossy(&contents), "Hello, World!"); 50 51 dir.unlink_file_at(filename.to_string()).await.unwrap(); 52 Ok(()) 53 } 54 } 55 56 fn main() {} 57