summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough
diff options
context:
space:
mode:
authorMohammad Dashti <mdashti@gmail.com>2022-04-28 22:30:32 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-04-28 22:55:48 +0000
commit4c05fd86070a90e83e008b34f62fc99bc0972621 (patch)
tree2ab544460c21d58d4c7836ca646bdf26b4a8bb58 /jstests/noPassthrough
parentb3598e71a2e91f8a297aae9790fe109acafa1404 (diff)
downloadmongo-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.js38
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));
+})();