tawasuyu

tawasuyu/llimphi

Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.

Rust 238TOML 102Markdown 83Shell 24178 Definitions

⎇ main llimphi-wasm-runner/tests/gating.rs Rust · 44 lines · 1.7 KB History Who touched what raw

chore: refresco desde el monorepo — 27 crates nuevos (anim, lottie, svg, mesh, image, layer, test, wire-view, widgets rag-sidebar/router/lazy-list/rive-button) y sync de los 95 existentes 93253cc22 · Sergio ·

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}