1 use futures::join;
2 use test_programs::p3::wasi::filesystem::types::{DescriptorFlags, OpenFlags, PathFlags};
3 use test_programs::p3::{wasi, wit_stream};
4 
5 struct Component;
6 
7 test_programs::p3::export!(Component);
8 
9 impl test_programs::p3::exports::wasi::cli::run::Guest for Component {
run() -> Result<(), ()>10     async fn run() -> Result<(), ()> {
11         let preopens = wasi::filesystem::preopens::get_directories();
12         let (dir, _) = &preopens[0];
13 
14         let filename = "test.txt";
15         let file = dir
16             .open_at(
17                 PathFlags::empty(),
18                 filename.to_string(),
19                 OpenFlags::CREATE,
20                 DescriptorFlags::READ | DescriptorFlags::WRITE,
21             )
22             .await
23             .unwrap();
24         let (mut data_tx, data_rx) = wit_stream::new();
25         join!(
26             async {
27                 file.write_via_stream(data_rx, 5).await.unwrap();
28             },
29             async {
30                 let remaining = data_tx.write_all(b"Hello, ".to_vec()).await;
31                 assert!(remaining.is_empty());
32                 let remaining = data_tx.write_all(b"World!".to_vec()).await;
33                 assert!(remaining.is_empty());
34                 drop(data_tx);
35             },
36         );
37         let (data_rx, data_fut) = file.read_via_stream(0);
38         let contents = data_rx.collect().await;
39         data_fut.await.unwrap();
40         assert_eq!(
41             String::from_utf8_lossy(&contents),
42             "\0\0\0\0\0Hello, World!"
43         );
44 
45         // Test that file read streams behave like other read streams.
46         let (data_rx, data_fut) = file.read_via_stream(5);
47         let contents = data_rx.collect().await;
48         data_fut.await.unwrap();
49         assert_eq!(String::from_utf8_lossy(&contents), "Hello, World!");
50 
51         dir.unlink_file_at(filename.to_string()).await.unwrap();
52         Ok(())
53     }
54 }
55 
main()56 fn main() {}
57