/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ function getSimpleMeasurementsFromTelemetryPing() { const TelemetryPing = Cc["@mozilla.org/base/telemetry-ping;1"].getService(Ci.nsIObserver); let str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString); TelemetryPing.observe(str, "get-payload", ""); return JSON.parse(str.data).simpleMeasurements; } function test() { // Test the module logic let tmp = {}; Cu.import("resource:///modules/TelemetryTimestamps.jsm", tmp); let TelemetryTimestamps = tmp.TelemetryTimestamps; let now = Date.now(); TelemetryTimestamps.add("foo"); ok(TelemetryTimestamps.get().foo, "foo was added"); ok(TelemetryTimestamps.get().foo >= now, "foo has a reasonable value"); // Add timestamp with value // Use a value far in the future since TelemetryPing substracts the time of // process initialization. const YEAR_4000_IN_MS = 64060588800000; TelemetryTimestamps.add("bar", YEAR_4000_IN_MS); ok(TelemetryTimestamps.get().bar, "bar was added"); is(TelemetryTimestamps.get().bar, YEAR_4000_IN_MS, "bar has the right value"); // Can't add the same timestamp twice TelemetryTimestamps.add("bar", 2); is(TelemetryTimestamps.get().bar, YEAR_4000_IN_MS, "bar wasn't overwritten"); let threw = false; try { TelemetryTimestamps.add("baz", "this isn't a number"); } catch (ex) { threw = true; } ok(threw, "adding baz threw"); ok(!TelemetryTimestamps.get().baz, "no baz was added"); // Test that the data gets added to the telemetry ping properly let simpleMeasurements = getSimpleMeasurementsFromTelemetryPing(); ok(simpleMeasurements, "got simple measurements from ping data"); ok(simpleMeasurements.foo > 1, "foo was included"); ok(simpleMeasurements.bar > 1, "bar was included"); ok(!simpleMeasurements.baz, "baz wasn't included since it wasn't added"); // Check browser timestamps that we add let props = [ // These can't be reliably tested when the test is run alone //"delayedStartupStarted", //"delayedStartupFinished", "sessionRestoreInitialized", // This doesn't get hit in the testing profile //"sessionRestoreRestoring" ]; props.forEach(function (p) { let value = simpleMeasurements[p]; ok(value, p + " exists"); ok(!isNaN(value), p + " is a number"); ok(value > 0, p + " value is reasonable"); }); }