summaryrefslogtreecommitdiffstats
path: root/toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js')
-rw-r--r--toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js191
1 files changed, 191 insertions, 0 deletions
diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js b/toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js
new file mode 100644
index 0000000000..889de4498a
--- /dev/null
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js
@@ -0,0 +1,191 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+*/
+
+const { ClientID } = ChromeUtils.importESModule(
+ "resource://gre/modules/ClientID.sys.mjs"
+);
+const { TelemetryController } = ChromeUtils.importESModule(
+ "resource://gre/modules/TelemetryController.sys.mjs"
+);
+const { TelemetryStorage } = ChromeUtils.importESModule(
+ "resource://gre/modules/TelemetryStorage.sys.mjs"
+);
+const { TelemetryUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/TelemetryUtils.sys.mjs"
+);
+
+const DELETION_REQUEST_PING_TYPE = "deletion-request";
+const TEST_PING_TYPE = "test-ping-type";
+
+function sendPing(addEnvironment = false) {
+ let options = {
+ addClientId: true,
+ addEnvironment,
+ };
+ return TelemetryController.submitExternalPing(TEST_PING_TYPE, {}, options);
+}
+
+add_task(async function test_setup() {
+ // Addon manager needs a profile directory
+ do_get_profile();
+ // Make sure we don't generate unexpected pings due to pref changes.
+ await setEmptyPrefWatchlist();
+
+ Services.prefs.setBoolPref(TelemetryUtils.Preferences.FhrUploadEnabled, true);
+
+ await new Promise(resolve =>
+ Telemetry.asyncFetchTelemetryData(wrapWithExceptionHandler(resolve))
+ );
+
+ PingServer.start();
+ Services.prefs.setStringPref(
+ TelemetryUtils.Preferences.Server,
+ "http://localhost:" + PingServer.port
+ );
+ await TelemetryController.testSetup();
+});
+
+/**
+ * Testing the following scenario:
+ *
+ * 1. Telemetry upload gets disabled
+ * 2. Canary client ID is set
+ * 3. Instance is shut down
+ * 4. Telemetry upload flag is toggled
+ * 5. Instance is started again
+ * 6. Detect that upload is enabled and reset client ID
+ *
+ * This scenario e.g. happens when switching between channels
+ * with and without the deletion-request ping reset included.
+ */
+add_task(async function test_clientid_reset_after_reenabling() {
+ await sendPing();
+ let ping = await PingServer.promiseNextPing();
+ Assert.equal(ping.type, TEST_PING_TYPE, "The ping must be a test ping");
+ Assert.ok("clientId" in ping);
+
+ let firstClientId = ping.clientId;
+ Assert.notEqual(
+ TelemetryUtils.knownClientID,
+ firstClientId,
+ "Client ID should be valid and random"
+ );
+
+ // Disable FHR upload: this should trigger a deletion-request ping.
+ Services.prefs.setBoolPref(
+ TelemetryUtils.Preferences.FhrUploadEnabled,
+ false
+ );
+
+ ping = await PingServer.promiseNextPing();
+ Assert.equal(
+ ping.type,
+ DELETION_REQUEST_PING_TYPE,
+ "The ping must be a deletion-request ping"
+ );
+ Assert.equal(ping.clientId, firstClientId);
+ let clientId = await ClientID.getClientID();
+ Assert.equal(TelemetryUtils.knownClientID, clientId);
+
+ // Now shutdown the instance
+ await TelemetryController.testShutdown();
+ await TelemetryStorage.testClearPendingPings();
+
+ // Flip the pref again
+ Services.prefs.setBoolPref(TelemetryUtils.Preferences.FhrUploadEnabled, true);
+
+ // Start the instance
+ await TelemetryController.testReset();
+
+ let newClientId = await ClientID.getClientID();
+ Assert.notEqual(
+ TelemetryUtils.knownClientID,
+ newClientId,
+ "Client ID should be valid and random"
+ );
+ Assert.notEqual(
+ firstClientId,
+ newClientId,
+ "Client ID should be newly generated"
+ );
+});
+
+/**
+ * Testing the following scenario:
+ * (Reverse of the first test)
+ *
+ * 1. Telemetry upload gets disabled, canary client ID is set
+ * 2. Telemetry upload is enabled
+ * 3. New client ID is generated.
+ * 3. Instance is shut down
+ * 4. Telemetry upload flag is toggled
+ * 5. Instance is started again
+ * 6. Detect that upload is disabled and sets canary client ID
+ *
+ * This scenario e.g. happens when switching between channels
+ * with and without the deletion-request ping reset included.
+ */
+add_task(async function test_clientid_canary_after_disabling() {
+ await sendPing();
+ let ping = await PingServer.promiseNextPing();
+ Assert.equal(ping.type, TEST_PING_TYPE, "The ping must be a test ping");
+ Assert.ok("clientId" in ping);
+
+ let firstClientId = ping.clientId;
+ Assert.notEqual(
+ TelemetryUtils.knownClientID,
+ firstClientId,
+ "Client ID should be valid and random"
+ );
+
+ // Disable FHR upload: this should trigger a deletion-request ping.
+ Services.prefs.setBoolPref(
+ TelemetryUtils.Preferences.FhrUploadEnabled,
+ false
+ );
+
+ ping = await PingServer.promiseNextPing();
+ Assert.equal(
+ ping.type,
+ DELETION_REQUEST_PING_TYPE,
+ "The ping must be a deletion-request ping"
+ );
+ Assert.equal(ping.clientId, firstClientId);
+ let clientId = await ClientID.getClientID();
+ Assert.equal(TelemetryUtils.knownClientID, clientId);
+
+ Services.prefs.setBoolPref(TelemetryUtils.Preferences.FhrUploadEnabled, true);
+ await sendPing();
+ ping = await PingServer.promiseNextPing();
+ Assert.equal(ping.type, TEST_PING_TYPE, "The ping must be a test ping");
+ Assert.notEqual(
+ firstClientId,
+ ping.clientId,
+ "Client ID should be newly generated"
+ );
+
+ // Now shutdown the instance
+ await TelemetryController.testShutdown();
+ await TelemetryStorage.testClearPendingPings();
+
+ // Flip the pref again
+ Services.prefs.setBoolPref(
+ TelemetryUtils.Preferences.FhrUploadEnabled,
+ false
+ );
+
+ // Start the instance
+ await TelemetryController.testReset();
+
+ let newClientId = await ClientID.getClientID();
+ Assert.equal(
+ TelemetryUtils.knownClientID,
+ newClientId,
+ "Client ID should be a canary when upload disabled"
+ );
+});
+
+add_task(async function stopServer() {
+ await PingServer.stop();
+});