diff --git a/crates/test-programs/wasi-tests/src/bin/path_exists.rs b/crates/test-programs/wasi-tests/src/bin/path_exists.rs new file mode 100644 index 0000000000..8fa763161d --- /dev/null +++ b/crates/test-programs/wasi-tests/src/bin/path_exists.rs @@ -0,0 +1,79 @@ +use std::{env, process}; +use wasi_tests::{create_file, open_scratch_directory}; + +unsafe fn test_path_exists(dir_fd: wasi::Fd) { + // Create a temporary directory + wasi::path_create_directory(dir_fd, "subdir").expect("create directory"); + + // Check directory exists: + let file_stat = wasi::path_filestat_get(dir_fd, 0, "subdir").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_DIRECTORY); + + // Should still exist with symlink follow flag: + let file_stat = wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir") + .expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_DIRECTORY); + + // Create a file: + create_file(dir_fd, "subdir/file"); + // Check directory exists: + let file_stat = wasi::path_filestat_get(dir_fd, 0, "subdir/file").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_REGULAR_FILE); + + // Should still exist with symlink follow flag: + let file_stat = + wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir/file") + .expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_REGULAR_FILE); + + // Create a symlink to a file: + wasi::path_symlink("subdir/file", dir_fd, "link1").expect("create symlink"); + // Check symlink exists: + let file_stat = wasi::path_filestat_get(dir_fd, 0, "link1").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_SYMBOLIC_LINK); + + // Should still exist with symlink follow flag, pointing to regular file + let file_stat = wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "link1") + .expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_REGULAR_FILE); + + // Create a symlink to a dir: + wasi::path_symlink("subdir", dir_fd, "link2").expect("create symlink"); + // Check symlink exists: + let file_stat = wasi::path_filestat_get(dir_fd, 0, "link2").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_SYMBOLIC_LINK); + + // Should still exist with symlink follow flag, pointing to directory + let file_stat = wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "link2") + .expect("reading file stats"); + assert_eq!(file_stat.filetype, wasi::FILETYPE_DIRECTORY); + + wasi::path_unlink_file(dir_fd, "link1").expect("clean up"); + wasi::path_unlink_file(dir_fd, "link2").expect("clean up"); + wasi::path_unlink_file(dir_fd, "subdir/file").expect("clean up"); + wasi::path_remove_directory(dir_fd, "subdir").expect("clean up"); +} + +fn main() { + /* + let mut args = env::args(); + let prog = args.next().unwrap(); + let arg = if let Some(arg) = args.next() { + arg + } else { + eprintln!("usage: {} ", prog); + process::exit(1); + }; + + // Open scratch directory + let dir_fd = match open_scratch_directory(&arg) { + Ok(dir_fd) => dir_fd, + Err(err) => { + eprintln!("{}", err); + process::exit(1) + } + }; + */ + // Run the tests. + unsafe { test_path_exists(3) } +}