|
|
|
use anyhow::Result;
|
|
|
|
use wasmtime::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn wrong_import_numbers() -> Result<()> {
|
|
|
|
let mut store = Store::<()>::default();
|
|
|
|
let module = Module::new(store.engine(), r#"(module (import "" "" (func)))"#)?;
|
|
|
|
|
|
|
|
assert!(Instance::new(&mut store, &module, &[]).is_err());
|
|
|
|
let func = Func::wrap(&mut store, || {});
|
|
|
|
assert!(Instance::new(&mut store, &module, &[func.clone().into(), func.into()]).is_err());
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn initializes_linear_memory() -> Result<()> {
|
|
|
|
// Test for https://github.com/bytecodealliance/wasmtime/issues/2784
|
|
|
|
let wat = r#"
|
|
|
|
(module
|
|
|
|
(memory (export "memory") 2)
|
|
|
|
(data (i32.const 0) "Hello World!")
|
|
|
|
)"#;
|
|
|
|
let module = Module::new(&Engine::default(), wat)?;
|
|
|
|
|
|
|
|
let mut store = Store::new(module.engine(), ());
|
|
|
|
let instance = Instance::new(&mut store, &module, &[])?;
|
|
|
|
let memory = instance.get_memory(&mut store, "memory").unwrap();
|
|
|
|
|
|
|
|
let mut bytes = [0; 12];
|
|
|
|
memory.read(&store, 0, &mut bytes)?;
|
|
|
|
assert_eq!(bytes, "Hello World!".as_bytes());
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn initializes_linear_memory_paged() -> Result<()> {
|
|
|
|
let wat = r#"
|
|
|
|
(module
|
|
|
|
(memory (export "memory") 2)
|
|
|
|
(data (i32.const 0) "Hello World!")
|
|
|
|
)"#;
|
|
|
|
|
|
|
|
let mut config = Config::new();
|
|
|
|
config.paged_memory_initialization(true);
|
|
|
|
|
|
|
|
let module = Module::new(&Engine::new(&config)?, wat)?;
|
|
|
|
|
|
|
|
let mut store = Store::new(module.engine(), ());
|
|
|
|
let instance = Instance::new(&mut store, &module, &[])?;
|
|
|
|
let memory = instance.get_memory(&mut store, "memory").unwrap();
|
|
|
|
|
|
|
|
let mut bytes = [0; 12];
|
|
|
|
memory.read(&store, 0, &mut bytes)?;
|
|
|
|
assert_eq!(bytes, "Hello World!".as_bytes());
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn linear_memory_limits() -> Result<()> {
|
|
|
|
// this test will allocate 4GB of virtual memory space, and may not work in
|
|
|
|
// situations like CI QEMU emulation where it triggers SIGKILL.
|
|
|
|
if std::env::var("WASMTIME_TEST_NO_HOG_MEMORY").is_ok() {
|
|
|
|
return Ok(());
|
|
|
|
}
|
|
|
|
test(&Engine::default())?;
|
|
|
|
test(&Engine::new(Config::new().allocation_strategy(
|
|
|
|
InstanceAllocationStrategy::Pooling {
|
|
|
|
strategy: PoolingAllocationStrategy::NextAvailable,
|
|
|
|
module_limits: ModuleLimits {
|
|
|
|
memory_pages: 65536,
|
|
|
|
..ModuleLimits::default()
|
|
|
|
},
|
|
|
|
instance_limits: InstanceLimits::default(),
|
|
|
|
},
|
|
|
|
))?)?;
|
|
|
|
return Ok(());
|
|
|
|
|
|
|
|
fn test(engine: &Engine) -> Result<()> {
|
|
|
|
let wat = r#"
|
|
|
|
(module
|
|
|
|
(memory 65534)
|
|
|
|
|
|
|
|
(func (export "grow") (result i32)
|
|
|
|
i32.const 1
|
|
|
|
memory.grow)
|
|
|
|
(func (export "size") (result i32)
|
|
|
|
memory.size)
|
|
|
|
)
|
|
|
|
"#;
|
|
|
|
let module = Module::new(engine, wat)?;
|
|
|
|
|
|
|
|
let mut store = Store::new(engine, ());
|
|
|
|
let instance = Instance::new(&mut store, &module, &[])?;
|
|
|
|
let size = instance.get_typed_func::<(), i32, _>(&mut store, "size")?;
|
|
|
|
let grow = instance.get_typed_func::<(), i32, _>(&mut store, "grow")?;
|
|
|
|
|
|
|
|
assert_eq!(size.call(&mut store, ())?, 65534);
|
|
|
|
assert_eq!(grow.call(&mut store, ())?, 65534);
|
|
|
|
assert_eq!(size.call(&mut store, ())?, 65535);
|
|
|
|
assert_eq!(grow.call(&mut store, ())?, 65535);
|
|
|
|
assert_eq!(size.call(&mut store, ())?, 65536);
|
|
|
|
assert_eq!(grow.call(&mut store, ())?, -1);
|
|
|
|
assert_eq!(size.call(&mut store, ())?, 65536);
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|