michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /** michael@0: * Simple tests for "location", "callsite", "time", "parameterNames", michael@0: * "arguments", and "return" trace types. michael@0: */ michael@0: michael@0: var gDebuggee; michael@0: var gClient; michael@0: var gTraceClient; michael@0: michael@0: function run_test() michael@0: { michael@0: initTestTracerServer(); michael@0: gDebuggee = addTestGlobal("test-tracer-actor"); michael@0: gClient = new DebuggerClient(DebuggerServer.connectPipe()); michael@0: gClient.connect(function() { michael@0: attachTestTab(gClient, "test-tracer-actor", function(aResponse, aTabClient) { michael@0: gClient.attachTracer(aResponse.traceActor, function(aResponse, aTraceClient) { michael@0: gTraceClient = aTraceClient; michael@0: test_enter_exit_frame(); michael@0: }); michael@0: }); michael@0: }); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function check_number(value) michael@0: { michael@0: do_check_eq(typeof value, "number"); michael@0: do_check_true(!isNaN(value)); michael@0: } michael@0: michael@0: function check_location(actual, expected) michael@0: { michael@0: do_check_eq(typeof actual, "object"); michael@0: michael@0: check_number(actual.line); michael@0: check_number(actual.column); michael@0: michael@0: do_check_eq(actual.url, expected.url); michael@0: do_check_eq(actual.line, expected.line); michael@0: do_check_eq(actual.column, expected.column); michael@0: michael@0: } michael@0: michael@0: function test_enter_exit_frame() michael@0: { michael@0: let traces = []; michael@0: let traceStopped = promise.defer(); michael@0: michael@0: gClient.addListener("traces", function(aEvent, aPacket) { michael@0: for (let t of aPacket.traces) { michael@0: if (t.type == "enteredFrame") { michael@0: do_check_eq(typeof t.name, "string"); michael@0: do_check_eq(typeof t.location, "object"); michael@0: michael@0: check_number(t.sequence); michael@0: check_number(t.time); michael@0: check_number(t.location.line); michael@0: check_number(t.location.column); michael@0: if (t.callsite) { michael@0: check_number(t.callsite.line); michael@0: check_number(t.callsite.column); michael@0: } michael@0: } else { michael@0: check_number(t.sequence); michael@0: check_number(t.time); michael@0: } michael@0: michael@0: traces[t.sequence] = t; michael@0: if (traces.length === 4) { michael@0: traceStopped.resolve(); michael@0: } michael@0: } michael@0: }); michael@0: michael@0: start_trace() michael@0: .then(eval_code) michael@0: .then(() => traceStopped.promise) michael@0: .then(stop_trace) michael@0: .then(function() { michael@0: let url = getFileUrl("tracerlocations.js"); michael@0: michael@0: check_location(traces[0].location, { url: url, line: 1, column: 0 }); michael@0: michael@0: do_check_eq(traces[1].name, "foo"); michael@0: michael@0: // XXX: foo's definition is at tracerlocations.js:3:0, but Debugger.Script michael@0: // does not provide complete definition locations (bug 901138). Therefore, michael@0: // we use the first statement in the function (tracerlocations.js:4:2) as michael@0: // an approximation. michael@0: // michael@0: // However, |column| will always be 0 until we can get bug 863089 michael@0: // fixed. michael@0: check_location(traces[1].location, { url: url, line: 4, column: 0 }); michael@0: check_location(traces[1].callsite, { url: url, line: 8, column: 0 }); michael@0: michael@0: do_check_eq(typeof traces[1].parameterNames, "object"); michael@0: do_check_eq(traces[1].parameterNames.length, 1); michael@0: do_check_eq(traces[1].parameterNames[0], "x"); michael@0: michael@0: do_check_eq(typeof traces[1].arguments, "object"); michael@0: do_check_true(Array.isArray(traces[1].arguments)); michael@0: do_check_eq(traces[1].arguments.length, 1); michael@0: do_check_eq(traces[1].arguments[0], 42); michael@0: michael@0: do_check_eq(typeof traces[2].return, "string"); michael@0: do_check_eq(traces[2].return, "bar"); michael@0: michael@0: finishClient(gClient); michael@0: }, error => { michael@0: DevToolsUtils.reportException("test_trace_actor-05.js", error); michael@0: do_check_true(false); michael@0: }); michael@0: } michael@0: michael@0: function start_trace() michael@0: { michael@0: let deferred = promise.defer(); michael@0: gTraceClient.startTrace( michael@0: ["name", "location", "callsite", "time", "parameterNames", "arguments", "return"], michael@0: null, michael@0: function() { deferred.resolve(); }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function eval_code() michael@0: { michael@0: let code = readFile("tracerlocations.js"); michael@0: Components.utils.evalInSandbox(code, gDebuggee, "1.8", michael@0: getFileUrl("tracerlocations.js"), 1); michael@0: } michael@0: michael@0: function stop_trace() michael@0: { michael@0: let deferred = promise.defer(); michael@0: gTraceClient.stopTrace(null, function() { deferred.resolve(); }); michael@0: return deferred.promise; michael@0: }