use chio_wasm_guards::abi::WasmGuardAbi;
use chio_wasm_guards::error::WasmGuardError;
use super::common::{fresh_wasmtime_backend, load_frozen_config, minimal_request};
#[test]
fn unbounded_self_recursion_traps() {
let cfg = load_frozen_config();
let wat = r#"
(module
(memory (export "memory") 1)
(func $rec (export "evaluate") (param i32 i32) (result i32)
(drop (call $rec (local.get 0) (local.get 1)))
(i32.const 0)))
"#;
let bytes = wat::parse_str(wat).expect("wat compile");
let (_engine, mut backend) = fresh_wasmtime_backend();
backend
.load_module(&bytes, cfg.escape_fuel_limit)
.expect("recursion module loads");
let request = minimal_request();
let err = backend
.evaluate(&request)
.expect_err("unbounded recursion must trap");
match err {
WasmGuardError::Trap(_) | WasmGuardError::FuelExhausted { .. } => {}
other => panic!("expected Trap or FuelExhausted, got {other:?}"),
}
}
#[test]
fn mutual_recursion_traps() {
let cfg = load_frozen_config();
let wat = r#"
(module
(memory (export "memory") 1)
(func $a (param i32 i32) (result i32)
(drop (call $b (local.get 0) (local.get 1)))
(i32.const 0))
(func $b (param i32 i32) (result i32)
(drop (call $a (local.get 0) (local.get 1)))
(i32.const 0))
(func (export "evaluate") (param i32 i32) (result i32)
(call $a (local.get 0) (local.get 1))))
"#;
let bytes = wat::parse_str(wat).expect("wat compile");
let (_engine, mut backend) = fresh_wasmtime_backend();
backend
.load_module(&bytes, cfg.escape_fuel_limit)
.expect("mutual-recursion module loads");
let request = minimal_request();
let err = backend
.evaluate(&request)
.expect_err("mutual recursion must trap");
match err {
WasmGuardError::Trap(_) | WasmGuardError::FuelExhausted { .. } => {}
other => panic!("expected Trap or FuelExhausted, got {other:?}"),
}
}
#[test]
fn fat_frame_recursion_traps() {
let cfg = load_frozen_config();
let wat = r#"
(module
(memory (export "memory") 1)
(func $rec (export "evaluate") (param i32 i32) (result i32)
(local $a i64) (local $b i64) (local $c i64) (local $d i64)
(local $e i64) (local $f i64) (local $g i64) (local $h i64)
(drop (call $rec (local.get 0) (local.get 1)))
(i32.const 0)))
"#;
let bytes = wat::parse_str(wat).expect("wat compile");
let (_engine, mut backend) = fresh_wasmtime_backend();
backend
.load_module(&bytes, cfg.escape_fuel_limit)
.expect("fat-frame recursion module loads");
let request = minimal_request();
let err = backend
.evaluate(&request)
.expect_err("fat-frame recursion must trap");
match err {
WasmGuardError::Trap(_) | WasmGuardError::FuelExhausted { .. } => {}
other => panic!("expected Trap or FuelExhausted, got {other:?}"),
}
}