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 +}