tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
⎇ c5a232cf24788ab75a850ffe81eca5a7af50e2f8
llimphi-wasm-runner/tests/gating.rs
Historia
Quién tocó qué
crudo
1//! Certifica la frontera física host-side: un host import gateado por permiso
2//! sólo se enlaza si el bit está. Sin él, un guest que lo importe NO instancia.
3//!
4//! Usamos un módulo WAT mínimo (compilado en runtime, sin toolchain wasm32) que
5//! importa `tawa.host_net_request` — la función gateada por `PERMISO_RED`.
6
7use llimphi_wasm_runner::build_linker;
8use wasmi::{CompilationMode, Config, Engine, Module, Store};
9
10/// Módulo que importa la función gateada y exporta `memory`.
11const WAT_IMPORTA_RED: &str = r#"
12(module
13 (import "tawa" "host_net_request" (func $req (param i32 i32) (result i32)))
14 (memory (export "memory") 1)
15 (func (export "ping") (result i32)
16 (call $req (i32.const 0) (i32.const 0))))
17"#;
18
19fn intenta_instanciar(permisos: u32) -> Result<(), String> {
20 let wasm = wat::parse_str(WAT_IMPORTA_RED).expect("WAT válido");
21 let mut config = Config::default();
22 config.compilation_mode(CompilationMode::Eager);
23 let engine = Engine::new(&config);
24 let module = Module::new(&engine, &wasm).map_err(|e| e.to_string())?;
25 let mut store = Store::new(&engine, ());
26 let linker = build_linker(&engine, permisos)?;
27 linker
28 .instantiate_and_start(&mut store, &module)
29 .map(|_| ())
30 .map_err(|e| e.to_string())
31}
32
33#[test]
34fn con_permiso_red_instancia() {
35 // Con PERMISO_RED concedido, el import se enlaza y el módulo instancia.
36 assert!(intenta_instanciar(format::PERMISO_RED).is_ok());
37}
38
39#[test]
40fn sin_permiso_red_no_instancia() {
41 // Sin el bit, `host_net_request` no se enlaza: el import queda sin resolver
42 // y la instanciación falla. Frontera física: no hay tabla que escalar.
43 assert!(intenta_instanciar(0).is_err());
44}