add a readdir unit test to wasi-cap-std-sync

This commit is contained in:
Pat Hickey
2021-02-01 19:40:24 -08:00
parent 80fce7c1c8
commit dec0038ba0
3 changed files with 65 additions and 2 deletions

View File

@@ -259,6 +259,9 @@ fn convert_systimespec(t: Option<wasi_common::SystemTimeSpec>) -> Option<SystemT
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::Dir; use super::Dir;
use std::collections::HashMap;
use wasi_common::dir::{ReaddirCursor, ReaddirEntity, WasiDir};
use wasi_common::file::{FdFlags, FileType, OFlags};
#[test] #[test]
fn scratch_dir() { fn scratch_dir() {
let tempdir = tempfile::Builder::new() let tempdir = tempfile::Builder::new()
@@ -271,4 +274,63 @@ mod test {
wasi_common::WasiDir::open_dir(&preopen_dir, false, ".") wasi_common::WasiDir::open_dir(&preopen_dir, false, ".")
.expect("open the same directory via WasiDir abstraction"); .expect("open the same directory via WasiDir abstraction");
} }
#[test]
fn readdir() {
let tempdir = tempfile::Builder::new()
.prefix("cap-std-sync")
.tempdir()
.expect("create temporary dir");
let preopen_dir = unsafe { cap_std::fs::Dir::open_ambient_dir(tempdir.path()) }
.expect("open ambient temporary dir");
let preopen_dir = Dir::from_cap_std(preopen_dir);
let entities = readdir_into_map(&preopen_dir);
assert_eq!(
entities.len(),
2,
"should just be . and .. in empty dir: {:?}",
entities
);
assert!(entities.get(".").is_some());
assert!(entities.get("..").is_some());
preopen_dir
.open_file(
false,
"file1",
OFlags::CREATE,
true,
false,
FdFlags::empty(),
)
.expect("create file1");
let entities = readdir_into_map(&preopen_dir);
assert_eq!(entities.len(), 3, "should be ., .., file1 {:?}", entities);
assert_eq!(
entities.get(".").expect(". entry").filetype,
FileType::Directory
);
assert_eq!(
entities.get("..").expect(".. entry").filetype,
FileType::Directory
);
assert_eq!(
entities.get("file1").expect("file1 entry").filetype,
FileType::RegularFile
);
}
fn readdir_into_map(dir: &dyn WasiDir) -> HashMap<String, ReaddirEntity> {
let mut out = HashMap::new();
for readdir_result in dir
.readdir(ReaddirCursor::from(0))
.expect("readdir succeeds")
{
let (entity, name) = readdir_result.expect("readdir entry is valid");
out.insert(name, entity);
}
out
}
} }

View File

@@ -162,6 +162,7 @@ impl TableDirExt for crate::table::Table {
} }
} }
#[derive(Debug, Clone)]
pub struct ReaddirEntity { pub struct ReaddirEntity {
pub next: ReaddirCursor, pub next: ReaddirCursor,
pub inode: u64, pub inode: u64,

View File

@@ -30,7 +30,7 @@ pub trait WasiFile {
fn num_ready_bytes(&self) -> Result<u64, Error>; // read op fn num_ready_bytes(&self) -> Result<u64, Error>; // read op
} }
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum FileType { pub enum FileType {
Unknown, Unknown,
BlockDevice, BlockDevice,
@@ -62,7 +62,7 @@ bitflags! {
} }
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct Filestat { pub struct Filestat {
pub device_id: u64, pub device_id: u64,
pub inode: u64, pub inode: u64,