Introduce a Test Idler to have a remotely controlled idler

Summary:
To test things that depend on `Idler`, we would so far need to depend on timing in the unit tests, which is very error prone. So introduced a `TestIdler` as well to make sure we can create an idler we can control remotely (as demonstrated in the unit test)

Note that idler smells like generator functions all over the place, so maybe I'll take a stab later to see if we can replace idlers with generators, which gives a much clearer control flow imho.

Reviewed By: nikoant

Differential Revision: D19158369

fbshipit-source-id: 605d120860ecb02883442524df6f876e050ff092
This commit is contained in:
Michel Weststrate
2019-12-19 02:36:22 -08:00
committed by Facebook Github Bot
parent f4fdeef692
commit 0a5df48639
2 changed files with 123 additions and 9 deletions

View File

@@ -7,7 +7,8 @@
* @format
*/
import {Idler} from '../Idler.tsx';
import {Idler, TestIdler} from '../Idler.tsx';
import {sleep} from '../promiseTimeout.tsx';
test('Idler should interrupt', async () => {
const idler = new Idler();
@@ -15,7 +16,9 @@ test('Idler should interrupt', async () => {
try {
for (; i < 500; i++) {
if (i == 100) {
expect(idler.shouldIdle()).toBe(false);
idler.cancel();
expect(idler.shouldIdle()).toBe(true);
}
await idler.idle();
}
@@ -24,3 +27,47 @@ test('Idler should interrupt', async () => {
expect(i).toEqual(100);
}
});
test('Idler should want to idle', async () => {
const idler = new Idler();
expect(idler.shouldIdle()).toBe(false);
await sleep(10);
expect(idler.shouldIdle()).toBe(false);
await sleep(200);
expect(idler.shouldIdle()).toBe(true);
await idler.idle();
expect(idler.shouldIdle()).toBe(false);
});
test('TestIdler can be controlled', async () => {
const idler = new TestIdler();
expect(idler.shouldIdle()).toBe(false);
expect(idler.shouldIdle()).toBe(true);
let resolved = false;
idler.idle().then(() => {
resolved = true;
});
expect(resolved).toBe(false);
await idler.next();
expect(resolved).toBe(true);
expect(idler.shouldIdle()).toBe(false);
expect(idler.shouldIdle()).toBe(true);
idler.idle();
await idler.next();
idler.cancel();
expect(idler.shouldIdle()).toBe(true);
let threw = false;
const p = idler.idle().catch(e => {
threw = true;
expect(e).toMatchInlineSnapshot(
`[CancelledPromiseError: Idler got killed]`,
);
});
await p;
expect(threw).toBe(true);
});