tenfourfox/devtools/client/performance/test/browser_perf-recordings-io-06.js
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

141 lines
3.4 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests if the performance tool can import profiler data when Profiler is v2
* and requires deflating, and has an extra thread that's a string. Not sure
* what causes this.
*/
var STRINGED_THREAD = (function () {
let thread = {};
thread.libs = [{
start: 123,
end: 456,
offset: 0,
name: "",
breakpadId: ""
}];
thread.meta = { version: 2, interval: 1, stackwalk: 0, processType: 1, startTime: 0 };
thread.threads = [{
name: "Plugin",
tid: 4197,
samples: [],
markers: [],
}];
return JSON.stringify(thread);
})();
var PROFILER_DATA = (function () {
let data = {};
let threads = data.threads = [];
let thread = {};
threads.push(thread);
threads.push(STRINGED_THREAD);
thread.name = "Content";
thread.samples = [{
time: 5,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "B" },
{ location: "C" }
]
}, {
time: 5 + 6,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "B" },
{ location: "D" }
]
}, {
time: 5 + 6 + 7,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "E" },
{ location: "F" }
]
}, {
time: 20,
frames: [
{ location: "(root)" },
{ location: "A" },
{ location: "B" },
{ location: "C" },
{ location: "D" },
{ location: "E" },
{ location: "F" },
{ location: "G" }
]
}];
// Handled in other deflating tests
thread.markers = [];
let meta = data.meta = {};
meta.version = 2;
meta.interval = 1;
meta.stackwalk = 0;
meta.product = "Firefox";
return data;
})();
var test = Task.async(function*() {
let { target, panel, toolbox } = yield initPerformance(SIMPLE_URL);
let { $, EVENTS, PerformanceController, DetailsView, JsCallTreeView } = panel.panelWin;
let profilerData = {
profile: PROFILER_DATA,
duration: 10000,
configuration: {},
fileType: "Recorded Performance Data",
version: 2
};
let file = FileUtils.getFile("TmpD", ["tmpprofile.json"]);
file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("666", 8));
yield asyncCopy(profilerData, file);
// Import recording.
let calltreeRendered = once(JsCallTreeView, EVENTS.JS_CALL_TREE_RENDERED);
let imported = once(PerformanceController, EVENTS.RECORDING_IMPORTED);
yield PerformanceController.importRecording("", file);
yield imported;
ok(true, "The profiler data appears to have been successfully imported.");
yield calltreeRendered;
ok(true, "The imported data was re-rendered.");
yield teardown(panel);
finish();
});
function getUnicodeConverter() {
let className = "@mozilla.org/intl/scriptableunicodeconverter";
let converter = Cc[className].createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
return converter;
}
function asyncCopy(data, file) {
let deferred = Promise.defer();
let string = JSON.stringify(data);
let inputStream = getUnicodeConverter().convertToInputStream(string);
let outputStream = FileUtils.openSafeFileOutputStream(file);
NetUtil.asyncCopy(inputStream, outputStream, status => {
if (!Components.isSuccessCode(status)) {
deferred.reject(new Error("Could not save data to file."));
}
deferred.resolve();
});
return deferred.promise;
}