summaryrefslogtreecommitdiffstats
path: root/services/common/tests/unit/test_async_foreach.js
diff options
context:
space:
mode:
Diffstat (limited to 'services/common/tests/unit/test_async_foreach.js')
-rw-r--r--services/common/tests/unit/test_async_foreach.js88
1 files changed, 88 insertions, 0 deletions
diff --git a/services/common/tests/unit/test_async_foreach.js b/services/common/tests/unit/test_async_foreach.js
new file mode 100644
index 0000000000..14a23e7ff7
--- /dev/null
+++ b/services/common/tests/unit/test_async_foreach.js
@@ -0,0 +1,88 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const { Async } = ChromeUtils.importESModule(
+ "resource://services-common/async.sys.mjs"
+);
+const { sinon } = ChromeUtils.importESModule(
+ "resource://testing-common/Sinon.sys.mjs"
+);
+
+function makeArray(length) {
+ // Start at 1 so that we can just divide by yieldEvery to get the expected
+ // call count. (we exp)
+ return Array.from({ length }, (v, i) => i + 1);
+}
+
+// Adjust if we ever change the default.
+const DEFAULT_YIELD_EVERY = 50;
+
+add_task(async function testYields() {
+ let spy = sinon.spy(Async, "promiseYield");
+ try {
+ await Async.yieldingForEach(makeArray(DEFAULT_YIELD_EVERY * 2), element => {
+ // The yield will happen *after* this function is ran.
+ Assert.equal(
+ spy.callCount,
+ Math.floor((element - 1) / DEFAULT_YIELD_EVERY)
+ );
+ });
+ } finally {
+ spy.restore();
+ }
+});
+
+add_task(async function testExistingYieldState() {
+ const yieldState = Async.yieldState(DEFAULT_YIELD_EVERY);
+
+ for (let i = 0; i < 15; i++) {
+ Assert.equal(yieldState.shouldYield(), false);
+ }
+
+ let spy = sinon.spy(Async, "promiseYield");
+
+ try {
+ await Async.yieldingForEach(
+ makeArray(DEFAULT_YIELD_EVERY * 2),
+ element => {
+ Assert.equal(
+ spy.callCount,
+ Math.floor((element + 15 - 1) / DEFAULT_YIELD_EVERY)
+ );
+ },
+ yieldState
+ );
+ } finally {
+ spy.restore();
+ }
+});
+
+add_task(async function testEarlyReturn() {
+ let lastElement = 0;
+ await Async.yieldingForEach(makeArray(DEFAULT_YIELD_EVERY), element => {
+ lastElement = element;
+ return element === 10;
+ });
+
+ Assert.equal(lastElement, 10);
+});
+
+add_task(async function testEaryReturnAsync() {
+ let lastElement = 0;
+ await Async.yieldingForEach(makeArray(DEFAULT_YIELD_EVERY), async element => {
+ lastElement = element;
+ return element === 10;
+ });
+
+ Assert.equal(lastElement, 10);
+});
+
+add_task(async function testEarlyReturnPromise() {
+ let lastElement = 0;
+ await Async.yieldingForEach(makeArray(DEFAULT_YIELD_EVERY), element => {
+ lastElement = element;
+ return new Promise(resolve => resolve(element === 10));
+ });
+
+ Assert.equal(lastElement, 10);
+});