summaryrefslogtreecommitdiffstats
path: root/browser/components/migration/tests/unit/test_automigration.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/migration/tests/unit/test_automigration.js')
-rw-r--r--browser/components/migration/tests/unit/test_automigration.js695
1 files changed, 0 insertions, 695 deletions
diff --git a/browser/components/migration/tests/unit/test_automigration.js b/browser/components/migration/tests/unit/test_automigration.js
deleted file mode 100644
index bc9076a6c..000000000
--- a/browser/components/migration/tests/unit/test_automigration.js
+++ /dev/null
@@ -1,695 +0,0 @@
-"use strict";
-
-let AutoMigrateBackstage = Cu.import("resource:///modules/AutoMigrate.jsm"); /* globals AutoMigrate */
-
-let gShimmedMigratorKeyPicker = null;
-let gShimmedMigrator = null;
-
-const kUsecPerMin = 60 * 1000000;
-
-// This is really a proxy on MigrationUtils, but if we specify that directly,
-// we get in trouble because the object itself is frozen, and Proxies can't
-// return a different value to an object when directly proxying a frozen
-// object.
-AutoMigrateBackstage.MigrationUtils = new Proxy({}, {
- get(target, name) {
- if (name == "getMigratorKeyForDefaultBrowser" && gShimmedMigratorKeyPicker) {
- return gShimmedMigratorKeyPicker;
- }
- if (name == "getMigrator" && gShimmedMigrator) {
- return function() { return gShimmedMigrator };
- }
- return MigrationUtils[name];
- },
-});
-
-do_register_cleanup(function() {
- AutoMigrateBackstage.MigrationUtils = MigrationUtils;
-});
-
-// This should be replaced by using History.fetch with a fetchVisits option,
-// once that becomes available
-function* visitsForURL(url)
-{
- let visitCount = 0;
- let db = yield PlacesUtils.promiseDBConnection();
- visitCount = yield db.execute(
- `SELECT count(*) FROM moz_historyvisits v
- JOIN moz_places h ON h.id = v.place_id
- WHERE url_hash = hash(:url) AND url = :url`,
- {url});
- visitCount = visitCount[0].getInt64(0);
- return visitCount;
-}
-
-
-/**
- * Test automatically picking a browser to migrate from
- */
-add_task(function* checkMigratorPicking() {
- Assert.throws(() => AutoMigrate.pickMigrator("firefox"),
- /Can't automatically migrate from Firefox/,
- "Should throw when explicitly picking Firefox.");
-
- Assert.throws(() => AutoMigrate.pickMigrator("gobbledygook"),
- /migrator object is not available/,
- "Should throw when passing unknown migrator key");
- gShimmedMigratorKeyPicker = function() {
- return "firefox";
- };
- Assert.throws(() => AutoMigrate.pickMigrator(),
- /Can't automatically migrate from Firefox/,
- "Should throw when implicitly picking Firefox.");
- gShimmedMigratorKeyPicker = function() {
- return "gobbledygook";
- };
- Assert.throws(() => AutoMigrate.pickMigrator(),
- /migrator object is not available/,
- "Should throw when an unknown migrator is the default");
- gShimmedMigratorKeyPicker = function() {
- return "";
- };
- Assert.throws(() => AutoMigrate.pickMigrator(),
- /Could not determine default browser key/,
- "Should throw when an unknown migrator is the default");
-});
-
-
-/**
- * Test automatically picking a profile to migrate from
- */
-add_task(function* checkProfilePicking() {
- let fakeMigrator = {sourceProfiles: [{id: "a"}, {id: "b"}]};
- let profB = fakeMigrator.sourceProfiles[1];
- Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator),
- /Don't know how to pick a profile when more/,
- "Should throw when there are multiple profiles.");
- Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator, "c"),
- /Profile specified was not found/,
- "Should throw when the profile supplied doesn't exist.");
- let profileToMigrate = AutoMigrate.pickProfile(fakeMigrator, "b");
- Assert.equal(profileToMigrate, profB, "Should return profile supplied");
-
- fakeMigrator.sourceProfiles = null;
- Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator, "c"),
- /Profile specified but only a default profile found./,
- "Should throw when the profile supplied doesn't exist.");
- profileToMigrate = AutoMigrate.pickProfile(fakeMigrator);
- Assert.equal(profileToMigrate, null, "Should return default profile when that's the only one.");
-
- fakeMigrator.sourceProfiles = [];
- Assert.throws(() => AutoMigrate.pickProfile(fakeMigrator),
- /No profile data found/,
- "Should throw when no profile data is present.");
-
- fakeMigrator.sourceProfiles = [{id: "a"}];
- let profA = fakeMigrator.sourceProfiles[0];
- profileToMigrate = AutoMigrate.pickProfile(fakeMigrator);
- Assert.equal(profileToMigrate, profA, "Should return the only profile if only one is present.");
-});
-
-/**
- * Test the complete automatic process including browser and profile selection,
- * and actual migration (which implies startup)
- */
-add_task(function* checkIntegration() {
- gShimmedMigrator = {
- get sourceProfiles() {
- do_print("Read sourceProfiles");
- return null;
- },
- getMigrateData(profileToMigrate) {
- this._getMigrateDataArgs = profileToMigrate;
- return Ci.nsIBrowserProfileMigrator.BOOKMARKS;
- },
- migrate(types, startup, profileToMigrate) {
- this._migrateArgs = [types, startup, profileToMigrate];
- },
- };
- gShimmedMigratorKeyPicker = function() {
- return "gobbledygook";
- };
- AutoMigrate.migrate("startup");
- Assert.strictEqual(gShimmedMigrator._getMigrateDataArgs, null,
- "getMigrateData called with 'null' as a profile");
-
- let {BOOKMARKS, HISTORY, PASSWORDS} = Ci.nsIBrowserProfileMigrator;
- let expectedTypes = BOOKMARKS | HISTORY | PASSWORDS;
- Assert.deepEqual(gShimmedMigrator._migrateArgs, [expectedTypes, "startup", null],
- "migrate called with 'null' as a profile");
-});
-
-/**
- * Test the undo preconditions and a no-op undo in the automigrator.
- */
-add_task(function* checkUndoPreconditions() {
- let shouldAddData = false;
- gShimmedMigrator = {
- get sourceProfiles() {
- do_print("Read sourceProfiles");
- return null;
- },
- getMigrateData(profileToMigrate) {
- this._getMigrateDataArgs = profileToMigrate;
- return Ci.nsIBrowserProfileMigrator.BOOKMARKS;
- },
- migrate(types, startup, profileToMigrate) {
- this._migrateArgs = [types, startup, profileToMigrate];
- if (shouldAddData) {
- // Insert a login and check that that worked.
- MigrationUtils.insertLoginWrapper({
- hostname: "www.mozilla.org",
- formSubmitURL: "http://www.mozilla.org",
- username: "user",
- password: "pass",
- });
- }
- TestUtils.executeSoon(function() {
- Services.obs.notifyObservers(null, "Migration:Ended", undefined);
- });
- },
- };
-
- gShimmedMigratorKeyPicker = function() {
- return "gobbledygook";
- };
- AutoMigrate.migrate("startup");
- let migrationFinishedPromise = TestUtils.topicObserved("Migration:Ended");
- Assert.strictEqual(gShimmedMigrator._getMigrateDataArgs, null,
- "getMigrateData called with 'null' as a profile");
-
- let {BOOKMARKS, HISTORY, PASSWORDS} = Ci.nsIBrowserProfileMigrator;
- let expectedTypes = BOOKMARKS | HISTORY | PASSWORDS;
- Assert.deepEqual(gShimmedMigrator._migrateArgs, [expectedTypes, "startup", null],
- "migrate called with 'null' as a profile");
-
- yield migrationFinishedPromise;
- Assert.ok(Preferences.has("browser.migrate.automigrate.browser"),
- "Should have set browser pref");
- Assert.ok(!(yield AutoMigrate.canUndo()), "Should not be able to undo migration, as there's no data");
- gShimmedMigrator._migrateArgs = null;
- gShimmedMigrator._getMigrateDataArgs = null;
- Preferences.reset("browser.migrate.automigrate.browser");
- shouldAddData = true;
-
- AutoMigrate.migrate("startup");
- migrationFinishedPromise = TestUtils.topicObserved("Migration:Ended");
- Assert.strictEqual(gShimmedMigrator._getMigrateDataArgs, null,
- "getMigrateData called with 'null' as a profile");
- Assert.deepEqual(gShimmedMigrator._migrateArgs, [expectedTypes, "startup", null],
- "migrate called with 'null' as a profile");
-
- yield migrationFinishedPromise;
- let storedLogins = Services.logins.findLogins({}, "www.mozilla.org",
- "http://www.mozilla.org", null);
- Assert.equal(storedLogins.length, 1, "Should have 1 login");
-
- Assert.ok(Preferences.has("browser.migrate.automigrate.browser"),
- "Should have set browser pref");
- Assert.ok((yield AutoMigrate.canUndo()), "Should be able to undo migration, as now there's data");
-
- yield AutoMigrate.undo();
- Assert.ok(true, "Should be able to finish an undo cycle.");
-
- // Check that the undo removed the passwords:
- storedLogins = Services.logins.findLogins({}, "www.mozilla.org",
- "http://www.mozilla.org", null);
- Assert.equal(storedLogins.length, 0, "Should have no logins");
-});
-
-/**
- * Fake a migration and then try to undo it to verify all data gets removed.
- */
-add_task(function* checkUndoRemoval() {
- MigrationUtils.initializeUndoData();
- Preferences.set("browser.migrate.automigrate.browser", "automationbrowser");
- // Insert a login and check that that worked.
- MigrationUtils.insertLoginWrapper({
- hostname: "www.mozilla.org",
- formSubmitURL: "http://www.mozilla.org",
- username: "user",
- password: "pass",
- });
- let storedLogins = Services.logins.findLogins({}, "www.mozilla.org",
- "http://www.mozilla.org", null);
- Assert.equal(storedLogins.length, 1, "Should have 1 login");
-
- // Insert a bookmark and check that we have exactly 1 bookmark for that URI.
- yield MigrationUtils.insertBookmarkWrapper({
- parentGuid: PlacesUtils.bookmarks.toolbarGuid,
- url: "http://www.example.org/",
- title: "Some example bookmark",
- });
-
- let bookmark = yield PlacesUtils.bookmarks.fetch({url: "http://www.example.org/"});
- Assert.ok(bookmark, "Should have a bookmark before undo");
- Assert.equal(bookmark.title, "Some example bookmark", "Should have correct bookmark before undo.");
-
- // Insert 2 history visits
- let now_uSec = Date.now() * 1000;
- let visitedURI = Services.io.newURI("http://www.example.com/", null, null);
- let frecencyUpdatePromise = new Promise(resolve => {
- let expectedChanges = 2;
- let observer = {
- onFrecencyChanged: function() {
- if (!--expectedChanges) {
- PlacesUtils.history.removeObserver(observer);
- resolve();
- }
- },
- };
- PlacesUtils.history.addObserver(observer, false);
- });
- yield MigrationUtils.insertVisitsWrapper([{
- uri: visitedURI,
- visits: [
- {
- transitionType: PlacesUtils.history.TRANSITION_LINK,
- visitDate: now_uSec,
- },
- {
- transitionType: PlacesUtils.history.TRANSITION_LINK,
- visitDate: now_uSec - 100 * kUsecPerMin,
- },
- ]
- }]);
- yield frecencyUpdatePromise;
-
- // Verify that both visits get reported.
- let opts = PlacesUtils.history.getNewQueryOptions();
- opts.resultType = opts.RESULTS_AS_VISIT;
- let query = PlacesUtils.history.getNewQuery();
- query.uri = visitedURI;
- let visits = PlacesUtils.history.executeQuery(query, opts);
- visits.root.containerOpen = true;
- Assert.equal(visits.root.childCount, 2, "Should have 2 visits");
- // Clean up:
- visits.root.containerOpen = false;
-
- yield AutoMigrate.saveUndoState();
-
- // Verify that we can undo, then undo:
- Assert.ok(AutoMigrate.canUndo(), "Should be possible to undo migration");
- yield AutoMigrate.undo();
-
- let histograms = [
- "FX_STARTUP_MIGRATION_UNDO_BOOKMARKS_ERRORCOUNT",
- "FX_STARTUP_MIGRATION_UNDO_LOGINS_ERRORCOUNT",
- "FX_STARTUP_MIGRATION_UNDO_VISITS_ERRORCOUNT",
- ];
- for (let histogramId of histograms) {
- let keyedHistogram = Services.telemetry.getKeyedHistogramById(histogramId);
- let histogramData = keyedHistogram.snapshot().automationbrowser;
- Assert.equal(histogramData.sum, 0, `Should have reported 0 errors to ${histogramId}.`);
- Assert.greaterOrEqual(histogramData.counts[0], 1, `Should have reported value of 0 one time to ${histogramId}.`);
- }
- histograms = [
- "FX_STARTUP_MIGRATION_UNDO_BOOKMARKS_MS",
- "FX_STARTUP_MIGRATION_UNDO_LOGINS_MS",
- "FX_STARTUP_MIGRATION_UNDO_VISITS_MS",
- "FX_STARTUP_MIGRATION_UNDO_TOTAL_MS",
- ];
- for (let histogramId of histograms) {
- Assert.greater(Services.telemetry.getKeyedHistogramById(histogramId).snapshot().automationbrowser.sum, 0,
- `Should have reported non-zero time spent using undo for ${histogramId}`);
- }
-
- // Check that the undo removed the history visits:
- visits = PlacesUtils.history.executeQuery(query, opts);
- visits.root.containerOpen = true;
- Assert.equal(visits.root.childCount, 0, "Should have no more visits");
- visits.root.containerOpen = false;
-
- // Check that the undo removed the bookmarks:
- bookmark = yield PlacesUtils.bookmarks.fetch({url: "http://www.example.org/"});
- Assert.ok(!bookmark, "Should have no bookmarks after undo");
-
- // Check that the undo removed the passwords:
- storedLogins = Services.logins.findLogins({}, "www.mozilla.org",
- "http://www.mozilla.org", null);
- Assert.equal(storedLogins.length, 0, "Should have no logins");
-});
-
-add_task(function* checkUndoBookmarksState() {
- MigrationUtils.initializeUndoData();
- const {TYPE_FOLDER, TYPE_BOOKMARK} = PlacesUtils.bookmarks;
- let title = "Some example bookmark";
- let url = "http://www.example.com";
- let parentGuid = PlacesUtils.bookmarks.toolbarGuid;
- let {guid, lastModified} = yield MigrationUtils.insertBookmarkWrapper({
- title, url, parentGuid
- });
- Assert.deepEqual((yield MigrationUtils.stopAndRetrieveUndoData()).get("bookmarks"),
- [{lastModified, parentGuid, guid, type: TYPE_BOOKMARK}]);
-
- MigrationUtils.initializeUndoData();
- ({guid, lastModified} = yield MigrationUtils.insertBookmarkWrapper({
- title, parentGuid, type: TYPE_FOLDER
- }));
- let folder = {guid, lastModified, parentGuid, type: TYPE_FOLDER};
- let folderGuid = folder.guid;
- ({guid, lastModified} = yield MigrationUtils.insertBookmarkWrapper({
- title, url, parentGuid: folderGuid
- }));
- let kid1 = {guid, lastModified, parentGuid: folderGuid, type: TYPE_BOOKMARK};
- ({guid, lastModified} = yield MigrationUtils.insertBookmarkWrapper({
- title, url, parentGuid: folderGuid
- }));
- let kid2 = {guid, lastModified, parentGuid: folderGuid, type: TYPE_BOOKMARK};
-
- let bookmarksUndo = (yield MigrationUtils.stopAndRetrieveUndoData()).get("bookmarks");
- Assert.equal(bookmarksUndo.length, 3);
- // We expect that the last modified time from first kid #1 and then kid #2
- // has been propagated to the folder:
- folder.lastModified = kid2.lastModified;
- // Not just using deepEqual on the entire array (which should work) because
- // the failure messages get truncated by xpcshell which is unhelpful.
- Assert.deepEqual(bookmarksUndo[0], folder);
- Assert.deepEqual(bookmarksUndo[1], kid1);
- Assert.deepEqual(bookmarksUndo[2], kid2);
- yield PlacesUtils.bookmarks.eraseEverything();
-});
-
-add_task(function* testBookmarkRemovalByUndo() {
- const {TYPE_FOLDER} = PlacesUtils.bookmarks;
- MigrationUtils.initializeUndoData();
- let title = "Some example bookmark";
- let url = "http://www.mymagicaluniqueurl.com";
- let parentGuid = PlacesUtils.bookmarks.toolbarGuid;
- let {guid} = yield MigrationUtils.insertBookmarkWrapper({
- title: "Some folder", parentGuid, type: TYPE_FOLDER
- });
- let folderGuid = guid;
- let itemsToRemove = [];
- ({guid} = yield MigrationUtils.insertBookmarkWrapper({
- title: "Inner folder", parentGuid: folderGuid, type: TYPE_FOLDER
- }));
- let innerFolderGuid = guid;
- itemsToRemove.push(innerFolderGuid);
-
- ({guid} = yield MigrationUtils.insertBookmarkWrapper({
- title: "Inner inner folder", parentGuid: innerFolderGuid, type: TYPE_FOLDER
- }));
- itemsToRemove.push(guid);
-
- ({guid} = yield MigrationUtils.insertBookmarkWrapper({
- title: "Inner nested item", url: "http://inner-nested-example.com", parentGuid: guid
- }));
- itemsToRemove.push(guid);
-
- ({guid} = yield MigrationUtils.insertBookmarkWrapper({
- title, url, parentGuid: folderGuid
- }));
- itemsToRemove.push(guid);
-
- for (let toBeRemovedGuid of itemsToRemove) {
- let dbResultForGuid = yield PlacesUtils.bookmarks.fetch(toBeRemovedGuid);
- Assert.ok(dbResultForGuid, "Should be able to find items that will be removed.");
- }
- let bookmarkUndoState = (yield MigrationUtils.stopAndRetrieveUndoData()).get("bookmarks");
- // Now insert a separate item into this folder, not related to the migration.
- let newItem = yield PlacesUtils.bookmarks.insert(
- {title: "Not imported", parentGuid: folderGuid, url: "http://www.example.com"}
- );
-
- yield AutoMigrate._removeUnchangedBookmarks(bookmarkUndoState);
- Assert.ok(true, "Successfully removed imported items.");
-
- let itemFromDB = yield PlacesUtils.bookmarks.fetch(newItem.guid);
- Assert.ok(itemFromDB, "Item we inserted outside of migration is still there.");
- itemFromDB = yield PlacesUtils.bookmarks.fetch(folderGuid);
- Assert.ok(itemFromDB, "Folder we inserted in migration is still there because of new kids.");
- for (let removedGuid of itemsToRemove) {
- let dbResultForGuid = yield PlacesUtils.bookmarks.fetch(removedGuid);
- let dbgStr = dbResultForGuid && dbResultForGuid.title;
- Assert.equal(null, dbResultForGuid, "Should not be able to find items that should have been removed, but found " + dbgStr);
- }
- yield PlacesUtils.bookmarks.eraseEverything();
-});
-
-add_task(function* checkUndoLoginsState() {
- MigrationUtils.initializeUndoData();
- MigrationUtils.insertLoginWrapper({
- username: "foo",
- password: "bar",
- hostname: "https://example.com",
- formSubmitURL: "https://example.com/",
- timeCreated: new Date(),
- });
- let storedLogins = Services.logins.findLogins({}, "https://example.com", "", "");
- let storedLogin = storedLogins[0];
- storedLogin.QueryInterface(Ci.nsILoginMetaInfo);
- let {guid, timePasswordChanged} = storedLogin;
- let undoLoginData = (yield MigrationUtils.stopAndRetrieveUndoData()).get("logins");
- Assert.deepEqual([{guid, timePasswordChanged}], undoLoginData);
- Services.logins.removeAllLogins();
-});
-
-add_task(function* testLoginsRemovalByUndo() {
- MigrationUtils.initializeUndoData();
- MigrationUtils.insertLoginWrapper({
- username: "foo",
- password: "bar",
- hostname: "https://example.com",
- formSubmitURL: "https://example.com/",
- timeCreated: new Date(),
- });
- MigrationUtils.insertLoginWrapper({
- username: "foo",
- password: "bar",
- hostname: "https://example.org",
- formSubmitURL: "https://example.org/",
- timeCreated: new Date(new Date().getTime() - 10000),
- });
- // This should update the existing login
- LoginHelper.maybeImportLogin({
- username: "foo",
- password: "bazzy",
- hostname: "https://example.org",
- formSubmitURL: "https://example.org/",
- timePasswordChanged: new Date(),
- });
- Assert.equal(1, LoginHelper.searchLoginsWithObject({hostname: "https://example.org", formSubmitURL: "https://example.org/"}).length,
- "Should be only 1 login for example.org (that was updated)");
- let undoLoginData = (yield MigrationUtils.stopAndRetrieveUndoData()).get("logins");
-
- yield AutoMigrate._removeUnchangedLogins(undoLoginData);
- Assert.equal(0, LoginHelper.searchLoginsWithObject({hostname: "https://example.com", formSubmitURL: "https://example.com/"}).length,
- "unchanged example.com entry should have been removed.");
- Assert.equal(1, LoginHelper.searchLoginsWithObject({hostname: "https://example.org", formSubmitURL: "https://example.org/"}).length,
- "changed example.org entry should have persisted.");
- Services.logins.removeAllLogins();
-});
-
-add_task(function* checkUndoVisitsState() {
- MigrationUtils.initializeUndoData();
- yield MigrationUtils.insertVisitsWrapper([{
- uri: NetUtil.newURI("http://www.example.com/"),
- title: "Example",
- visits: [{
- visitDate: new Date("2015-07-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }, {
- visitDate: new Date("2015-09-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }, {
- visitDate: new Date("2015-08-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }],
- }, {
- uri: NetUtil.newURI("http://www.example.org/"),
- title: "Example",
- visits: [{
- visitDate: new Date("2016-04-03").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }, {
- visitDate: new Date("2015-08-03").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }],
- }, {
- uri: NetUtil.newURI("http://www.example.com/"),
- title: "Example",
- visits: [{
- visitDate: new Date("2015-10-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }],
- }]);
- let undoVisitData = (yield MigrationUtils.stopAndRetrieveUndoData()).get("visits");
- Assert.deepEqual(Array.from(undoVisitData.map(v => v.url)).sort(),
- ["http://www.example.com/", "http://www.example.org/"]);
- Assert.deepEqual(undoVisitData.find(v => v.url == "http://www.example.com/"), {
- url: "http://www.example.com/",
- visitCount: 4,
- first: new Date("2015-07-10").getTime() * 1000,
- last: new Date("2015-10-10").getTime() * 1000,
- });
- Assert.deepEqual(undoVisitData.find(v => v.url == "http://www.example.org/"), {
- url: "http://www.example.org/",
- visitCount: 2,
- first: new Date("2015-08-03").getTime() * 1000,
- last: new Date("2016-04-03").getTime() * 1000,
- });
-
- yield PlacesTestUtils.clearHistory();
-});
-
-add_task(function* checkUndoVisitsState() {
- MigrationUtils.initializeUndoData();
- yield MigrationUtils.insertVisitsWrapper([{
- uri: NetUtil.newURI("http://www.example.com/"),
- title: "Example",
- visits: [{
- visitDate: new Date("2015-07-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }, {
- visitDate: new Date("2015-09-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }, {
- visitDate: new Date("2015-08-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }],
- }, {
- uri: NetUtil.newURI("http://www.example.org/"),
- title: "Example",
- visits: [{
- visitDate: new Date("2016-04-03").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }, {
- visitDate: new Date("2015-08-03").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }],
- }, {
- uri: NetUtil.newURI("http://www.example.com/"),
- title: "Example",
- visits: [{
- visitDate: new Date("2015-10-10").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }],
- }, {
- uri: NetUtil.newURI("http://www.mozilla.org/"),
- title: "Example",
- visits: [{
- visitDate: new Date("2015-01-01").getTime() * 1000,
- transitionType: Ci.nsINavHistoryService.TRANSITION_LINK,
- }],
- }]);
-
- // We have to wait until frecency updates have been handled in order
- // to accurately determine whether we're doing the right thing.
- let frecencyUpdatesHandled = new Promise(resolve => {
- PlacesUtils.history.addObserver({
- onFrecencyChanged(aURI) {
- if (aURI.spec == "http://www.unrelated.org/") {
- PlacesUtils.history.removeObserver(this);
- resolve();
- }
- }
- }, false);
- });
- yield PlacesUtils.history.insertMany([{
- url: "http://www.example.com/",
- title: "Example",
- visits: [{
- date: new Date("2015-08-16"),
- }],
- }, {
- url: "http://www.example.org/",
- title: "Example",
- visits: [{
- date: new Date("2016-01-03"),
- }, {
- date: new Date("2015-05-03"),
- }],
- }, {
- url: "http://www.unrelated.org/",
- title: "Unrelated",
- visits: [{
- date: new Date("2015-09-01"),
- }],
- }]);
- yield frecencyUpdatesHandled;
- let undoVisitData = (yield MigrationUtils.stopAndRetrieveUndoData()).get("visits");
-
- let frecencyChangesExpected = new Map([
- ["http://www.example.com/", PromiseUtils.defer()],
- ["http://www.example.org/", PromiseUtils.defer()]
- ]);
- let uriDeletedExpected = new Map([
- ["http://www.mozilla.org/", PromiseUtils.defer()],
- ]);
- let wrongMethodDeferred = PromiseUtils.defer();
- let observer = {
- onBeginUpdateBatch: function() {},
- onEndUpdateBatch: function() {},
- onVisit: function(uri) {
- wrongMethodDeferred.reject(new Error("Unexpected call to onVisit " + uri.spec));
- },
- onTitleChanged: function(uri) {
- wrongMethodDeferred.reject(new Error("Unexpected call to onTitleChanged " + uri.spec));
- },
- onClearHistory: function() {
- wrongMethodDeferred.reject("Unexpected call to onClearHistory");
- },
- onPageChanged: function(uri) {
- wrongMethodDeferred.reject(new Error("Unexpected call to onPageChanged " + uri.spec));
- },
- onFrecencyChanged: function(aURI) {
- do_print("frecency change");
- Assert.ok(frecencyChangesExpected.has(aURI.spec),
- "Should be expecting frecency change for " + aURI.spec);
- frecencyChangesExpected.get(aURI.spec).resolve();
- },
- onManyFrecenciesChanged: function() {
- do_print("Many frecencies changed");
- wrongMethodDeferred.reject(new Error("This test can't deal with onManyFrecenciesChanged to be called"));
- },
- onDeleteURI: function(aURI) {
- do_print("delete uri");
- Assert.ok(uriDeletedExpected.has(aURI.spec),
- "Should be expecting uri deletion for " + aURI.spec);
- uriDeletedExpected.get(aURI.spec).resolve();
- },
- };
- PlacesUtils.history.addObserver(observer, false);
-
- yield AutoMigrate._removeSomeVisits(undoVisitData);
- PlacesUtils.history.removeObserver(observer);
- yield Promise.all(uriDeletedExpected.values());
- yield Promise.all(frecencyChangesExpected.values());
-
- Assert.equal(yield visitsForURL("http://www.example.com/"), 1,
- "1 example.com visit (out of 5) should have persisted despite being within the range, due to limiting");
- Assert.equal(yield visitsForURL("http://www.mozilla.org/"), 0,
- "0 mozilla.org visits should have persisted (out of 1).");
- Assert.equal(yield visitsForURL("http://www.example.org/"), 2,
- "2 example.org visits should have persisted (out of 4).");
- Assert.equal(yield visitsForURL("http://www.unrelated.org/"), 1,
- "1 unrelated.org visits should have persisted as it's not involved in the import.");
- yield PlacesTestUtils.clearHistory();
-});
-
-add_task(function* checkHistoryRemovalCompletion() {
- AutoMigrate._errorMap = {bookmarks: 0, visits: 0, logins: 0};
- yield AutoMigrate._removeSomeVisits([{url: "http://www.example.com/", limit: -1}]);
- ok(true, "Removing visits should complete even if removing some visits failed.");
- Assert.equal(AutoMigrate._errorMap.visits, 1, "Should have logged the error for visits.");
-
- // Unfortunately there's not a reliable way to make removing bookmarks be
- // unhappy unless the DB is messed up (e.g. contains children but has
- // parents removed already).
- yield AutoMigrate._removeUnchangedBookmarks([
- {guid: PlacesUtils.bookmarks, lastModified: new Date(0), parentGuid: 0},
- {guid: "gobbledygook", lastModified: new Date(0), parentGuid: 0},
- ]);
- ok(true, "Removing bookmarks should complete even if some items are gone or bogus.");
- Assert.equal(AutoMigrate._errorMap.bookmarks, 0,
- "Should have ignored removing non-existing (or builtin) bookmark.");
-
-
- yield AutoMigrate._removeUnchangedLogins([
- {guid: "gobbledygook", timePasswordChanged: new Date(0)},
- ]);
- ok(true, "Removing logins should complete even if logins don't exist.");
- Assert.equal(AutoMigrate._errorMap.logins, 0,
- "Should have ignored removing non-existing logins.");
-});