1d2dee5ddSNick Fitzgerald #![cfg(arc_try_new)]
2d2dee5ddSNick Fitzgerald
3*439de7fbSNick Fitzgerald use wasmtime::{Config, Engine, Func, Instance, Linker, Module, Result, Store};
4d2dee5ddSNick Fitzgerald use wasmtime_fuzzing::oom::OomTest;
5d2dee5ddSNick Fitzgerald
6d2dee5ddSNick Fitzgerald #[test]
call_exported_func() -> Result<()>7d2dee5ddSNick Fitzgerald fn call_exported_func() -> Result<()> {
8d2dee5ddSNick Fitzgerald let module_bytes = {
9d2dee5ddSNick Fitzgerald let mut config = Config::new();
10d2dee5ddSNick Fitzgerald config.concurrency_support(false);
11d2dee5ddSNick Fitzgerald let engine = Engine::new(&config)?;
12d2dee5ddSNick Fitzgerald let module = Module::new(
13d2dee5ddSNick Fitzgerald &engine,
14d2dee5ddSNick Fitzgerald r#"
15d2dee5ddSNick Fitzgerald (module
16d2dee5ddSNick Fitzgerald (func (export "add") (param i32 i32) (result i32)
17d2dee5ddSNick Fitzgerald (i32.add (local.get 0) (local.get 1))
18d2dee5ddSNick Fitzgerald )
19d2dee5ddSNick Fitzgerald )
20d2dee5ddSNick Fitzgerald "#,
21d2dee5ddSNick Fitzgerald )?;
22d2dee5ddSNick Fitzgerald module.serialize()?
23d2dee5ddSNick Fitzgerald };
24d2dee5ddSNick Fitzgerald
25d2dee5ddSNick Fitzgerald let mut config = Config::new();
26d2dee5ddSNick Fitzgerald config.enable_compiler(false);
27d2dee5ddSNick Fitzgerald config.concurrency_support(false);
28d2dee5ddSNick Fitzgerald let engine = Engine::new(&config)?;
29d2dee5ddSNick Fitzgerald
30d2dee5ddSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
31d2dee5ddSNick Fitzgerald let linker = Linker::<()>::new(&engine);
32d2dee5ddSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
33d2dee5ddSNick Fitzgerald
34d2dee5ddSNick Fitzgerald OomTest::new().test(|| {
35d2dee5ddSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
36d2dee5ddSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
37d2dee5ddSNick Fitzgerald let add = instance.get_typed_func::<(i32, i32), i32>(&mut store, "add")?;
38d2dee5ddSNick Fitzgerald let result = add.call(&mut store, (1, 2))?;
39d2dee5ddSNick Fitzgerald assert_eq!(result, 3);
40d2dee5ddSNick Fitzgerald Ok(())
41d2dee5ddSNick Fitzgerald })
42d2dee5ddSNick Fitzgerald }
43*439de7fbSNick Fitzgerald
44*439de7fbSNick Fitzgerald #[test]
instance_new() -> Result<()>45*439de7fbSNick Fitzgerald fn instance_new() -> Result<()> {
46*439de7fbSNick Fitzgerald let module_bytes = {
47*439de7fbSNick Fitzgerald let mut config = Config::new();
48*439de7fbSNick Fitzgerald config.concurrency_support(false);
49*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
50*439de7fbSNick Fitzgerald Module::new(
51*439de7fbSNick Fitzgerald &engine,
52*439de7fbSNick Fitzgerald "(module (import \"\" \"f\" (func)) (func (export \"g\") (call 0)))",
53*439de7fbSNick Fitzgerald )?
54*439de7fbSNick Fitzgerald .serialize()?
55*439de7fbSNick Fitzgerald };
56*439de7fbSNick Fitzgerald let mut config = Config::new();
57*439de7fbSNick Fitzgerald config.enable_compiler(false);
58*439de7fbSNick Fitzgerald config.concurrency_support(false);
59*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
60*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
61*439de7fbSNick Fitzgerald
62*439de7fbSNick Fitzgerald OomTest::new().test(|| {
63*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
64*439de7fbSNick Fitzgerald let func = Func::try_wrap(&mut store, || {})?;
65*439de7fbSNick Fitzgerald let _instance = Instance::new(&mut store, &module, &[func.into()])?;
66*439de7fbSNick Fitzgerald Ok(())
67*439de7fbSNick Fitzgerald })
68*439de7fbSNick Fitzgerald }
69*439de7fbSNick Fitzgerald
70*439de7fbSNick Fitzgerald #[test]
instance_get_export() -> Result<()>71*439de7fbSNick Fitzgerald fn instance_get_export() -> Result<()> {
72*439de7fbSNick Fitzgerald let module_bytes = {
73*439de7fbSNick Fitzgerald let mut config = Config::new();
74*439de7fbSNick Fitzgerald config.concurrency_support(false);
75*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
76*439de7fbSNick Fitzgerald Module::new(&engine, "(module (func (export \"f\")))")?.serialize()?
77*439de7fbSNick Fitzgerald };
78*439de7fbSNick Fitzgerald let mut config = Config::new();
79*439de7fbSNick Fitzgerald config.enable_compiler(false);
80*439de7fbSNick Fitzgerald config.concurrency_support(false);
81*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
82*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
83*439de7fbSNick Fitzgerald let linker = Linker::<()>::new(&engine);
84*439de7fbSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
85*439de7fbSNick Fitzgerald
86*439de7fbSNick Fitzgerald OomTest::new().test(|| {
87*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
88*439de7fbSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
89*439de7fbSNick Fitzgerald let _export = instance.get_export(&mut store, "f");
90*439de7fbSNick Fitzgerald Ok(())
91*439de7fbSNick Fitzgerald })
92*439de7fbSNick Fitzgerald }
93*439de7fbSNick Fitzgerald
94*439de7fbSNick Fitzgerald #[test]
instance_exports() -> Result<()>95*439de7fbSNick Fitzgerald fn instance_exports() -> Result<()> {
96*439de7fbSNick Fitzgerald let module_bytes = {
97*439de7fbSNick Fitzgerald let mut config = Config::new();
98*439de7fbSNick Fitzgerald config.concurrency_support(false);
99*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
100*439de7fbSNick Fitzgerald Module::new(
101*439de7fbSNick Fitzgerald &engine,
102*439de7fbSNick Fitzgerald "(module (func (export \"f\")) (memory (export \"m\") 1) (global (export \"g\") i32 (i32.const 0)))",
103*439de7fbSNick Fitzgerald )?
104*439de7fbSNick Fitzgerald .serialize()?
105*439de7fbSNick Fitzgerald };
106*439de7fbSNick Fitzgerald let mut config = Config::new();
107*439de7fbSNick Fitzgerald config.enable_compiler(false);
108*439de7fbSNick Fitzgerald config.concurrency_support(false);
109*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
110*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
111*439de7fbSNick Fitzgerald let linker = Linker::<()>::new(&engine);
112*439de7fbSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
113*439de7fbSNick Fitzgerald
114*439de7fbSNick Fitzgerald OomTest::new().test(|| {
115*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
116*439de7fbSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
117*439de7fbSNick Fitzgerald let count = instance.exports(&mut store).count();
118*439de7fbSNick Fitzgerald assert_eq!(count, 3);
119*439de7fbSNick Fitzgerald Ok(())
120*439de7fbSNick Fitzgerald })
121*439de7fbSNick Fitzgerald }
122*439de7fbSNick Fitzgerald
123*439de7fbSNick Fitzgerald #[test]
instance_get_func() -> Result<()>124*439de7fbSNick Fitzgerald fn instance_get_func() -> Result<()> {
125*439de7fbSNick Fitzgerald let module_bytes = {
126*439de7fbSNick Fitzgerald let mut config = Config::new();
127*439de7fbSNick Fitzgerald config.concurrency_support(false);
128*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
129*439de7fbSNick Fitzgerald Module::new(
130*439de7fbSNick Fitzgerald &engine,
131*439de7fbSNick Fitzgerald "(module (func (export \"f\") (param i32) (result i32) (local.get 0)))",
132*439de7fbSNick Fitzgerald )?
133*439de7fbSNick Fitzgerald .serialize()?
134*439de7fbSNick Fitzgerald };
135*439de7fbSNick Fitzgerald let mut config = Config::new();
136*439de7fbSNick Fitzgerald config.enable_compiler(false);
137*439de7fbSNick Fitzgerald config.concurrency_support(false);
138*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
139*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
140*439de7fbSNick Fitzgerald let linker = Linker::<()>::new(&engine);
141*439de7fbSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
142*439de7fbSNick Fitzgerald
143*439de7fbSNick Fitzgerald OomTest::new().test(|| {
144*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
145*439de7fbSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
146*439de7fbSNick Fitzgerald let f = instance.get_func(&mut store, "f");
147*439de7fbSNick Fitzgerald assert!(f.is_some());
148*439de7fbSNick Fitzgerald Ok(())
149*439de7fbSNick Fitzgerald })
150*439de7fbSNick Fitzgerald }
151*439de7fbSNick Fitzgerald
152*439de7fbSNick Fitzgerald #[test]
instance_get_typed_func() -> Result<()>153*439de7fbSNick Fitzgerald fn instance_get_typed_func() -> Result<()> {
154*439de7fbSNick Fitzgerald let module_bytes = {
155*439de7fbSNick Fitzgerald let mut config = Config::new();
156*439de7fbSNick Fitzgerald config.concurrency_support(false);
157*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
158*439de7fbSNick Fitzgerald Module::new(
159*439de7fbSNick Fitzgerald &engine,
160*439de7fbSNick Fitzgerald "(module (func (export \"f\") (param i32) (result i32) (local.get 0)))",
161*439de7fbSNick Fitzgerald )?
162*439de7fbSNick Fitzgerald .serialize()?
163*439de7fbSNick Fitzgerald };
164*439de7fbSNick Fitzgerald let mut config = Config::new();
165*439de7fbSNick Fitzgerald config.enable_compiler(false);
166*439de7fbSNick Fitzgerald config.concurrency_support(false);
167*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
168*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
169*439de7fbSNick Fitzgerald let linker = Linker::<()>::new(&engine);
170*439de7fbSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
171*439de7fbSNick Fitzgerald
172*439de7fbSNick Fitzgerald OomTest::new().test(|| {
173*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
174*439de7fbSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
175*439de7fbSNick Fitzgerald let _f = instance.get_typed_func::<i32, i32>(&mut store, "f")?;
176*439de7fbSNick Fitzgerald Ok(())
177*439de7fbSNick Fitzgerald })
178*439de7fbSNick Fitzgerald }
179*439de7fbSNick Fitzgerald
180*439de7fbSNick Fitzgerald #[test]
instance_get_table() -> Result<()>181*439de7fbSNick Fitzgerald fn instance_get_table() -> Result<()> {
182*439de7fbSNick Fitzgerald let module_bytes = {
183*439de7fbSNick Fitzgerald let mut config = Config::new();
184*439de7fbSNick Fitzgerald config.concurrency_support(false);
185*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
186*439de7fbSNick Fitzgerald Module::new(&engine, "(module (table (export \"t\") 1 funcref))")?.serialize()?
187*439de7fbSNick Fitzgerald };
188*439de7fbSNick Fitzgerald let mut config = Config::new();
189*439de7fbSNick Fitzgerald config.enable_compiler(false);
190*439de7fbSNick Fitzgerald config.concurrency_support(false);
191*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
192*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
193*439de7fbSNick Fitzgerald let linker = Linker::<()>::new(&engine);
194*439de7fbSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
195*439de7fbSNick Fitzgerald
196*439de7fbSNick Fitzgerald OomTest::new().test(|| {
197*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
198*439de7fbSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
199*439de7fbSNick Fitzgerald let t = instance.get_table(&mut store, "t");
200*439de7fbSNick Fitzgerald assert!(t.is_some());
201*439de7fbSNick Fitzgerald Ok(())
202*439de7fbSNick Fitzgerald })
203*439de7fbSNick Fitzgerald }
204*439de7fbSNick Fitzgerald
205*439de7fbSNick Fitzgerald #[test]
instance_get_memory() -> Result<()>206*439de7fbSNick Fitzgerald fn instance_get_memory() -> Result<()> {
207*439de7fbSNick Fitzgerald let module_bytes = {
208*439de7fbSNick Fitzgerald let mut config = Config::new();
209*439de7fbSNick Fitzgerald config.concurrency_support(false);
210*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
211*439de7fbSNick Fitzgerald Module::new(&engine, "(module (memory (export \"m\") 1))")?.serialize()?
212*439de7fbSNick Fitzgerald };
213*439de7fbSNick Fitzgerald let mut config = Config::new();
214*439de7fbSNick Fitzgerald config.enable_compiler(false);
215*439de7fbSNick Fitzgerald config.concurrency_support(false);
216*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
217*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
218*439de7fbSNick Fitzgerald let linker = Linker::<()>::new(&engine);
219*439de7fbSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
220*439de7fbSNick Fitzgerald
221*439de7fbSNick Fitzgerald OomTest::new().test(|| {
222*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
223*439de7fbSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
224*439de7fbSNick Fitzgerald let m = instance.get_memory(&mut store, "m");
225*439de7fbSNick Fitzgerald assert!(m.is_some());
226*439de7fbSNick Fitzgerald Ok(())
227*439de7fbSNick Fitzgerald })
228*439de7fbSNick Fitzgerald }
229*439de7fbSNick Fitzgerald
230*439de7fbSNick Fitzgerald #[test]
instance_get_global() -> Result<()>231*439de7fbSNick Fitzgerald fn instance_get_global() -> Result<()> {
232*439de7fbSNick Fitzgerald let module_bytes = {
233*439de7fbSNick Fitzgerald let mut config = Config::new();
234*439de7fbSNick Fitzgerald config.concurrency_support(false);
235*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
236*439de7fbSNick Fitzgerald Module::new(
237*439de7fbSNick Fitzgerald &engine,
238*439de7fbSNick Fitzgerald "(module (global (export \"g\") i32 (i32.const 42)))",
239*439de7fbSNick Fitzgerald )?
240*439de7fbSNick Fitzgerald .serialize()?
241*439de7fbSNick Fitzgerald };
242*439de7fbSNick Fitzgerald let mut config = Config::new();
243*439de7fbSNick Fitzgerald config.enable_compiler(false);
244*439de7fbSNick Fitzgerald config.concurrency_support(false);
245*439de7fbSNick Fitzgerald let engine = Engine::new(&config)?;
246*439de7fbSNick Fitzgerald let module = unsafe { Module::deserialize(&engine, &module_bytes)? };
247*439de7fbSNick Fitzgerald let linker = Linker::<()>::new(&engine);
248*439de7fbSNick Fitzgerald let instance_pre = linker.instantiate_pre(&module)?;
249*439de7fbSNick Fitzgerald
250*439de7fbSNick Fitzgerald OomTest::new().test(|| {
251*439de7fbSNick Fitzgerald let mut store = Store::try_new(&engine, ())?;
252*439de7fbSNick Fitzgerald let instance = instance_pre.instantiate(&mut store)?;
253*439de7fbSNick Fitzgerald let g = instance.get_global(&mut store, "g");
254*439de7fbSNick Fitzgerald assert!(g.is_some());
255*439de7fbSNick Fitzgerald Ok(())
256*439de7fbSNick Fitzgerald })
257*439de7fbSNick Fitzgerald }
258