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