0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-24 16:46:00 +01:00
mongodb/jstests/noPassthrough/js_exceptions.js
Moustafa Maher be39a8421f SERVER-95628 Make rawMongoProgramOutput more robust (#28204)
GitOrigin-RevId: 6b01ab93e5ba70a22cc816931cd464b6f2ddbd13
2024-10-22 22:40:58 +00:00

121 lines
3.2 KiB
JavaScript

/**
* Validate that exceptions are reported correctly
*
*/
let tests = [
{
callback: function() {
UUID("asdf");
},
match: "Error: Invalid UUID string: asdf :",
stack: true,
},
{
callback: function() {
throw {};
},
match: "uncaught exception: \\\[object Object\\\] :",
stack: undefined,
},
{
callback: function() {
throw "asdf";
},
match: "uncaught exception: asdf",
stack: false,
},
{
callback: function() {
throw 1;
},
match: "uncaught exception: 1",
stack: false,
},
{
callback: function() {
// eslint-disable-next-line
foo.bar();
},
match: "uncaught exception: ReferenceError: foo is not defined :",
stack: true,
},
{
callback: function() {
throw function() {};
},
match: "function\\\(\\\) {} :",
stack: undefined,
},
{
callback: function() {
try {
UUID("asdf");
} catch (e) {
throw (e.constructor());
}
},
match: "uncaught exception: Error :",
stack: true,
},
{
callback: function() {
try {
UUID("asdf");
} catch (e) {
throw (e.prototype);
}
},
match: "uncaught exception: undefined",
stack: false,
},
];
function recurser(depth, limit, callback) {
if (++depth >= limit) {
callback();
} else {
recurser(depth, limit, callback);
}
}
function assertMatch(m, l) {
assert(m.test(l), m + " didn't match \"" + l + "\"");
}
tests.forEach(function(t) {
let code = tojson(recurser);
[1, 2, 10].forEach(function(depth) {
clearRawMongoProgramOutput();
assert.throws(startParallelShell(
code + ";\nrecurser(0," + depth + "," + tojson(t.callback) + ");", false, true));
let output = rawMongoProgramOutput(".*");
let lines = output.split(/\s*\n|\\n/);
let matchShellExp = false;
while (lines.length > 0 & matchShellExp !== true) {
let line = lines.shift();
if (line.match(/MongoDB shell version/)) {
matchShellExp = true;
}
}
assert(matchShellExp);
assertMatch(/\s*/, lines.pop());
assertMatch(/exiting with code/, lines.pop());
assertMatch(new RegExp(t.match), lines.shift());
if (t.stack == true) {
assert.eq(lines.length,
depth + 2); // plus one for the shell and one for the callback
lines.forEach(function(l) {
assertMatch(/\@\(shell eval\):\d+:\d+/, l);
});
lines.pop();
lines.shift();
lines.forEach(function(l) {
assertMatch(/recurser\@/, l);
});
} else if (t.stack == false) {
assert.eq(lines.length, 0);
} else if (t.stack == undefined) {
assert.eq(lines.length, 1);
assertMatch(/undefined/, lines.pop());
}
});
});