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:
committed by
Facebook Github Bot
parent
f4fdeef692
commit
0a5df48639
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user