Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/tests/all/component_model/async_dynamic.rs
3068 views
1
use wasmtime::component::{Component, FutureAny, FutureReader, Linker, StreamAny, StreamReader};
2
use wasmtime::{Config, Engine, Result, Store};
3
4
#[test]
5
fn simple_type_conversions() -> Result<()> {
6
let mut config = Config::new();
7
config.wasm_component_model_async(true);
8
let engine = Engine::new(&config)?;
9
let mut store = Store::new(&engine, ());
10
11
let f = FutureReader::new(&mut store, async { wasmtime::error::Ok(10_u32) });
12
let f = f.try_into_future_any(&mut store).unwrap();
13
assert!(f.clone().try_into_future_reader::<()>().is_err());
14
assert!(f.clone().try_into_future_reader::<u64>().is_err());
15
let f = f.try_into_future_reader::<u32>().unwrap();
16
f.try_into_future_any(&mut store).unwrap().close(&mut store);
17
18
let s = StreamReader::new(&mut store, vec![10_u32]);
19
let s = s.try_into_stream_any(&mut store).unwrap();
20
assert!(s.clone().try_into_stream_reader::<()>().is_err());
21
assert!(s.clone().try_into_stream_reader::<u64>().is_err());
22
let s = s.try_into_stream_reader::<u32>().unwrap();
23
s.try_into_stream_any(&mut store).unwrap().close(&mut store);
24
25
Ok(())
26
}
27
28
#[test]
29
#[cfg_attr(miri, ignore)]
30
fn simple_type_assertions() -> Result<()> {
31
let mut config = Config::new();
32
config.wasm_component_model_async(true);
33
let engine = Engine::new(&config)?;
34
let mut store = Store::new(&engine, ());
35
36
let component = Component::new(
37
&engine,
38
r#"
39
(component
40
(type $f (future u32))
41
(type $s (stream u32))
42
(core func $mk-f (canon future.new $f))
43
(core func $mk-s (canon stream.new $s))
44
45
(core module $m
46
(import "" "mk-f" (func $mk-f (result i64)))
47
(import "" "mk-s" (func $mk-s (result i64)))
48
49
(func (export "x") (param i32) (result i32) local.get 0)
50
51
(func (export "mk-f") (result i32)
52
(i32.wrap_i64 (call $mk-f)))
53
(func (export "mk-s") (result i32)
54
(i32.wrap_i64 (call $mk-s)))
55
)
56
(core instance $i (instantiate $m
57
(with "" (instance
58
(export "mk-f" (func $mk-f))
59
(export "mk-s" (func $mk-s))
60
))
61
))
62
(func (export "f") (param "f" $f) (result $f)
63
(canon lift (core func $i "x")))
64
(func (export "s") (param "s" $s) (result $s)
65
(canon lift (core func $i "x")))
66
(func (export "mk-f") (result $f)
67
(canon lift (core func $i "mk-f")))
68
(func (export "mk-s") (result $s)
69
(canon lift (core func $i "mk-s")))
70
)
71
"#,
72
)?;
73
74
let instance = Linker::new(&engine).instantiate(&mut store, &component)?;
75
76
let f_t_t =
77
instance.get_typed_func::<(FutureReader<u32>,), (FutureReader<u32>,)>(&mut store, "f")?;
78
let f_t_a = instance.get_typed_func::<(FutureReader<u32>,), (FutureAny,)>(&mut store, "f")?;
79
let f_a_t = instance.get_typed_func::<(FutureAny,), (FutureReader<u32>,)>(&mut store, "f")?;
80
let f_a_a = instance.get_typed_func::<(FutureAny,), (FutureAny,)>(&mut store, "f")?;
81
82
let s_t_t =
83
instance.get_typed_func::<(StreamReader<u32>,), (StreamReader<u32>,)>(&mut store, "s")?;
84
let s_t_a = instance.get_typed_func::<(StreamReader<u32>,), (StreamAny,)>(&mut store, "s")?;
85
let s_a_t = instance.get_typed_func::<(StreamAny,), (StreamReader<u32>,)>(&mut store, "s")?;
86
let s_a_a = instance.get_typed_func::<(StreamAny,), (StreamAny,)>(&mut store, "s")?;
87
88
let mk_f_t = instance.get_typed_func::<(), (FutureReader<u32>,)>(&mut store, "mk-f")?;
89
let mk_f_a = instance.get_typed_func::<(), (FutureAny,)>(&mut store, "mk-f")?;
90
let mk_s_t = instance.get_typed_func::<(), (StreamReader<u32>,)>(&mut store, "mk-s")?;
91
let mk_s_a = instance.get_typed_func::<(), (StreamAny,)>(&mut store, "mk-s")?;
92
93
assert!(instance.get_typed_func::<(), ()>(&mut store, "f").is_err());
94
assert!(
95
instance
96
.get_typed_func::<(u32,), (FutureReader<u32>,)>(&mut store, "f")
97
.is_err()
98
);
99
assert!(
100
instance
101
.get_typed_func::<(FutureReader<u32>,), (u32,)>(&mut store, "f")
102
.is_err()
103
);
104
assert!(
105
instance
106
.get_typed_func::<(FutureReader<()>,), (FutureReader<u32>,)>(&mut store, "f")
107
.is_err()
108
);
109
assert!(
110
instance
111
.get_typed_func::<(FutureReader<u64>,), (FutureReader<u32>,)>(&mut store, "f")
112
.is_err()
113
);
114
115
assert!(instance.get_typed_func::<(), ()>(&mut store, "s").is_err());
116
assert!(
117
instance
118
.get_typed_func::<(u32,), (StreamReader<u32>,)>(&mut store, "s")
119
.is_err()
120
);
121
assert!(
122
instance
123
.get_typed_func::<(StreamReader<u32>,), (u32,)>(&mut store, "s")
124
.is_err()
125
);
126
assert!(
127
instance
128
.get_typed_func::<(StreamReader<()>,), (StreamReader<u32>,)>(&mut store, "s")
129
.is_err()
130
);
131
assert!(
132
instance
133
.get_typed_func::<(StreamReader<u64>,), (StreamReader<u32>,)>(&mut store, "s")
134
.is_err()
135
);
136
137
let roundtrip = |store: &mut Store<()>, f: FutureReader<u32>| -> Result<()> {
138
let (f,) = f_t_t.call(&mut *store, (f,))?;
139
let (f,) = f_t_a.call(&mut *store, (f,))?;
140
let (f,) = f_a_a.call(&mut *store, (f,))?;
141
let (mut f,) = f_a_t.call(&mut *store, (f,))?;
142
f.close(&mut *store);
143
Ok(())
144
};
145
146
let f = FutureReader::new(&mut store, async { wasmtime::error::Ok(10_u32) });
147
roundtrip(&mut store, f)?;
148
149
let (f,) = mk_f_t.call(&mut store, ())?;
150
roundtrip(&mut store, f)?;
151
152
let (f,) = mk_f_a.call(&mut store, ())?;
153
let f = f.try_into_future_reader::<u32>()?;
154
roundtrip(&mut store, f)?;
155
156
let roundtrip = |store: &mut Store<()>, s: StreamReader<u32>| -> Result<()> {
157
let (s,) = s_t_t.call(&mut *store, (s,))?;
158
let (s,) = s_t_a.call(&mut *store, (s,))?;
159
let (s,) = s_a_a.call(&mut *store, (s,))?;
160
let (mut s,) = s_a_t.call(&mut *store, (s,))?;
161
s.close(&mut *store);
162
Ok(())
163
};
164
165
let s = StreamReader::new(&mut store, vec![10_u32]);
166
roundtrip(&mut store, s)?;
167
168
let (s,) = mk_s_t.call(&mut store, ())?;
169
roundtrip(&mut store, s)?;
170
171
let (s,) = mk_s_a.call(&mut store, ())?;
172
let s = s.try_into_stream_reader::<u32>()?;
173
roundtrip(&mut store, s)?;
174
175
Ok(())
176
}
177
178