use wasmi::{Config, Engine, Error, Func, Linker, Module, Store};
fn test_setup() -> (Store<()>, Linker<()>) {
let mut config = Config::default();
config.consume_fuel(true);
config.compilation_mode(wasmi::CompilationMode::Eager);
let engine = Engine::new(&config);
let store = Store::new(&engine, ());
let linker = Linker::new(&engine);
(store, linker)
}
fn create_module(store: &Store<()>, bytes: &[u8]) -> Module {
Module::new(store.engine(), bytes).unwrap()
}
fn default_test_setup(wasm: &[u8]) -> (Store<()>, Func) {
let (mut store, linker) = test_setup();
let module = create_module(&store, wasm);
let instance = linker.instantiate_and_start(&mut store, &module).unwrap();
let func = instance.get_func(&store, "test").unwrap();
(store, func)
}
fn assert_success(call_result: Result<i32, Error>) {
assert!(call_result.is_ok());
assert_eq!(call_result.unwrap(), -1);
}
fn test_module() -> &'static str {
r#"
(module
(memory 1 1)
(func (export "test") (result i32)
(memory.grow (i32.const 1))
)
)"#
}
fn check_fuel_consumption(given_fuel: u64, consumed_fuel: u64) {
assert!(given_fuel >= consumed_fuel);
let wasm = test_module();
let (mut store, func) = default_test_setup(wasm.as_bytes());
let func = func.typed::<(), i32>(&store).unwrap();
store.set_fuel(given_fuel).unwrap(); assert_success(func.call(&mut store, ()));
assert_eq!(given_fuel - store.get_fuel().unwrap(), consumed_fuel);
}
#[test]
fn fuel_consumption_01() {
check_fuel_consumption(4, 4);
}