diff options
author | Mohammad Dashti <mdashti@gmail.com> | 2022-04-28 22:30:32 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-04-28 22:55:48 +0000 |
commit | 4c05fd86070a90e83e008b34f62fc99bc0972621 (patch) | |
tree | 2ab544460c21d58d4c7836ca646bdf26b4a8bb58 /jstests/noPassthrough | |
parent | b3598e71a2e91f8a297aae9790fe109acafa1404 (diff) | |
download | mongo-4c05fd86070a90e83e008b34f62fc99bc0972621.tar.gz |
SERVER-65773 Improved MozJS error handling
(cherry picked from commit 6808bcf11efcb0b2e1af095093803a61326cb4c6)
Diffstat (limited to 'jstests/noPassthrough')
-rw-r--r-- | jstests/noPassthrough/shell_infinite_recursion.js | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/jstests/noPassthrough/shell_infinite_recursion.js b/jstests/noPassthrough/shell_infinite_recursion.js new file mode 100644 index 00000000000..e89d888e321 --- /dev/null +++ b/jstests/noPassthrough/shell_infinite_recursion.js @@ -0,0 +1,38 @@ +// This test checks that an infinite recursion correctly produces an 'InternalError: too much +// recursion' error and does not crash the shell. +(function() { +"use strict"; + +const makeBinData = () => BinData(4, "gf1UcxdHTJ2HQ/EGQrO7mQ=="); +const makeUUID = () => UUID("81fd5473-1747-4c9d-8743-f10642b3bb99"); +const makeHexData = () => new HexData(4, "81fd547317474c9d8743f10642b3bb99"); + +function infiniteRecursionGen(fn) { + return function() { + let testRecursiveFn = () => { + let y = fn(); + return testRecursiveFn(y); + }; + let x = testRecursiveFn(1); + return x; + }; +} + +function assertThrowsInfiniteRecursion(fn) { + const err = assert.throws(fn, [], "Infinite recursion should throw an error."); + assert(/too much recursion/.test(err.message), + `Error wasn't caused by infinite recursion: ${err.toString()}\n${err.stack}`); + + // The choice of 20 for the number of frames is somewhat arbitrary. We check for there to be + // some reasonable number of stack frames because most regressions would cause the stack to + // contain a single frame or none at all. + const kMinExpectedStack = 20; + assert.gte(err.stack.split("\n").length, + kMinExpectedStack, + `Error didn't preserve the JavaScript stacktrace: ${err.toString()}\n${err.stack}`); +} + +assertThrowsInfiniteRecursion(infiniteRecursionGen(makeBinData)); +assertThrowsInfiniteRecursion(infiniteRecursionGen(makeUUID)); +assertThrowsInfiniteRecursion(infiniteRecursionGen(makeHexData)); +})(); |