Path: blob/main/crates/wizer/tests/all/preloads.rs
2459 views
use anyhow::Result;1use wasmtime::{Instance, Linker, Module};2use wasmtime_wizer::Wizer;3use wat::parse_str as wat_to_wasm;45const PRELOAD1: &'static str = r#"6(module7(func (export "f") (param i32) (result i32)8local.get 09i32.const 110i32.add))11"#;1213const PRELOAD2: &'static str = r#"14(module15(func (export "f") (param i32) (result i32)16local.get 017i32.const 218i32.add))19"#;2021async fn run_with_preloads(args: &[wasmtime::Val], wat: &str) -> Result<wasmtime::Val> {22let wasm = wat_to_wasm(wat)?;23let mut config = wasmtime::Config::new();24config.async_support(true);25let engine = wasmtime::Engine::new(&config)?;26let mut store = wasmtime::Store::new(&engine, ());27let mod1 = Module::new(store.engine(), PRELOAD1)?;28let mod2 = Module::new(store.engine(), PRELOAD2)?;2930let processed = Wizer::new()31.run(&mut store, &wasm, async |store, module| {32let i1 = Instance::new_async(&mut *store, &mod1, &[]).await?;33let i2 = Instance::new_async(&mut *store, &mod2, &[]).await?;34let mut linker = Linker::new(store.engine());35linker.instance(&mut *store, "mod1", i1)?;36linker.instance(&mut *store, "mod2", i2)?;37linker.instantiate_async(store, module).await38})39.await?;4041let testmod = wasmtime::Module::new(&engine, &processed[..])?;4243let mod1_inst = wasmtime::Instance::new_async(&mut store, &mod1, &[]).await?;44let mod2_inst = wasmtime::Instance::new_async(&mut store, &mod2, &[]).await?;45let mut linker = wasmtime::Linker::new(&engine);46linker.instance(&mut store, "mod1", mod1_inst)?;47linker.instance(&mut store, "mod2", mod2_inst)?;4849let inst = linker.instantiate_async(&mut store, &testmod).await?;50let run = inst51.get_func(&mut store, "run")52.ok_or_else(|| anyhow::anyhow!("no `run` function on test module"))?;53let mut returned = vec![wasmtime::Val::I32(0)];54run.call_async(&mut store, args, &mut returned).await?;55Ok(returned[0])56}5758#[tokio::test]59async fn test_preloads() {60const WAT: &'static str = r#"61(module62(import "mod1" "f" (func $mod1f (param i32) (result i32)))63(import "mod2" "f" (func $mod2f (param i32) (result i32)))64(global $g1 (mut i32) (i32.const 0))65(global $g2 (mut i32) (i32.const 0))66(func (export "wizer-initialize")67i32.const 10068call $mod1f69global.set $g170i32.const 10071call $mod2f72global.set $g2)73(func (export "run") (param i32 i32) (result i32)74local.get 075call $mod1f76local.get 177call $mod2f78i32.add79global.get $g180global.get $g281i32.add82i32.add))83"#;8485let result = run_with_preloads(&[wasmtime::Val::I32(200), wasmtime::Val::I32(201)], WAT)86.await87.unwrap();88assert!(matches!(result, wasmtime::Val::I32(607)));89}909192