/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ /* * Verifies the async flushing methods. */ add_task(async () => { let defaultProfile = makeRandomProfileDir("default"); let hash = xreDirProvider.getInstallHash(); writeCompatibilityIni(defaultProfile); writeProfilesIni({ profiles: [ { name: "default", path: defaultProfile.leafName, default: false, }, ], installs: { [hash]: { default: defaultProfile.leafName }, }, }); selectStartupProfile(); checkStartupReason("default"); let profileData = readProfilesIni(); checkProfileService(profileData); let service = getProfileService(); let newProfileDir = makeRandomProfileDir("newProfile"); service.createProfile(newProfileDir, "new"); await service.asyncFlush(); profileData = readProfilesIni(); Assert.equal(profileData.profiles.length, 2, "Should now have two profiles."); checkProfileService(profileData); let other1 = makeRandomProfileDir("other1"); let other2 = makeRandomProfileDir("other2"); // Write out a different ini file. writeProfilesIni({ profiles: [ { name: "changedname", path: defaultProfile.leafName, }, { name: "other1", path: other1.leafName, }, { name: "other2", path: other2.leafName, }, ], installs: { [hash]: { default: defaultProfile.leafName }, }, }); // Change the modified time. let profilesini = gDataHome.clone(); profilesini.append("profiles.ini"); let oldTime = profilesini.lastModifiedTime; profilesini.lastModifiedTime = oldTime - 10000; try { await service.asyncFlush(); Assert.ok(false, "Flushing should have failed"); } catch (e) { Assert.ok(true, "Flushing should have failed"); } profileData = readProfilesIni(); Assert.equal(profileData.profiles.length, 3, "Should have three profiles."); let found = profileData.profiles.find(p => p.name == "changedname"); Assert.ok(found, "Should have found the current profile."); Assert.equal(found.path, defaultProfile.leafName); Assert.equal(found.storeID, null); found = profileData.profiles.find(p => p.name == "other1"); Assert.ok(found, "Should have found the other1 profile."); Assert.equal(found.path, other1.leafName); Assert.equal(found.storeID, null); found = profileData.profiles.find(p => p.name == "other2"); Assert.ok(found, "Should have found the other2 profile."); Assert.equal(found.path, other2.leafName); Assert.equal(found.storeID, null); let installData = readInstallsIni(); Assert.equal(profileData.installs[hash].default, defaultProfile.leafName); Assert.equal(installData.installs[hash].default, defaultProfile.leafName); if (AppConstants.MOZ_SELECTABLE_PROFILES) { // Set a store ID on the profile. Flushing will succeed because the profile path hasn't changed. service.currentProfile.storeID = "7126354jdf"; await service.asyncFlushGroupProfile(); profileData = readProfilesIni(); Assert.equal(profileData.profiles.length, 3, "Should have three profiles."); found = profileData.profiles.find(p => p.name == "changedname"); Assert.ok(found, "Should have found the current profile."); Assert.equal(found.path, defaultProfile.leafName); Assert.equal(found.storeID, "7126354jdf"); found = profileData.profiles.find(p => p.name == "other1"); Assert.ok(found, "Should have found the other1 profile."); Assert.equal(found.path, other1.leafName); Assert.equal(found.storeID, null); found = profileData.profiles.find(p => p.name == "other2"); Assert.ok(found, "Should have found the other2 profile."); Assert.equal(found.path, other2.leafName); Assert.equal(found.storeID, null); installData = readInstallsIni(); Assert.equal(profileData.installs[hash].default, defaultProfile.leafName); Assert.equal(installData.installs[hash].default, defaultProfile.leafName); // Change the profile path. Flushing will succeed because the store ID now matches. service.currentProfile.rootDir = newProfileDir; await service.asyncFlushGroupProfile(); profileData = readProfilesIni(); Assert.equal(profileData.profiles.length, 3, "Should have three profiles."); found = profileData.profiles.find(p => p.name == "changedname"); Assert.ok(found, "Should have found the current profile."); Assert.equal(found.path, newProfileDir.leafName); Assert.equal(found.storeID, "7126354jdf"); found = profileData.profiles.find(p => p.name == "other1"); Assert.ok(found, "Should have found the other1 profile."); Assert.equal(found.path, other1.leafName); Assert.equal(found.storeID, null); found = profileData.profiles.find(p => p.name == "other2"); Assert.ok(found, "Should have found the other2 profile."); Assert.equal(found.path, other2.leafName); Assert.equal(found.storeID, null); installData = readInstallsIni(); Assert.equal(profileData.installs[hash].default, newProfileDir.leafName); Assert.equal(installData.installs[hash].default, newProfileDir.leafName); // Modify the on-disk data writeProfilesIni({ profiles: [ { name: "some other name", path: "some other directory", storeID: "7126354jdf", }, ], installs: { [hash]: { default: "some other directory" }, }, }); await service.asyncFlushGroupProfile(); profileData = readProfilesIni(); Assert.equal(profileData.profiles.length, 1, "Should have one profile."); found = profileData.profiles[0]; Assert.ok(found, "Should have found the current profile."); Assert.equal(found.path, newProfileDir.leafName); Assert.equal(found.storeID, "7126354jdf"); } });