Files
wasmtime/tests/all/component_model/bindgen.rs
Pat Hickey 2e0bc7dab6 Wasmtime component bindgen: opt-in trappable error types (#5397)
* wip

* start trying to write a runtime test

* cut out all the more complex test cases until i get this one working

* add macro parsing for the trappable error type config

* runtime result tests works for an empty and a string error type

* debugging: macro is broken because interfaces dont have names???

* thats how you name interfaces

* record error and variant error work

* show a concrete trap type, remove debug

* delete clap annotations from wit-bindgen crate

these are not used - clap isnt even an optional dep here - but were a holdover from the old home
2022-12-14 18:44:05 +00:00

120 lines
3.0 KiB
Rust

use super::engine;
use anyhow::Result;
use wasmtime::{
component::{Component, Linker},
Store,
};
mod results;
mod no_imports {
use super::*;
wasmtime::component::bindgen!({
inline: "
world no-imports {
export foo: interface {
foo: func()
}
default export interface {
bar: func()
}
}
",
});
#[test]
fn run() -> Result<()> {
let engine = engine();
let component = Component::new(
&engine,
r#"
(component
(core module $m
(func (export ""))
)
(core instance $i (instantiate $m))
(func $f (export "bar") (canon lift (core func $i "")))
(instance $i (export "foo" (func $f)))
(export "foo" (instance $i))
)
"#,
)?;
let linker = Linker::new(&engine);
let mut store = Store::new(&engine, ());
let (no_imports, _) = NoImports::instantiate(&mut store, &component, &linker)?;
no_imports.bar(&mut store)?;
no_imports.foo().foo(&mut store)?;
Ok(())
}
}
mod one_import {
use super::*;
wasmtime::component::bindgen!({
inline: "
world one-import {
import foo: interface {
foo: func()
}
default export interface {
bar: func()
}
}
",
});
#[test]
fn run() -> Result<()> {
let engine = engine();
let component = Component::new(
&engine,
r#"
(component
(import "foo" (instance $i
(export "foo" (func))
))
(core module $m
(import "" "" (func))
(export "" (func 0))
)
(core func $f (canon lower (func $i "foo")))
(core instance $i (instantiate $m
(with "" (instance (export "" (func $f))))
))
(func $f (export "bar") (canon lift (core func $i "")))
)
"#,
)?;
#[derive(Default)]
struct MyImports {
hit: bool,
}
impl foo::Foo for MyImports {
fn foo(&mut self) -> Result<()> {
self.hit = true;
Ok(())
}
}
let mut linker = Linker::new(&engine);
foo::add_to_linker(&mut linker, |f: &mut MyImports| f)?;
let mut store = Store::new(&engine, MyImports::default());
let (one_import, _) = OneImport::instantiate(&mut store, &component, &linker)?;
one_import.bar(&mut store)?;
assert!(store.data().hit);
Ok(())
}
}