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