diff options
Diffstat (limited to 'toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js')
-rw-r--r-- | toolkit/components/telemetry/tests/unit/test_TelemetryClientID_reset.js | 191 |
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(); +}); |