Path: blob/main/tests/all/component_model/linker.rs
1692 views
use anyhow::Result;1use wasmtime::component::types::ComponentItem;2use wasmtime::component::{Component, Linker, ResourceType};3use wasmtime::{Engine, Store};45#[test]6fn old_import_importing_new_item() -> Result<()> {7let engine = Engine::default();8let mut linker = Linker::<()>::new(&engine);910let ty = ResourceType::host::<u32>();11linker.root().resource("a:b/[email protected]", ty, |_, _| Ok(()))?;1213let component = Component::new(14&engine,15r#"(component16(import "a:b/[email protected]" (type $t (sub resource)))17(export "a" (type $t))18)"#,19)?;20let mut store = Store::new(&engine, ());21let i = linker.instantiate(&mut store, &component)?;2223assert_eq!(i.get_resource(&mut store, "a"), Some(ty));2425Ok(())26}2728#[test]29fn new_import_importing_old_item() -> Result<()> {30let engine = Engine::default();31let mut linker = Linker::<()>::new(&engine);3233let ty = ResourceType::host::<u32>();34linker.root().resource("a:b/[email protected]", ty, |_, _| Ok(()))?;3536let component = Component::new(37&engine,38r#"(component39(import "a:b/[email protected]" (type $t (sub resource)))40(export "a" (type $t))41)"#,42)?;43let mut store = Store::new(&engine, ());44let i = linker.instantiate(&mut store, &component)?;4546assert_eq!(i.get_resource(&mut store, "a"), Some(ty));4748Ok(())49}5051#[test]52fn import_both_old_and_new() -> Result<()> {53let engine = Engine::default();54let mut linker = Linker::<()>::new(&engine);5556let t1 = ResourceType::host::<u32>();57let t2 = ResourceType::host::<i32>();58linker.root().resource("a:b/[email protected]", t1, |_, _| Ok(()))?;59linker.root().resource("a:b/[email protected]", t2, |_, _| Ok(()))?;6061let component = Component::new(62&engine,63r#"(component64(import "a:b/[email protected]" (type $t1 (sub resource)))65(import "a:b/[email protected]" (type $t2 (sub resource)))66(export "t1" (type $t1))67(export "t2" (type $t2))68)"#,69)?;70let mut store = Store::new(&engine, ());71let i = linker.instantiate(&mut store, &component)?;7273assert_eq!(i.get_resource(&mut store, "t1"), Some(t1));74assert_eq!(i.get_resource(&mut store, "t2"), Some(t2));7576Ok(())77}7879#[test]80fn missing_import_selects_max() -> Result<()> {81let engine = Engine::default();82let mut linker = Linker::<()>::new(&engine);8384let t1 = ResourceType::host::<u32>();85let t2 = ResourceType::host::<i32>();86linker.root().resource("a:b/[email protected]", t1, |_, _| Ok(()))?;87linker.root().resource("a:b/[email protected]", t2, |_, _| Ok(()))?;8889let component = Component::new(90&engine,91r#"(component92(import "a:b/[email protected]" (type $t1 (sub resource)))93(import "a:b/[email protected]" (type $t2 (sub resource)))94(export "t1" (type $t1))95(export "t2" (type $t2))96)"#,97)?;98let mut store = Store::new(&engine, ());99let i = linker.instantiate(&mut store, &component)?;100101assert_eq!(i.get_resource(&mut store, "t1"), Some(t2));102assert_eq!(i.get_resource(&mut store, "t2"), Some(t2));103104Ok(())105}106107#[test]108#[cfg_attr(miri, ignore)]109fn linker_substituting_types_issue_8003() -> Result<()> {110let engine = Engine::default();111let linker = Linker::<()>::new(&engine);112let component = Component::new(113&engine,114r#"115(component116(component $foo117(type $_myres (resource (rep i32)))118(export $myres "myres" (type $_myres))119120(core module $m121(func (export "make") (result i32) unreachable)122)123(core instance $m (instantiate $m))124125(func (export "make") (result (own $myres))126(canon lift (core func $m "make")))127)128(instance $foo (instantiate $foo))129(export "foo" (instance $foo))130)131"#,132)?;133134let component_ty = linker.substituted_component_type(&component)?;135let exports = component_ty.exports(&engine);136for (_name, item) in exports {137match item {138ComponentItem::ComponentInstance(instance) => {139for _ in instance.exports(&engine) {140// ..141}142}143_ => {}144}145}146Ok(())147}148149#[test]150fn linker_defines_unknown_imports_as_traps() -> Result<()> {151let engine = Engine::default();152let mut linker = Linker::<()>::new(&engine);153154let component = Component::new(155&engine,156r#"(component157(import "foo" (func))158(import "bar" (instance (export "baz" (func))))159(import "qux" (type (sub resource)))160)"#,161)?;162linker.define_unknown_imports_as_traps(&component)?;163let mut store = Store::new(&engine, ());164let _ = linker.instantiate(&mut store, &component)?;165166Ok(())167}168169#[test]170fn linker_fails_to_define_unknown_core_module_imports_as_traps() -> Result<()> {171let engine = Engine::default();172let mut linker = Linker::<()>::new(&engine);173174let component = Component::new(175&engine,176r#"(component177(import "foo" (core module))178)"#,179)?;180assert!(linker.define_unknown_imports_as_traps(&component).is_err());181182Ok(())183}184185186