From 099c921f406e3ae1ff47054c7cd6a48fc775c5c0 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Fri, 17 Jan 2020 21:27:05 -0500 Subject: [PATCH] test: add wasi test for symlink() and readlink() This test provides missing coverage for __wasi_path_symlink() and __wasi_path_readlink(). PR-URL: https://github.com/nodejs/node/pull/31403 Reviewed-By: Jiawen Geng Reviewed-By: David Carlier Reviewed-By: Rich Trott --- test/wasi/c/create_symlink.c | 26 ++++++++++++++++++++++++++ test/wasi/test-wasi-symlinks.js | 1 + test/wasi/wasm/create_symlink.wasm | Bin 0 -> 35660 bytes 3 files changed, 27 insertions(+) create mode 100644 test/wasi/c/create_symlink.c create mode 100755 test/wasi/wasm/create_symlink.wasm diff --git a/test/wasi/c/create_symlink.c b/test/wasi/c/create_symlink.c new file mode 100644 index 00000000000000..094484ee7db745 --- /dev/null +++ b/test/wasi/c/create_symlink.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include + +int main() { + const char* target = "./input.txt"; + const char* linkpath = "/sandbox/subdir/test_link"; + char readlink_result[128]; + size_t result_size = sizeof(readlink_result); + + assert(0 == symlink(target, linkpath)); + assert(readlink(linkpath, readlink_result, result_size) == + strlen(target) + 1); + assert(0 == strcmp(readlink_result, target)); + + FILE* file = fopen(linkpath, "r"); + assert(file != NULL); + + int c = fgetc(file); + while (c != EOF) { + int wrote = fputc(c, stdout); + assert(wrote != EOF); + c = fgetc(file); + } +} diff --git a/test/wasi/test-wasi-symlinks.js b/test/wasi/test-wasi-symlinks.js index f6e4d90820ebce..d1ec796125cb53 100644 --- a/test/wasi/test-wasi-symlinks.js +++ b/test/wasi/test-wasi-symlinks.js @@ -74,6 +74,7 @@ if (process.argv[2] === 'wasi-child') { assert.strictEqual(child.stdout.toString(), options.stdout || ''); } + runWASI({ test: 'create_symlink', stdout: 'hello from input.txt' }); runWASI({ test: 'follow_symlink', stdout: 'hello from input.txt' }); runWASI({ test: 'symlink_escape' }); runWASI({ test: 'symlink_loop' }); diff --git a/test/wasi/wasm/create_symlink.wasm b/test/wasi/wasm/create_symlink.wasm new file mode 100755 index 0000000000000000000000000000000000000000..1612e975d87e5d3a3e0182bad86f171037c3c5f5 GIT binary patch literal 35660 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