wasmer/tests/wasi_serialization.rs

66 lines
2.0 KiB
Rust
Raw Normal View History

2019-08-28 10:50:59 -07:00
#![cfg(test)]
2019-11-21 13:38:22 -08:00
use wasmer_runtime::{compile, Ctx, Func};
2019-08-28 10:50:59 -07:00
use wasmer_wasi::{state::*, *};
use std::ffi::c_void;
// TODO: fix this test!
#[ignore]
2019-11-21 20:20:12 -08:00
#[cfg(not(feature = "singlepass"))]
2019-08-28 10:50:59 -07:00
#[test]
fn serializing_works() {
let args = vec![
b"program_name".into_iter().cloned().collect(),
b"arg1".into_iter().cloned().collect(),
];
let envs = vec![
b"PATH=/bin".into_iter().cloned().collect(),
b"GOROOT=$HOME/.cargo/bin".into_iter().cloned().collect(),
];
let wasm_binary = include_bytes!("wasi_test_resources/unstable/fd_read.wasm");
let module = compile(&wasm_binary[..])
.map_err(|e| format!("Can't compile module: {:?}", e))
.unwrap();
let wasi_version = get_wasi_version(&module, true).expect("WASI module");
let import_object = generate_import_object_for_version(
wasi_version,
2019-08-28 10:50:59 -07:00
args.clone(),
envs.clone(),
vec![],
vec![(
".".to_string(),
std::path::PathBuf::from("wasi_test_resources/test_fs/hamlet"),
2019-08-28 10:50:59 -07:00
)],
);
let state_bytes = {
let instance = module.instantiate(&import_object).unwrap();
let start: Func<(), ()> = instance.exports.get("_start").unwrap();
2019-08-28 10:50:59 -07:00
start.call().unwrap();
let state = get_wasi_state(instance.context());
assert_eq!(state.args, args);
assert_eq!(state.envs, envs);
let bytes = state.freeze().unwrap();
bytes
};
let mut instance = module.instantiate(&import_object).unwrap();
let wasi_state = Box::new(WasiState::unfreeze(&state_bytes).unwrap());
instance.context_mut().data = Box::into_raw(wasi_state) as *mut c_void;
let second_entry: Func<(), i32> = instance.exports.get("second_entry").unwrap();
2019-08-28 10:50:59 -07:00
let result = second_entry.call().unwrap();
assert_eq!(result, true as i32);
}
#[allow(clippy::mut_from_ref)]
pub(crate) fn get_wasi_state(ctx: &Ctx) -> &mut WasiState {
unsafe { state::get_wasi_state(&mut *(ctx as *const Ctx as *mut Ctx)) }
}