diff options
author | 2023-10-17 14:10:25 -0700 | |
---|---|---|
committer | 2023-10-17 14:10:25 -0700 | |
commit | 7458b969c5d9971e89d187b687e1924e78da427e (patch) | |
tree | ee3dbf95c728cf407bf49a27826b541e9264a8bd /test/js/node/v8/capture-stack-trace.test.js | |
parent | d4a2c29131ec154f5e4db897d4deedab2002cbc4 (diff) | |
parent | e91436e5248d947b50f90b4a7402690be8a41f39 (diff) | |
download | bun-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.js | 81 |
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(); }); |