Run wast tests with both instance allocators.
This commit adds a "pooling" variant to the wast tests that uses the pooling instance allocation strategy. This should help with the test coverage of the pooling instance allocator.
This commit is contained in:
1
.github/workflows/main.yml
vendored
1
.github/workflows/main.yml
vendored
@@ -305,6 +305,7 @@ jobs:
|
|||||||
- run: |
|
- run: |
|
||||||
cargo test --features uffd -p wasmtime-runtime instance::allocator::pooling
|
cargo test --features uffd -p wasmtime-runtime instance::allocator::pooling
|
||||||
cargo test --features uffd -p wasmtime-cli pooling_allocator
|
cargo test --features uffd -p wasmtime-cli pooling_allocator
|
||||||
|
cargo test --features uffd -p wasmtime-cli wast::Cranelift
|
||||||
if: matrix.os == 'ubuntu-latest'
|
if: matrix.os == 'ubuntu-latest'
|
||||||
env:
|
env:
|
||||||
RUST_BACKTRACE: 1
|
RUST_BACKTRACE: 1
|
||||||
|
|||||||
20
build.rs
20
build.rs
@@ -111,7 +111,8 @@ fn test_directory(
|
|||||||
|
|
||||||
let testsuite = &extract_name(path);
|
let testsuite = &extract_name(path);
|
||||||
for entry in dir_entries.iter() {
|
for entry in dir_entries.iter() {
|
||||||
write_testsuite_tests(out, entry, testsuite, strategy)?;
|
write_testsuite_tests(out, entry, testsuite, strategy, false)?;
|
||||||
|
write_testsuite_tests(out, entry, testsuite, strategy, true)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(dir_entries.len())
|
Ok(dir_entries.len())
|
||||||
@@ -148,6 +149,7 @@ fn write_testsuite_tests(
|
|||||||
path: impl AsRef<Path>,
|
path: impl AsRef<Path>,
|
||||||
testsuite: &str,
|
testsuite: &str,
|
||||||
strategy: &str,
|
strategy: &str,
|
||||||
|
pooling: bool,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let path = path.as_ref();
|
let path = path.as_ref();
|
||||||
let testname = extract_name(path);
|
let testname = extract_name(path);
|
||||||
@@ -160,14 +162,24 @@ fn write_testsuite_tests(
|
|||||||
)?;
|
)?;
|
||||||
} else if ignore(testsuite, &testname, strategy) {
|
} else if ignore(testsuite, &testname, strategy) {
|
||||||
writeln!(out, "#[ignore]")?;
|
writeln!(out, "#[ignore]")?;
|
||||||
|
} else if pooling {
|
||||||
|
// Ignore on aarch64 due to using QEMU for running tests (limited memory)
|
||||||
|
writeln!(out, r#"#[cfg_attr(target_arch = "aarch64", ignore)]"#)?;
|
||||||
}
|
}
|
||||||
writeln!(out, "fn r#{}() {{", &testname)?;
|
|
||||||
|
writeln!(
|
||||||
|
out,
|
||||||
|
"fn r#{}{}() {{",
|
||||||
|
&testname,
|
||||||
|
if pooling { "_pooling" } else { "" }
|
||||||
|
)?;
|
||||||
writeln!(out, " let _ = env_logger::try_init();")?;
|
writeln!(out, " let _ = env_logger::try_init();")?;
|
||||||
writeln!(
|
writeln!(
|
||||||
out,
|
out,
|
||||||
" crate::wast::run_wast(r#\"{}\"#, crate::wast::Strategy::{}).unwrap();",
|
" crate::wast::run_wast(r#\"{}\"#, crate::wast::Strategy::{}, {}).unwrap();",
|
||||||
path.display(),
|
path.display(),
|
||||||
strategy
|
strategy,
|
||||||
|
pooling
|
||||||
)?;
|
)?;
|
||||||
writeln!(out, "}}")?;
|
writeln!(out, "}}")?;
|
||||||
writeln!(out)?;
|
writeln!(out)?;
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use wasmtime::{Config, Engine, Store, Strategy};
|
use wasmtime::{
|
||||||
|
Config, Engine, InstanceAllocationStrategy, InstanceLimits, ModuleLimits,
|
||||||
|
PoolingAllocationStrategy, Store, Strategy,
|
||||||
|
};
|
||||||
use wasmtime_wast::WastContext;
|
use wasmtime_wast::WastContext;
|
||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/wast_testsuite_tests.rs"));
|
include!(concat!(env!("OUT_DIR"), "/wast_testsuite_tests.rs"));
|
||||||
@@ -7,7 +10,7 @@ include!(concat!(env!("OUT_DIR"), "/wast_testsuite_tests.rs"));
|
|||||||
// Each of the tests included from `wast_testsuite_tests` will call this
|
// Each of the tests included from `wast_testsuite_tests` will call this
|
||||||
// function which actually executes the `wast` test suite given the `strategy`
|
// function which actually executes the `wast` test suite given the `strategy`
|
||||||
// to compile it.
|
// to compile it.
|
||||||
fn run_wast(wast: &str, strategy: Strategy) -> anyhow::Result<()> {
|
fn run_wast(wast: &str, strategy: Strategy, pooling: bool) -> anyhow::Result<()> {
|
||||||
let wast = Path::new(wast);
|
let wast = Path::new(wast);
|
||||||
|
|
||||||
let simd = wast.iter().any(|s| s == "simd");
|
let simd = wast.iter().any(|s| s == "simd");
|
||||||
@@ -44,6 +47,30 @@ fn run_wast(wast: &str, strategy: Strategy) -> anyhow::Result<()> {
|
|||||||
cfg.static_memory_maximum_size(0);
|
cfg.static_memory_maximum_size(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if pooling {
|
||||||
|
// The limits here are crafted such that the wast tests should pass.
|
||||||
|
// However, these limits may become insufficient in the future as the wast tests change.
|
||||||
|
// If a wast test fails because of a limit being "exceeded" or if memory/table
|
||||||
|
// fails to grow, the values here will need to be adjusted.
|
||||||
|
cfg.with_allocation_strategy(InstanceAllocationStrategy::Pooling {
|
||||||
|
strategy: PoolingAllocationStrategy::NextAvailable,
|
||||||
|
module_limits: ModuleLimits {
|
||||||
|
imported_memories: 2,
|
||||||
|
imported_tables: 2,
|
||||||
|
imported_globals: 11,
|
||||||
|
memories: 2,
|
||||||
|
tables: 4,
|
||||||
|
globals: 11,
|
||||||
|
memory_pages: 805,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
instance_limits: InstanceLimits {
|
||||||
|
count: 450,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
|
||||||
let store = Store::new(&Engine::new(&cfg));
|
let store = Store::new(&Engine::new(&cfg));
|
||||||
let mut wast_context = WastContext::new(store);
|
let mut wast_context = WastContext::new(store);
|
||||||
wast_context.register_spectest()?;
|
wast_context.register_spectest()?;
|
||||||
|
|||||||
Reference in New Issue
Block a user