summaryrefslogtreecommitdiffstats
path: root/browser/components/migration/tests/unit/test_Safari_history_strange_entries.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/migration/tests/unit/test_Safari_history_strange_entries.js')
-rw-r--r--browser/components/migration/tests/unit/test_Safari_history_strange_entries.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/browser/components/migration/tests/unit/test_Safari_history_strange_entries.js b/browser/components/migration/tests/unit/test_Safari_history_strange_entries.js
new file mode 100644
index 0000000000..2578353e35
--- /dev/null
+++ b/browser/components/migration/tests/unit/test_Safari_history_strange_entries.js
@@ -0,0 +1,115 @@
+/* Any copyright is dedicated to the Public Domain.
+http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const { PlacesQuery } = ChromeUtils.importESModule(
+ "resource://gre/modules/PlacesQuery.sys.mjs"
+);
+
+const HISTORY_FILE_PATH = "Library/Safari/History.db";
+const HISTORY_STRANGE_ENTRIES_FILE_PATH =
+ "Library/Safari/HistoryStrangeEntries.db";
+
+// By default, our migrators will cut off migrating any history older than
+// 180 days. In order to make sure this test continues to run correctly
+// in the future, we copy the reference database to History.db, and then
+// use Sqlite.sys.mjs to connect to it and manually update all of the visit
+// times to be "now", so that they all fall within the 180 day window. The
+// Nov 10th date below is right around when the reference database visit
+// entries were created.
+//
+// This update occurs in `updateVisitTimes`.
+const MS_SINCE_SNAPSHOT_TIME =
+ new Date() - new Date("Nov 10, 2022 00:00:00 UTC");
+
+async function setupHistoryFile() {
+ removeHistoryFile();
+ let file = do_get_file(HISTORY_STRANGE_ENTRIES_FILE_PATH);
+ file.copyTo(file.parent, "History.db");
+ await updateVisitTimes();
+}
+
+function removeHistoryFile() {
+ let file = do_get_file(HISTORY_FILE_PATH, true);
+ try {
+ file.remove(false);
+ } catch (ex) {
+ // It is ok if this doesn't exist.
+ if (ex.result != Cr.NS_ERROR_FILE_NOT_FOUND) {
+ throw ex;
+ }
+ }
+}
+
+add_setup(async function setup() {
+ registerFakePath("ULibDir", do_get_file("Library/"));
+ await setupHistoryFile();
+ registerCleanupFunction(async () => {
+ await PlacesUtils.history.clear();
+ removeHistoryFile();
+ });
+});
+
+async function updateVisitTimes() {
+ let cocoaSnapshotDelta = MS_SINCE_SNAPSHOT_TIME / 1000;
+ let historyFile = do_get_file(HISTORY_FILE_PATH);
+ let dbConn = await Sqlite.openConnection({ path: historyFile.path });
+
+ await dbConn.execute(
+ "UPDATE history_visits SET visit_time = visit_time + :cocoaSnapshotDelta;",
+ {
+ cocoaSnapshotDelta,
+ }
+ );
+
+ await dbConn.close();
+}
+
+/**
+ * Tests that we can import successfully from Safari when Safari's history
+ * database contains malformed URLs.
+ */
+add_task(async function testHistoryImportStrangeEntries() {
+ await PlacesUtils.history.clear();
+
+ let placesQuery = new PlacesQuery();
+ let emptyHistory = await placesQuery.getHistory();
+ Assert.equal(emptyHistory.size, 0, "Empty history should indeed be empty.");
+
+ const EXPECTED_MIGRATED_SITES = 10;
+ const EXPECTED_MIGRATED_VISTS = 23;
+
+ let historyFile = do_get_file(HISTORY_FILE_PATH);
+ let dbConn = await Sqlite.openConnection({ path: historyFile.path });
+ let [rowCountResult] = await dbConn.execute(
+ "SELECT COUNT(*) FROM history_visits"
+ );
+ Assert.greater(
+ rowCountResult.getResultByName("COUNT(*)"),
+ EXPECTED_MIGRATED_VISTS,
+ "There are more total rows than valid rows"
+ );
+ await dbConn.close();
+
+ let migrator = await MigrationUtils.getMigrator("safari");
+ await promiseMigration(migrator, MigrationUtils.resourceTypes.HISTORY);
+ let migratedHistory = await placesQuery.getHistory({ sortBy: "site" });
+ let siteCount = migratedHistory.size;
+ let visitCount = 0;
+ for (let [, visits] of migratedHistory) {
+ visitCount += visits.length;
+ }
+ Assert.equal(
+ siteCount,
+ EXPECTED_MIGRATED_SITES,
+ "Should have migrated all valid history sites"
+ );
+ Assert.equal(
+ visitCount,
+ EXPECTED_MIGRATED_VISTS,
+ "Should have migrated all valid history visits"
+ );
+
+ placesQuery.close();
+});