diff options
Diffstat (limited to 'mobile/android/tests/browser/robocop/testUITelemetry.js')
-rw-r--r-- | mobile/android/tests/browser/robocop/testUITelemetry.js | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/mobile/android/tests/browser/robocop/testUITelemetry.js b/mobile/android/tests/browser/robocop/testUITelemetry.js new file mode 100644 index 000000000..5edf06f19 --- /dev/null +++ b/mobile/android/tests/browser/robocop/testUITelemetry.js @@ -0,0 +1,154 @@ +// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cu = Components.utils; + +Cu.import("resource://gre/modules/Services.jsm"); + +const EVENT_TEST1 = "_test_event_1.1"; +const EVENT_TEST2 = "_test_event_2.1"; +const EVENT_TEST3 = "_test_event_3.1"; +const EVENT_TEST4 = "_test_event_4.1"; + +const METHOD_TEST1 = "_test_method_1"; +const METHOD_TEST2 = "_test_method_2"; + +const METHOD_NONE = null; + +const REASON_TEST1 = "_test_reason_1"; +const REASON_TEST2 = "_test_reason_2"; + +const SESSION_STARTED_TWICE = "_test_session_started_twice.1"; +const SESSION_STOPPED_TWICE = "_test_session_stopped_twice.1"; + +function do_check_array_eq(a1, a2) { + do_check_eq(a1.length, a2.length); + for (let i = 0; i < a1.length; ++i) { + do_check_eq(a1[i], a2[i]); + } +} + +/** + * Asserts that the given measurements are equal. Assumes that measurements + * of type "event" have their sessions arrays sorted. + */ +function do_check_measurement_eq(m1, m2) { + do_check_eq(m1.type, m2.type); + + switch (m1.type) { + case "event": + do_check_eq(m1.action, m2.action); + do_check_eq(m1.method, m2.method); + do_check_array_eq(m1.sessions, m2.sessions); + do_check_eq(m1.extras, m2.extras); + break; + + case "session": + do_check_eq(m1.name, m2.name); + do_check_eq(m1.reason, m2.reason); + break; + + default: + do_throw("Unknown event type: " + m1.type); + } +} + +function getObserver() { + let bridge = Cc["@mozilla.org/android/bridge;1"] + .getService(Ci.nsIAndroidBridge); + let obsXPCOM = bridge.browserApp.getUITelemetryObserver(); + do_check_true(!!obsXPCOM); + return obsXPCOM.wrappedJSObject; +} + +/** + * The following event test will fail if telemetry isn't enabled. The Java-side + * part of this test should have turned it on; fail if it didn't work. + */ +add_test(function test_enabled() { + let obs = getObserver(); + do_check_true(!!obs); + do_check_true(obs.enabled); + run_next_test(); +}); + +add_test(function test_telemetry_events() { + let expected = expectedArraysToObjs([ + ["event", EVENT_TEST1, METHOD_TEST1, [], undefined], + ["event", EVENT_TEST2, METHOD_TEST1, [SESSION_STARTED_TWICE], undefined], + ["event", EVENT_TEST2, METHOD_TEST2, [SESSION_STARTED_TWICE], undefined], + ["event", EVENT_TEST3, METHOD_TEST1, [SESSION_STARTED_TWICE, SESSION_STOPPED_TWICE], "foobarextras"], + ["session", SESSION_STARTED_TWICE, REASON_TEST1], + ["event", EVENT_TEST4, METHOD_TEST1, [SESSION_STOPPED_TWICE], "barextras"], + ["session", SESSION_STOPPED_TWICE, REASON_TEST2], + ["event", EVENT_TEST1, METHOD_NONE, [], undefined], + ]); + + let clearMeasurements = false; + let obs = getObserver(); + let measurements = removeNonTestMeasurements(obs.getUIMeasurements(clearMeasurements)); + + measurements.forEach(function (m, i) { + if (m.type === "event") { + m.sessions = removeNonTestSessions(m.sessions); + m.sessions.sort(); // Mutates. + } + + do_check_measurement_eq(expected[i], m); + }); + + expected.forEach(function (m, i) { + do_check_measurement_eq(m, measurements[i]); + }); + + run_next_test(); +}); + +/** + * Converts the expected value arrays to objects, + * for less typing when initializing the expected arrays. + */ +function expectedArraysToObjs(expectedArrays) { + return expectedArrays.map(function (arr) { + let type = arr[0]; + if (type === "event") { + return { + type: type, + action: arr[1], + method: arr[2], + sessions: arr[3].sort(), // Sort, just in case it's not sorted by hand! + extras: arr[4], + }; + + } else if (type === "session") { + return { + type: type, + name: arr[1], + reason: arr[2], + }; + } + }); +} + +function removeNonTestMeasurements(measurements) { + return measurements.filter(function (measurement) { + if (measurement.type === "event") { + return measurement.action.startsWith("_test_event_"); + } else if (measurement.type === "session") { + return measurement.name.startsWith("_test_session_"); + } + return false; + }); +} + +function removeNonTestSessions(sessions) { + return sessions.filter(function (sessionName) { + return sessionName.startsWith("_test_session_"); + }); +} + +run_next_test(); |