diff --git a/test/built-ins/Atomics/wait/cannot-suspend-throws.js b/test/built-ins/Atomics/wait/cannot-suspend-throws.js new file mode 100644 index 0000000000000000000000000000000000000000..c5ec687b29841d35f9505d49eb24e128a235eea2 --- /dev/null +++ b/test/built-ins/Atomics/wait/cannot-suspend-throws.js @@ -0,0 +1,25 @@ +// Copyright (C) 2018 Amal Hussein. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-atomics.wait +description: > + Atomics.wait throws if agent cannot be suspended, CanBlock is false +info: | + Assuming [[CanBlock]] is false for the main host. + + Atomics.wait( typedArray, index, value, timeout ) + + ... (after args validation) + 6. Let B be AgentCanSuspend(). + 7. If B is false, throw a TypeError exception. + ... +features: [Atomics, SharedArrayBuffer, TypedArray] +---*/ + +var sab = new SharedArrayBuffer(4); +var int32Array = new Int32Array(sab); + +assert.throws(TypeError, function() { + Atomics.wait(int32Array, 0, 0, 0); +}); diff --git a/test/built-ins/Atomics/wait/datablock-bufferdata-throws.js b/test/built-ins/Atomics/wait/datablock-bufferdata-throws.js index 88898db582672bef1203703189e758989cefd394..640550c0b20827951daf9370cd24a196684d8987 100644 --- a/test/built-ins/Atomics/wait/datablock-bufferdata-throws.js +++ b/test/built-ins/Atomics/wait/datablock-bufferdata-throws.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-atomics.wait -description: +description: > Throws a TypeError if typedArray.buffer is not a SharedArrayBuffer info: | Atomics.wait( typedArray, index, value, timeout ) diff --git a/test/built-ins/Atomics/wait/index-symbol-throws.js b/test/built-ins/Atomics/wait/index-symbol-throws.js index 497c0788e6bf5b5827bf5504c3671e8a54d2d164..e391fcc4c3f4b3ce2108687d238dfcd7ab86ac9a 100644 --- a/test/built-ins/Atomics/wait/index-symbol-throws.js +++ b/test/built-ins/Atomics/wait/index-symbol-throws.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-atomics.wait -description: +description: > Throws a TypeError if index arg can not be converted to an Integer info: | Atomics.wait( typedArray, index, value, timeout ) diff --git a/test/built-ins/Atomics/wait/missing-typedarrayname-throws.js b/test/built-ins/Atomics/wait/missing-typedarrayname-throws.js index db301c5971d362703caa030e204b0133e040425d..7c1fbae1bc9072249e0357b1a4914b2a16516b4c 100644 --- a/test/built-ins/Atomics/wait/missing-typedarrayname-throws.js +++ b/test/built-ins/Atomics/wait/missing-typedarrayname-throws.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-atomics.wait -description: +description: > Throws a TypeError if the typedArray arg is not a TypedArray object info: | Atomics.wait( typedArray, index, value, timeout ) diff --git a/test/built-ins/Atomics/wait/negative-index-throws.js b/test/built-ins/Atomics/wait/negative-index-throws.js index 7a8f2310e0bb55b52e9219662b78a0fb3bc5160f..d46d1addba173a2fdcda134de718c73b1dc5764f 100644 --- a/test/built-ins/Atomics/wait/negative-index-throws.js +++ b/test/built-ins/Atomics/wait/negative-index-throws.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-atomics.wait -description: +description: > Throws a RangeError is index < 0 info: | Atomics.wait( typedArray, index, value, timeout ) diff --git a/test/built-ins/Atomics/wait/not-an-object-throws.js b/test/built-ins/Atomics/wait/not-an-object-throws.js index bcb67dd52e159033baf59892a51ac64be78afb38..39d564586ccc5844d4f40de79cfe38d27e780c8d 100644 --- a/test/built-ins/Atomics/wait/not-an-object-throws.js +++ b/test/built-ins/Atomics/wait/not-an-object-throws.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-atomics.wait -description: +description: > Throws a TypeError if typedArray arg is not an Object info: | Atomics.wait( typedArray, index, value, timeout ) diff --git a/test/built-ins/Atomics/wait/null-bufferdata-throws.js b/test/built-ins/Atomics/wait/null-bufferdata-throws.js index 804e0b4d3ef3c83b504d95bb27e77e12937e5fc5..9dc142b0c27f7ab6826636422e27293c4429a39d 100644 --- a/test/built-ins/Atomics/wait/null-bufferdata-throws.js +++ b/test/built-ins/Atomics/wait/null-bufferdata-throws.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-atomics.wait -description: +description: > A null value for bufferData throws a TypeError info: | Atomics.wait( typedArray, index, value, timeout ) diff --git a/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js b/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js index 3274028197f6e6dbd00032012aed6e085cb5d0e9..c0eb33eb426ea31f857a926f6effbd255ada6b65 100644 --- a/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js +++ b/test/built-ins/Atomics/wait/undefined-index-defaults-to-zero.js @@ -2,7 +2,7 @@ // This code is governed by the BSD license found in the LICENSE file. /*--- esid: sec-atomics.wait -description: +description: > An undefined index arg should translate to 0 info: | Atomics.wait( typedArray, index, value, timeout ) diff --git a/test/built-ins/Atomics/wait/was-woken-before-timeout.js b/test/built-ins/Atomics/wait/was-woken-before-timeout.js new file mode 100644 index 0000000000000000000000000000000000000000..844dc2fe827ce6a7a7c0aa3dbabf1ff5aa06cbb8 --- /dev/null +++ b/test/built-ins/Atomics/wait/was-woken-before-timeout.js @@ -0,0 +1,55 @@ +// Copyright (C) 2018 Amal Hussein. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-atomics.wait +description: > + Test that Atomics.wait returns the right result when it was awoken before + a timeout +info: | + Atomics.wait( typedArray, index, value, timeout ) + + 2.Let i be ? ValidateAtomicAccess(typedArray, index). + ... + 2.Let accessIndex be ? ToIndex(requestIndex). + + 9.If IsSharedArrayBuffer(buffer) is false, throw a TypeError exception. + ... + 3.If bufferData is a Data Block, return false + + If value is undefined, then + Let index be 0. +features: [Atomics, SharedArrayBuffer, TypedArray] +---*/ + +var timeout = 20000; +$262.agent.start( + ` + $262.agent.receiveBroadcast(function (sab) { + var int32Array = new Int32Array(sab); + $262.agent.report(Atomics.wait(int32Array, 0, 0, ${timeout})); + $262.agent.leaving(); + }) + `); + + var sab = new SharedArrayBuffer(4); + var int32Array = new Int32Array(sab); + + var sleeping = 100; + + $262.agent.broadcast(int32Array.buffer); + $262.agent.sleep(sleeping); + + assert.sameValue(Atomics.wake(int32Array, 0), 1); + + assert.sameValue(getReport(), "ok"); + assert.sameValue(sleeping < timeout, "this test assumes it won't last for more than 20 seconds"); + + function getReport() { + var r; + while ((r = $262.agent.getReport()) == null) { + sleeping += 100; + $262.agent.sleep(100); + } + return r; + } + \ No newline at end of file diff --git a/test/built-ins/Atomics/wait/was-woken.js b/test/built-ins/Atomics/wait/was-woken.js index 266c4ee0e39ff149e653ef4adccc2c9ae6305070..56eeeade10a1ce50950f0682373526be694f3f63 100644 --- a/test/built-ins/Atomics/wait/was-woken.js +++ b/test/built-ins/Atomics/wait/was-woken.js @@ -25,7 +25,8 @@ assert.sameValue(getReport(), "ok"); function getReport() { var r; - while ((r = $262.agent.getReport()) == null) + while ((r = $262.agent.getReport()) == null) { $262.agent.sleep(100); + } return r; }