diff options
Diffstat (limited to 'toolkit/components/telemetry/tests/unit/test_MigratePendingPings.js')
-rw-r--r-- | toolkit/components/telemetry/tests/unit/test_MigratePendingPings.js | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/toolkit/components/telemetry/tests/unit/test_MigratePendingPings.js b/toolkit/components/telemetry/tests/unit/test_MigratePendingPings.js new file mode 100644 index 0000000000..bb618bb8da --- /dev/null +++ b/toolkit/components/telemetry/tests/unit/test_MigratePendingPings.js @@ -0,0 +1,153 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +*/ + +"use strict"; + +const { TelemetryStorage } = ChromeUtils.importESModule( + "resource://gre/modules/TelemetryStorage.sys.mjs" +); +const { TelemetryUtils } = ChromeUtils.importESModule( + "resource://gre/modules/TelemetryUtils.sys.mjs" +); +const { makeFakeAppDir } = ChromeUtils.importESModule( + "resource://testing-common/AppData.sys.mjs" +); + +// The name of the pending pings directory outside of the user profile, +// in the user app data directory. +const PENDING_PING_DIR_NAME = "Pending Pings"; + +// Create a directory inside the profile and register it as UAppData, so +// we can stick fake crash pings inside there. We put it inside the profile +// just because we know that will get cleaned up after the test runs. +async function createFakeAppDir() { + // Create "<profile>/UAppData/Pending Pings". + const pendingPingsPath = PathUtils.join( + PathUtils.profileDir, + "UAppData", + PENDING_PING_DIR_NAME + ); + await IOUtils.makeDirectory(pendingPingsPath, { + ignoreExisting: true, + createAncestors: true, + }); + + await makeFakeAppDir(); +} + +add_task(async function setup() { + // Init the profile. + do_get_profile(); + await createFakeAppDir(); + // Make sure we don't generate unexpected pings due to pref changes. + await setEmptyPrefWatchlist(); +}); + +add_task(async function test_migrateUnsentPings() { + const PINGS = [ + { + type: "crash", + id: TelemetryUtils.generateUUID(), + payload: { foo: "bar" }, + dateCreated: new Date(2010, 1, 1, 10, 0, 0), + }, + { + type: "other", + id: TelemetryUtils.generateUUID(), + payload: { moo: "meh" }, + dateCreated: new Date(2010, 2, 1, 10, 2, 0), + }, + ]; + const APP_DATA_DIR = Services.dirsvc.get("UAppData", Ci.nsIFile).path; + const APPDATA_PINGS_DIR = PathUtils.join(APP_DATA_DIR, PENDING_PING_DIR_NAME); + + // Create some pending pings outside of the user profile. + for (let ping of PINGS) { + const pingPath = PathUtils.join(APPDATA_PINGS_DIR, ping.id + ".json"); + await TelemetryStorage.savePingToFile(ping, pingPath, true); + } + + // Make sure the pending ping list is empty. + await TelemetryStorage.testClearPendingPings(); + + // Start the migration from TelemetryStorage. + let pendingPings = await TelemetryStorage.loadPendingPingList(); + Assert.equal( + pendingPings.length, + 2, + "TelemetryStorage must have migrated 2 pings." + ); + + for (let ping of PINGS) { + // Verify that the pings were migrated and are among the pending pings. + Assert.ok( + pendingPings.find(p => p.id == ping.id), + "The ping must have been migrated." + ); + + // Try to load the migrated ping from the user profile. + let migratedPing = await TelemetryStorage.loadPendingPing(ping.id); + Assert.equal( + ping.id, + migratedPing.id, + "Should have loaded the correct ping id." + ); + Assert.equal( + ping.type, + migratedPing.type, + "Should have loaded the correct ping type." + ); + Assert.deepEqual( + ping.payload, + migratedPing.payload, + "Should have loaded the correct payload." + ); + + // Verify that the pings are no longer outside of the user profile. + const pingPath = PathUtils.join(APPDATA_PINGS_DIR, ping.id + ".json"); + Assert.ok( + !(await IOUtils.exists(pingPath)), + "The ping should not be in the Pending Pings directory anymore." + ); + } +}); + +add_task(async function test_migrateIncompatiblePing() { + const APP_DATA_DIR = Services.dirsvc.get("UAppData", Ci.nsIFile).path; + const APPDATA_PINGS_DIR = PathUtils.join(APP_DATA_DIR, PENDING_PING_DIR_NAME); + + // Create a ping incompatible with migration outside of the user profile. + const pingPath = PathUtils.join(APPDATA_PINGS_DIR, "incompatible.json"); + await TelemetryStorage.savePingToFile({ incom: "patible" }, pingPath, true); + + // Ensure the pending ping list is empty. + await TelemetryStorage.testClearPendingPings(); + TelemetryStorage.reset(); + + // Start the migration from TelemetryStorage. + let pendingPings = await TelemetryStorage.loadPendingPingList(); + Assert.equal( + pendingPings.length, + 0, + "TelemetryStorage must have migrated no pings." + + JSON.stringify(pendingPings) + ); + + Assert.ok( + !(await IOUtils.exists(pingPath)), + "The incompatible ping must have been deleted by the migration" + ); +}); + +add_task(async function teardown() { + // Delete the UAppData directory and make sure nothing breaks. + const APP_DATA_DIR = Services.dirsvc.get("UAppData", Ci.nsIFile).path; + await IOUtils.remove(APP_DATA_DIR, { recursive: true }); + Assert.ok( + !(await IOUtils.exists(APP_DATA_DIR)), + "The UAppData directory must not exist anymore." + ); + TelemetryStorage.reset(); + await TelemetryStorage.loadPendingPingList(); +}); |