tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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;