/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const { setTimeout } = ChromeUtils.importESModule(
"resource://gre/modules/Timer.sys.mjs"
);
const { AsyncQueue } = ChromeUtils.importESModule(
"chrome://remote/content/shared/AsyncQueue.sys.mjs"
);
function sleep(delay = 100) {
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
return new Promise(resolve => setTimeout(resolve, delay));
}
add_task(async
function test_enqueueSyncTask() {
let value =
"";
const queue =
new AsyncQueue();
await Promise.all([
queue.enqueue(() => (value +=
"foo")),
queue.enqueue(() => (value +=
"bar")),
]);
equal(value,
"foobar",
"Tasks run in the correct order");
});
add_task(async
function test_enqueueAsyncTask() {
let value =
"";
const queue =
new AsyncQueue();
await Promise.all([
queue.enqueue(async () => {
await sleep(100);
value +=
"foo";
}),
queue.enqueue(async () => {
await sleep(10);
value +=
"bar";
}),
]);
equal(value,
"foobar",
"Tasks run in the correct order");
});
add_task(async
function test_enqueueAsyncTask() {
let value =
"";
const queue =
new AsyncQueue();
const promises = Promise.all([
queue.enqueue(async () => {
await sleep(100);
value +=
"foo";
}),
queue.enqueue(async () => {
await sleep(10);
value +=
"bar";
}),
]);
const promise = queue.enqueue(async () => (value +=
"42"));
await promise;
await promises;
equal(value,
"foobar42",
"Tasks run in the correct order");
});
add_task(async
function test_returnValue() {
const queue =
new AsyncQueue();
const results = await Promise.all([
queue.enqueue(() =>
"foo"),
queue.enqueue(() => 42),
]);
equal(results[0],
"foo",
"First task returned correct value");
equal(results[1], 42,
"Second task returned correct value");
});
add_task(async
function test_enqueueErroneousTasks() {
const queue =
new AsyncQueue();
await
Assert.rejects(
queue.enqueue(() => {
throw new Error(
"invalid");
}),
/Error: invalid/,
"Expected error was returned"
);
await
Assert.rejects(
queue.enqueue(async () => {
throw new Error(
"invalid");
}),
/Error: invalid/,
"Expected error was returned"
);
});