Skip to content

Commit 43be22a

Browse files
committed
wasi:filesystem@0.3.0-rc-2025-09-16: Add tests for mkdir/rmdir
1 parent ebffc08 commit 43be22a

2 files changed

Lines changed: 153 additions & 0 deletions

File tree

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: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
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/imports@0.3.0-rc-2026-02-09;
10+
include wasi:cli/command@0.3.0-rc-2026-02-09;
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, DescriptorFlags, ErrorCode, OpenFlags, PathFlags};
20+
21+
async fn test_mkdir_rmdir(dir: &Descriptor) {
22+
let mkdir = |path: &str| dir.create_directory_at(path.to_string());
23+
let rmdir = |path: &str| dir.remove_directory_at(path.to_string());
24+
25+
// create-directory-at: async func(path: string) -> result<_, error-code>;
26+
assert_eq!(
27+
dir.create_directory_at("".to_string()).await,
28+
Err(ErrorCode::NoEntry)
29+
);
30+
assert_eq!(mkdir(".").await, Err(ErrorCode::Exist));
31+
assert_eq!(mkdir("..").await, Err(ErrorCode::NotPermitted));
32+
assert_eq!(mkdir("parent/foo").await, Err(ErrorCode::NotPermitted));
33+
assert_eq!(mkdir("/").await, Err(ErrorCode::NotPermitted));
34+
assert_eq!(
35+
mkdir("../fs-tests.dir/q.cleanup").await,
36+
Err(ErrorCode::NotPermitted)
37+
);
38+
assert_eq!(
39+
mkdir("parent/fs-tests.dir/q.cleanup").await,
40+
Err(ErrorCode::NotPermitted)
41+
);
42+
assert_eq!(mkdir("a.txt").await, Err(ErrorCode::Exist));
43+
mkdir("q.cleanup").await.unwrap();
44+
assert_eq!(
45+
rmdir("../fs-tests.dir/q.cleanup").await,
46+
Err(ErrorCode::NotPermitted)
47+
);
48+
assert_eq!(
49+
rmdir("parent/fs-tests.dir/q.cleanup").await,
50+
Err(ErrorCode::NotPermitted)
51+
);
52+
assert_eq!(
53+
rmdir("q.cleanup/../../fs-tests.dir/q.cleanup").await,
54+
Err(ErrorCode::NotPermitted)
55+
);
56+
rmdir("q.cleanup").await.unwrap();
57+
mkdir("q.cleanup/").await.unwrap();
58+
rmdir("q.cleanup").await.unwrap();
59+
mkdir("q.cleanup").await.unwrap();
60+
// FIXME: https://github.com/bytecodealliance/wasmtime/issues/11524
61+
// rmdir("q.cleanup/")
62+
// .await.unwrap();
63+
// mkdir("q.cleanup/////")
64+
// .await.unwrap();
65+
// rmdir("q.cleanup////////////")
66+
// .await.unwrap();
67+
// Using this instead to clean up:
68+
rmdir("q.cleanup").await.unwrap();
69+
70+
// remove-directory-at: async func(path: string) -> result<_, error-code>;
71+
assert_eq!(rmdir("").await, Err(ErrorCode::NoEntry));
72+
assert!(matches!(
73+
rmdir(".").await,
74+
Err(ErrorCode::Invalid | ErrorCode::Access)
75+
));
76+
assert_eq!(rmdir("..").await, Err(ErrorCode::NotPermitted));
77+
assert_eq!(rmdir("/").await, Err(ErrorCode::NotPermitted));
78+
assert_eq!(rmdir("a.txt").await, Err(ErrorCode::NotDirectory));
79+
assert_eq!(rmdir("z.txt").await, Err(ErrorCode::NoEntry));
80+
// FIXME: https://github.com/bytecodealliance/wasmtime/issues/12178
81+
// assert_eq!(rmdir("parent").await, Err(ErrorCode::NotDirectory));
82+
assert_eq!(
83+
rmdir("parent/fs-tests.dir").await,
84+
Err(ErrorCode::NotPermitted)
85+
);
86+
87+
mkdir("child.cleanup").await.unwrap();
88+
mkdir("sibling.cleanup").await.unwrap();
89+
let child = dir
90+
.open_at(
91+
PathFlags::empty(),
92+
"child.cleanup".to_string(),
93+
OpenFlags::DIRECTORY,
94+
DescriptorFlags::MUTATE_DIRECTORY,
95+
)
96+
.await
97+
.unwrap();
98+
99+
let child_mkdir = |path: &str| child.create_directory_at(path.to_string());
100+
let child_rmdir = |path: &str| child.remove_directory_at(path.to_string());
101+
102+
child_mkdir("z.cleanup").await.unwrap();
103+
child_rmdir("z.cleanup").await.unwrap();
104+
assert_eq!(
105+
child_mkdir("../z.cleanup").await.unwrap_err(),
106+
ErrorCode::NotPermitted
107+
);
108+
assert_eq!(
109+
child_rmdir("../z.cleanup").await.unwrap_err(),
110+
ErrorCode::NotPermitted
111+
);
112+
assert_eq!(
113+
child_mkdir("../sibling.cleanup/z.cleanup")
114+
.await
115+
.unwrap_err(),
116+
ErrorCode::NotPermitted
117+
);
118+
assert_eq!(
119+
child_rmdir("../sibling.cleanup/z.cleanup")
120+
.await
121+
.unwrap_err(),
122+
ErrorCode::NotPermitted
123+
);
124+
assert_eq!(
125+
child_rmdir("../sibling.cleanup").await.unwrap_err(),
126+
ErrorCode::NotPermitted
127+
);
128+
rmdir("child.cleanup").await.unwrap();
129+
}
130+
131+
struct Component;
132+
export!(Component);
133+
impl exports::wasi::cli::run::Guest for Component {
134+
async fn run() -> Result<(), ()> {
135+
match &wasi::filesystem::preopens::get_directories()[..] {
136+
[(dir, dirname)] if dirname == "fs-tests.dir" => {
137+
test_mkdir_rmdir(dir).await;
138+
}
139+
[..] => {
140+
eprintln!("usage: run with one open dir named 'fs-tests.dir'");
141+
process::exit(1)
142+
}
143+
};
144+
Ok(())
145+
}
146+
}
147+
148+
fn main() {
149+
unreachable!("main is a stub");
150+
}

0 commit comments

Comments
 (0)