ExecutionTracer-coverage-exclusive.js (3963B)
1 // The execution tracing and the code coverage should be mutually exclusive. 2 3 if (typeof enableExecutionTracing == "undefined") { 4 quit(); 5 } 6 7 var g = newGlobal({ newCompartment: true }); 8 var dbg = new Debugger(); 9 dbg.addDebuggee(g); 10 11 // Setting collectCoverageInfo should fail while the execution tracing is 12 // active, and it shouldn't affect the trace. 13 14 g.enableExecutionTracing(); 15 16 g.eval(`[1].map(function f1(x) { return x; });`); 17 18 let caught = false; 19 try { 20 dbg.collectCoverageInfo = true; 21 } catch (e) { 22 caught = true; 23 assertEq(e.message, "execution trace and collectCoverageInfo cannot be active at the same time"); 24 } 25 assertEq(caught, true); 26 27 g.eval(`[10].map(function f2(x) { return x; });`); 28 29 caught = false; 30 try { 31 dbg.collectCoverageInfo = false; 32 } catch (e) { 33 caught = true; 34 assertEq(e.message, "execution trace and collectCoverageInfo cannot be active at the same time"); 35 } 36 assertEq(caught, true); 37 38 g.eval(`[100].map(function f3(x) { return x; });`); 39 40 const trace = g.getExecutionTrace(); 41 42 g.disableExecutionTracing(); 43 44 assertEq(trace.length, 1); 45 46 const events = trace[0].events; 47 assertEq(events.length, 6); 48 49 assertEq(events[0].kind, "FunctionEnter"); 50 assertEq(events[0].lineNumber, 1); 51 assertEq(events[0].columnNumber, 20); 52 assertEq(events[0].script.includes("ExecutionTracer-coverage-exclusive.js"), true); 53 assertEq(events[0].script.endsWith(" > eval"), true); 54 assertEq(typeof events[0].realmID, "number"); 55 assertEq(events[0].name, "f1"); 56 57 assertEq(events[1].kind, "FunctionLeave"); 58 assertEq(events[1].lineNumber, 1); 59 assertEq(events[1].columnNumber, 20); 60 assertEq(events[1].script.includes("ExecutionTracer-coverage-exclusive.js"), true); 61 assertEq(events[1].script.endsWith(" > eval"), true); 62 assertEq(typeof events[1].realmID, "number"); 63 assertEq(events[1].name, "f1"); 64 65 assertEq(events[2].kind, "FunctionEnter"); 66 assertEq(events[2].lineNumber, 1); 67 assertEq(events[2].columnNumber, 21); 68 assertEq(events[2].script.includes("ExecutionTracer-coverage-exclusive.js"), true); 69 assertEq(events[2].script.endsWith(" > eval"), true); 70 assertEq(typeof events[2].realmID, "number"); 71 assertEq(events[2].name, "f2"); 72 73 assertEq(events[3].kind, "FunctionLeave"); 74 assertEq(events[3].lineNumber, 1); 75 assertEq(events[3].columnNumber, 21); 76 assertEq(events[3].script.includes("ExecutionTracer-coverage-exclusive.js"), true); 77 assertEq(events[3].script.endsWith(" > eval"), true); 78 assertEq(typeof events[3].realmID, "number"); 79 assertEq(events[3].name, "f2"); 80 81 assertEq(events[4].kind, "FunctionEnter"); 82 assertEq(events[4].lineNumber, 1); 83 assertEq(events[4].columnNumber, 22); 84 assertEq(events[4].script.includes("ExecutionTracer-coverage-exclusive.js"), true); 85 assertEq(events[4].script.endsWith(" > eval"), true); 86 assertEq(typeof events[4].realmID, "number"); 87 assertEq(events[4].name, "f3"); 88 89 assertEq(events[5].kind, "FunctionLeave"); 90 assertEq(events[5].lineNumber, 1); 91 assertEq(events[5].columnNumber, 22); 92 assertEq(events[5].script.includes("ExecutionTracer-coverage-exclusive.js"), true); 93 assertEq(events[5].script.endsWith(" > eval"), true); 94 assertEq(typeof events[5].realmID, "number"); 95 assertEq(events[5].name, "f3"); 96 97 // Enabling/disabling the execution trace should fail while the code coverage 98 // is active, and it shouldn't affect the coverage result. 99 100 const scripts = []; 101 dbg.onNewScript = s => { 102 scripts.push(s); 103 }; 104 105 dbg.collectCoverageInfo = true; 106 107 g.eval(`[1000].map(function f4(x) { return x; });`); 108 109 caught = false; 110 try { 111 g.enableExecutionTracing(); 112 } catch (e) { 113 caught = true; 114 assertEq(e.message, "execution trace and collectCoverageInfo cannot be active at the same time"); 115 } 116 assertEq(caught, true); 117 118 g.eval(`[10000].map(function f5(x) { return x; });`); 119 120 // This should be no-op. 121 g.disableExecutionTracing(); 122 123 g.eval(`[100000].map(function f6(x) { return x; });`); 124 125 assertEq(scripts.length, 3); 126 for (const s of scripts) { 127 const cov = s.getOffsetsCoverage(); 128 assertEq(typeof cov, "object"); 129 } 130 131 dbg.collectCoverageInfo = false;