From 9cc7e32e37e6708980abc051f2cb71526c175d88 Mon Sep 17 00:00:00 2001 From: Casper Beyer Date: Wed, 24 Feb 2021 20:55:50 +0800 Subject: feat: add exit sanitizer to Deno.test (#9529) This adds an exit sanitizer to ensure that code being tested or dependencies of that code can't accidentally call "Deno.exit" leading to partial test runs and false results. --- runtime/js/40_testing.js | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'runtime/js/40_testing.js') diff --git a/runtime/js/40_testing.js b/runtime/js/40_testing.js index 2258dc7b6..eec75f133 100644 --- a/runtime/js/40_testing.js +++ b/runtime/js/40_testing.js @@ -4,7 +4,7 @@ ((window) => { const core = window.Deno.core; const colors = window.__bootstrap.colors; - const { exit } = window.__bootstrap.os; + const { setExitHandler, exit } = window.__bootstrap.os; const { Console, inspectArgs } = window.__bootstrap.console; const { stdout } = window.__bootstrap.files; const { exposeForTest } = window.__bootstrap.internals; @@ -86,6 +86,27 @@ finishing test case.`; }; } + // Wrap test function in additional assertion that makes sure + // that the test case does not accidentally exit prematurely. + function assertExit(fn) { + return async function exitSanitizer() { + setExitHandler((exitCode) => { + assert( + false, + `Test case attempted to exit with exit code: ${exitCode}`, + ); + }); + + try { + await fn(); + } catch (err) { + throw err; + } finally { + setExitHandler(null); + } + }; + } + const TEST_REGISTRY = []; // Main test function provided by Deno, as you can see it merely @@ -100,6 +121,7 @@ finishing test case.`; only: false, sanitizeOps: true, sanitizeResources: true, + sanitizeExit: true, }; if (typeof t === "string") { @@ -128,6 +150,10 @@ finishing test case.`; testDef.fn = assertResources(testDef.fn); } + if (testDef.sanitizeExit) { + testDef.fn = assertExit(testDef.fn); + } + TEST_REGISTRY.push(testDef); } -- cgit v1.2.3