diff --git a/test/wasi/c/poll.c b/test/wasi/c/poll.c index 6b6ef71fd6..9afb6325a9 100644 --- a/test/wasi/c/poll.c +++ b/test/wasi/c/poll.c @@ -2,11 +2,38 @@ #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}; @@ -16,16 +43,31 @@ int main(void) { assert(fds[0].revents == POLLOUT); assert(fds[1].revents == POLLOUT); - 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); + // 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}; - sleep(1); - time(&now); - assert(now - before >= 3); + 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}; + ret = poll(fds, 1, 2000); + assert(ret == 1); + + 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 89d8f73d68..e4bd44e83d 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 90b39c502e..37e17b8d88 100755 Binary files a/test/wasi/wasm/poll.wasm and b/test/wasi/wasm/poll.wasm differ