Skip to content

Commit

Permalink
Try #726:
Browse files Browse the repository at this point in the history
  • Loading branch information
bors[bot] authored Aug 28, 2019
2 parents 7d05d3c + 8a2dba5 commit 8cbeba9
Show file tree
Hide file tree
Showing 15 changed files with 528 additions and 135 deletions.
81 changes: 81 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,13 @@ wasitests-singlepass: wasitests-setup
cargo test --manifest-path lib/wasi-tests/Cargo.toml --release --features singlepass -- --test-threads=1

wasitests-cranelift: wasitests-setup
cargo test --manifest-path lib/wasi-tests/Cargo.toml --release --features clif -- --test-threads=1
cargo test --manifest-path lib/wasi-tests/Cargo.toml --release --features clif -- --test-threads=1 --nocapture

wasitests-llvm: wasitests-setup
cargo test --manifest-path lib/wasi-tests/Cargo.toml --release --features llvm -- --test-threads=1

wasitests-unit:
cargo test --manifest-path lib/wasi-tests/Cargo.toml --release --features clif -- --test-threads=1 --nocapture
cargo test --manifest-path lib/wasi/Cargo.toml --release

wasitests: wasitests-unit wasitests-singlepass wasitests-cranelift wasitests-llvm
Expand Down
1 change: 1 addition & 0 deletions lib/wasi-tests/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ build = "build/mod.rs"

[dependencies]
wasmer-runtime-core = { path = "../runtime-core", version = "0.6.0" }
wasmer-runtime = { path = "../runtime", version = "0.6.0" }
wasmer-wasi = { path = "../wasi", version = "0.6.0" }
# hack to get tests to work
wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.6.0", optional = true }
Expand Down
61 changes: 60 additions & 1 deletion lib/wasi-tests/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1 +1,60 @@
// nothing to see here
#![cfg(test)]
use wasmer_runtime::{compile, Func};
use wasmer_runtime_core::vm::Ctx;
use wasmer_wasi::{state::*, *};

use std::ffi::c_void;

#[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!("../wasitests/fd_read.wasm");
let import_object = generate_import_object(
args.clone(),
envs.clone(),
vec![],
vec![(
".".to_string(),
std::path::PathBuf::from("wasitests/test_fs/hamlet"),
)],
);
let module = compile(&wasm_binary[..])
.map_err(|e| format!("Can't compile module: {:?}", e))
.unwrap();

let state_bytes = {
let instance = module.instantiate(&import_object).unwrap();

let start: Func<(), ()> = instance.func("_start").unwrap();
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.func("second_entry").unwrap();
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)) }
}
14 changes: 14 additions & 0 deletions lib/wasi-tests/tests/wasitests/fd_read.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#[test]
fn test_fd_read() {
assert_wasi_output!(
"../../wasitests/fd_read.wasm",
"fd_read",
vec![],
vec![(
".".to_string(),
::std::path::PathBuf::from("wasitests/test_fs/hamlet")
),],
vec![],
"../../wasitests/fd_read.out"
);
}
1 change: 1 addition & 0 deletions lib/wasi-tests/tests/wasitests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ mod create_dir;
mod envvar;
mod fd_allocate;
mod fd_pread;
mod fd_read;
mod fd_sync;
mod file_metadata;
mod fs_sandbox_test;
Expand Down
3 changes: 3 additions & 0 deletions lib/wasi-tests/wasitests/fd_read.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SCENE IV. The Queen's closet.

Enter QUEEN GERTRUDE and POLO
86 changes: 86 additions & 0 deletions lib/wasi-tests/wasitests/fd_read.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// Args:
// mapdir: .:wasitests/test_fs/hamlet

// this program is used in the pause/resume test

use std::fs;
#[cfg(target_os = "wasi")]
use std::os::wasi::prelude::AsRawFd;
use std::path::PathBuf;

#[cfg(target_os = "wasi")]
#[repr(C)]
struct WasiIovec {
pub buf: u32,
pub buf_len: u32,
}

#[cfg(target_os = "wasi")]
#[link(wasm_import_module = "wasi_unstable")]
extern "C" {
fn fd_read(fd: u32, iovs: u32, iovs_len: u32, nread: u32) -> u16;
}

#[cfg(target_os = "wasi")]
fn read(fd: u32, iovs: &[&mut [u8]]) -> u32 {
let mut nread = 0;
let mut processed_iovs = vec![];

for iov in iovs {
processed_iovs.push(WasiIovec {
buf: iov.as_ptr() as usize as u32,
buf_len: iov.len() as u32,
})
}

unsafe {
fd_read(
fd,
processed_iovs.as_ptr() as usize as u32,
processed_iovs.len() as u32,
&mut nread as *mut u32 as usize as u32,
);
}
nread
}

fn main() {
#[cfg(not(target_os = "wasi"))]
let mut base = PathBuf::from("wasitests/test_fs/hamlet");
#[cfg(target_os = "wasi")]
let mut base = PathBuf::from(".");

base.push("act3/scene4.txt");
let mut file = fs::File::open(&base).expect("Could not open file");
let mut buffer = [0u8; 64];

#[cfg(target_os = "wasi")]
{
let raw_fd = file.as_raw_fd();
assert_eq!(read(raw_fd, &[&mut buffer]), 64);
let str_val = std::str::from_utf8(&buffer[..]).unwrap().to_string();
println!("{}", &str_val);
}
// leak the file handle so that we can use it later
std::mem::forget(file);

#[cfg(not(target_os = "wasi"))]
{
// eh, just print the output directly
print!(
"SCENE IV. The Queen's closet.
Enter QUEEN GERTRUDE and POLO"
);
}
}

#[cfg(target_os = "wasi")]
#[no_mangle]
fn second_entry() -> bool {
let raw_fd = 5;
let mut buffer = [0u8; 8];
let result = read(raw_fd, &[&mut buffer]);

&buffer == b"NIUS \n\nL"
}
Binary file added lib/wasi-tests/wasitests/fd_read.wasm
Binary file not shown.
13 changes: 8 additions & 5 deletions lib/wasi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@ repository = "https://github.com/wasmerio/wasmer"
edition = "2018"

[dependencies]
wasmer-runtime-core = { path = "../runtime-core", version = "0.6.0" }
bincode = "1"
byteorder = "1.3.2"
generational-arena = { version = "0.2.2", features = ["serde"] }
libc = "0.2.60"
rand = "0.7.0"
# wasmer-runtime-abi = { path = "../runtime-abi" }
generational-arena = "0.2.2"
log = "0.4.8"
byteorder = "1.3.2"
rand = "0.7.0"
time = "0.1.42"
typetag = "0.1"
serde = { version = "1", features = ["derive"] }
# wasmer-runtime-abi = { path = "../runtime-abi" }
wasmer-runtime-core = { path = "../runtime-core", version = "0.6.0" }

[target.'cfg(windows)'.dependencies]
winapi = "0.3.7"
Loading

0 comments on commit 8cbeba9

Please sign in to comment.