michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: var dbFile, oldSize; michael@0: var currentTestIndex = 0; michael@0: michael@0: function triggerExpiration() { michael@0: // We can't easily fake a "daily idle" event, so for testing purposes form michael@0: // history listens for another notification to trigger an immediate michael@0: // expiration. michael@0: Services.obs.notifyObservers(null, "formhistory-expire-now", null); michael@0: } michael@0: michael@0: let checkExists = function(num) { do_check_true(num > 0); next_test(); } michael@0: let checkNotExists = function(num) { do_check_true(!num); next_test(); } michael@0: michael@0: var TestObserver = { michael@0: QueryInterface : XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]), michael@0: michael@0: observe : function (subject, topic, data) { michael@0: do_check_eq(topic, "satchel-storage-changed"); michael@0: michael@0: if (data == "formhistory-expireoldentries") { michael@0: next_test(); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: function test_finished() { michael@0: // Make sure we always reset prefs. michael@0: if (Services.prefs.prefHasUserValue("browser.formfill.expire_days")) michael@0: Services.prefs.clearUserPref("browser.formfill.expire_days"); michael@0: michael@0: do_test_finished(); michael@0: } michael@0: michael@0: let iter = tests(); michael@0: michael@0: function run_test() michael@0: { michael@0: do_test_pending(); michael@0: iter.next(); michael@0: } michael@0: michael@0: function next_test() michael@0: { michael@0: iter.next(); michael@0: } michael@0: michael@0: function tests() michael@0: { michael@0: Services.obs.addObserver(TestObserver, "satchel-storage-changed", true); michael@0: michael@0: // ===== test init ===== michael@0: var testfile = do_get_file("asyncformhistory_expire.sqlite"); michael@0: var profileDir = do_get_profile(); michael@0: michael@0: // Cleanup from any previous tests or failures. michael@0: dbFile = profileDir.clone(); michael@0: dbFile.append("formhistory.sqlite"); michael@0: if (dbFile.exists()) michael@0: dbFile.remove(false); michael@0: michael@0: testfile.copyTo(profileDir, "formhistory.sqlite"); michael@0: do_check_true(dbFile.exists()); michael@0: michael@0: // We're going to clear this at the end, so it better have the default value now. michael@0: do_check_false(Services.prefs.prefHasUserValue("browser.formfill.expire_days")); michael@0: michael@0: // Sanity check initial state michael@0: yield countEntries(null, null, function(num) { do_check_eq(508, num); next_test(); }); michael@0: yield countEntries("name-A", "value-A", checkExists); // lastUsed == distant past michael@0: yield countEntries("name-B", "value-B", checkExists); // lastUsed == distant future michael@0: michael@0: do_check_eq(CURRENT_SCHEMA, FormHistory.schemaVersion); michael@0: michael@0: // Add a new entry michael@0: yield countEntries("name-C", "value-C", checkNotExists); michael@0: yield addEntry("name-C", "value-C", next_test); michael@0: yield countEntries("name-C", "value-C", checkExists); michael@0: michael@0: // Update some existing entries to have ages relative to when the test runs. michael@0: var now = 1000 * Date.now(); michael@0: let updateLastUsed = function updateLastUsedFn(results, age) michael@0: { michael@0: let lastUsed = now - age * 24 * PR_HOURS; michael@0: michael@0: let changes = [ ]; michael@0: for (let r = 0; r < results.length; r++) { michael@0: changes.push({ op: "update", lastUsed: lastUsed, guid: results[r].guid }); michael@0: } michael@0: michael@0: return changes; michael@0: } michael@0: michael@0: let results = yield searchEntries(["guid"], { lastUsed: 181 }, iter); michael@0: yield updateFormHistory(updateLastUsed(results, 181), next_test); michael@0: michael@0: results = yield searchEntries(["guid"], { lastUsed: 179 }, iter); michael@0: yield updateFormHistory(updateLastUsed(results, 179), next_test); michael@0: michael@0: results = yield searchEntries(["guid"], { lastUsed: 31 }, iter); michael@0: yield updateFormHistory(updateLastUsed(results, 31), next_test); michael@0: michael@0: results = yield searchEntries(["guid"], { lastUsed: 29 }, iter); michael@0: yield updateFormHistory(updateLastUsed(results, 29), next_test); michael@0: michael@0: results = yield searchEntries(["guid"], { lastUsed: 9999 }, iter); michael@0: yield updateFormHistory(updateLastUsed(results, 11), next_test); michael@0: michael@0: results = yield searchEntries(["guid"], { lastUsed: 9 }, iter); michael@0: yield updateFormHistory(updateLastUsed(results, 9), next_test); michael@0: michael@0: yield countEntries("name-A", "value-A", checkExists); michael@0: yield countEntries("181DaysOld", "foo", checkExists); michael@0: yield countEntries("179DaysOld", "foo", checkExists); michael@0: yield countEntries(null, null, function(num) { do_check_eq(509, num); next_test(); }); michael@0: michael@0: // 2 entries are expected to expire. michael@0: triggerExpiration(); michael@0: yield; michael@0: michael@0: yield countEntries("name-A", "value-A", checkNotExists); michael@0: yield countEntries("181DaysOld", "foo", checkNotExists); michael@0: yield countEntries("179DaysOld", "foo", checkExists); michael@0: yield countEntries(null, null, function(num) { do_check_eq(507, num); next_test(); }); michael@0: michael@0: // And again. No change expected. michael@0: triggerExpiration(); michael@0: yield; michael@0: michael@0: yield countEntries(null, null, function(num) { do_check_eq(507, num); next_test(); }); michael@0: michael@0: // Set formfill pref to 30 days. michael@0: Services.prefs.setIntPref("browser.formfill.expire_days", 30); michael@0: yield countEntries("179DaysOld", "foo", checkExists); michael@0: yield countEntries("bar", "31days", checkExists); michael@0: yield countEntries("bar", "29days", checkExists); michael@0: yield countEntries(null, null, function(num) { do_check_eq(507, num); next_test(); }); michael@0: michael@0: triggerExpiration(); michael@0: yield; michael@0: michael@0: yield countEntries("179DaysOld", "foo", checkNotExists); michael@0: yield countEntries("bar", "31days", checkNotExists); michael@0: yield countEntries("bar", "29days", checkExists); michael@0: yield countEntries(null, null, function(num) { do_check_eq(505, num); next_test(); }); michael@0: michael@0: // Set override pref to 10 days and expire. This expires a large batch of michael@0: // entries, and should trigger a VACCUM to reduce file size. michael@0: Services.prefs.setIntPref("browser.formfill.expire_days", 10); michael@0: michael@0: yield countEntries("bar", "29days", checkExists); michael@0: yield countEntries("9DaysOld", "foo", checkExists); michael@0: yield countEntries(null, null, function(num) { do_check_eq(505, num); next_test(); }); michael@0: michael@0: triggerExpiration(); michael@0: yield; michael@0: michael@0: yield countEntries("bar", "29days", checkNotExists); michael@0: yield countEntries("9DaysOld", "foo", checkExists); michael@0: yield countEntries("name-B", "value-B", checkExists); michael@0: yield countEntries("name-C", "value-C", checkExists); michael@0: yield countEntries(null, null, function(num) { do_check_eq(3, num); next_test(); }); michael@0: michael@0: test_finished(); michael@0: };