From 047ed0a830ca6d22c17e803c8827e7863c7b1e6b Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 14 Dec 2019 20:59:04 -0500 Subject: [PATCH 1/2] test: improve WASI start() coverage This commit adds additional test cases to test-wasi-start-validation.js, which gets the JS test coverage of start() to 100%. --- test/wasi/test-wasi-start-validation.js | 67 ++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/test/wasi/test-wasi-start-validation.js b/test/wasi/test-wasi-start-validation.js index 80fc035d7c9826..1750b46821e233 100644 --- a/test/wasi/test-wasi-start-validation.js +++ b/test/wasi/test-wasi-start-validation.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const { WASI } = require('wasi'); @@ -29,3 +29,68 @@ const fixtures = require('../common/fixtures'); ); })(); } + +(async () => { + const wasi = new WASI(); + const bufferSource = fixtures.readSync('simple.wasm'); + const wasm = await WebAssembly.compile(bufferSource); + const instance = await WebAssembly.instantiate(wasm); + const values = [undefined, null, 'foo', 42, true, false, () => {}]; + let cnt = 0; + + // Mock instance.exports to trigger start() validation. + Object.defineProperty(instance, 'exports', { + get() { return values[cnt++]; } + }); + + values.forEach((val) => { + assert.throws( + () => { wasi.start(instance); }, + { code: 'ERR_INVALID_ARG_TYPE', message: /\binstance\.exports\b/ } + ); + }); +})(); + +(async () => { + const wasi = new WASI(); + const bufferSource = fixtures.readSync('simple.wasm'); + const wasm = await WebAssembly.compile(bufferSource); + const instance = await WebAssembly.instantiate(wasm); + + // Mock instance.exports.memory to bypass start() validation. + Object.defineProperty(instance, 'exports', { + get() { + return { + memory: new WebAssembly.Memory({ initial: 1 }) + }; + } + }); + + wasi.start(instance); + assert.throws( + () => { wasi.start(instance); }, + { + code: 'ERR_WASI_ALREADY_STARTED', + message: /^WASI instance has already started$/ + } + ); +})(); + +(async () => { + const wasi = new WASI(); + const bufferSource = fixtures.readSync('simple.wasm'); + const wasm = await WebAssembly.compile(bufferSource); + const instance = await WebAssembly.instantiate(wasm); + + // Mock instance.exports to bypass start() validation. + Object.defineProperty(instance, 'exports', { + get() { + return { + memory: new WebAssembly.Memory({ initial: 1 }), + __wasi_unstable_reactor_start: common.mustCall() + }; + } + }); + + wasi.start(instance); +})(); From f5540d594196ef9ff96ef13626e3c25fd61730c0 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 14 Dec 2019 21:05:27 -0500 Subject: [PATCH 2/2] test: simplify test-wasi-start-validation.js This commit removes an extra block scope, and avoid reading the simple.wasm file for every test case. --- test/wasi/test-wasi-start-validation.js | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/test/wasi/test-wasi-start-validation.js b/test/wasi/test-wasi-start-validation.js index 1750b46821e233..c29fcb9715953b 100644 --- a/test/wasi/test-wasi-start-validation.js +++ b/test/wasi/test-wasi-start-validation.js @@ -5,6 +5,7 @@ const assert = require('assert'); const { WASI } = require('wasi'); const fixtures = require('../common/fixtures'); +const bufferSource = fixtures.readSync('simple.wasm'); { const wasi = new WASI(); @@ -16,23 +17,19 @@ const fixtures = require('../common/fixtures'); ); } -{ +(async () => { const wasi = new WASI({}); - (async () => { - const bufferSource = fixtures.readSync('simple.wasm'); - const wasm = await WebAssembly.compile(bufferSource); - const instance = await WebAssembly.instantiate(wasm); + const wasm = await WebAssembly.compile(bufferSource); + const instance = await WebAssembly.instantiate(wasm); - assert.throws( - () => { wasi.start(instance); }, - { code: 'ERR_INVALID_ARG_TYPE', message: /\bWebAssembly\.Memory\b/ } - ); - })(); -} + assert.throws( + () => { wasi.start(instance); }, + { code: 'ERR_INVALID_ARG_TYPE', message: /\bWebAssembly\.Memory\b/ } + ); +})(); (async () => { const wasi = new WASI(); - const bufferSource = fixtures.readSync('simple.wasm'); const wasm = await WebAssembly.compile(bufferSource); const instance = await WebAssembly.instantiate(wasm); const values = [undefined, null, 'foo', 42, true, false, () => {}]; @@ -53,7 +50,6 @@ const fixtures = require('../common/fixtures'); (async () => { const wasi = new WASI(); - const bufferSource = fixtures.readSync('simple.wasm'); const wasm = await WebAssembly.compile(bufferSource); const instance = await WebAssembly.instantiate(wasm); @@ -78,7 +74,6 @@ const fixtures = require('../common/fixtures'); (async () => { const wasi = new WASI(); - const bufferSource = fixtures.readSync('simple.wasm'); const wasm = await WebAssembly.compile(bufferSource); const instance = await WebAssembly.instantiate(wasm);