From c3e1bf78c430d3a716ba5c90b422653abe2d1d51 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Mon, 31 Aug 2020 23:01:20 -0400 Subject: [PATCH] test: add wasi readdir() test This commit provides coverage for __wasi_fd_readdir(). PR-URL: https://github.com/nodejs/node/pull/35202 Reviewed-By: Gus Caplan Reviewed-By: Anna Henningsen Reviewed-By: Jiawen Geng --- test/wasi/c/readdir.c | 50 ++++++++++++++++++++++++++++++++++++ test/wasi/test-wasi.js | 5 ++++ test/wasi/wasm/readdir.wasm | Bin 0 -> 36298 bytes 3 files changed, 55 insertions(+) create mode 100644 test/wasi/c/readdir.c create mode 100755 test/wasi/wasm/readdir.wasm diff --git a/test/wasi/c/readdir.c b/test/wasi/c/readdir.c new file mode 100644 index 00000000000000..a18ae5de34eb8f --- /dev/null +++ b/test/wasi/c/readdir.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include + +int main() { + DIR* dir; + struct dirent* entry; + char* platform; + int cnt; + int has_d_type; + + platform = getenv("NODE_PLATFORM"); + assert(platform != NULL); + has_d_type = (0 != strcmp(platform, "aix") && 0 != strcmp(platform, "sunos")); + + dir = opendir("/sandbox"); + assert(dir != NULL); + + cnt = 0; + errno = 0; + while (NULL != (entry = readdir(dir))) { + if (strcmp(entry->d_name, "input.txt") == 0 || + strcmp(entry->d_name, "input2.txt") == 0 || + strcmp(entry->d_name, "notadir") == 0) { + if (has_d_type) { + assert(entry->d_type == DT_REG); + } else { + assert(entry->d_type == DT_UNKNOWN); + } + } else if (strcmp(entry->d_name, "subdir") == 0) { + if (has_d_type) { + assert(entry->d_type == DT_DIR); + } else { + assert(entry->d_type == DT_UNKNOWN); + } + } else { + assert("unexpected file"); + } + + cnt++; + } + + assert(errno == 0); + assert(cnt == 4); + closedir(dir); + return 0; +} diff --git a/test/wasi/test-wasi.js b/test/wasi/test-wasi.js index 8ebc290d7b8269..b4c404e515cbb2 100644 --- a/test/wasi/test-wasi.js +++ b/test/wasi/test-wasi.js @@ -84,6 +84,11 @@ if (process.argv[2] === 'wasi-child') { runWASI({ test: 'notdir' }); runWASI({ test: 'poll' }); runWASI({ test: 'preopen_populates' }); + + if (!common.isWindows && process.platform !== 'android') { + runWASI({ test: 'readdir' }); + } + runWASI({ test: 'read_file', stdout: `hello from input.txt${EOL}` }); runWASI({ test: 'read_file_twice', diff --git a/test/wasi/wasm/readdir.wasm b/test/wasi/wasm/readdir.wasm new file mode 100755 index 0000000000000000000000000000000000000000..ce6cb4999524db243ef569120258fff2a8c23a9f GIT binary patch literal 36298 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�W0n)&bCmBd7Cs-1&}o zzU%0*yWX9hy!XCSr;p5k=$82pp^Hc6FW)kM*`bnXYH;?E)4}QjW}H1jHWg%FovVGN zJP7IkU;Td$yaf(que;jwcjXqJyEN-o+M%;lOl=;z!b3!PTP^bM(CwPHE(7O(0~Fc- AivR!s literal 0 HcmV?d00001