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