Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
const HISTOGRAM = "WEBEXT_CONTENT_SCRIPT_INJECTION_MS";
const HISTOGRAM_KEYED = "WEBEXT_CONTENT_SCRIPT_INJECTION_MS_BY_ADDONID";
const GLEAN_METRIC_ID = "contentScriptInjection";
const server = createHttpServer();
server.registerDirectory("/data/", do_get_file("data"));
const BASE_URL = `http://localhost:${server.identity.primaryPort}/data`;
add_task(async function test_telemetry() {
const { GleanTimingDistribution } = globalThis;
function contentScript() {
browser.test.sendMessage("content-script-run");
}
let extension1 = ExtensionTestUtils.loadExtension({
manifest: {
content_scripts: [
{
js: ["content_script.js"],
run_at: "document_end",
},
],
},
files: {
"content_script.js": contentScript,
},
});
let extension2 = ExtensionTestUtils.loadExtension({
manifest: {
content_scripts: [
{
js: ["content_script.js"],
run_at: "document_end",
},
],
},
files: {
"content_script.js": contentScript,
},
});
// Make sure to force flushing glean fog data from child processes before
// resetting the already collected data.
await Services.fog.testFlushAllChildren();
resetTelemetryData();
let process = "content";
// Assert unified telemetry data.
if (AppConstants.platform != "android") {
ok(
!(HISTOGRAM in getSnapshots(process)),
`No data recorded for histogram: ${HISTOGRAM}.`
);
ok(
!(HISTOGRAM_KEYED in getKeyedSnapshots(process)),
`No data recorded for keyed histogram: ${HISTOGRAM_KEYED}.`
);
}
// Assert glean telemetry data.
assertGleanMetricsNoSamples({
metricId: GLEAN_METRIC_ID,
gleanMetric: Glean.extensionsTiming[GLEAN_METRIC_ID],
gleanMetricConstructor: GleanTimingDistribution,
});
await extension1.startup();
let extensionId = extension1.extension.id;
info(`Started extension with id ${extensionId}`);
// Assert unified telemetry data.
if (AppConstants.platform != "android") {
ok(
!(HISTOGRAM in getSnapshots(process)),
`No data recorded for histogram after startup: ${HISTOGRAM}.`
);
ok(
!(HISTOGRAM_KEYED in getKeyedSnapshots(process)),
`No data recorded for keyed histogram: ${HISTOGRAM_KEYED}.`
);
}
// Assert glean telemetry data.
assertGleanMetricsNoSamples({
metricId: GLEAN_METRIC_ID,
gleanMetric: Glean.extensionsTiming[GLEAN_METRIC_ID],
gleanMetricConstructor: GleanTimingDistribution,
});
let contentPage = await ExtensionTestUtils.loadContentPage(
`${BASE_URL}/file_sample.html`
);
await extension1.awaitMessage("content-script-run");
// Assert unified telemetry data.
if (AppConstants.platform != "android") {
await promiseTelemetryRecorded(HISTOGRAM, process, 1);
await promiseKeyedTelemetryRecorded(
HISTOGRAM_KEYED,
process,
extensionId,
1
);
equal(
valueSum(getSnapshots(process)[HISTOGRAM].values),
1,
`Data recorded for histogram: ${HISTOGRAM}.`
);
equal(
valueSum(getKeyedSnapshots(process)[HISTOGRAM_KEYED][extensionId].values),
1,
`Data recorded for histogram: ${HISTOGRAM_KEYED} with key ${extensionId}.`
);
}
// Assert glean telemetry data.
await Services.fog.testFlushAllChildren();
assertGleanMetricsSamplesCount({
metricId: GLEAN_METRIC_ID,
gleanMetric: Glean.extensionsTiming[GLEAN_METRIC_ID],
gleanMetricConstructor: GleanTimingDistribution,
expectedSamplesCount: 1,
});
await contentPage.close();
await extension1.unload();
await extension2.startup();
let extensionId2 = extension2.extension.id;
info(`Started extension with id ${extensionId2}`);
// Assert unified telemetry data.
if (AppConstants.platform != "android") {
equal(
valueSum(getSnapshots(process)[HISTOGRAM].values),
1,
`No new data recorded for histogram after extension2 startup: ${HISTOGRAM}.`
);
equal(
valueSum(getKeyedSnapshots(process)[HISTOGRAM_KEYED][extensionId].values),
1,
`No new data recorded for histogram after extension2 startup: ${HISTOGRAM_KEYED} with key ${extensionId}.`
);
ok(
!(extensionId2 in getKeyedSnapshots(process)[HISTOGRAM_KEYED]),
`No data recorded for histogram after startup: ${HISTOGRAM_KEYED} with key ${extensionId2}.`
);
}
// Assert glean telemetry data.
await Services.fog.testFlushAllChildren();
assertGleanMetricsSamplesCount({
metricId: GLEAN_METRIC_ID,
gleanMetric: Glean.extensionsTiming[GLEAN_METRIC_ID],
gleanMetricConstructor: GleanTimingDistribution,
expectedSamplesCount: 1,
message: "No new data recorded yet after extension 2 startup",
});
contentPage = await ExtensionTestUtils.loadContentPage(
`${BASE_URL}/file_sample.html`
);
await extension2.awaitMessage("content-script-run");
// Assert unified telemetry data.
if (AppConstants.platform != "android") {
await promiseTelemetryRecorded(HISTOGRAM, process, 2);
await promiseKeyedTelemetryRecorded(
HISTOGRAM_KEYED,
process,
extensionId2,
1
);
equal(
valueSum(getSnapshots(process)[HISTOGRAM].values),
2,
`Data recorded for histogram: ${HISTOGRAM}.`
);
equal(
valueSum(getKeyedSnapshots(process)[HISTOGRAM_KEYED][extensionId].values),
1,
`No new data recorded for histogram: ${HISTOGRAM_KEYED} with key ${extensionId}.`
);
equal(
valueSum(
getKeyedSnapshots(process)[HISTOGRAM_KEYED][extensionId2].values
),
1,
`Data recorded for histogram: ${HISTOGRAM_KEYED} with key ${extensionId2}.`
);
}
// Assert glean telemetry data.
await Services.fog.testFlushAllChildren();
assertGleanMetricsSamplesCount({
metricId: GLEAN_METRIC_ID,
gleanMetric: Glean.extensionsTiming[GLEAN_METRIC_ID],
gleanMetricConstructor: GleanTimingDistribution,
expectedSamplesCount: 2,
message: "New data recorded after extension 2 content script injection",
});
await contentPage.close();
await extension2.unload();
});