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