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