toolkit/devtools/server/tests/unit/test_trace_actor-05.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-05.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,141 @@
     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 + * Simple tests for "location", "callsite", "time", "parameterNames",
     1.9 + * "arguments", and "return" trace types.
    1.10 + */
    1.11 +
    1.12 +var gDebuggee;
    1.13 +var gClient;
    1.14 +var gTraceClient;
    1.15 +
    1.16 +function run_test()
    1.17 +{
    1.18 +  initTestTracerServer();
    1.19 +  gDebuggee = addTestGlobal("test-tracer-actor");
    1.20 +  gClient = new DebuggerClient(DebuggerServer.connectPipe());
    1.21 +  gClient.connect(function() {
    1.22 +    attachTestTab(gClient, "test-tracer-actor", function(aResponse, aTabClient) {
    1.23 +      gClient.attachTracer(aResponse.traceActor, function(aResponse, aTraceClient) {
    1.24 +        gTraceClient = aTraceClient;
    1.25 +        test_enter_exit_frame();
    1.26 +      });
    1.27 +    });
    1.28 +  });
    1.29 +  do_test_pending();
    1.30 +}
    1.31 +
    1.32 +function check_number(value)
    1.33 +{
    1.34 +  do_check_eq(typeof value, "number");
    1.35 +  do_check_true(!isNaN(value));
    1.36 +}
    1.37 +
    1.38 +function check_location(actual, expected)
    1.39 +{
    1.40 +  do_check_eq(typeof actual, "object");
    1.41 +
    1.42 +  check_number(actual.line);
    1.43 +  check_number(actual.column);
    1.44 +
    1.45 +  do_check_eq(actual.url, expected.url);
    1.46 +  do_check_eq(actual.line, expected.line);
    1.47 +  do_check_eq(actual.column, expected.column);
    1.48 +
    1.49 +}
    1.50 +
    1.51 +function test_enter_exit_frame()
    1.52 +{
    1.53 +  let traces = [];
    1.54 +  let traceStopped = promise.defer();
    1.55 +
    1.56 +  gClient.addListener("traces", function(aEvent, aPacket) {
    1.57 +    for (let t of aPacket.traces) {
    1.58 +      if (t.type == "enteredFrame") {
    1.59 +        do_check_eq(typeof t.name, "string");
    1.60 +        do_check_eq(typeof t.location, "object");
    1.61 +
    1.62 +        check_number(t.sequence);
    1.63 +        check_number(t.time);
    1.64 +        check_number(t.location.line);
    1.65 +        check_number(t.location.column);
    1.66 +        if (t.callsite) {
    1.67 +          check_number(t.callsite.line);
    1.68 +          check_number(t.callsite.column);
    1.69 +        }
    1.70 +      } else {
    1.71 +        check_number(t.sequence);
    1.72 +        check_number(t.time);
    1.73 +      }
    1.74 +
    1.75 +      traces[t.sequence] = t;
    1.76 +      if (traces.length === 4) {
    1.77 +        traceStopped.resolve();
    1.78 +      }
    1.79 +    }
    1.80 +  });
    1.81 +
    1.82 +  start_trace()
    1.83 +    .then(eval_code)
    1.84 +    .then(() => traceStopped.promise)
    1.85 +    .then(stop_trace)
    1.86 +    .then(function() {
    1.87 +      let url = getFileUrl("tracerlocations.js");
    1.88 +
    1.89 +      check_location(traces[0].location, { url: url, line: 1, column: 0 });
    1.90 +
    1.91 +      do_check_eq(traces[1].name, "foo");
    1.92 +
    1.93 +      // XXX: foo's definition is at tracerlocations.js:3:0, but Debugger.Script
    1.94 +      // does not provide complete definition locations (bug 901138). Therefore,
    1.95 +      // we use the first statement in the function (tracerlocations.js:4:2) as
    1.96 +      // an approximation.
    1.97 +      //
    1.98 +      // However, |column| will always be 0 until we can get bug 863089
    1.99 +      // fixed.
   1.100 +      check_location(traces[1].location, { url: url, line: 4, column: 0 });
   1.101 +      check_location(traces[1].callsite, { url: url, line: 8, column: 0 });
   1.102 +
   1.103 +      do_check_eq(typeof traces[1].parameterNames, "object");
   1.104 +      do_check_eq(traces[1].parameterNames.length, 1);
   1.105 +      do_check_eq(traces[1].parameterNames[0], "x");
   1.106 +
   1.107 +      do_check_eq(typeof traces[1].arguments, "object");
   1.108 +      do_check_true(Array.isArray(traces[1].arguments));
   1.109 +      do_check_eq(traces[1].arguments.length, 1);
   1.110 +      do_check_eq(traces[1].arguments[0], 42);
   1.111 +
   1.112 +      do_check_eq(typeof traces[2].return, "string");
   1.113 +      do_check_eq(traces[2].return, "bar");
   1.114 +
   1.115 +      finishClient(gClient);
   1.116 +    }, error => {
   1.117 +      DevToolsUtils.reportException("test_trace_actor-05.js", error);
   1.118 +      do_check_true(false);
   1.119 +    });
   1.120 +}
   1.121 +
   1.122 +function start_trace()
   1.123 +{
   1.124 +  let deferred = promise.defer();
   1.125 +  gTraceClient.startTrace(
   1.126 +    ["name", "location", "callsite", "time", "parameterNames", "arguments", "return"],
   1.127 +    null,
   1.128 +    function() { deferred.resolve(); });
   1.129 +  return deferred.promise;
   1.130 +}
   1.131 +
   1.132 +function eval_code()
   1.133 +{
   1.134 +  let code = readFile("tracerlocations.js");
   1.135 +  Components.utils.evalInSandbox(code, gDebuggee, "1.8",
   1.136 +                                getFileUrl("tracerlocations.js"), 1);
   1.137 +}
   1.138 +
   1.139 +function stop_trace()
   1.140 +{
   1.141 +  let deferred = promise.defer();
   1.142 +  gTraceClient.stopTrace(null, function() { deferred.resolve(); });
   1.143 +  return deferred.promise;
   1.144 +}

mercurial