diff options
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_extension_content_telemetry.js')
-rw-r--r-- | toolkit/components/extensions/test/xpcshell/test_ext_extension_content_telemetry.js | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_extension_content_telemetry.js b/toolkit/components/extensions/test/xpcshell/test_ext_extension_content_telemetry.js new file mode 100644 index 0000000000..8d5ec1d0f6 --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/test_ext_extension_content_telemetry.js @@ -0,0 +1,220 @@ +/* -*- 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: [ + { + matches: ["http://*/*/file_sample.html"], + js: ["content_script.js"], + run_at: "document_end", + }, + ], + }, + + files: { + "content_script.js": contentScript, + }, + }); + let extension2 = ExtensionTestUtils.loadExtension({ + manifest: { + content_scripts: [ + { + matches: ["http://*/*/file_sample.html"], + 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(); +}); |