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