blob: 3fbc4e9a50fc11dda3955a25153a692188ec2641 [file] [log] [blame]
/**
* @license
* Copyright 2022 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../test/common-test-setup';
import {assertFails, waitEventLoop} from '../../test/test-utils';
import {Scheduler} from './scheduler';
import {MaxInFlightScheduler} from './max-in-flight-scheduler';
import {FakeScheduler} from './fake-scheduler';
import {assert} from '@open-wc/testing';
suite('max-in-flight scheduler', () => {
let fakeScheduler: FakeScheduler<number>;
let scheduler: Scheduler<number>;
setup(() => {
fakeScheduler = new FakeScheduler<number>();
scheduler = new MaxInFlightScheduler<number>(fakeScheduler, 2);
});
test('executes tasks', async () => {
const promise = scheduler.schedule(async () => 1);
assert.equal(fakeScheduler.scheduled.length, 1);
fakeScheduler.resolve();
assert.equal(fakeScheduler.scheduled.length, 0);
const val = await promise;
assert.equal(val, 1);
});
test('propagates errors', async () => {
const error = new Error('This is an error');
const promise = scheduler.schedule(async () => {
throw error;
});
assert.equal(fakeScheduler.scheduled.length, 1);
assertFails(promise, error);
fakeScheduler.resolve();
assert.equal(fakeScheduler.scheduled.length, 0);
await promise.catch((reason: Error) => {
assert.equal(reason, error);
});
});
test('propagates subscheduler errors', async () => {
const error = new Error('This is an error');
const promise = scheduler.schedule(async () => 1);
assert.equal(fakeScheduler.scheduled.length, 1);
assertFails(promise, error);
fakeScheduler.reject(error);
assert.equal(fakeScheduler.scheduled.length, 0);
await promise.catch((reason: Error) => {
assert.equal(reason, error);
});
});
test('allows up to 2 in flight', async () => {
for (let i = 0; i < 3; ++i) {
scheduler.schedule(async () => i);
}
assert.equal(fakeScheduler.scheduled.length, 2);
});
test('resumes when promise resolves', async () => {
for (let i = 0; i < 3; ++i) {
scheduler.schedule(async () => i);
}
assert.equal(fakeScheduler.scheduled.length, 2);
fakeScheduler.resolve();
assert.equal(fakeScheduler.scheduled.length, 1);
await waitEventLoop();
assert.equal(fakeScheduler.scheduled.length, 2);
});
test('resumes when promise fails', async () => {
for (let i = 0; i < 3; ++i) {
scheduler.schedule(async () => i);
}
assert.equal(fakeScheduler.scheduled.length, 2);
fakeScheduler.reject(new Error('Fake Error'));
assert.equal(fakeScheduler.scheduled.length, 1);
await waitEventLoop();
assert.equal(fakeScheduler.scheduled.length, 2);
});
test('eventually resumes all', async () => {
const promises = [];
for (let i = 0; i < 3; ++i) {
promises.push(scheduler.schedule(async () => i));
}
for (let i = 0; i < 3; ++i) {
fakeScheduler.resolve();
await waitEventLoop();
}
const res = await Promise.all(promises);
assert.deepEqual(res, [0, 1, 2]);
});
});