Skip to content

Commit

Permalink
[test] Add js-api tests (WebAssembly#114)
Browse files Browse the repository at this point in the history
This tests the `WebAssembly.Memory` constructor and the `grow` method.

* Memory.buffer should be frozen and not extensible when shared
* Don't check isFrozen during grow (constructor test is sufficient)
* Don't check stray argument in shared memory detach test
  • Loading branch information
binji authored Jan 25, 2019
1 parent 0890745 commit 0b80037
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 4 deletions.
31 changes: 28 additions & 3 deletions test/js-api/memory/constructor.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,18 @@ function assert_Memory(memory, expected) {

// https://github.com/WebAssembly/spec/issues/840
assert_equals(memory.buffer, memory.buffer, "buffer should be idempotent");
assert_equals(Object.getPrototypeOf(memory.buffer), ArrayBuffer.prototype,
"prototype of buffer");
assert_true(Object.isExtensible(memory.buffer), "buffer extensibility");
const isShared = !!expected.shared;
const bufferType = isShared ? self.SharedArrayBuffer : ArrayBuffer;
assert_equals(Object.getPrototypeOf(memory.buffer), bufferType.prototype,
'prototype of buffer');
assert_equals(memory.buffer.byteLength, 0x10000 * expected.size, "size of buffer");
if (expected.size > 0) {
const array = new Uint8Array(memory.buffer);
assert_equals(array[0], 0, "first element of buffer");
assert_equals(array[array.byteLength - 1], 0, "last element of buffer");
}
assert_equals(isShared, Object.isFrozen(memory.buffer), "buffer frozen");
assert_not_equals(Object.isExtensible(memory.buffer), isShared, "buffer extensibility");
}

test(() => {
Expand Down Expand Up @@ -83,6 +86,10 @@ test(() => {
assert_throws(new RangeError(), () => new WebAssembly.Memory({ "initial": 10, "maximum": 9 }));
}, "Initial value exceeds maximum");

test(() => {
assert_throws(new TypeError(), () => new WebAssembly.Memory({ "initial": 10, "shared": true }));
}, "Shared memory without maximum");

test(() => {
const proxy = new Proxy({}, {
has(o, x) {
Expand Down Expand Up @@ -118,13 +125,25 @@ test(() => {
},
};
},

get shared() {
order.push("shared");
return {
valueOf() {
order.push("shared valueOf");
return true;
},
};
},
});

assert_array_equals(order, [
"initial",
"initial valueOf",
"maximum",
"maximum valueOf",
"shared",
"shared valueOf",
]);
}, "Order of evaluation for descriptor");

Expand All @@ -145,3 +164,9 @@ test(() => {
const memory = new WebAssembly.Memory(argument, {});
assert_Memory(memory, { "size": 0 });
}, "Stray argument");

test(() => {
const argument = { "initial": 4, "maximum": 10, shared: true };
const memory = new WebAssembly.Memory(argument);
assert_Memory(memory, { "size": 4, "shared": true });
}, "Shared memory");
29 changes: 28 additions & 1 deletion test/js-api/memory/grow.any.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

function assert_ArrayBuffer(actual, expected, message) {
// https://github.com/WebAssembly/spec/issues/840
assert_equals(Object.getPrototypeOf(actual), ArrayBuffer.prototype,
const bufferType = expected.shared ? self.SharedArrayBuffer : ArrayBuffer;
assert_equals(Object.getPrototypeOf(actual), bufferType.prototype,
`${message}: prototype`);
if (expected.detached) {
// https://github.com/tc39/ecma262/issues/678
Expand Down Expand Up @@ -183,3 +184,29 @@ test(() => {
assert_ArrayBuffer(oldMemory, { "detached": true }, "Old buffer after growing");
assert_ArrayBuffer(newMemory, { "size": 2 }, "New buffer after growing");
}, "Stray argument");

test(() => {
const argument = { "initial": 1, "maximum": 2, "shared": true };
const memory = new WebAssembly.Memory(argument);
const oldMemory = memory.buffer;
assert_ArrayBuffer(oldMemory, { "size": 1, "shared": true }, "Buffer before growing");

const result = memory.grow(1);
assert_equals(result, 1);

const newMemory = memory.buffer;
assert_not_equals(oldMemory, newMemory);
assert_ArrayBuffer(oldMemory, { "size": 1, "shared": true }, "Old buffer after growing");
assert_ArrayBuffer(newMemory, { "size": 2, "shared": true }, "New buffer after growing");

// The old and new buffers must have the same value for the
// [[ArrayBufferData]] internal slot.
const oldArray = new Uint8Array(oldMemory);
const newArray = new Uint8Array(newMemory);
assert_equals(oldArray[0], 0, "old first element");
assert_equals(newArray[0], 0, "new first element");
oldArray[0] = 1;
assert_equals(oldArray[0], 1, "old first element");
assert_equals(newArray[0], 1, "new first element");

}, "Growing shared memory does not detach old buffer");

0 comments on commit 0b80037

Please sign in to comment.