Path: blob/main/crates/wasi-common/tests/all/sync.rs
1692 views
use super::*;1use test_programs_artifacts::*;2use wasi_common::sync::{WasiCtxBuilder, add_to_linker};34foreach_preview1!(assert_test_exists);56fn run(path: &str, inherit_stdio: bool) -> Result<()> {7let path = Path::new(path);8let name = path.file_stem().unwrap().to_str().unwrap();9let workspace = prepare_workspace(name)?;10let stdout = WritePipe::new_in_memory();11let stderr = WritePipe::new_in_memory();12let r = {13let engine = test_programs_artifacts::engine(|_| {});14let mut linker = Linker::new(&engine);15add_to_linker(&mut linker, |cx| cx)?;1617// Create our wasi context.18// Additionally register any preopened directories if we have them.19let mut builder = WasiCtxBuilder::new();2021if inherit_stdio {22builder.inherit_stdio();23} else {24builder25.stdout(Box::new(stdout.clone()))26.stderr(Box::new(stderr.clone()));27}28builder.arg(name)?.arg(".")?;29println!("preopen: {workspace:?}");30let preopen_dir =31cap_std::fs::Dir::open_ambient_dir(workspace.path(), cap_std::ambient_authority())?;32builder.preopened_dir(preopen_dir, ".")?;33for (var, val) in test_programs_artifacts::wasi_tests_environment() {34builder.env(var, val)?;35}3637let mut store = Store::new(&engine, builder.build());38let module = Module::from_file(&engine, path)?;39let instance = linker.instantiate(&mut store, &module)?;40let start = instance.get_typed_func::<(), ()>(&mut store, "_start")?;41start.call(&mut store, ())?;42Ok(())43};4445r.map_err(move |trap: anyhow::Error| {46let stdout = stdout47.try_into_inner()48.expect("sole ref to stdout")49.into_inner();50if !stdout.is_empty() {51println!("guest stdout:\n{}\n===", String::from_utf8_lossy(&stdout));52}53let stderr = stderr54.try_into_inner()55.expect("sole ref to stderr")56.into_inner();57if !stderr.is_empty() {58println!("guest stderr:\n{}\n===", String::from_utf8_lossy(&stderr));59}60trap.context(format!(61"error while testing wasi-tests {name} with cap-std-sync"62))63})?;64Ok(())65}6667// Below here is mechanical: there should be one test for every binary in68// wasi-tests.69#[test_log::test]70fn preview1_big_random_buf() {71run(PREVIEW1_BIG_RANDOM_BUF, true).unwrap()72}73#[test_log::test]74fn preview1_clock_time_get() {75run(PREVIEW1_CLOCK_TIME_GET, true).unwrap()76}77#[test_log::test]78fn preview1_close_preopen() {79run(PREVIEW1_CLOSE_PREOPEN, true).unwrap()80}81#[test_log::test]82fn preview1_dangling_fd() {83run(PREVIEW1_DANGLING_FD, true).unwrap()84}85#[test_log::test]86fn preview1_dangling_symlink() {87run(PREVIEW1_DANGLING_SYMLINK, true).unwrap()88}89#[test_log::test]90fn preview1_directory_seek() {91run(PREVIEW1_DIRECTORY_SEEK, true).unwrap()92}93#[test_log::test]94fn preview1_dir_fd_op_failures() {95run(PREVIEW1_DIR_FD_OP_FAILURES, true).unwrap()96}97#[test_log::test]98fn preview1_fd_advise() {99run(PREVIEW1_FD_ADVISE, true).unwrap()100}101#[test_log::test]102fn preview1_fd_filestat_get() {103run(PREVIEW1_FD_FILESTAT_GET, true).unwrap()104}105#[test_log::test]106fn preview1_fd_filestat_set() {107run(PREVIEW1_FD_FILESTAT_SET, true).unwrap()108}109#[test_log::test]110fn preview1_fd_flags_set() {111run(PREVIEW1_FD_FLAGS_SET, true).unwrap()112}113#[test_log::test]114fn preview1_fd_readdir() {115run(PREVIEW1_FD_READDIR, true).unwrap()116}117#[test_log::test]118fn preview1_file_allocate() {119run(PREVIEW1_FILE_ALLOCATE, true).unwrap()120}121// This test is outside of linux because the behavior of `pwrite`, which this122// test bottoms out into, differs across platforms. The wasi-common crate123// doesn't have the infrastructure in place to manually track the append-mode124// flag easily, but `wasmtime-wasi` has the "correct" behavior here.125#[test_log::test]126#[cfg_attr(not(target_os = "linux"), ignore)]127fn preview1_file_pread_pwrite() {128run(PREVIEW1_FILE_PREAD_PWRITE, true).unwrap()129}130#[test_log::test]131fn preview1_file_read_write() {132run(PREVIEW1_FILE_READ_WRITE, true).unwrap()133}134#[test_log::test]135fn preview1_file_seek_tell() {136run(PREVIEW1_FILE_SEEK_TELL, true).unwrap()137}138#[test_log::test]139fn preview1_file_truncation() {140run(PREVIEW1_FILE_TRUNCATION, true).unwrap()141}142#[test_log::test]143fn preview1_file_unbuffered_write() {144run(PREVIEW1_FILE_UNBUFFERED_WRITE, true).unwrap()145}146#[test_log::test]147fn preview1_interesting_paths() {148run(PREVIEW1_INTERESTING_PATHS, true).unwrap()149}150#[test_log::test]151fn preview1_regular_file_isatty() {152run(PREVIEW1_REGULAR_FILE_ISATTY, true).unwrap()153}154#[test_log::test]155fn preview1_nofollow_errors() {156run(PREVIEW1_NOFOLLOW_ERRORS, true).unwrap()157}158#[test_log::test]159fn preview1_overwrite_preopen() {160run(PREVIEW1_OVERWRITE_PREOPEN, true).unwrap()161}162#[test_log::test]163fn preview1_path_exists() {164run(PREVIEW1_PATH_EXISTS, true).unwrap()165}166#[test_log::test]167fn preview1_path_filestat() {168run(PREVIEW1_PATH_FILESTAT, true).unwrap()169}170#[test_log::test]171fn preview1_path_link() {172run(PREVIEW1_PATH_LINK, true).unwrap()173}174#[test_log::test]175fn preview1_path_open_create_existing() {176run(PREVIEW1_PATH_OPEN_CREATE_EXISTING, true).unwrap()177}178#[test_log::test]179fn preview1_path_open_read_write() {180run(PREVIEW1_PATH_OPEN_READ_WRITE, true).unwrap()181}182#[test_log::test]183fn preview1_path_open_dirfd_not_dir() {184run(PREVIEW1_PATH_OPEN_DIRFD_NOT_DIR, true).unwrap()185}186#[test_log::test]187fn preview1_path_open_missing() {188run(PREVIEW1_PATH_OPEN_MISSING, true).unwrap()189}190#[test_log::test]191fn preview1_path_open_nonblock() {192run(PREVIEW1_PATH_OPEN_NONBLOCK, true).unwrap()193}194#[test_log::test]195fn preview1_path_rename_dir_trailing_slashes() {196run(PREVIEW1_PATH_RENAME_DIR_TRAILING_SLASHES, true).unwrap()197}198#[test_log::test]199fn preview1_path_rename() {200run(PREVIEW1_PATH_RENAME, true).unwrap()201}202#[test_log::test]203fn preview1_path_symlink_trailing_slashes() {204run(PREVIEW1_PATH_SYMLINK_TRAILING_SLASHES, true).unwrap()205}206#[test_log::test]207fn preview1_poll_oneoff_files() {208run(PREVIEW1_POLL_ONEOFF_FILES, false).unwrap()209}210#[test_log::test]211fn preview1_poll_oneoff_stdio() {212run(PREVIEW1_POLL_ONEOFF_STDIO, true).unwrap()213}214#[test_log::test]215fn preview1_readlink() {216run(PREVIEW1_READLINK, true).unwrap()217}218#[test_log::test]219fn preview1_remove_directory() {220run(PREVIEW1_REMOVE_DIRECTORY, true).unwrap()221}222#[test_log::test]223fn preview1_remove_nonempty_directory() {224run(PREVIEW1_REMOVE_NONEMPTY_DIRECTORY, true).unwrap()225}226#[test_log::test]227fn preview1_renumber() {228run(PREVIEW1_RENUMBER, true).unwrap()229}230#[test_log::test]231fn preview1_sched_yield() {232run(PREVIEW1_SCHED_YIELD, true).unwrap()233}234#[test_log::test]235fn preview1_stdio() {236run(PREVIEW1_STDIO, true).unwrap()237}238#[test_log::test]239fn preview1_stdio_isatty() {240if test_programs_artifacts::stdio_is_terminal() {241// Inherit stdio, which is a terminal in the test runner's environment:242run(PREVIEW1_STDIO_ISATTY, true).unwrap()243}244}245#[test_log::test]246fn preview1_stdio_not_isatty() {247// Don't inherit stdio, test asserts each is not tty:248run(PREVIEW1_STDIO_NOT_ISATTY, false).unwrap()249}250251#[test_log::test]252fn preview1_symlink_create() {253run(PREVIEW1_SYMLINK_CREATE, true).unwrap()254}255#[test_log::test]256fn preview1_symlink_filestat() {257run(PREVIEW1_SYMLINK_FILESTAT, true).unwrap()258}259#[test_log::test]260fn preview1_symlink_loop() {261run(PREVIEW1_SYMLINK_LOOP, true).unwrap()262}263#[test_log::test]264fn preview1_unlink_file_trailing_slashes() {265run(PREVIEW1_UNLINK_FILE_TRAILING_SLASHES, true).unwrap()266}267#[test_log::test]268fn preview1_path_open_preopen() {269run(PREVIEW1_PATH_OPEN_PREOPEN, true).unwrap()270}271#[test_log::test]272fn preview1_unicode_output() {273run(PREVIEW1_UNICODE_OUTPUT, true).unwrap()274}275#[test_log::test]276fn preview1_file_write() {277run(PREVIEW1_FILE_WRITE, true).unwrap()278}279#[test_log::test]280fn preview1_path_open_lots() {281run(PREVIEW1_PATH_OPEN_LOTS, true).unwrap()282}283284285