Path: blob/main/tests/all/component_model/async_dynamic.rs
2450 views
use wasmtime::component::{Component, FutureAny, FutureReader, Linker, StreamAny, StreamReader};1use wasmtime::{Config, Engine, Result, Store};23#[test]4fn simple_type_conversions() {5let engine = Engine::default();6let mut store = Store::new(&engine, ());78let f = FutureReader::new(&mut store, async { anyhow::Ok(10_u32) });9let f = f.try_into_future_any(&mut store).unwrap();10assert!(f.clone().try_into_future_reader::<()>().is_err());11assert!(f.clone().try_into_future_reader::<u64>().is_err());12let f = f.try_into_future_reader::<u32>().unwrap();13f.try_into_future_any(&mut store).unwrap().close(&mut store);1415let s = StreamReader::new(&mut store, vec![10_u32]);16let s = s.try_into_stream_any(&mut store).unwrap();17assert!(s.clone().try_into_stream_reader::<()>().is_err());18assert!(s.clone().try_into_stream_reader::<u64>().is_err());19let s = s.try_into_stream_reader::<u32>().unwrap();20s.try_into_stream_any(&mut store).unwrap().close(&mut store);21}2223#[test]24#[cfg_attr(miri, ignore)]25fn simple_type_assertions() -> Result<()> {26let mut config = Config::new();27config.wasm_component_model_async(true);28let engine = Engine::new(&config)?;29let mut store = Store::new(&engine, ());3031let component = Component::new(32&engine,33r#"34(component35(type $f (future u32))36(type $s (stream u32))37(core func $mk-f (canon future.new $f))38(core func $mk-s (canon stream.new $s))3940(core module $m41(import "" "mk-f" (func $mk-f (result i64)))42(import "" "mk-s" (func $mk-s (result i64)))4344(func (export "x") (param i32) (result i32) local.get 0)4546(func (export "mk-f") (result i32)47(i32.wrap_i64 (call $mk-f)))48(func (export "mk-s") (result i32)49(i32.wrap_i64 (call $mk-s)))50)51(core instance $i (instantiate $m52(with "" (instance53(export "mk-f" (func $mk-f))54(export "mk-s" (func $mk-s))55))56))57(func (export "f") (param "f" $f) (result $f)58(canon lift (core func $i "x")))59(func (export "s") (param "s" $s) (result $s)60(canon lift (core func $i "x")))61(func (export "mk-f") (result $f)62(canon lift (core func $i "mk-f")))63(func (export "mk-s") (result $s)64(canon lift (core func $i "mk-s")))65)66"#,67)?;6869let instance = Linker::new(&engine).instantiate(&mut store, &component)?;7071let f_t_t =72instance.get_typed_func::<(FutureReader<u32>,), (FutureReader<u32>,)>(&mut store, "f")?;73let f_t_a = instance.get_typed_func::<(FutureReader<u32>,), (FutureAny,)>(&mut store, "f")?;74let f_a_t = instance.get_typed_func::<(FutureAny,), (FutureReader<u32>,)>(&mut store, "f")?;75let f_a_a = instance.get_typed_func::<(FutureAny,), (FutureAny,)>(&mut store, "f")?;7677let s_t_t =78instance.get_typed_func::<(StreamReader<u32>,), (StreamReader<u32>,)>(&mut store, "s")?;79let s_t_a = instance.get_typed_func::<(StreamReader<u32>,), (StreamAny,)>(&mut store, "s")?;80let s_a_t = instance.get_typed_func::<(StreamAny,), (StreamReader<u32>,)>(&mut store, "s")?;81let s_a_a = instance.get_typed_func::<(StreamAny,), (StreamAny,)>(&mut store, "s")?;8283let mk_f_t = instance.get_typed_func::<(), (FutureReader<u32>,)>(&mut store, "mk-f")?;84let mk_f_a = instance.get_typed_func::<(), (FutureAny,)>(&mut store, "mk-f")?;85let mk_s_t = instance.get_typed_func::<(), (StreamReader<u32>,)>(&mut store, "mk-s")?;86let mk_s_a = instance.get_typed_func::<(), (StreamAny,)>(&mut store, "mk-s")?;8788assert!(instance.get_typed_func::<(), ()>(&mut store, "f").is_err());89assert!(90instance91.get_typed_func::<(u32,), (FutureReader<u32>,)>(&mut store, "f")92.is_err()93);94assert!(95instance96.get_typed_func::<(FutureReader<u32>,), (u32,)>(&mut store, "f")97.is_err()98);99assert!(100instance101.get_typed_func::<(FutureReader<()>,), (FutureReader<u32>,)>(&mut store, "f")102.is_err()103);104assert!(105instance106.get_typed_func::<(FutureReader<u64>,), (FutureReader<u32>,)>(&mut store, "f")107.is_err()108);109110assert!(instance.get_typed_func::<(), ()>(&mut store, "s").is_err());111assert!(112instance113.get_typed_func::<(u32,), (StreamReader<u32>,)>(&mut store, "s")114.is_err()115);116assert!(117instance118.get_typed_func::<(StreamReader<u32>,), (u32,)>(&mut store, "s")119.is_err()120);121assert!(122instance123.get_typed_func::<(StreamReader<()>,), (StreamReader<u32>,)>(&mut store, "s")124.is_err()125);126assert!(127instance128.get_typed_func::<(StreamReader<u64>,), (StreamReader<u32>,)>(&mut store, "s")129.is_err()130);131132let roundtrip = |store: &mut Store<()>, f: FutureReader<u32>| -> Result<()> {133let (f,) = f_t_t.call(&mut *store, (f,))?;134f_t_t.post_return(&mut *store)?;135let (f,) = f_t_a.call(&mut *store, (f,))?;136f_t_a.post_return(&mut *store)?;137let (f,) = f_a_a.call(&mut *store, (f,))?;138f_a_a.post_return(&mut *store)?;139let (mut f,) = f_a_t.call(&mut *store, (f,))?;140f_a_t.post_return(&mut *store)?;141f.close(&mut *store);142Ok(())143};144145let f = FutureReader::new(&mut store, async { anyhow::Ok(10_u32) });146roundtrip(&mut store, f)?;147148let (f,) = mk_f_t.call(&mut store, ())?;149mk_f_t.post_return(&mut store)?;150roundtrip(&mut store, f)?;151152let (f,) = mk_f_a.call(&mut store, ())?;153mk_f_a.post_return(&mut store)?;154let f = f.try_into_future_reader::<u32>()?;155roundtrip(&mut store, f)?;156157let roundtrip = |store: &mut Store<()>, s: StreamReader<u32>| -> Result<()> {158let (s,) = s_t_t.call(&mut *store, (s,))?;159s_t_t.post_return(&mut *store)?;160let (s,) = s_t_a.call(&mut *store, (s,))?;161s_t_a.post_return(&mut *store)?;162let (s,) = s_a_a.call(&mut *store, (s,))?;163s_a_a.post_return(&mut *store)?;164let (mut s,) = s_a_t.call(&mut *store, (s,))?;165s_a_t.post_return(&mut *store)?;166s.close(&mut *store);167Ok(())168};169170let s = StreamReader::new(&mut store, vec![10_u32]);171roundtrip(&mut store, s)?;172173let (s,) = mk_s_t.call(&mut store, ())?;174mk_s_t.post_return(&mut store)?;175roundtrip(&mut store, s)?;176177let (s,) = mk_s_a.call(&mut store, ())?;178mk_s_a.post_return(&mut store)?;179let s = s.try_into_stream_reader::<u32>()?;180roundtrip(&mut store, s)?;181182Ok(())183}184185186