diff options
Diffstat (limited to 'toolkit/components/contentprefs/tests/unit/test_contentPrefsCache.js')
-rw-r--r-- | toolkit/components/contentprefs/tests/unit/test_contentPrefsCache.js | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/toolkit/components/contentprefs/tests/unit/test_contentPrefsCache.js b/toolkit/components/contentprefs/tests/unit/test_contentPrefsCache.js new file mode 100644 index 000000000..38a2faddc --- /dev/null +++ b/toolkit/components/contentprefs/tests/unit/test_contentPrefsCache.js @@ -0,0 +1,244 @@ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var cps = new ContentPrefInstance(null); + +function run_test() { + testCacheWorks("test1.example.com", "test-pref1"); + testHasCachedPrefFunction("test2.example.com", "test-pref2"); + testSetCaches("test3.example.com", "test-pref3"); + testGetCaches("test4.example.com", "test-pref4"); + testRemovePrefs("test5.example.com", "test-pref5"); + testTypeConversions("test6.example.com", "test-pref6"); + testNonExistingPrefCachesAsUndefined("test7.example.com", "test-pref7"); + testCacheEviction("test8.example.com", "test-pref8"); +} + +function testCacheWorks(uri, prefName) { + const CACHED_VALUE = 3; + const NEW_VALUE = 5; + + cps.setPref(uri, prefName, CACHED_VALUE); + do_check_eq(cps.getPref(uri, prefName), CACHED_VALUE); + + // Now change the value directly through the DB and check + // that the cached value is different + + let groupId = selectValue("SELECT id FROM groups WHERE name = :param1", "id", uri); + let settingId = selectValue("SELECT id FROM settings WHERE name = :param1", "id", prefName); + let prefId = selectValue("SELECT id FROM prefs WHERE groupID = :param1 AND settingID = :param2", + "id", groupId, settingId); + + let stmt = cps.DBConnection.createStatement("UPDATE prefs SET value = :value WHERE id = :id"); + stmt.params.value = NEW_VALUE; + stmt.params.id = prefId; + stmt.execute(); + + let dbValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); + let cacheValue = cps.getPref(uri, prefName); + + do_check_eq(dbValue, NEW_VALUE); + do_check_eq(cacheValue, CACHED_VALUE); + do_check_neq(cacheValue, dbValue); + + do_test_pending(); + cps.getPref(uri, prefName, function (value) { + do_check_eq(dbValue, NEW_VALUE); + do_check_eq(value, CACHED_VALUE); + do_check_neq(value, dbValue); + do_test_finished(); + }); +} + +function testHasCachedPrefFunction(uri, prefName) { + const STARTING_VALUE = 3; + const NEW_VALUE = 5; + + do_check_false(isCached(uri, prefName)); + + cps.setPref(uri, prefName, STARTING_VALUE); + + let groupId = selectValue("SELECT id FROM groups WHERE name = :param1", "id", uri); + let settingId = selectValue("SELECT id FROM settings WHERE name = :param1", "id", prefName); + let prefId = selectValue("SELECT id FROM prefs WHERE groupID = :param1 AND settingID = :param2", + "id", groupId, settingId); + + do_check_neq(prefId, undefined); + + let originalValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); + do_check_eq(originalValue, STARTING_VALUE); + + let stmt = cps.DBConnection.createStatement("UPDATE prefs SET value = :value WHERE id = :id"); + stmt.params.value = NEW_VALUE; + stmt.params.id = prefId; + stmt.execute(); + + let newValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); + do_check_eq(newValue, NEW_VALUE); + + let cachedValue = cps.getPref(uri, prefName); + do_check_eq(cachedValue, STARTING_VALUE); + do_check_true(isCached(uri, prefName)); +} + +function testSetCaches(uri, prefName) { + cps.setPref(uri, prefName, 0); + do_check_true(isCached(uri, prefName)); +} + +function testRemovePrefs(uri, prefName) { + + /* removePref */ + cps.setPref("www1." + uri, prefName, 1); + + do_check_eq(cps.getPref("www1." + uri, prefName), 1); + + cps.removePref("www1." + uri, prefName); + + do_check_false(isCached("www1." + uri, prefName)); + do_check_false(cps.hasPref("www1." + uri, prefName)); + do_check_neq(cps.getPref("www1." + uri, prefName), 1); + + /* removeGroupedPrefs */ + cps.setPref("www2." + uri, prefName, 2); + cps.setPref("www3." + uri, prefName, 3); + + do_check_eq(cps.getPref("www2." + uri, prefName), 2); + do_check_eq(cps.getPref("www3." + uri, prefName), 3); + + cps.removeGroupedPrefs(); + + do_check_false(isCached("www2." + uri, prefName)); + do_check_false(isCached("www3." + uri, prefName)); + do_check_false(cps.hasPref("www2." + uri, prefName)); + do_check_false(cps.hasPref("www3." + uri, prefName)); + do_check_neq(cps.getPref("www2." + uri, prefName), 2); + do_check_neq(cps.getPref("www3." + uri, prefName), 3); + + /* removePrefsByName */ + cps.setPref("www4." + uri, prefName, 4); + cps.setPref("www5." + uri, prefName, 5); + + do_check_eq(cps.getPref("www4." + uri, prefName), 4); + do_check_eq(cps.getPref("www5." + uri, prefName), 5); + + cps.removePrefsByName(prefName); + + do_check_false(isCached("www4." + uri, prefName)); + do_check_false(isCached("www5." + uri, prefName)); + do_check_false(cps.hasPref("www4." + uri, prefName)); + do_check_false(cps.hasPref("www5." + uri, prefName)); + do_check_neq(cps.getPref("www4." + uri, prefName), 4); + do_check_neq(cps.getPref("www5." + uri, prefName), 5); +} + +function testGetCaches(uri, prefName) { + const VALUE = 4; + + let insertGroup = cps.DBConnection.createStatement("INSERT INTO groups (name) VALUES (:name)"); + insertGroup.params.name = uri; + insertGroup.execute(); + let groupId = cps.DBConnection.lastInsertRowID; + + let insertSetting = cps.DBConnection.createStatement("INSERT INTO settings (name) VALUES (:name)"); + insertSetting.params.name = prefName; + insertSetting.execute(); + let settingId = cps.DBConnection.lastInsertRowID; + + let insertPref = cps.DBConnection.createStatement(` + INSERT INTO prefs (groupID, settingID, value) + VALUES (:groupId, :settingId, :value) + `); + insertPref.params.groupId = groupId; + insertPref.params.settingId = settingId; + insertPref.params.value = VALUE; + insertPref.execute(); + let prefId = cps.DBConnection.lastInsertRowID; + + let dbValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); + + // First access from service should hit the DB + let svcValue = cps.getPref(uri, prefName); + + // Second time should get the value from cache + let cacheValue = cps.getPref(uri, prefName); + + do_check_eq(VALUE, dbValue); + do_check_eq(VALUE, svcValue); + do_check_eq(VALUE, cacheValue); + + do_check_true(isCached(uri, prefName)); +} + +function testTypeConversions(uri, prefName) { + let value; + + cps.setPref(uri, prefName, true); + value = cps.getPref(uri, prefName); + do_check_true(value === 1); + + cps.setPref(uri, prefName, false); + value = cps.getPref(uri, prefName); + do_check_true(value === 0); + + cps.setPref(uri, prefName, null); + value = cps.getPref(uri, prefName); + do_check_true(value === null); + + cps.setPref(uri, prefName, undefined); + value = cps.getPref(uri, prefName); + do_check_true(value === null); +} + +function testNonExistingPrefCachesAsUndefined(uri, prefName) { + + do_check_false(isCached(uri, prefName)); + + // Cache the pref + let value = cps.getPref(uri, prefName); + do_check_true(value === undefined); + + do_check_true(isCached(uri, prefName)); + + // Cached pref + value = cps.getPref(uri, prefName); + do_check_true(value === undefined); +} + +function testCacheEviction(uri, prefName) { + + cps.setPref(uri, prefName, 5); + do_check_eq(cps.getPref(uri, prefName), 5); + do_check_true(isCached(uri, prefName)); + + // try to evict value from cache by adding various other entries + const ENTRIES_TO_ADD = 200; + for (let i = 0; i < ENTRIES_TO_ADD; i++) { + let uriToAdd = "www" + i + uri; + cps.setPref(uriToAdd, prefName, 0); + } + + do_check_false(isCached(uri, prefName)); + +} + +function selectValue(stmt, columnName, param1, param2) { + stmt = cps.DBConnection.createStatement(stmt); + if (param1) + stmt.params.param1 = param1; + + if (param2) + stmt.params.param2 = param2; + + stmt.executeStep(); + let val = stmt.row[columnName]; + stmt.reset(); + stmt.finalize(); + return val; +} + +function isCached(uri, prefName) { + return cps.hasCachedPref(uri, prefName); +} |