mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-08 13:48:26 +00:00
Add (non-working) unit test
This commit is contained in:
@@ -43,6 +43,7 @@ pub type WasiConsoleIoEnvDestructor = unsafe extern "C" fn (*mut c_char, usize)
|
|||||||
/// (only one thread can read / write / seek from the console I/O)
|
/// (only one thread can read / write / seek from the console I/O)
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct wasi_console_io_override_t {
|
pub struct wasi_console_io_override_t {
|
||||||
read: WasiConsoleIoReadCallback,
|
read: WasiConsoleIoReadCallback,
|
||||||
write: WasiConsoleIoWriteCallback,
|
write: WasiConsoleIoWriteCallback,
|
||||||
@@ -195,6 +196,78 @@ pub unsafe extern "C" fn wasi_console_io_override_new(
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasi_console_io_override_delete(
|
||||||
|
ptr: *mut wasi_console_io_override_t
|
||||||
|
) {
|
||||||
|
Box::from_raw(ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasi_console_io_override_write_bytes(
|
||||||
|
ptr: *mut wasi_console_io_override_t,
|
||||||
|
buf: *const c_char,
|
||||||
|
len: usize,
|
||||||
|
) -> i32 {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasi_console_io_override_read_bytes(
|
||||||
|
ptr: *mut wasi_console_io_override_t,
|
||||||
|
buf: *mut c_char,
|
||||||
|
len: usize,
|
||||||
|
) -> i32 {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasi_console_io_override_write_str(
|
||||||
|
ptr: *mut wasi_console_io_override_t,
|
||||||
|
buf: *const c_char,
|
||||||
|
) -> i32 {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasi_console_io_override_read_str(
|
||||||
|
ptr: *mut wasi_console_io_override_t,
|
||||||
|
buf: *mut c_char,
|
||||||
|
) -> i32 {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasi_console_io_override_seek(
|
||||||
|
ptr: *mut wasi_console_io_override_t,
|
||||||
|
// 0 = from start
|
||||||
|
// 1 = from end
|
||||||
|
// 2 = from current position
|
||||||
|
seek_dir: c_char,
|
||||||
|
seek: i64,
|
||||||
|
) -> i64 {
|
||||||
|
|
||||||
|
let seek_pos = match seek_dir {
|
||||||
|
0 => SeekFrom::Start(seek as usize),
|
||||||
|
1 => SeekFrom::End(seek),
|
||||||
|
2 => SeekFrom::Current(seek),
|
||||||
|
};
|
||||||
|
|
||||||
|
let ptr = unsafe { &mut *ptr };
|
||||||
|
|
||||||
|
ptr
|
||||||
|
.seek(seek_pos)
|
||||||
|
.map(|p| p.try_into().ok())
|
||||||
|
.unwrap_or(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasi_console_io_override_clone(
|
||||||
|
ptr: *const wasi_console_io_override_t
|
||||||
|
) -> *mut wasi_console_io_override_t {
|
||||||
|
unsafe { &*ptr }.clone()
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a `wasi_console_io_override_t` callback object that does nothing
|
/// Creates a `wasi_console_io_override_t` callback object that does nothing
|
||||||
/// and redirects stdout / stderr to /dev/null
|
/// and redirects stdout / stderr to /dev/null
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@@ -662,11 +735,41 @@ mod tests {
|
|||||||
wasm_byte_vec_t wasm;
|
wasm_byte_vec_t wasm;
|
||||||
wat2wasm(&wat, &wasm);
|
wat2wasm(&wat, &wasm);
|
||||||
|
|
||||||
|
wasi_console_io_override_t* override_stdin = wasi_console_io_override_new(
|
||||||
|
|
||||||
|
);
|
||||||
|
wasi_console_io_override_t* override_stdout = wasi_console_io_override_new(
|
||||||
|
|
||||||
|
);
|
||||||
|
wasi_console_io_override_t* override_stdin = wasi_console_io_override_new(
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
// Cloning the `wasi_console_io_override_t` does not deep-clone the
|
||||||
|
// internal stream, since that is locked behind an Arc<Mutex<T>>.
|
||||||
|
wasi_console_io_override_t* stdin_sender = wasi_console_io_override_clone(&override_stdin);
|
||||||
|
wasi_console_io_override_t* stdout_receiver = wasi_console_io_override_clone(&override_stdout);
|
||||||
|
wasi_console_io_override_t* stderr_receiver = wasi_console_io_override_clone(&override_stderr);
|
||||||
|
|
||||||
wasm_module_t* module = wasm_module_new(store, &wasm);
|
wasm_module_t* module = wasm_module_new(store, &wasm);
|
||||||
assert(module);
|
assert(module);
|
||||||
|
|
||||||
assert(wasi_get_wasi_version(module) == SNAPSHOT0);
|
assert(wasi_get_wasi_version(module) == SNAPSHOT0);
|
||||||
|
|
||||||
|
// The program should wait for a stdin, then print "stdout: $1" to stdout
|
||||||
|
// and "stderr: $1" to stderr and exit.
|
||||||
|
wasi_console_io_override_write_str(stdin_sender, "hello\0");
|
||||||
|
|
||||||
|
assert(wasi_console_io_override_read_str(stdout_receiver), "stdout: hello\0");
|
||||||
|
assert(wasi_console_io_override_read_str(stdout_receiver), "\0");
|
||||||
|
|
||||||
|
assert(wasi_console_io_override_read_str(stderr_receiver), "stderr: hello\0");
|
||||||
|
assert(wasi_console_io_override_read_str(stderr_receiver), "\0");
|
||||||
|
|
||||||
|
wasi_console_io_override_delete(stdin_sender);
|
||||||
|
wasi_console_io_override_delete(stdout_receiver);
|
||||||
|
wasi_console_io_override_delete(stderr_receiver);
|
||||||
|
|
||||||
wasm_module_delete(module);
|
wasm_module_delete(module);
|
||||||
wasm_byte_vec_delete(&wasm);
|
wasm_byte_vec_delete(&wasm);
|
||||||
wasm_byte_vec_delete(&wat);
|
wasm_byte_vec_delete(&wat);
|
||||||
@@ -751,6 +854,8 @@ mod tests {
|
|||||||
(assert_c! {
|
(assert_c! {
|
||||||
#include "tests/wasmer.h"
|
#include "tests/wasmer.h"
|
||||||
|
|
||||||
|
struct MyCustomStdin { }
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
wasm_engine_t* engine = wasm_engine_new();
|
wasm_engine_t* engine = wasm_engine_new();
|
||||||
wasm_store_t* store = wasm_store_new(engine);
|
wasm_store_t* store = wasm_store_new(engine);
|
||||||
|
|||||||
BIN
lib/c-api/tests/wasm-c-api/example/stdio.wasm
Executable file
BIN
lib/c-api/tests/wasm-c-api/example/stdio.wasm
Executable file
Binary file not shown.
Reference in New Issue
Block a user