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