From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- .../xpcshell/test_ext_startup_cache_telemetry.js | 173 +++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 toolkit/components/extensions/test/xpcshell/test_ext_startup_cache_telemetry.js (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_startup_cache_telemetry.js') diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache_telemetry.js b/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache_telemetry.js new file mode 100644 index 0000000000..7ceec46679 --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/test_ext_startup_cache_telemetry.js @@ -0,0 +1,173 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +ChromeUtils.defineESModuleGetters(this, { + ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs", + TelemetryTestUtils: "resource://testing-common/TelemetryTestUtils.sys.mjs", +}); + +AddonTestUtils.init(this); +AddonTestUtils.overrideCertDB(); + +AddonTestUtils.createAppInfo( + "xpcshell@tests.mozilla.org", + "XPCShell", + "42", + "42" +); + +const ADDON_ID = "test-startup-cache-telemetry@xpcshell.mozilla.org"; + +add_setup(async () => { + // FOG needs a profile directory to put its data in. + do_get_profile(); + // FOG needs to be initialized in order for data to flow. + Services.fog.initializeFOG(); + + await AddonTestUtils.promiseStartupManager(); +}); + +add_task(async function test_startupCache_write_byteLength() { + Services.fog.testResetFOG(); + const extension = ExtensionTestUtils.loadExtension({ + useAddonManager: "permanent", + manifest: { + browser_specific_settings: { gecko: { id: ADDON_ID } }, + }, + }); + + await extension.startup(); + + const { StartupCache } = ExtensionParent; + + const aomStartup = Cc[ + "@mozilla.org/addons/addon-manager-startup;1" + ].getService(Ci.amIAddonManagerStartup); + + let expectedByteLength = new Uint8Array( + aomStartup.encodeBlob(StartupCache._data) + ).byteLength; + + equal( + typeof expectedByteLength, + "number", + "Got a numeric byteLength for the expected startupCache data" + ); + Assert.greater( + expectedByteLength, + 0, + "Got a non-zero byteLength as expected" + ); + await StartupCache._saveNow(); + + let scalars = TelemetryTestUtils.getProcessScalars("parent"); + equal( + scalars["extensions.startupCache.write_byteLength"], + expectedByteLength, + "Got the expected value set in the 'extensions.startupCache.write_byteLength' scalar" + ); + equal( + Glean.extensions.startupCacheWriteBytelength.testGetValue(), + expectedByteLength, + "Expected 'extensions.startupCache.write_byteLength' Glean metric." + ); + + await extension.unload(); +}); + +add_task(async function test_startupCache_read_errors() { + const { StartupCache } = ExtensionParent; + + // Clear any pre-existing keyed scalar. + TelemetryTestUtils.getProcessScalars("parent", /* keyed */ true, true); + Services.fog.testResetFOG(); + + // Temporarily point StartupCache._file to a path that is + // not going to exist for sure. + Assert.notEqual( + StartupCache.file, + null, + "Got a StartupCache._file non-null property as expected" + ); + const oldFile = StartupCache.file; + const restoreStartupCacheFile = () => (StartupCache.file = oldFile); + StartupCache.file = `${StartupCache.file}.non_existing_file.${Math.random()}`; + registerCleanupFunction(restoreStartupCacheFile); + + // Make sure the _readData has been called and we can expect + // the extensions.startupCache.read_errors scalar to have + // been recorded. + await StartupCache._readData(); + + let scalars = TelemetryTestUtils.getProcessScalars( + "parent", + /* keyed */ true + ); + Assert.deepEqual( + scalars["extensions.startupCache.read_errors"], + { + NotFoundError: 1, + }, + "Got the expected value set in the 'extensions.startupCache.read_errors' keyed scalar" + ); + Assert.deepEqual( + Glean.extensions.startupCacheReadErrors.NotFoundError.testGetValue(), + 1, + "Expected value for 'extensions.startupCache.read_errors' Glean metric." + ); + + restoreStartupCacheFile(); +}); + +add_task(async function test_startupCache_load_timestamps() { + const { StartupCache } = ExtensionParent; + + // Clear any pre-existing keyed scalar and Glean metrics data. + Services.telemetry.getSnapshotForScalars("main", true); + Services.fog.testResetFOG(); + + let gleanMetric = Glean.extensions.startupCacheLoadTime.testGetValue(); + equal( + gleanMetric, + null, + "Expect extensions.startup_cache_load_time Glean metric to be initially null" + ); + + // Make sure the _readData has been called and we can expect + // the startupCache load telemetry timestamps to have been + // recorded. + await StartupCache._readData(); + + info( + "Verify telemetry recorded for the 'extensions.startup_cache_load_time' Glean metric" + ); + + gleanMetric = Glean.extensions.startupCacheLoadTime.testGetValue(); + equal( + typeof gleanMetric, + "number", + "Expect extensions.startup_cache_load_time Glean metric to be set to a number" + ); + + info( + "Verify telemetry mirrored into the 'extensions.startupCache.load_time' scalar" + ); + + const scalars = TelemetryTestUtils.getProcessScalars("parent", false, true); + const mirror = scalars["extensions.startupCache.load_time"]; + + equal( + typeof mirror, + "number", + "Expect extensions.startupCache.load_time mirrored scalar to be set to a number" + ); + + // See https://bugzilla.mozilla.org/show_bug.cgi?id=1865850. + Assert.lessOrEqual( + Math.abs(gleanMetric - mirror), + 1, + `Expect Glean metric ${gleanMetric} and mirrored scalar ${mirror} to be within 1ms of each other.` + ); +}); -- cgit v1.2.3