diff --git a/crates/test-programs/wasi-tests/Cargo.lock b/crates/test-programs/wasi-tests/Cargo.lock index 4c59593f01..dc4aa117a9 100644 --- a/crates/test-programs/wasi-tests/Cargo.lock +++ b/crates/test-programs/wasi-tests/Cargo.lock @@ -1,5 +1,11 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.72" @@ -22,6 +28,7 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" name = "wasi-tests" version = "0.19.0" dependencies = [ + "lazy_static", "libc", "more-asserts", "wasi", diff --git a/crates/test-programs/wasi-tests/Cargo.toml b/crates/test-programs/wasi-tests/Cargo.toml index d5fc2b3341..c120f463bf 100644 --- a/crates/test-programs/wasi-tests/Cargo.toml +++ b/crates/test-programs/wasi-tests/Cargo.toml @@ -10,6 +10,7 @@ publish = false libc = "0.2.65" wasi = "0.10.2" more-asserts = "0.2.1" +lazy_static = "1.4" # This crate is built with the wasm32-wasi target, so it's separate # from the main Wasmtime build, so use this directive to exclude it diff --git a/crates/test-programs/wasi-tests/src/config.rs b/crates/test-programs/wasi-tests/src/config.rs new file mode 100644 index 0000000000..ee8132eaaf --- /dev/null +++ b/crates/test-programs/wasi-tests/src/config.rs @@ -0,0 +1,48 @@ +pub struct TestConfig { + errno_mode: ErrnoMode, + no_dangling_symlinks: bool, + no_fd_allocate: bool, +} + +enum ErrnoMode { + Linux, + Windows, + Permissive, +} + +impl TestConfig { + pub fn from_env() -> Self { + let errno_mode = if std::env::var("ERRNO_MODE_LINUX").is_ok() { + ErrnoMode::Linux + } else if std::env::var("ERRNO_MODE_WINDOWS").is_ok() { + ErrnoMode::Windows + } else { + ErrnoMode::Permissive + }; + let no_dangling_symlinks = std::env::var("NO_DANGLING_SYMLINKS").is_ok(); + let no_fd_allocate = std::env::var("NO_FD_ALLOCATE").is_ok(); + TestConfig { + errno_mode, + no_dangling_symlinks, + no_fd_allocate, + } + } + pub fn errno_expect_linux(&self) -> bool { + match self.errno_mode { + ErrnoMode::Linux => true, + _ => false, + } + } + pub fn errno_expect_windows(&self) -> bool { + match self.errno_mode { + ErrnoMode::Windows => true, + _ => false, + } + } + pub fn support_dangling_symlinks(&self) -> bool { + !self.no_dangling_symlinks + } + pub fn support_fd_allocate(&self) -> bool { + !self.no_fd_allocate + } +} diff --git a/crates/test-programs/wasi-tests/src/lib.rs b/crates/test-programs/wasi-tests/src/lib.rs index 7ecc77b33d..46d38f8cba 100644 --- a/crates/test-programs/wasi-tests/src/lib.rs +++ b/crates/test-programs/wasi-tests/src/lib.rs @@ -1,4 +1,9 @@ use more_asserts::assert_gt; +pub mod config; + +lazy_static::lazy_static! { + pub static ref TESTCONFIG: config::TestConfig = config::TestConfig::from_env(); +} // The `wasi` crate version 0.9.0 and beyond, doesn't // seem to define these constants, so we do it ourselves. @@ -69,7 +74,7 @@ macro_rules! assert_errno { }; ($s:expr, windows => $i:expr, $( $rest:expr ),+) => { let e = $s; - if std::env::var("ERRNO_EXPECT_WINDOWS").is_ok() { + if $crate::TESTCONFIG.errno_expect_windows() { assert_errno!(e, $i); } else { assert_errno!(e, $($rest),+, $i); @@ -77,7 +82,7 @@ macro_rules! assert_errno { }; ($s:expr, linux => $i:expr, $( $rest:expr ),+) => { let e = $s; - if std::env::var("ERRNO_EXPECT_LINUX").is_ok() { + if $crate::TESTCONFIG.errno_expect_linux() { assert_errno!(e, $i); } else { assert_errno!(e, $($rest),+, $i);