Files
wasmtime/tests/all/component_model/aot.rs
Alex Crichton b305f251fb Update the wasm-tools family of crates (#5310)
Most of the changes here are the updates to the component model which
includes optional URL fields in imports/exports.
2022-11-21 21:37:16 +00:00

100 lines
3.2 KiB
Rust

use anyhow::Result;
use wasmtime::component::{Component, Linker};
use wasmtime::{Module, Store};
#[test]
fn module_component_mismatch() -> Result<()> {
let engine = super::engine();
let module = Module::new(&engine, "(module)")?.serialize()?;
let component = Component::new(&engine, "(component)")?.serialize()?;
unsafe {
assert!(Module::deserialize(&engine, &component).is_err());
assert!(Component::deserialize(&engine, &module).is_err());
}
Ok(())
}
#[test]
fn bare_bones() -> Result<()> {
let engine = super::engine();
let component = Component::new(&engine, "(component)")?.serialize()?;
assert_eq!(component, engine.precompile_component(b"(component)")?);
let component = unsafe { Component::deserialize(&engine, &component)? };
let mut store = Store::new(&engine, ());
Linker::new(&engine).instantiate(&mut store, &component)?;
Ok(())
}
#[test]
fn mildly_more_interesting() -> Result<()> {
let engine = super::engine();
let component = Component::new(
&engine,
r#"
(component
(core module $a
(func (export "a") (result i32)
i32.const 100)
)
(core instance $a (instantiate $a))
(core module $b
(import "a" "a" (func $import (result i32)))
(func (export "a") (result i32)
call $import
i32.const 3
i32.add)
)
(core instance $b (instantiate $b (with "a" (instance $a))))
(func (export "a") (result u32)
(canon lift (core func $b "a"))
)
)
"#,
)?
.serialize()?;
let component = unsafe { Component::deserialize(&engine, &component)? };
let mut store = Store::new(&engine, ());
let instance = Linker::new(&engine).instantiate(&mut store, &component)?;
let func = instance.get_typed_func::<(), (u32,), _>(&mut store, "a")?;
assert_eq!(func.call(&mut store, ())?, (103,));
Ok(())
}
#[test]
fn deserialize_from_serialized() -> Result<()> {
let engine = super::engine();
let buffer1 = Component::new(&engine, "(component (core module))")?.serialize()?;
let buffer2 = unsafe { Component::deserialize(&engine, &buffer1)?.serialize()? };
assert!(buffer1 == buffer2);
Ok(())
}
// This specifically tests the current behavior that it's an error, but this can
// be made to work if necessary in the future. Currently the implementation of
// `serialize` is not conducive to easily implementing this feature and
// otherwise it's not seen as too important to implement.
#[test]
fn cannot_serialize_exported_module() -> Result<()> {
let engine = super::engine();
let component = Component::new(
&engine,
r#"(component
(core module $m)
(export "a" (core module $m))
)"#,
)?;
let mut store = Store::new(&engine, ());
let instance = Linker::new(&engine).instantiate(&mut store, &component)?;
let module = instance.get_module(&mut store, "a").unwrap();
assert!(module.serialize().is_err());
Ok(())
}