1 use test_programs::wasi; 2 use test_programs::wasi::filesystem::types::{DescriptorFlags, OpenFlags, PathFlags}; 3 4 fn main() { 5 let preopens = wasi::filesystem::preopens::get_directories(); 6 let (dir, _) = &preopens[0]; 7 8 let filename = "test.txt"; 9 let file = dir 10 .open_at( 11 PathFlags::empty(), 12 filename, 13 OpenFlags::CREATE, 14 DescriptorFlags::READ | DescriptorFlags::WRITE, 15 ) 16 .unwrap(); 17 let stream = file.write_via_stream(5).unwrap(); 18 stream.blocking_write_and_flush(b"Hello, ").unwrap(); 19 stream.blocking_write_and_flush(b"World!").unwrap(); 20 drop(stream); 21 22 let stream = file.read_via_stream(0).unwrap(); 23 let contents = stream.blocking_read(100).unwrap(); 24 assert_eq!(contents, b"\0\0\0\0\0Hello, World!"); 25 drop(stream); 26 27 // Test that file read streams behave like other read streams. 28 let mut buf = Vec::new(); 29 let stream = file.read_via_stream(0).unwrap(); 30 let ready = stream.subscribe(); 31 loop { 32 ready.block(); 33 34 match stream.read(0) { 35 Ok(chunk) => assert!(chunk.is_empty()), 36 Err(wasi::io::streams::StreamError::Closed) => break, 37 Err(e) => panic!("Failed checking stream state: {e:?}"), 38 } 39 40 match stream.read(4) { 41 Ok(chunk) => buf.extend(chunk), 42 Err(wasi::io::streams::StreamError::Closed) => break, 43 Err(e) => panic!("Failed reading stream: {e:?}"), 44 } 45 } 46 assert_eq!(buf, b"\0\0\0\0\0Hello, World!"); 47 drop(ready); 48 drop(stream); 49 drop(file); 50 51 dir.unlink_file_at(filename).unwrap(); 52 } 53