Path: blob/main/crates/wizer/tests/all/preloads.rs
3073 views
use wasmtime::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 engine = wasmtime::Engine::default();24let mut store = wasmtime::Store::new(&engine, ());25let mod1 = Module::new(store.engine(), PRELOAD1)?;26let mod2 = Module::new(store.engine(), PRELOAD2)?;2728let processed = Wizer::new()29.run(&mut store, &wasm, async |store, module| {30let i1 = Instance::new_async(&mut *store, &mod1, &[]).await?;31let i2 = Instance::new_async(&mut *store, &mod2, &[]).await?;32let mut linker = Linker::new(store.engine());33linker.instance(&mut *store, "mod1", i1)?;34linker.instance(&mut *store, "mod2", i2)?;35linker.instantiate_async(store, module).await36})37.await?;3839let testmod = wasmtime::Module::new(&engine, &processed[..])?;4041let mod1_inst = wasmtime::Instance::new_async(&mut store, &mod1, &[]).await?;42let mod2_inst = wasmtime::Instance::new_async(&mut store, &mod2, &[]).await?;43let mut linker = wasmtime::Linker::new(&engine);44linker.instance(&mut store, "mod1", mod1_inst)?;45linker.instance(&mut store, "mod2", mod2_inst)?;4647let inst = linker.instantiate_async(&mut store, &testmod).await?;48let run = inst49.get_func(&mut store, "run")50.ok_or_else(|| wasmtime::format_err!("no `run` function on test module"))?;51let mut returned = vec![wasmtime::Val::I32(0)];52run.call_async(&mut store, args, &mut returned).await?;53Ok(returned[0])54}5556#[tokio::test]57async fn test_preloads() {58const WAT: &'static str = r#"59(module60(import "mod1" "f" (func $mod1f (param i32) (result i32)))61(import "mod2" "f" (func $mod2f (param i32) (result i32)))62(global $g1 (mut i32) (i32.const 0))63(global $g2 (mut i32) (i32.const 0))64(func (export "wizer-initialize")65i32.const 10066call $mod1f67global.set $g168i32.const 10069call $mod2f70global.set $g2)71(func (export "run") (param i32 i32) (result i32)72local.get 073call $mod1f74local.get 175call $mod2f76i32.add77global.get $g178global.get $g279i32.add80i32.add))81"#;8283let result = run_with_preloads(&[wasmtime::Val::I32(200), wasmtime::Val::I32(201)], WAT)84.await85.unwrap();86assert!(matches!(result, wasmtime::Val::I32(607)));87}888990