aboutsummaryrefslogtreecommitdiff
path: root/test/js/node/v8/capture-stack-trace.test.js
diff options
context:
space:
mode:
authorGravatar Dylan Conway <dylan.conway567@gmail.com> 2023-10-17 14:10:25 -0700
committerGravatar Dylan Conway <dylan.conway567@gmail.com> 2023-10-17 14:10:25 -0700
commit7458b969c5d9971e89d187b687e1924e78da427e (patch)
treeee3dbf95c728cf407bf49a27826b541e9264a8bd /test/js/node/v8/capture-stack-trace.test.js
parentd4a2c29131ec154f5e4db897d4deedab2002cbc4 (diff)
parente91436e5248d947b50f90b4a7402690be8a41f39 (diff)
downloadbun-7458b969c5d9971e89d187b687e1924e78da427e.tar.gz
bun-7458b969c5d9971e89d187b687e1924e78da427e.tar.zst
bun-7458b969c5d9971e89d187b687e1924e78da427e.zip
Merge branch 'main' into postinstall_3
Diffstat (limited to 'test/js/node/v8/capture-stack-trace.test.js')
-rw-r--r--test/js/node/v8/capture-stack-trace.test.js81
1 files changed, 71 insertions, 10 deletions
diff --git a/test/js/node/v8/capture-stack-trace.test.js b/test/js/node/v8/capture-stack-trace.test.js
index cb2624681..5e9492955 100644
--- a/test/js/node/v8/capture-stack-trace.test.js
+++ b/test/js/node/v8/capture-stack-trace.test.js
@@ -17,6 +17,15 @@ test("Regular .stack", () => {
expect(err.stack).toMatch(/at new Foo/);
});
+test("throw inside Error.prepareStackTrace doesnt crash", () => {
+ Error.prepareStackTrace = function (err, stack) {
+ Error.prepareStackTrace = null;
+ throw new Error("wat");
+ };
+
+ expect(() => new Error().stack).toThrow("wat");
+});
+
test("capture stack trace", () => {
function f1() {
f2();
@@ -460,14 +469,66 @@ test("CallFrame.p.toString", () => {
expect(e.stack[0].toString().includes("<anonymous>")).toBe(true);
});
-test.todo("err.stack should invoke prepareStackTrace", () => {
- // This is V8's behavior.
- let prevPrepareStackTrace = Error.prepareStackTrace;
- let wasCalled = false;
- Error.prepareStackTrace = (e, s) => {
- wasCalled = true;
- };
- const e = new Error();
- e.stack;
- expect(wasCalled).toBe(true);
+test("err.stack should invoke prepareStackTrace", () => {
+ var lineNumber = -1;
+ var functionName = "";
+ var parentLineNumber = -1;
+ function functionWithAName() {
+ // This is V8's behavior.
+ let prevPrepareStackTrace = Error.prepareStackTrace;
+
+ Error.prepareStackTrace = (e, s) => {
+ lineNumber = s[0].getLineNumber();
+ functionName = s[0].getFunctionName();
+ parentLineNumber = s[1].getLineNumber();
+ expect(s[0].getFileName().includes("capture-stack-trace.test.js")).toBe(true);
+ expect(s[1].getFileName().includes("capture-stack-trace.test.js")).toBe(true);
+ };
+ const e = new Error();
+ e.stack;
+ Error.prepareStackTrace = prevPrepareStackTrace;
+ }
+
+ functionWithAName();
+
+ expect(functionName).toBe("functionWithAName");
+ expect(lineNumber).toBe(488);
+ // TODO: this is wrong
+ expect(parentLineNumber).toBe(497);
+});
+
+test("Error.prepareStackTrace inside a node:vm works", () => {
+ const { runInNewContext } = require("node:vm");
+ Error.prepareStackTrace = null;
+ const result = runInNewContext(
+ `
+ Error.prepareStackTrace = (err, stack) => {
+ if (typeof err.stack !== "string") {
+ throw new Error("err.stack is not a string");
+ }
+
+ return "custom stack trace";
+ };
+
+ const err = new Error();
+ err.stack;
+ `,
+ );
+ expect(result).toBe("custom stack trace");
+ expect(Error.prepareStackTrace).toBeNull();
+});
+
+test("Error.captureStackTrace inside error constructor works", () => {
+ class ExtendedError extends Error {
+ constructor() {
+ super();
+ Error.captureStackTrace(this, ExtendedError);
+ }
+ }
+
+ class AnotherError extends ExtendedError {}
+
+ expect(() => {
+ throw new AnotherError();
+ }).toThrow();
});