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}