1 use test_programs::wasi;
2 use test_programs::wasi::filesystem::types::{DescriptorFlags, OpenFlags, PathFlags};
3 
main()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