1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-21 23:04:45 -05:00

feat: provide ops details for ops sanitizer failures (#12188)

This commit is contained in:
Casper Beyer 2021-10-11 23:00:33 +08:00 committed by GitHub
parent 3b2cb8e711
commit 1683044ed9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 78 additions and 4 deletions

View file

@ -133,6 +133,12 @@ itest!(allow_none {
output: "test/allow_none.out",
});
itest!(ops_sanitizer_unstable {
args: "test --unstable test/ops_sanitizer_unstable.ts",
exit_code: 1,
output: "test/ops_sanitizer_unstable.out",
});
itest!(exit_sanitizer {
args: "test test/exit_sanitizer.ts",
output: "test/exit_sanitizer.out",

View file

@ -0,0 +1,35 @@
Check [WILDCARD]/testdata/test/ops_sanitizer_unstable.ts
running 2 tests from [WILDCARD]/testdata/test/ops_sanitizer_unstable.ts
test no-op ... ok ([WILDCARD])
test leak interval ... FAILED ([WILDCARD])
failures:
leak interval
AssertionError: Test case is leaking async ops.
Before:
- dispatched: 1
- completed: 1
After:
- dispatched: 3
- completed: 2
Ops:
op_global_timer:
Before:
- dispatched: 1
- completed: 1
After:
- dispatched: 3
- completed: 2
Make sure to await all promises returned from Deno APIs before
finishing test case.
at [WILDCARD]
failures:
leak interval
test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out ([WILDCARD])
error: Test failed

View file

@ -0,0 +1,4 @@
Deno.test("no-op", function () {});
Deno.test("leak interval", function () {
setInterval(function () {});
});

View file

@ -23,6 +23,7 @@
StringPrototypeIncludes,
StringPrototypeSlice,
RegExp,
Number,
RegExpPrototypeTest,
SymbolToStringTag,
} = window.__bootstrap.primordials;
@ -46,22 +47,50 @@
}
const post = metrics();
// We're checking diff because one might spawn HTTP server in the background
// that will be a pending async op before test starts.
const dispatchedDiff = post.opsDispatchedAsync - pre.opsDispatchedAsync;
const completedDiff = post.opsCompletedAsync - pre.opsCompletedAsync;
assert(
dispatchedDiff === completedDiff,
`Test case is leaking async ops.
const details = [];
for (const key in post.ops) {
const dispatchedDiff = Number(
post.ops[key]?.opsDispatchedAsync -
(pre.ops[key]?.opsDispatchedAsync ?? 0),
);
const completedDiff = Number(
post.ops[key]?.opsCompletedAsync -
(pre.ops[key]?.opsCompletedAsync ?? 0),
);
if (dispatchedDiff !== completedDiff) {
details.push(`
${key}:
Before:
- dispatched: ${pre.ops[key]?.opsDispatchedAsync ?? 0}
- completed: ${pre.ops[key]?.opsCompletedAsync ?? 0}
After:
- dispatched: ${post.ops[key].opsDispatchedAsync}
- completed: ${post.ops[key].opsCompletedAsync}`);
}
}
const message = `Test case is leaking async ops.
Before:
- dispatched: ${pre.opsDispatchedAsync}
- completed: ${pre.opsCompletedAsync}
After:
- dispatched: ${post.opsDispatchedAsync}
- completed: ${post.opsCompletedAsync}
${details.length > 0 ? "Ops:" + details.join("") : ""}
Make sure to await all promises returned from Deno APIs before
finishing test case.`,
finishing test case.`;
assert(
dispatchedDiff === completedDiff,
message,
);
};
}