From b5b416d73e4568178bef7ad8f92da653947aeb66 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sun, 2 Feb 2020 13:15:10 -0500 Subject: [PATCH] test: add WASI test for file resizing This commit adds a WASI test to cover the following functions: - __wasi_fd_filestat_set_size() - __wasi_fd_tell() PR-URL: https://github.com/nodejs/node/pull/31617 Reviewed-By: James M Snell Reviewed-By: Daniel Bevenius Reviewed-By: Anna Henningsen --- test/wasi/c/ftruncate.c | 39 ++++++++++++++++++++++++++++++++++ test/wasi/test-wasi.js | 1 + test/wasi/wasm/ftruncate.wasm | Bin 0 -> 34111 bytes 3 files changed, 40 insertions(+) create mode 100644 test/wasi/c/ftruncate.c create mode 100755 test/wasi/wasm/ftruncate.wasm diff --git a/test/wasi/c/ftruncate.c b/test/wasi/c/ftruncate.c new file mode 100644 index 00000000000000..cf41802a01faf6 --- /dev/null +++ b/test/wasi/c/ftruncate.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include + +#define BASE_DIR "/tmp" +#define OUTPUT_DIR BASE_DIR "/testdir" +#define PATH OUTPUT_DIR "/output.txt" + +int main(void) { + struct stat st; + int fd; + + (void)st; + assert(0 == mkdir(OUTPUT_DIR, 0755)); + + fd = open(PATH, O_CREAT | O_WRONLY, 0666); + assert(fd != -1); + + /* Verify that the file is initially empty. */ + assert(0 == fstat(fd, &st)); + assert(st.st_size == 0); + assert(0 == lseek(fd, 0, SEEK_CUR)); + + /* Increase the file size using ftruncate(). */ + assert(0 == ftruncate(fd, 500)); + assert(0 == fstat(fd, &st)); + assert(st.st_size == 500); + assert(0 == lseek(fd, 0, SEEK_CUR)); + + /* Truncate the file using ftruncate(). */ + assert(0 == ftruncate(fd, 300)); + assert(0 == fstat(fd, &st)); + assert(st.st_size == 300); + assert(0 == lseek(fd, 0, SEEK_CUR)); + + assert(0 == close(fd)); + return 0; +} diff --git a/test/wasi/test-wasi.js b/test/wasi/test-wasi.js index e4bd44e83d186c..8ebc290d7b8269 100644 --- a/test/wasi/test-wasi.js +++ b/test/wasi/test-wasi.js @@ -71,6 +71,7 @@ if (process.argv[2] === 'wasi-child') { runWASI({ test: 'exitcode', exitCode: 120 }); runWASI({ test: 'fd_prestat_get_refresh' }); runWASI({ test: 'freopen', stdout: `hello from input2.txt${EOL}` }); + runWASI({ test: 'ftruncate' }); runWASI({ test: 'getentropy' }); // Tests that are currently unsupported on IBM i PASE. diff --git a/test/wasi/wasm/ftruncate.wasm b/test/wasi/wasm/ftruncate.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a16e90d98ddb289bc87399df25e44c9f1b71519a GIT binary patch literal 34111 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�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 literal 0 HcmV?d00001