rudelblinken_runtime/
lib.rs

1//! # Rudelblinken Runtime
2//!
3//! Host runtime for rudelblinken wasm modules. This crate provides functionality to link your host implementation with a rudelblinken wasm module.
4//!
5//! For testing this provides a simulated host implementation in [rudelblinken_runtime::emulated_host::EmulatedHost]
6//!
7//! You can use it like this:
8//!  
9//! ```rust
10//! use rudelblinken_runtime::emulated_host::EmulatedHost;
11//! use rudelblinken_runtime::linker::setup;
12//!
13//! const WASM_MOD: &[u8] = include_bytes!(
14//!     "../../rudelblinken-wasm/target/wasm32-unknown-unknown/release/rudelblinken_wasm.wasm"
15//! );
16//!
17//! let host = EmulatedHost::new();
18//! let mut instance = setup(WASM_MOD, host).unwrap();
19//! instance.run().unwrap();
20//! ```
21
22pub mod emulated_host;
23pub mod host;
24pub mod linker;
25
26/// This crate uses wasmi::Error as its main error type.
27pub use wasmi::Error;
28
29#[cfg(test)]
30mod tests {
31    use super::emulated_host::EmulatedHost;
32    use super::linker::setup;
33
34    #[test]
35    fn can_execute_helloworld() {
36        let module_bytes = std::fs::read("../wasm-binaries/binaries/hello_world.wasm").unwrap();
37
38        let (_, host) = EmulatedHost::new();
39        let mut instance = setup(&module_bytes, host).unwrap();
40        instance.run().unwrap();
41    }
42
43    #[test]
44    fn logging_works() {
45        let module_bytes = std::fs::read("../wasm-binaries/binaries/test_logging.wasm").unwrap();
46
47        let (_, host) = EmulatedHost::new();
48        let mut instance = setup(&module_bytes, host).unwrap();
49        instance.run().unwrap();
50    }
51
52    #[test]
53    fn infinite_loop_gets_killed() {
54        let module_bytes = std::fs::read("../wasm-binaries/binaries/infinite_loop.wasm").unwrap();
55
56        let (_, host) = EmulatedHost::new();
57        let mut instance = setup(&module_bytes, host).unwrap();
58        let error: wasmi::Error = instance.run().unwrap_err();
59        assert_eq!(
60            error.as_trap_code().unwrap(),
61            wasmi::core::TrapCode::OutOfFuel
62        );
63    }
64    // // How would I even test this?
65    // #[test]
66    // fn infinite_loop_does_not_get_killed_if_it_yields() {
67    //     let module_bytes = std::fs::read("../wasm-binaries/binaries/infinite_loop.wasm").unwrap();
68
69    //     let host = EmulatedHost::new();
70    //     let mut instance = setup(&module_bytes, host).unwrap();
71    //     instance.run().unwrap();
72    // }
73}