Skip to content

Commit 571a8fc

Browse files
authored
Merge pull request #145 from wingo/filesystem-open-errors
wasi:filesystem@0.3.0-rc-2025-09-16: Add tests for errors during open
2 parents 3665ec6 + 54a792b commit 571a8fc

2 files changed

Lines changed: 71 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: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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-2025-09-16;
10+
include wasi:cli/command@0.3.0-rc-2025-09-16;
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+
22+
async fn test_open_errors(dir: &Descriptor) {
23+
let open = |flags: PathFlags, path: &str| -> _ {
24+
dir.open_at(
25+
flags,
26+
path.to_string(),
27+
OpenFlags::empty(),
28+
DescriptorFlags::READ,
29+
)
30+
};
31+
let open_r = |path: &str| open(PathFlags::empty(), path);
32+
let open_r_follow = |path: &str| open(PathFlags::SYMLINK_FOLLOW, path);
33+
// open-at: async func(path-flags: path-flags, path: string, open-flags: open-flags, %flags: descriptor-flags) -> result<descriptor, error-code>;
34+
assert_eq!(open_r("").await.expect_err("open"), ErrorCode::NoEntry);
35+
assert_eq!(
36+
open_r("..").await.expect_err("open .."),
37+
ErrorCode::NotPermitted
38+
);
39+
assert_eq!(
40+
open_r_follow("parent").await.expect_err("open parent"),
41+
ErrorCode::NotPermitted
42+
);
43+
assert_eq!(
44+
open_r("/").await.expect_err("open /"),
45+
ErrorCode::NotPermitted
46+
);
47+
}
48+
49+
struct Component;
50+
export!(Component);
51+
impl exports::wasi::cli::run::Guest for Component {
52+
async fn run() -> Result<(), ()> {
53+
match &wasi::filesystem::preopens::get_directories()[..] {
54+
[(dir, dirname)] if dirname == "fs-tests.dir" => {
55+
test_open_errors(dir).await;
56+
}
57+
[..] => {
58+
eprintln!("usage: run with one open dir named 'fs-tests.dir'");
59+
process::exit(1)
60+
}
61+
};
62+
Ok(())
63+
}
64+
}
65+
66+
fn main() {
67+
unreachable!("main is a stub");
68+
}

0 commit comments

Comments
 (0)