diff --git a/test/wasi/c/poll.c b/test/wasi/c/poll.c index 6b6ef71fd68c3b..9afb6325a98a03 100644 --- a/test/wasi/c/poll.c +++ b/test/wasi/c/poll.c @@ -2,30 +2,72 @@ #include #include #include +#include +#include int main(void) { - struct pollfd fds[2]; + struct pollfd fds[4]; time_t before, now; int ret; + char* platform; + int is_aix; + int is_win; + platform = getenv("NODE_PLATFORM"); + is_aix = platform != NULL && 0 == strcmp(platform, "aix"); + is_win = platform != NULL && 0 == strcmp(platform, "win32"); + + // Test sleep() behavior. + time(&before); + sleep(1); + time(&now); + assert(now - before >= 1); + + // Test poll() timeout behavior. + fds[0] = (struct pollfd){.fd = -1, .events = 0, .revents = 0}; + time(&before); + ret = poll(fds, 1, 2000); + time(&now); + assert(ret == 0); + assert(now - before >= 2); + + // The rest of the test is unsupported on Windows. + if (is_win) + return 0; + + fds[0] = (struct pollfd){.fd = 1, .events = POLLOUT, .revents = 0}; + fds[1] = (struct pollfd){.fd = 2, .events = POLLOUT, .revents = 0}; + + ret = poll(fds, 2, -1); + assert(ret == 2); + assert(fds[0].revents == POLLOUT); + assert(fds[1].revents == POLLOUT); + + // Make a poll() call with duplicate file descriptors. fds[0] = (struct pollfd){.fd = 1, .events = POLLOUT, .revents = 0}; fds[1] = (struct pollfd){.fd = 2, .events = POLLOUT, .revents = 0}; + fds[2] = (struct pollfd){.fd = 1, .events = POLLOUT, .revents = 0}; + fds[3] = (struct pollfd){.fd = 1, .events = POLLIN, .revents = 0}; ret = poll(fds, 2, -1); assert(ret == 2); assert(fds[0].revents == POLLOUT); assert(fds[1].revents == POLLOUT); + assert(fds[2].revents == 0); + assert(fds[3].revents == 0); + // The original version of this test expected a timeout and return value of + // zero. In the Node test suite, STDIN is not a TTY, and poll() returns one, + // with revents = POLLHUP | POLLIN, except on AIX whose poll() does not + // support POLLHUP. fds[0] = (struct pollfd){.fd = 0, .events = POLLIN, .revents = 0}; - time(&before); ret = poll(fds, 1, 2000); - time(&now); - assert(ret == 0); - assert(now - before >= 2); + assert(ret == 1); - sleep(1); - time(&now); - assert(now - before >= 3); + if (is_aix) + assert(fds[0].revents == POLLIN); + else + assert(fds[0].revents == (POLLHUP | POLLIN)); return 0; } diff --git a/test/wasi/test-wasi.js b/test/wasi/test-wasi.js index 89d8f73d684833..e4bd44e83d186c 100644 --- a/test/wasi/test-wasi.js +++ b/test/wasi/test-wasi.js @@ -38,7 +38,13 @@ if (process.argv[2] === 'wasi-child') { function runWASI(options) { console.log('executing', options.test); - const opts = { env: { ...process.env, NODE_DEBUG_NATIVE: 'wasi' } }; + const opts = { + env: { + ...process.env, + NODE_DEBUG_NATIVE: 'wasi', + NODE_PLATFORM: process.platform + } + }; if (options.stdin !== undefined) opts.input = options.stdin; @@ -75,7 +81,7 @@ if (process.argv[2] === 'wasi-child') { runWASI({ test: 'link' }); runWASI({ test: 'main_args' }); runWASI({ test: 'notdir' }); - // runWASI({ test: 'poll' }); + runWASI({ test: 'poll' }); runWASI({ test: 'preopen_populates' }); runWASI({ test: 'read_file', stdout: `hello from input.txt${EOL}` }); runWASI({ diff --git a/test/wasi/wasm/poll.wasm b/test/wasi/wasm/poll.wasm index 90b39c502ef4db..37e17b8d880ad2 100755 Binary files a/test/wasi/wasm/poll.wasm and b/test/wasi/wasm/poll.wasm differ