Path: blob/main/tests/all/component_model/async_dynamic.rs
3068 views
use wasmtime::component::{Component, FutureAny, FutureReader, Linker, StreamAny, StreamReader};1use wasmtime::{Config, Engine, Result, Store};23#[test]4fn simple_type_conversions() -> Result<()> {5let mut config = Config::new();6config.wasm_component_model_async(true);7let engine = Engine::new(&config)?;8let mut store = Store::new(&engine, ());910let f = FutureReader::new(&mut store, async { wasmtime::error::Ok(10_u32) });11let f = f.try_into_future_any(&mut store).unwrap();12assert!(f.clone().try_into_future_reader::<()>().is_err());13assert!(f.clone().try_into_future_reader::<u64>().is_err());14let f = f.try_into_future_reader::<u32>().unwrap();15f.try_into_future_any(&mut store).unwrap().close(&mut store);1617let s = StreamReader::new(&mut store, vec![10_u32]);18let s = s.try_into_stream_any(&mut store).unwrap();19assert!(s.clone().try_into_stream_reader::<()>().is_err());20assert!(s.clone().try_into_stream_reader::<u64>().is_err());21let s = s.try_into_stream_reader::<u32>().unwrap();22s.try_into_stream_any(&mut store).unwrap().close(&mut store);2324Ok(())25}2627#[test]28#[cfg_attr(miri, ignore)]29fn simple_type_assertions() -> Result<()> {30let mut config = Config::new();31config.wasm_component_model_async(true);32let engine = Engine::new(&config)?;33let mut store = Store::new(&engine, ());3435let component = Component::new(36&engine,37r#"38(component39(type $f (future u32))40(type $s (stream u32))41(core func $mk-f (canon future.new $f))42(core func $mk-s (canon stream.new $s))4344(core module $m45(import "" "mk-f" (func $mk-f (result i64)))46(import "" "mk-s" (func $mk-s (result i64)))4748(func (export "x") (param i32) (result i32) local.get 0)4950(func (export "mk-f") (result i32)51(i32.wrap_i64 (call $mk-f)))52(func (export "mk-s") (result i32)53(i32.wrap_i64 (call $mk-s)))54)55(core instance $i (instantiate $m56(with "" (instance57(export "mk-f" (func $mk-f))58(export "mk-s" (func $mk-s))59))60))61(func (export "f") (param "f" $f) (result $f)62(canon lift (core func $i "x")))63(func (export "s") (param "s" $s) (result $s)64(canon lift (core func $i "x")))65(func (export "mk-f") (result $f)66(canon lift (core func $i "mk-f")))67(func (export "mk-s") (result $s)68(canon lift (core func $i "mk-s")))69)70"#,71)?;7273let instance = Linker::new(&engine).instantiate(&mut store, &component)?;7475let f_t_t =76instance.get_typed_func::<(FutureReader<u32>,), (FutureReader<u32>,)>(&mut store, "f")?;77let f_t_a = instance.get_typed_func::<(FutureReader<u32>,), (FutureAny,)>(&mut store, "f")?;78let f_a_t = instance.get_typed_func::<(FutureAny,), (FutureReader<u32>,)>(&mut store, "f")?;79let f_a_a = instance.get_typed_func::<(FutureAny,), (FutureAny,)>(&mut store, "f")?;8081let s_t_t =82instance.get_typed_func::<(StreamReader<u32>,), (StreamReader<u32>,)>(&mut store, "s")?;83let s_t_a = instance.get_typed_func::<(StreamReader<u32>,), (StreamAny,)>(&mut store, "s")?;84let s_a_t = instance.get_typed_func::<(StreamAny,), (StreamReader<u32>,)>(&mut store, "s")?;85let s_a_a = instance.get_typed_func::<(StreamAny,), (StreamAny,)>(&mut store, "s")?;8687let mk_f_t = instance.get_typed_func::<(), (FutureReader<u32>,)>(&mut store, "mk-f")?;88let mk_f_a = instance.get_typed_func::<(), (FutureAny,)>(&mut store, "mk-f")?;89let mk_s_t = instance.get_typed_func::<(), (StreamReader<u32>,)>(&mut store, "mk-s")?;90let mk_s_a = instance.get_typed_func::<(), (StreamAny,)>(&mut store, "mk-s")?;9192assert!(instance.get_typed_func::<(), ()>(&mut store, "f").is_err());93assert!(94instance95.get_typed_func::<(u32,), (FutureReader<u32>,)>(&mut store, "f")96.is_err()97);98assert!(99instance100.get_typed_func::<(FutureReader<u32>,), (u32,)>(&mut store, "f")101.is_err()102);103assert!(104instance105.get_typed_func::<(FutureReader<()>,), (FutureReader<u32>,)>(&mut store, "f")106.is_err()107);108assert!(109instance110.get_typed_func::<(FutureReader<u64>,), (FutureReader<u32>,)>(&mut store, "f")111.is_err()112);113114assert!(instance.get_typed_func::<(), ()>(&mut store, "s").is_err());115assert!(116instance117.get_typed_func::<(u32,), (StreamReader<u32>,)>(&mut store, "s")118.is_err()119);120assert!(121instance122.get_typed_func::<(StreamReader<u32>,), (u32,)>(&mut store, "s")123.is_err()124);125assert!(126instance127.get_typed_func::<(StreamReader<()>,), (StreamReader<u32>,)>(&mut store, "s")128.is_err()129);130assert!(131instance132.get_typed_func::<(StreamReader<u64>,), (StreamReader<u32>,)>(&mut store, "s")133.is_err()134);135136let roundtrip = |store: &mut Store<()>, f: FutureReader<u32>| -> Result<()> {137let (f,) = f_t_t.call(&mut *store, (f,))?;138let (f,) = f_t_a.call(&mut *store, (f,))?;139let (f,) = f_a_a.call(&mut *store, (f,))?;140let (mut f,) = f_a_t.call(&mut *store, (f,))?;141f.close(&mut *store);142Ok(())143};144145let f = FutureReader::new(&mut store, async { wasmtime::error::Ok(10_u32) });146roundtrip(&mut store, f)?;147148let (f,) = mk_f_t.call(&mut store, ())?;149roundtrip(&mut store, f)?;150151let (f,) = mk_f_a.call(&mut store, ())?;152let f = f.try_into_future_reader::<u32>()?;153roundtrip(&mut store, f)?;154155let roundtrip = |store: &mut Store<()>, s: StreamReader<u32>| -> Result<()> {156let (s,) = s_t_t.call(&mut *store, (s,))?;157let (s,) = s_t_a.call(&mut *store, (s,))?;158let (s,) = s_a_a.call(&mut *store, (s,))?;159let (mut s,) = s_a_t.call(&mut *store, (s,))?;160s.close(&mut *store);161Ok(())162};163164let s = StreamReader::new(&mut store, vec![10_u32]);165roundtrip(&mut store, s)?;166167let (s,) = mk_s_t.call(&mut store, ())?;168roundtrip(&mut store, s)?;169170let (s,) = mk_s_a.call(&mut store, ())?;171let s = s.try_into_stream_reader::<u32>()?;172roundtrip(&mut store, s)?;173174Ok(())175}176177178