diff options
Diffstat (limited to 'devtools/client/aboutdebugging/test/browser/helper-telemetry.js')
-rw-r--r-- | devtools/client/aboutdebugging/test/browser/helper-telemetry.js | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/devtools/client/aboutdebugging/test/browser/helper-telemetry.js b/devtools/client/aboutdebugging/test/browser/helper-telemetry.js new file mode 100644 index 0000000000..228f01aff3 --- /dev/null +++ b/devtools/client/aboutdebugging/test/browser/helper-telemetry.js @@ -0,0 +1,115 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* import-globals-from head.js */ + +/** + * Reset all telemetry events. + */ +function setupTelemetryTest() { + // Let's reset the counts. + Services.telemetry.clearEvents(); + + // Ensure no events have been logged + const ALL_CHANNELS = Ci.nsITelemetry.DATASET_ALL_CHANNELS; + const snapshot = Services.telemetry.snapshotEvents(ALL_CHANNELS, true); + ok(!snapshot.parent, "No events have been logged for the main process"); +} +/* exported setupTelemetryTest */ + +/** + * Check that the logged telemetry events exactly match the array of expected events. + * Will compare the number of events, the event methods, and the event extras including + * the about:debugging session id. + */ +function checkTelemetryEvents(expectedEvents, expectedSessionId) { + const evts = readAboutDebuggingEvents(); + is(evts.length, expectedEvents.length, "Expected number of events"); + + function _eventHasExpectedExtras(e, expectedEvent) { + const expectedExtras = Object.keys(expectedEvent.extras); + return expectedExtras.every(extra => { + return e.extras[extra] === expectedEvent.extras[extra]; + }); + } + + for (const expectedEvent of expectedEvents) { + const sameMethodEvents = evts.filter( + e => e.method === expectedEvent.method + ); + ok( + !!sameMethodEvents.length, + "Found event for method: " + expectedEvent.method + ); + + const sameExtrasEvents = sameMethodEvents.filter(e => + _eventHasExpectedExtras(e, expectedEvent) + ); + ok( + sameExtrasEvents.length === 1, + "Found exactly one event matching the expected extras" + ); + if (sameExtrasEvents.length === 0) { + info(JSON.stringify(sameMethodEvents)); + } + is( + sameExtrasEvents[0].extras.session_id, + expectedSessionId, + "Select page event has the expected session" + ); + } + + return evts; +} +/* exported checkTelemetryEvents */ + +/** + * Retrieve the session id from an "open" event. + * Note that calling this will "clear" all the events. + */ +function getOpenEventSessionId() { + const openEvents = readAboutDebuggingEvents().filter( + e => e.method === "open_adbg" + ); + ok(!!openEvents[0], "Found an about:debugging open event"); + return openEvents[0].extras.session_id; +} +/* exported getOpenEventSessionId */ + +/** + * Read all the pending events that have "aboutdebugging" as their object property. + * WARNING: Calling this method also flushes/clears the events. + */ +function readAboutDebuggingEvents() { + const ALL_CHANNELS = Ci.nsITelemetry.DATASET_ALL_CHANNELS; + // Retrieve and clear telemetry events. + const snapshot = Services.telemetry.snapshotEvents(ALL_CHANNELS, true); + // about:debugging events are logged in the parent process + const parentEvents = snapshot.parent || []; + + return parentEvents + .map(_toEventObject) + .filter(e => e.object === "aboutdebugging"); +} +/* exported getLoggedEvents */ + +/** + * The telemetry event data structure is simply an array. This helper remaps the array to + * an object with more user friendly properties. + */ +function _toEventObject(rawEvent) { + return { + // Category is typically devtools.main for us. + category: rawEvent[1], + // Method is the event's name (eg open, select_page etc...) + method: rawEvent[2], + // Object will usually be aboutdebugging for our tests + object: rawEvent[3], + // Value is usually empty for devtools events + value: rawEvent[4], + // Extras contain all the details of the event, including the session_id. + extras: rawEvent[5], + }; +} |