summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_process_crash_telemetry.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /toolkit/components/extensions/test/xpcshell/test_process_crash_telemetry.js
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_process_crash_telemetry.js')
-rw-r--r--toolkit/components/extensions/test/xpcshell/test_process_crash_telemetry.js126
1 files changed, 126 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_process_crash_telemetry.js b/toolkit/components/extensions/test/xpcshell/test_process_crash_telemetry.js
new file mode 100644
index 0000000000..151fce579e
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_process_crash_telemetry.js
@@ -0,0 +1,126 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+const { ExtensionProcessCrashObserver } = ChromeUtils.importESModule(
+ "resource://gre/modules/Extension.sys.mjs"
+);
+
+AddonTestUtils.init(this);
+AddonTestUtils.overrideCertDB();
+AddonTestUtils.createAppInfo(
+ "xpcshell@tests.mozilla.org",
+ "XPCShell",
+ "1",
+ "43"
+);
+
+add_setup(() => {
+ // FOG needs a profile directory to put its data in.
+ do_get_profile();
+ // FOG needs to be initialized in order for data to flow
+ // NOTE: in mobile builds the test will pass without this call,
+ // but in Desktop build the xpcshell test would get stuck on
+ // the call to testGetValue.
+ Services.fog.initializeFOG();
+ Services.fog.testResetFOG();
+
+ Assert.equal(
+ ExtensionProcessCrashObserver.appInForeground,
+ AppConstants.platform !== "android",
+ "Expect appInForeground to be initially true on desktop and false on android builds"
+ );
+
+ // For Android build we mock the app moving in the foreground for the first time
+ // (which, in a real Fenix instance, happens when the application receives the first
+ // call to the onPause lifecycle callback and the geckoview-initial-foreground
+ // topic is being notified to Gecko as a side-effect of that).
+ //
+ // We have to mock the app moving in the foreground before any of the test extension
+ // startup, so that both Desktop and Mobile builds are in the same initial foreground
+ // state for the rest of the test file.
+ if (AppConstants.platform === "android") {
+ info("Mock geckoview-initial-foreground observer service topic");
+ ExtensionProcessCrashObserver.observe(null, "geckoview-initial-foreground");
+ Assert.equal(
+ ExtensionProcessCrashObserver.appInForeground,
+ true,
+ "Expect appInForeground to be true after geckoview-initial-foreground topic"
+ );
+ }
+});
+
+add_task(async function test_process_crash_telemetry() {
+ await AddonTestUtils.promiseStartupManager();
+
+ let extension = ExtensionTestUtils.loadExtension({
+ useAddonManager: "permanent",
+ background() {
+ browser.test.sendMessage("bg:loaded");
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("bg:loaded");
+
+ let { currentProcessChildID } = ExtensionProcessCrashObserver;
+
+ Assert.notEqual(
+ currentProcessChildID,
+ undefined,
+ "Expect ExtensionProcessCrashObserver.currentProcessChildID to be set"
+ );
+
+ Assert.equal(
+ ChromeUtils.getAllDOMProcesses().find(
+ pp => pp.childID == currentProcessChildID
+ )?.remoteType,
+ "extension",
+ "Expect a child process with remoteType extension to be found for the process childID set"
+ );
+
+ Assert.ok(
+ Glean.extensions.processEvent.created_fg.testGetValue() > 0,
+ "Expect glean processEvent.created_fg to be set."
+ );
+ Assert.equal(
+ undefined,
+ Glean.extensions.processEvent.created_bg.testGetValue(),
+ "Expect glean processEvent.created_bg to be not set."
+ );
+
+ info("Mock application-background observer service topic");
+ ExtensionProcessCrashObserver.observe(null, "application-background");
+
+ Assert.equal(
+ ExtensionProcessCrashObserver.appInForeground,
+ // Only in desktop builds we expect the flag to be always true
+ !ExtensionProcessCrashObserver._isAndroid,
+ "Got expected value set on ExtensionProcessCrashObserver.appInForeground"
+ );
+
+ info("Mock a process crash being notified");
+ let propertyBag = Cc["@mozilla.org/hash-property-bag;1"].createInstance(
+ Ci.nsIWritablePropertyBag2
+ );
+ propertyBag.setPropertyAsBool("abnormal", true);
+ ExtensionProcessCrashObserver.observe(
+ propertyBag,
+ "ipc:content-shutdown",
+ currentProcessChildID
+ );
+
+ if (ExtensionProcessCrashObserver._isAndroid) {
+ Assert.ok(
+ Glean.extensions.processEvent.crashed_bg.testGetValue() > 0,
+ "Expect glean processEvent.crashed_bg to be set on Android builds."
+ );
+ } else {
+ Assert.ok(
+ Glean.extensions.processEvent.crashed_fg.testGetValue() > 0,
+ "Expect glean processEvent.crashed_fg to be set on desktop."
+ );
+ }
+
+ await extension.unload();
+});