1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 23:34:47 -05:00

fix: async ops sanitizer false positives in timers (#4602)

This commit is contained in:
Bartek Iwańczuk 2020-04-03 19:20:36 +02:00 committed by GitHub
parent efb022a50c
commit 3f489ae1ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 6 deletions

View file

@ -14,6 +14,12 @@ const GREEN_OK = green("ok");
const YELLOW_IGNORED = yellow("ignored"); const YELLOW_IGNORED = yellow("ignored");
const disabledConsole = new Console((): void => {}); const disabledConsole = new Console((): void => {});
function delay(n: number): Promise<void> {
return new Promise((resolve: () => void, _) => {
setTimeout(resolve, n);
});
}
function formatDuration(time = 0): string { function formatDuration(time = 0): string {
const timeStr = `(${time}ms)`; const timeStr = `(${time}ms)`;
return gray(italic(timeStr)); return gray(italic(timeStr));
@ -28,6 +34,10 @@ function assertOps(fn: () => void | Promise<void>): () => void | Promise<void> {
return async function asyncOpSanitizer(): Promise<void> { return async function asyncOpSanitizer(): Promise<void> {
const pre = metrics(); const pre = metrics();
await fn(); await fn();
// Defer until next event loop turn - that way timeouts and intervals
// cleared can actually be removed from resource table, otherwise
// false positives may occur (https://github.com/denoland/deno/issues/4591)
await delay(0);
const post = metrics(); const post = metrics();
// We're checking diff because one might spawn HTTP server in the background // We're checking diff because one might spawn HTTP server in the background
// that will be a pending async op before test starts. // that will be a pending async op before test starts.

View file

@ -130,9 +130,6 @@ unitTest(
assertEquals(c, 3); assertEquals(c, 3);
clearInterval(t); clearInterval(t);
// Defer for a moment to allow async op from `setInterval` to resolve;
// for more explanation see `FIXME` in `cli/js/timers.ts::setGlobalTimeout`
await defer(20);
await resolvable; await resolvable;
} }
); );
@ -153,9 +150,6 @@ unitTest(
sig.dispose(); sig.dispose();
clearInterval(t); clearInterval(t);
// Defer for a moment to allow async op from `setInterval` to resolve;
// for more explanation see `FIXME` in `cli/js/timers.ts::setGlobalTimeout`
await defer(20);
await resolvable; await resolvable;
} }
); );