1 //! Dummy implementations of things that a Wasm module can import.
2 
3 use wasmtime::{error::Context as _, *};
4 
5 /// Create a set of dummy functions/globals/etc for the given imports.
dummy_linker<T>(store: &mut Store<T>, module: &Module) -> Result<Linker<T>>6 pub fn dummy_linker<T>(store: &mut Store<T>, module: &Module) -> Result<Linker<T>> {
7     let mut linker = Linker::new(store.engine());
8     linker.allow_shadowing(true);
9     for import in module.imports() {
10         let extern_ = import.ty().default_value(&mut *store).with_context(|| {
11             format!(
12                 "failed to create dummy value of `{}::{}` - {:?}",
13                 import.module(),
14                 import.name(),
15                 import.ty(),
16             )
17         })?;
18         linker
19             .define(&store, import.module(), import.name(), extern_)
20             .unwrap();
21     }
22     Ok(linker)
23 }
24 
25 #[cfg(test)]
26 mod tests {
27 
28     use super::*;
29 
store() -> Store<()>30     fn store() -> Store<()> {
31         let mut config = Config::default();
32         config.wasm_multi_memory(true);
33         let engine = wasmtime::Engine::new(&config).unwrap();
34         Store::new(&engine, ())
35     }
36 
37     #[test]
dummy_table_import()38     fn dummy_table_import() {
39         let mut store = store();
40         let table_type = TableType::new(RefType::EXTERNREF, 10, None);
41         let table = table_type.default_value(&mut store).unwrap();
42         assert_eq!(table.size(&store), 10);
43         for i in 0..10 {
44             assert!(table.get(&mut store, i).unwrap().unwrap_extern().is_none());
45         }
46     }
47 
48     #[test]
dummy_global_import()49     fn dummy_global_import() {
50         let mut store = store();
51         let global_type = GlobalType::new(ValType::I32, Mutability::Const);
52         let global = global_type.default_value(&mut store).unwrap();
53         assert!(global.ty(&store).content().is_i32());
54         assert_eq!(global.ty(&store).mutability(), Mutability::Const);
55     }
56 
57     #[test]
dummy_memory_import()58     fn dummy_memory_import() {
59         let mut store = store();
60         let memory_type = MemoryType::new(1, None);
61         let memory = memory_type
62             .default_value(&mut store)
63             .unwrap()
64             .into_memory()
65             .unwrap();
66         assert_eq!(memory.size(&store), 1);
67     }
68 
69     #[test]
dummy_function_import()70     fn dummy_function_import() {
71         let mut store = store();
72         let func_ty = FuncType::new(store.engine(), vec![ValType::I32], vec![ValType::I64]);
73         let func = func_ty.default_value(&mut store).unwrap();
74         let actual_ty = func.ty(&store);
75         assert!(FuncType::eq(&actual_ty, &func_ty));
76     }
77 }
78