diff --git a/test/wasi/test-wasi-start-validation.js b/test/wasi/test-wasi-start-validation.js index 2a5cb764943f80..3f530a42f791f8 100644 --- a/test/wasi/test-wasi-start-validation.js +++ b/test/wasi/test-wasi-start-validation.js @@ -1,7 +1,7 @@ // Flags: --experimental-wasi-unstable-preview0 'use strict'; -require('../common'); +const common = require('../common'); const assert = require('assert'); const { WASI } = require('wasi'); @@ -30,3 +30,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); +})();