gecko/toolkit/components/telemetry/tests/unit/test_nsITelemetry.js

122 lines
3.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const INT_MAX = 0x7FFFFFFF;
const Telemetry = Cc["@mozilla.org/base/telemetry;1"].getService(Ci.nsITelemetry);
Cu.import("resource://gre/modules/Services.jsm");
function test_histogram(histogram_type, name, min, max, bucket_count) {
var h = Telemetry.newHistogram(name, min, max, bucket_count, histogram_type);
var r = h.snapshot().ranges;
var sum = 0;
for(var i=0;i<r.length;i++) {
var v = r[i];
sum += v;
h.add(v);
}
var s = h.snapshot();
// verify sum
do_check_eq(sum, h.snapshot().sum);;
// there should be exactly one element per bucket
for each(var i in s.counts) {
do_check_eq(i, 1);
}
var hgrams = Telemetry.histogramSnapshots
gh = hgrams[name]
do_check_eq(gh.histogram_type, histogram_type);
do_check_eq(gh.min, min)
do_check_eq(gh.max, max)
do_check_false(gh.static);
// Check that booleans work with nonboolean histograms
h.add(false);
h.add(true);
var s = h.snapshot().counts;
do_check_eq(s[0], 2)
do_check_eq(s[1], 2)
}
function expect_fail(f) {
let failed = false;
try {
f();
failed = false;
} catch (e) {
failed = true;
}
do_check_true(failed);
}
function test_boolean_histogram()
{
var h = Telemetry.newHistogram("test::boolean histogram", 99,1,4, Telemetry.HISTOGRAM_BOOLEAN);
var r = h.snapshot().ranges;
// boolean histograms ignore numeric parameters
do_check_eq(uneval(r), uneval([0, 1, 2]))
var sum = 0
for(var i=0;i<r.length;i++) {
var v = r[i];
sum += v;
h.add(v);
}
h.add(true);
h.add(false);
var s = h.snapshot();
do_check_eq(s.histogram_type, Telemetry.HISTOGRAM_BOOLEAN);
// last bucket should always be 0 since .add parameters are normalized to either 0 or 1
do_check_eq(s.counts[2], 0);
do_check_eq(s.sum, 3);
do_check_eq(s.counts[0], 2);
}
function test_getHistogramById() {
try {
Telemetry.getHistogramById("nonexistent");
do_throw("This can't happen");
} catch (e) {
}
var h = Telemetry.getHistogramById("CYCLE_COLLECTOR");
var s = h.snapshot();
do_check_eq(s.histogram_type, Telemetry.HISTOGRAM_EXPONENTIAL);
do_check_eq(s.min, 1);
do_check_eq(s.max, 10000);
do_check_true(s.static);
}
// Check that telemetry doesn't record in private mode
function test_privateMode() {
var h = Telemetry.newHistogram("test::private_mode_boolean", 1,2,3, Telemetry.HISTOGRAM_BOOLEAN);
var orig = h.snapshot();
Telemetry.canRecord = false;
h.add(1);
do_check_eq(uneval(orig), uneval(h.snapshot()));
Telemetry.canRecord = true;
h.add(1);
do_check_neq(uneval(orig), uneval(h.snapshot()));
}
function run_test()
{
let kinds = [Telemetry.HISTOGRAM_EXPONENTIAL, Telemetry.HISTOGRAM_LINEAR]
for each (let histogram_type in kinds) {
let [min, max, bucket_count] = [1, INT_MAX - 1, 10]
test_histogram(histogram_type, "test::"+histogram_type, min, max, bucket_count);
const nh = Telemetry.newHistogram;
expect_fail(function () nh("test::min", 0, max, bucket_count, histogram_type));
expect_fail(function () nh("test::bucket_count", min, max, 1, histogram_type));
}
test_boolean_histogram();
test_getHistogramById();
test_privateMode();
}