Skip to content

Commit 1df1255

Browse files
authored
Update and refactor how wasi-testsuite is run (#11560)
* Update and refactor how wasi-testsuite is run This commit updates the `WebAssembly/wasi-testuite` submodule in this repository which hasn't been updated once in the past 2 years. This then additionally refactors how tests are run: * A new top-level test is added at `tests/wasi.rs` similar to `tests/wast.rs`. * The top-level test uses `libtest_mimic` to enable running tests in parallel. * Using `libtest_mimic` enables running a test-at-a-time. * Using `libtest_mimic` enables seeing a list of failures instead of just the first failure. * Component versions of tests are run in addition to core wasm versions of tests. * Minor updates are made to the adapter and wasmtime-wasi to get some tests passing. * The list of allowed failures is updated with a `FIXME`-per-test of what's remaining. prtest:full * Fix in-tree tests with new behavior * Add Windows exemptions * Fix tests with wasi-common
1 parent 10d2cbc commit 1df1255

File tree

15 files changed

+345
-236
lines changed

15 files changed

+345
-236
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ glob = "0.3.0"
380380
libfuzzer-sys = "0.4.8"
381381
walkdir = "2.3.3"
382382
cfg-if = "1.0"
383-
tempfile = "3.1.0"
383+
tempfile = "3.21.0"
384384
filecheck = "0.5.0"
385385
libc = { version = "0.2.112", default-features = true }
386386
file-per-thread-logger = "0.2.0"
@@ -571,6 +571,10 @@ harness = false
571571
name = "wast"
572572
harness = false
573573

574+
[[test]]
575+
name = "wasi"
576+
harness = false
577+
574578
[[example]]
575579
name = "tokio"
576580
required-features = ["wasi-common/tokio"]

crates/test-programs/artifacts/build.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,19 @@ struct Test {
3737

3838
impl Artifacts {
3939
fn build(&mut self) {
40+
let mut generated_code = String::new();
4041
// Build adapters used below for componentization.
41-
let reactor_adapter = self.build_adapter("reactor", &[]);
42-
let command_adapter =
43-
self.build_adapter("command", &["--no-default-features", "--features=command"]);
44-
let proxy_adapter =
45-
self.build_adapter("proxy", &["--no-default-features", "--features=proxy"]);
42+
let reactor_adapter = self.build_adapter(&mut generated_code, "reactor", &[]);
43+
let command_adapter = self.build_adapter(
44+
&mut generated_code,
45+
"command",
46+
&["--no-default-features", "--features=command"],
47+
);
48+
let proxy_adapter = self.build_adapter(
49+
&mut generated_code,
50+
"proxy",
51+
&["--no-default-features", "--features=proxy"],
52+
);
4653

4754
// Build all test programs both in Rust and C/C++.
4855
let mut tests = Vec::new();
@@ -53,7 +60,6 @@ impl Artifacts {
5360
// test along with constants pointing to various paths. Note that
5461
// components are created here as well from core modules.
5562
let mut kinds = BTreeMap::new();
56-
let mut generated_code = String::new();
5763
let missing_sdk_path =
5864
PathBuf::from("Asset not compiled, WASI_SDK_PATH missing at compile time");
5965
for test in tests.iter() {
@@ -175,7 +181,12 @@ impl Artifacts {
175181
}
176182

177183
// Build the WASI Preview 1 adapter, and get the binary:
178-
fn build_adapter(&mut self, name: &str, features: &[&str]) -> Vec<u8> {
184+
fn build_adapter(
185+
&mut self,
186+
generated_code: &mut String,
187+
name: &str,
188+
features: &[&str],
189+
) -> Vec<u8> {
179190
let mut cmd = cargo();
180191
cmd.arg("build")
181192
.arg("--release")
@@ -202,6 +213,10 @@ impl Artifacts {
202213
std::fs::copy(&artifact, &adapter).unwrap();
203214
self.read_deps_of(&artifact);
204215
println!("wasi {name} adapter: {:?}", &adapter);
216+
generated_code.push_str(&format!(
217+
"pub const ADAPTER_{}: &'static str = {adapter:?};\n",
218+
name.to_shouty_snake_case(),
219+
));
205220
fs::read(&adapter).unwrap()
206221
}
207222

crates/test-programs/src/bin/preview1_renumber.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,11 @@ unsafe fn test_renumber(dir_fd: wasip1::Fd) {
9191
"file descriptor range check",
9292
);
9393

94-
wasip1::fd_renumber(fd_file3, 127).expect("renumbering FD to 127");
95-
match wasip1::fd_renumber(127, u32::MAX) {
96-
Err(wasip1::ERRNO_NOMEM) => {
97-
// The preview1 adapter cannot handle more than 128 descriptors
98-
eprintln!("fd_renumber({fd_file3}, {}) returned NOMEM", u32::MAX)
99-
}
100-
res => res.expect("renumbering FD to `u32::MAX`"),
101-
}
94+
assert_eq!(wasip1::fd_renumber(fd_file3, 127), Err(wasip1::ERRNO_BADF));
95+
assert_eq!(
96+
wasip1::fd_renumber(fd_file3, u32::MAX),
97+
Err(wasip1::ERRNO_BADF)
98+
);
10299

103100
let fd_file4 = wasip1::path_open(
104101
dir_fd,

crates/test-programs/src/bin/preview1_stdio.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use test_programs::preview1::{STDERR_FD, STDIN_FD, STDOUT_FD};
55
unsafe fn test_stdio() {
66
for fd in &[STDIN_FD, STDOUT_FD, STDERR_FD] {
77
wasip1::fd_fdstat_get(*fd).expect("fd_fdstat_get on stdio");
8-
wasip1::fd_renumber(*fd, *fd + 100).expect("renumbering stdio");
8+
assert_eq!(wasip1::fd_renumber(*fd, *fd + 100), Err(wasip1::ERRNO_BADF));
9+
wasip1::fd_renumber(*fd, *fd).unwrap();
910
}
1011
}
1112

crates/wasi-common/src/snapshots/preview_1.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,9 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
580580
if !table.contains_key(from) {
581581
return Err(Error::badf());
582582
}
583+
if !table.contains_key(to) {
584+
return Err(Error::badf());
585+
}
583586
table.renumber(from, to)
584587
}
585588

crates/wasi-preview1-component-adapter/src/descriptors.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,13 @@ impl Descriptors {
355355

356356
// Implementation of fd_renumber
357357
pub fn renumber(&mut self, from_fd: Fd, to_fd: Fd) -> Result<(), Errno> {
358-
// First, ensure from_fd is in bounds:
359-
let _ = self.get(from_fd)?;
358+
// First, ensure to_fd/from_fd is in bounds:
359+
if let Descriptor::Closed(_) = self.get(to_fd)? {
360+
return Err(wasi::ERRNO_BADF);
361+
}
362+
if let Descriptor::Closed(_) = self.get(from_fd)? {
363+
return Err(wasi::ERRNO_BADF);
364+
}
360365
// Expand table until to_fd is in bounds as well:
361366
while self.table_len.get() as u32 <= to_fd {
362367
self.push_closed()?;

crates/wasi-preview1-component-adapter/src/lib.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2415,8 +2415,13 @@ pub unsafe extern "C" fn sock_send(
24152415
/// Shut down socket send and receive channels.
24162416
/// Note: This is similar to `shutdown` in POSIX.
24172417
#[unsafe(no_mangle)]
2418-
pub unsafe extern "C" fn sock_shutdown(_fd: Fd, _how: Sdflags) -> Errno {
2419-
unreachable!()
2418+
pub unsafe extern "C" fn sock_shutdown(fd: Fd, _how: Sdflags) -> Errno {
2419+
State::with(|state| {
2420+
state
2421+
.descriptors_mut()
2422+
.get_stream_with_error_mut(fd, wasi::ERRNO_BADF)?;
2423+
Err(wasi::ERRNO_NOTSOCK)
2424+
})
24202425
}
24212426

24222427
#[cfg(not(feature = "proxy"))]

crates/wasi/src/p1.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1468,6 +1468,7 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiP1Ctx {
14681468
if let types::Filetype::Directory = fs_filetype {
14691469
fs_rights_base &= !types::Rights::FD_SEEK;
14701470
fs_rights_base &= !types::Rights::FD_FILESTAT_SET_SIZE;
1471+
fs_rights_base &= !types::Rights::PATH_FILESTAT_SET_SIZE;
14711472
}
14721473
if !flags.contains(filesystem::DescriptorFlags::READ) {
14731474
fs_rights_base &= !types::Rights::FD_READ;
@@ -1840,10 +1841,13 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiP1Ctx {
18401841
) -> Result<(), types::Error> {
18411842
let mut st = self.transact()?;
18421843
let from = from.into();
1844+
let to = to.into();
1845+
if !st.descriptors.used.contains_key(&to) {
1846+
return Err(types::Errno::Badf.into());
1847+
}
18431848
let btree_map::Entry::Occupied(desc) = st.descriptors.used.entry(from) else {
18441849
return Err(types::Errno::Badf.into());
18451850
};
1846-
let to = to.into();
18471851
if from != to {
18481852
let desc = desc.remove();
18491853
st.descriptors.free.insert(from);

supply-chain/audits.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3635,6 +3635,12 @@ criteria = "safe-to-deploy"
36353635
delta = "3.16.0 -> 3.19.1"
36363636
notes = "Idiom and platform updates, but nothing major and nothing out of line."
36373637

3638+
[[audits.tempfile]]
3639+
who = "Alex Crichton <[email protected]>"
3640+
criteria = "safe-to-deploy"
3641+
delta = "3.20.0 -> 3.21.0"
3642+
notes = "Only minor manifest/CI changes."
3643+
36383644
[[audits.terminal_size]]
36393645
who = "Alex Crichton <[email protected]>"
36403646
criteria = "safe-to-deploy"

0 commit comments

Comments
 (0)