summaryrefslogtreecommitdiffstats
path: root/devtools/client/performance/test/browser_perf-recordings-io-04.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/performance/test/browser_perf-recordings-io-04.js')
-rw-r--r--devtools/client/performance/test/browser_perf-recordings-io-04.js178
1 files changed, 178 insertions, 0 deletions
diff --git a/devtools/client/performance/test/browser_perf-recordings-io-04.js b/devtools/client/performance/test/browser_perf-recordings-io-04.js
new file mode 100644
index 000000000..2da84f438
--- /dev/null
+++ b/devtools/client/performance/test/browser_perf-recordings-io-04.js
@@ -0,0 +1,178 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+/* eslint-disable */
+/**
+ * Tests if the performance tool can import profiler data from the
+ * original profiler tool (Performance Recording v1, and Profiler data v2) and the correct views and graphs are loaded.
+ */
+var TICKS_DATA = (function () {
+ let ticks = [];
+ for (let i = 0; i < 100; i++) {
+ ticks.push(i * 10);
+ }
+ return ticks;
+})();
+
+var PROFILER_DATA = (function () {
+ let data = {};
+ let threads = data.threads = [];
+ let thread = {};
+ threads.push(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, OverviewView, JsCallTreeView } = panel.panelWin;
+
+ // Enable memory to test the memory-calltree and memory-flamegraph.
+ Services.prefs.setBoolPref(ALLOCATIONS_PREF, true);
+
+ // Create a structure from the data that mimics the old profiler's data.
+ // Different name for `ticks`, different way of storing time,
+ // and no memory, markers data.
+ let oldProfilerData = {
+ profilerData: { profile: PROFILER_DATA },
+ ticksData: TICKS_DATA,
+ recordingDuration: 10000,
+ fileType: "Recorded Performance Data",
+ version: 1
+ };
+
+ // Save recording as an old profiler data.
+ let file = FileUtils.getFile("TmpD", ["tmpprofile.json"]);
+ file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("666", 8));
+ yield asyncCopy(oldProfilerData, file);
+
+ // Import recording.
+
+ let calltreeRendered = once(OverviewView, EVENTS.UI_FRAMERATE_GRAPH_RENDERED);
+ let fpsRendered = once(JsCallTreeView, EVENTS.UI_JS_CALL_TREE_RENDERED);
+ let imported = once(PerformanceController, EVENTS.RECORDING_IMPORTED);
+ yield PerformanceController.importRecording("", file);
+
+ yield imported;
+ ok(true, "The original profiler data appears to have been successfully imported.");
+
+ yield calltreeRendered;
+ yield fpsRendered;
+ ok(true, "The imported data was re-rendered.");
+
+ // Ensure that only framerate and js calltree/flamegraph view are available
+ is(isVisible($("#overview-pane")), true, "overview graph container still shown");
+ is(isVisible($("#memory-overview")), false, "memory graph hidden");
+ is(isVisible($("#markers-overview")), false, "markers overview graph hidden");
+ is(isVisible($("#time-framerate")), true, "fps graph shown");
+ is($("#select-waterfall-view").hidden, true, "waterfall button hidden");
+ is($("#select-js-calltree-view").hidden, false, "jscalltree button shown");
+ is($("#select-js-flamegraph-view").hidden, false, "jsflamegraph button shown");
+ is($("#select-memory-calltree-view").hidden, true, "memorycalltree button hidden");
+ is($("#select-memory-flamegraph-view").hidden, true, "memoryflamegraph button hidden");
+ ok(DetailsView.isViewSelected(JsCallTreeView), "jscalltree view selected as its the only option");
+
+ // Verify imported recording.
+
+ let importedData = PerformanceController.getCurrentRecording().getAllData();
+ let expected = Object.create({
+ duration: 10000,
+ markers: [].toSource(),
+ frames: [].toSource(),
+ memory: [].toSource(),
+ ticks: TICKS_DATA.toSource(),
+ profile: RecordingUtils.deflateProfile(JSON.parse(JSON.stringify(PROFILER_DATA))).toSource(),
+ allocations: ({sites:[], timestamps:[], frames:[], sizes: []}).toSource(),
+ withTicks: true,
+ withMemory: false,
+ sampleFrequency: void 0
+ });
+
+ for (let field in expected) {
+ if (!!~["withTicks", "withMemory", "sampleFrequency"].indexOf(field)) {
+ is(importedData.configuration[field], expected[field], `${field} successfully converted in legacy import.`);
+ } else if (field === "profile") {
+ is(importedData.profile.toSource(), expected.profile,
+ "profiler data's samples successfully converted in legacy import.");
+ is(importedData.profile.meta.version, 3, "Updated meta version to 3.");
+ } else {
+ let data = importedData[field];
+ is(typeof data === "object" ? data.toSource() : data, expected[field],
+ `${field} successfully converted in legacy import.`);
+ }
+ }
+
+ 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;
+}
+/* eslint-enable */