diff options
Diffstat (limited to 'js/src/jit-test/tests/wasm/streaming.js')
-rw-r--r-- | js/src/jit-test/tests/wasm/streaming.js | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/streaming.js b/js/src/jit-test/tests/wasm/streaming.js new file mode 100644 index 0000000000..d87abe37be --- /dev/null +++ b/js/src/jit-test/tests/wasm/streaming.js @@ -0,0 +1,99 @@ +// |jit-test| skip-if: !wasmStreamingEnabled() + +load(libdir + "wasm-binary.js"); + +function testInstantiate(source, importObj, exportName, expectedValue) { + var result; + WebAssembly.instantiateStreaming(code, importObj).then(r => { result = r }); + drainJobQueue(); + assertEq(result !== undefined, true); + assertEq(result.module instanceof WebAssembly.Module, true); + assertEq(result.instance instanceof WebAssembly.Instance, true); + assertEq(result.instance.exports[exportName](), expectedValue); +} +function testBoth(source, exportName, expectedValue) { + var module; + WebAssembly.compileStreaming(code).then(m => { module = m }); + drainJobQueue(); + assertEq(module !== undefined, true); + assertEq(module instanceof WebAssembly.Module, true); + assertEq(new WebAssembly.Instance(module).exports[exportName](), expectedValue); + + testInstantiate(source, undefined, exportName, expectedValue); +} + +function testFailInstantiate(source, importObj, error) { + var caught = false; + WebAssembly.instantiateStreaming(source).catch(err => { + assertEq(err instanceof error, true); + caught = true; + }); + drainJobQueue(); + assertEq(caught, true); +} +function testFailBoth(source, error) { + var caught = false; + WebAssembly.compileStreaming(source).catch(err => { + assertEq(err instanceof error, true); + caught = true; + }); + drainJobQueue(); + assertEq(caught, true); + + testFailInstantiate(source, undefined, error); +} + +var code = wasmTextToBinary('(module (func (export "run") (result i32) i32.const 42))'); +testBoth(code, 'run', 42); +testFailBoth(42, TypeError); +testBoth(Promise.resolve(code), 'run', 42); +testFailBoth(Promise.resolve(42), TypeError); +testFailBoth(Promise.reject(new String("fail")), String); +testBoth({then(resolve) { resolve(code) }}, 'run', 42); +testFailBoth({then(resolve) { resolve(42) }}, TypeError); +testFailBoth(new Promise((resolve, reject) => { reject(new Error("hi")) }), Error); +testFailBoth(new Promise((resolve, reject) => { reject(new String("hi")) }), String); + +var code = wasmTextToBinary('(module (func $im (import "js" "foo") (result i32)) (func (export "run") (result i32) (i32.add (i32.const 1) (call $im))))'); +testInstantiate(code, {js:{foo() { return 42 }}}, 'run', 43); +testFailInstantiate(code, null, TypeError); +testFailInstantiate(code, {js:42}, TypeError); +testFailInstantiate(code, {js:{foo:42}}, TypeError); + +var text = `(module\n`; +text += ` (func (result i32) i32.const 0)\n`; +for (var i = 1; i <= 200; i++) + text += ` (func (result i32) (i32.add (i32.const ${i}) (call ${i-1})))\n`; +text += ` (func (export "run") (result i32) call 100)\n`; +text += `)`; +var code = wasmTextToBinary(text); + +// fuzzing-safe disables setBufferStreamParams +if (typeof setBufferStreamParams == 'function') { + assertEq(code.length > 1000, true); + for ([delayMillis, chunkSize] of [[0, 10], [1, 10], [0, 100], [1, 100], [0, 1000], [1, 1000], [10, 1000]]) { + setBufferStreamParams(delayMillis, chunkSize); + testBoth(code, 'run', 5050); + } + + setBufferStreamParams(1, 100); + var arr = []; + for (var i = 0; i < 10; i++) + arr.push(WebAssembly.instantiateStreaming(code)); + var results; + Promise.all(arr).then(r => results = r); + drainJobQueue(); + assertEq(results.length === 10, true); + for (var i = 0; i < 10; i++) + assertEq(results[i].instance.exports.run(), 5050); +} + +// No code section, but data section: +var code = wasmTextToBinary('(module (memory (import "js" "mem") 1) (data (i32.const 0) "a"))'); +var mem = new WebAssembly.Memory({initial:1}); +WebAssembly.instantiateStreaming(code, {js:{mem}}); +drainJobQueue(); +assertEq(new Uint8Array(mem.buffer)[0], 97); + +// Junk section before code section. +testFailBoth(moduleWithSections([{name: 100, body: [1, 2, 3]}, bodySection([])]), WebAssembly.CompileError); |