toolkit/devtools/server/tests/unit/test_trace_actor-04.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/toolkit/devtools/server/tests/unit/test_trace_actor-04.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,109 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +/**
     1.8 + * Tests that enteredFrame packets are sent on frame entry and
     1.9 + * exitedFrame packets are sent on frame exit. Tests that the "name"
    1.10 + * trace type works for function declarations.
    1.11 + */
    1.12 +
    1.13 +var gDebuggee;
    1.14 +var gClient;
    1.15 +var gTraceClient;
    1.16 +
    1.17 +function run_test()
    1.18 +{
    1.19 +  initTestTracerServer();
    1.20 +  gDebuggee = addTestGlobal("test-tracer-actor");
    1.21 +  gClient = new DebuggerClient(DebuggerServer.connectPipe());
    1.22 +  gClient.connect(function() {
    1.23 +    attachTestTab(gClient, "test-tracer-actor", function(aResponse, aTabClient) {
    1.24 +      gClient.attachTracer(aResponse.traceActor, function(aResponse, aTraceClient) {
    1.25 +        gTraceClient = aTraceClient;
    1.26 +        test_enter_exit_frame();
    1.27 +      });
    1.28 +    });
    1.29 +  });
    1.30 +  do_test_pending();
    1.31 +}
    1.32 +
    1.33 +function test_enter_exit_frame()
    1.34 +{
    1.35 +  let tracesSeen = 0;
    1.36 +  let traceNames = [];
    1.37 +  let traceStopped = promise.defer();
    1.38 +
    1.39 +  gClient.addListener("traces", function onTraces(aEvent, { traces }) {
    1.40 +    for (let t of traces) {
    1.41 +      tracesSeen++;
    1.42 +
    1.43 +      if (t.type == "enteredFrame") {
    1.44 +        do_check_eq(t.type, "enteredFrame",
    1.45 +                    'enteredFrame response should have type "enteredFrame"');
    1.46 +        do_check_eq(typeof t.sequence, "number",
    1.47 +                    'enteredFrame response should have sequence number');
    1.48 +        do_check_true(!isNaN(t.sequence),
    1.49 +                      'enteredFrame sequence should be a number');
    1.50 +        do_check_eq(typeof t.name, "string",
    1.51 +                    'enteredFrame response should have function name');
    1.52 +        traceNames[t.sequence] = t.name;
    1.53 +      } else {
    1.54 +        do_check_eq(t.type, "exitedFrame",
    1.55 +                    'exitedFrame response should have type "exitedFrame"');
    1.56 +        do_check_eq(typeof t.sequence, "number",
    1.57 +                    'exitedFrame response should have sequence number');
    1.58 +        do_check_true(!isNaN(t.sequence),
    1.59 +                      'exitedFrame sequence should be a number');
    1.60 +      }
    1.61 +
    1.62 +      if (tracesSeen == 10) {
    1.63 +        gClient.removeListener("traces", onTraces);
    1.64 +        traceStopped.resolve();
    1.65 +      }
    1.66 +    }
    1.67 +  });
    1.68 +
    1.69 +  start_trace()
    1.70 +    .then(eval_code)
    1.71 +    .then(() => traceStopped.promise)
    1.72 +    .then(stop_trace)
    1.73 +    .then(function() {
    1.74 +      do_check_eq(traceNames[2], "baz",
    1.75 +                  'Should have entered "baz" frame in third packet');
    1.76 +      do_check_eq(traceNames[3], "bar",
    1.77 +                  'Should have entered "bar" frame in fourth packet');
    1.78 +      do_check_eq(traceNames[4], "foo",
    1.79 +                  'Should have entered "foo" frame in fifth packet');
    1.80 +      finishClient(gClient);
    1.81 +    });
    1.82 +}
    1.83 +
    1.84 +function start_trace()
    1.85 +{
    1.86 +  let deferred = promise.defer();
    1.87 +  gTraceClient.startTrace(["name"], null, function() { deferred.resolve(); });
    1.88 +  return deferred.promise;
    1.89 +}
    1.90 +
    1.91 +function eval_code()
    1.92 +{
    1.93 +  gDebuggee.eval("(" + function() {
    1.94 +    function foo() {
    1.95 +      return;
    1.96 +    }
    1.97 +    function bar() {
    1.98 +      return foo();
    1.99 +    }
   1.100 +    function baz() {
   1.101 +      return bar();
   1.102 +    }
   1.103 +    baz();
   1.104 +  } + ")()");
   1.105 +}
   1.106 +
   1.107 +function stop_trace()
   1.108 +{
   1.109 +  let deferred = promise.defer();
   1.110 +  gTraceClient.stopTrace(null, function() { deferred.resolve(); });
   1.111 +  return deferred.promise;
   1.112 +}

mercurial