Skip to content

Commit 42cad9e

Browse files
authored
Merge pull request #133 from wingo/filesystem-advise
wasi:[email protected]: Add tests for fadvise
2 parents 34bdb2f + d3e1816 commit 42cad9e

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-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: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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::Advice;
21+
use wasi::filesystem::types::{DescriptorFlags, ErrorCode, OpenFlags, PathFlags};
22+
23+
async fn test_advise(dir: &Descriptor) {
24+
// Advise should fail on directories.
25+
assert_eq!(
26+
dir.advise(0, 0, Advice::Normal).await,
27+
Err(ErrorCode::BadDescriptor)
28+
);
29+
30+
let fd = dir
31+
.open_at(
32+
PathFlags::empty(),
33+
"a.txt".to_string(),
34+
OpenFlags::empty(),
35+
DescriptorFlags::READ,
36+
)
37+
.await
38+
.unwrap();
39+
40+
let size = fd.stat().await.unwrap().size;
41+
for advice in [
42+
Advice::Normal,
43+
Advice::Sequential,
44+
Advice::Random,
45+
Advice::WillNeed,
46+
Advice::DontNeed,
47+
Advice::NoReuse,
48+
] {
49+
for offset in [0, size.saturating_sub(4096), size, size + 4096] {
50+
for length in [0, 10, 4096, size, size + 4096] {
51+
match fd.advise(offset, length, advice).await {
52+
Ok(()) => {}
53+
Err(err) => {
54+
eprintln!("fadvise({}, {}, {:?}) => {}", offset, length, advice, err);
55+
process::exit(1);
56+
}
57+
}
58+
}
59+
}
60+
}
61+
}
62+
63+
struct Component;
64+
export!(Component);
65+
impl exports::wasi::cli::run::Guest for Component {
66+
async fn run() -> Result<(), ()> {
67+
match &wasi::filesystem::preopens::get_directories()[..] {
68+
[(dir, dirname)] if dirname == "fs-tests.dir" => {
69+
test_advise(dir).await;
70+
}
71+
[..] => {
72+
eprintln!("usage: run with one open dir named 'fs-tests.dir'");
73+
process::exit(1)
74+
}
75+
}
76+
Ok(())
77+
}
78+
}
79+
80+
fn main() {
81+
unreachable!("main is a stub");
82+
}

0 commit comments

Comments
 (0)