Skip to content

Commit 4cf6b4f

Browse files
authored
Merge pull request #131 from wingo/filesystem-flags-and-type
wasi:[email protected]: Add tests for flags/type APIs
2 parents 352cdca + a9bb5a4 commit 4cf6b4f

File tree

5 files changed

+173
-0
lines changed

5 files changed

+173
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"dirs": ["fs-tests.dir"]
3+
}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
use std::process;
2+
extern crate wit_bindgen;
3+
4+
wit_bindgen::generate!({
5+
inline: r"
6+
package test:test;
7+
8+
world test {
9+
include wasi:filesystem/[email protected];
10+
include wasi:cli/[email protected];
11+
}
12+
",
13+
additional_derives: [PartialEq, Eq, Hash, Clone],
14+
// Work around https://github.com/bytecodealliance/wasm-tools/issues/2285.
15+
features:["clocks-timezone"],
16+
generate_all
17+
});
18+
19+
use wasi::filesystem::types::Descriptor;
20+
use wasi::filesystem::types::{DescriptorFlags, ErrorCode, OpenFlags, PathFlags};
21+
use wasi::filesystem::types::DescriptorType;
22+
23+
async fn test_flags_and_type(dir: &Descriptor) {
24+
// get-flags: async func() -> result<descriptor-flags, error-code>;
25+
// get-type: async func() -> result<descriptor-type, error-code>;
26+
let open = |path: &str, oflags: OpenFlags, fdflags: DescriptorFlags| -> _ {
27+
dir.open_at(PathFlags::empty(), path.to_string(), oflags, fdflags)
28+
};
29+
let open_r = |path: &str| -> _ { open(path, OpenFlags::empty(), DescriptorFlags::READ) };
30+
let creat = |path: &str| -> _ {
31+
open(
32+
path,
33+
OpenFlags::CREATE | OpenFlags::EXCLUSIVE,
34+
DescriptorFlags::READ | DescriptorFlags::WRITE,
35+
)
36+
};
37+
let rm = |path: &str| dir.unlink_file_at(path.to_string());
38+
39+
assert_eq!(
40+
dir.get_flags().await,
41+
Ok(DescriptorFlags::READ | DescriptorFlags::MUTATE_DIRECTORY)
42+
);
43+
assert_eq!(dir.get_type().await, Ok(DescriptorType::Directory));
44+
45+
let d = open(".", OpenFlags::empty(), DescriptorFlags::empty())
46+
.await
47+
.unwrap();
48+
// No flags opening dir? Open as read.
49+
assert_eq!(d.get_flags().await, Ok(DescriptorFlags::READ));
50+
assert_eq!(d.get_type().await, Ok(DescriptorType::Directory));
51+
52+
assert_eq!(
53+
open(".", OpenFlags::empty(), DescriptorFlags::WRITE)
54+
.await
55+
.unwrap_err(),
56+
ErrorCode::IsDirectory
57+
);
58+
59+
// FIXME: https://github.com/bytecodealliance/wasmtime/issues/11667
60+
// let d = open(".", OpenFlags::empty(),
61+
// DescriptorFlags::MUTATE_DIRECTORY).await.unwrap();
62+
// assert_eq!(d.get_flags().await,
63+
// Ok(DescriptorFlags::READ | DescriptorFlags::MUTATE_DIRECTORY));
64+
// assert_eq!(d.get_type().await,
65+
// Ok(DescriptorType::Directory));
66+
//
67+
// let d = open(".", OpenFlags::empty(),
68+
// DescriptorFlags::READ | DescriptorFlags::MUTATE_DIRECTORY).await.unwrap();
69+
// assert_eq!(d.get_flags().await,
70+
// Ok(DescriptorFlags::READ | DescriptorFlags::MUTATE_DIRECTORY));
71+
// assert_eq!(d.get_type().await,
72+
// Ok(DescriptorType::Directory));
73+
// let d = open(".", OpenFlags::DIRECTORY,
74+
// DescriptorFlags::READ | DescriptorFlags::MUTATE_DIRECTORY).await.unwrap();
75+
// assert_eq!(d.get_flags().await,
76+
// Ok(DescriptorFlags::READ | DescriptorFlags::MUTATE_DIRECTORY));
77+
// assert_eq!(d.get_type().await,
78+
// Ok(DescriptorType::Directory));
79+
80+
let a = open_r("a.txt").await.unwrap();
81+
assert_eq!(a.get_flags().await, Ok(DescriptorFlags::READ));
82+
assert_eq!(a.get_type().await, Ok(DescriptorType::RegularFile));
83+
let c = creat("c.cleanup").await.unwrap();
84+
assert_eq!(
85+
c.get_flags().await,
86+
Ok(DescriptorFlags::READ | DescriptorFlags::WRITE)
87+
);
88+
rm("c.cleanup").await.unwrap();
89+
90+
let c = open(
91+
"c.cleanup",
92+
OpenFlags::CREATE | OpenFlags::EXCLUSIVE,
93+
DescriptorFlags::empty(),
94+
)
95+
.await
96+
.unwrap();
97+
// CREATE implies WRITE.
98+
assert_eq!(
99+
c.get_flags().await,
100+
Ok(DescriptorFlags::READ | DescriptorFlags::WRITE)
101+
);
102+
rm("c.cleanup").await.unwrap();
103+
104+
let c = open(
105+
"c.cleanup",
106+
OpenFlags::CREATE | OpenFlags::EXCLUSIVE,
107+
DescriptorFlags::READ,
108+
)
109+
.await
110+
.unwrap();
111+
// CREATE implies WRITE.
112+
assert_eq!(
113+
c.get_flags().await,
114+
Ok(DescriptorFlags::READ | DescriptorFlags::WRITE)
115+
);
116+
rm("c.cleanup").await.unwrap();
117+
118+
let c = open(
119+
"c.cleanup",
120+
OpenFlags::CREATE | OpenFlags::EXCLUSIVE,
121+
DescriptorFlags::WRITE,
122+
)
123+
.await
124+
.unwrap();
125+
// CREATE implies WRITE, but not READ.
126+
assert_eq!(c.get_flags().await, Ok(DescriptorFlags::WRITE));
127+
rm("c.cleanup").await.unwrap();
128+
129+
// EXCLUSIVE is meaningless without CREATE; flags default to READ.
130+
let a = open("a.txt", OpenFlags::EXCLUSIVE, DescriptorFlags::empty())
131+
.await
132+
.unwrap();
133+
assert_eq!(a.get_flags().await, Ok(DescriptorFlags::READ));
134+
135+
// No flags? Default to READ.
136+
let a = open("a.txt", OpenFlags::empty(), DescriptorFlags::empty())
137+
.await
138+
.unwrap();
139+
assert_eq!(a.get_flags().await, Ok(DescriptorFlags::READ));
140+
141+
// WRITE does not imply READ.
142+
let a = open("a.txt", OpenFlags::empty(), DescriptorFlags::WRITE)
143+
.await
144+
.unwrap();
145+
assert_eq!(a.get_flags().await, Ok(DescriptorFlags::WRITE));
146+
}
147+
148+
struct Component;
149+
export!(Component);
150+
impl exports::wasi::cli::run::Guest for Component {
151+
async fn run() -> Result<(), ()> {
152+
match &wasi::filesystem::preopens::get_directories()[..] {
153+
[(dir, dirname)] if dirname == "fs-tests.dir" => {
154+
test_flags_and_type(dir).await;
155+
}
156+
[..] => {
157+
eprintln!("usage: run with one open dir named 'fs-tests.dir'");
158+
process::exit(1)
159+
}
160+
}
161+
Ok(())
162+
}
163+
}
164+
165+
fn main() {
166+
unreachable!("main is a stub");
167+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
test-a
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
test-b
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
..

0 commit comments

Comments
 (0)