ErrorStack.js (4627B)
1 // |reftest| skip-if(!xulRuntime.shell) -- needs drainJobQueue 2 3 var BUGNUMBER = 1343158; 4 var summary = "Error.stack should provide meaningful stack trace in async function"; 5 6 print(BUGNUMBER + ": " + summary); 7 8 let COOKIE = "C0F5DBB89807"; 9 10 async function thrower() { 11 let stack = new Error().stack; // line 11 12 assertEq(/^thrower@.+ErrorStack.js:11/m.test(stack), true, toMessage(stack)); 13 assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack)); 14 assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack)); 15 assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack)); 16 assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 17 18 throw new Error(COOKIE); // line 18 19 } 20 21 async function inner() { 22 let stack = new Error().stack; // line 22 23 assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 24 assertEq(/^inner@.+ErrorStack.js:22/m.test(stack), true, toMessage(stack)); 25 assertEq(/^middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack)); 26 assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack)); 27 assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 28 29 await Promise.resolve(100); 30 31 stack = new Error().stack; // line 31 32 assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 33 assertEq(/^inner@.+ErrorStack.js:31/m.test(stack), true, toMessage(stack)); 34 assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack)); 35 assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack)); 36 assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 37 38 await thrower(); // line 38 39 } 40 41 async function middle() { 42 let stack = new Error().stack; // line 42 43 assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 44 assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 45 assertEq(/^middle@.+ErrorStack.js:42/m.test(stack), true, toMessage(stack)); 46 assertEq(/^outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack)); 47 assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 48 49 await Promise.resolve(1000); 50 51 stack = new Error().stack; // line 51 52 assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 53 assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 54 assertEq(/^middle@.+ErrorStack.js:51/m.test(stack), true, toMessage(stack)); 55 assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack)); 56 assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 57 58 await inner(); // line 58 59 } 60 61 async function outer() { 62 let stack = new Error().stack; // line 62 63 assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 64 assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 65 assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 66 assertEq(/^outer@.+ErrorStack.js:62/m.test(stack), true, toMessage(stack)); 67 assertEq(/^@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 68 69 await Promise.resolve(10000); 70 71 stack = new Error().stack; // line 71 72 assertEq(/thrower@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 73 assertEq(/inner@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 74 assertEq(/middle@.+ErrorStack.js/m.test(stack), false, toMessage(stack)); 75 assertEq(/^outer@.+ErrorStack.js:71/m.test(stack), true, toMessage(stack)); 76 assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 77 78 await middle(); // line 78 79 } 80 81 try { 82 getPromiseResult(outer()); // line 82 83 assertEq(true, false); 84 } catch (e) { 85 // Re-throw the exception to log the assertion failure properly. 86 if (!e.message.includes(COOKIE)) 87 throw e; 88 89 let stack = e.stack; 90 assertEq(/^thrower@.+ErrorStack.js:18/m.test(stack), true, toMessage(stack)); 91 assertEq(/^inner@.+ErrorStack.js:38/m.test(stack), true, toMessage(stack)); 92 assertEq(/^async\*middle@.+ErrorStack.js:58/m.test(stack), true, toMessage(stack)); 93 assertEq(/^async\*outer@.+ErrorStack.js:78/m.test(stack), true, toMessage(stack)); 94 assertEq(/^async\*@.+ErrorStack.js:82/m.test(stack), true, toMessage(stack)); 95 } 96 97 function toMessage(stack) { 98 // Provide the stack string in the error message for debugging. 99 return `[stack: ${stack.replace(/\n/g, "\\n")}]`; 100 } 101 102 if (typeof reportCompare === "function") 103 reportCompare(true, true);