1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/contentprefs/tests/unit/test_contentPrefsCache.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,242 @@ 1.4 +/* 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.7 + */ 1.8 + 1.9 +let cps = new ContentPrefInstance(null); 1.10 + 1.11 +function run_test() { 1.12 + testCacheWorks("test1.example.com", "test-pref1"); 1.13 + testHasCachedPrefFunction("test2.example.com", "test-pref2"); 1.14 + testSetCaches("test3.example.com", "test-pref3"); 1.15 + testGetCaches("test4.example.com", "test-pref4"); 1.16 + testRemovePrefs("test5.example.com", "test-pref5"); 1.17 + testTypeConversions("test6.example.com", "test-pref6"); 1.18 + testNonExistingPrefCachesAsUndefined("test7.example.com", "test-pref7"); 1.19 + testCacheEviction("test8.example.com", "test-pref8"); 1.20 +} 1.21 + 1.22 +function testCacheWorks(uri, prefName) { 1.23 + const CACHED_VALUE = 3; 1.24 + const NEW_VALUE = 5; 1.25 + 1.26 + cps.setPref(uri, prefName, CACHED_VALUE); 1.27 + do_check_eq(cps.getPref(uri, prefName), CACHED_VALUE); 1.28 + 1.29 + // Now change the value directly through the DB and check 1.30 + // that the cached value is different 1.31 + 1.32 + let groupId = selectValue("SELECT id FROM groups WHERE name = :param1", "id", uri); 1.33 + let settingId = selectValue("SELECT id FROM settings WHERE name = :param1", "id", prefName); 1.34 + let prefId = selectValue("SELECT id FROM prefs WHERE groupID = :param1 AND settingID = :param2", 1.35 + "id", groupId, settingId); 1.36 + 1.37 + let stmt = cps.DBConnection.createStatement("UPDATE prefs SET value = :value WHERE id = :id"); 1.38 + stmt.params.value = NEW_VALUE; 1.39 + stmt.params.id = prefId; 1.40 + stmt.execute(); 1.41 + 1.42 + let dbValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); 1.43 + let cacheValue = cps.getPref(uri, prefName); 1.44 + 1.45 + do_check_eq(dbValue, NEW_VALUE); 1.46 + do_check_eq(cacheValue, CACHED_VALUE); 1.47 + do_check_neq(cacheValue, dbValue); 1.48 + 1.49 + do_test_pending(); 1.50 + cps.getPref(uri, prefName, function (value) { 1.51 + do_check_eq(dbValue, NEW_VALUE); 1.52 + do_check_eq(value, CACHED_VALUE); 1.53 + do_check_neq(value, dbValue); 1.54 + do_test_finished(); 1.55 + }); 1.56 +} 1.57 + 1.58 +function testHasCachedPrefFunction(uri, prefName) { 1.59 + const STARTING_VALUE = 3; 1.60 + const NEW_VALUE = 5; 1.61 + 1.62 + do_check_false(isCached(uri, prefName)); 1.63 + 1.64 + cps.setPref(uri, prefName, STARTING_VALUE); 1.65 + 1.66 + let groupId = selectValue("SELECT id FROM groups WHERE name = :param1", "id", uri); 1.67 + let settingId = selectValue("SELECT id FROM settings WHERE name = :param1", "id", prefName); 1.68 + let prefId = selectValue("SELECT id FROM prefs WHERE groupID = :param1 AND settingID = :param2", 1.69 + "id", groupId, settingId); 1.70 + 1.71 + do_check_neq(prefId, undefined); 1.72 + 1.73 + let originalValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); 1.74 + do_check_eq(originalValue, STARTING_VALUE); 1.75 + 1.76 + let stmt = cps.DBConnection.createStatement("UPDATE prefs SET value = :value WHERE id = :id"); 1.77 + stmt.params.value = NEW_VALUE; 1.78 + stmt.params.id = prefId; 1.79 + stmt.execute(); 1.80 + 1.81 + let newValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); 1.82 + do_check_eq(newValue, NEW_VALUE); 1.83 + 1.84 + let cachedValue = cps.getPref(uri, prefName); 1.85 + do_check_eq(cachedValue, STARTING_VALUE); 1.86 + do_check_true(isCached(uri, prefName)); 1.87 +} 1.88 + 1.89 +function testSetCaches(uri, prefName) { 1.90 + cps.setPref(uri, prefName, 0); 1.91 + do_check_true(isCached(uri, prefName)); 1.92 +} 1.93 + 1.94 +function testRemovePrefs(uri, prefName) { 1.95 + 1.96 + /* removePref */ 1.97 + cps.setPref("www1." + uri, prefName, 1); 1.98 + 1.99 + do_check_eq(cps.getPref("www1." + uri, prefName), 1); 1.100 + 1.101 + cps.removePref("www1." + uri, prefName); 1.102 + 1.103 + do_check_false(isCached("www1." + uri, prefName)); 1.104 + do_check_false(cps.hasPref("www1." + uri, prefName)); 1.105 + do_check_neq(cps.getPref("www1." + uri, prefName), 1); 1.106 + 1.107 + /* removeGroupedPrefs */ 1.108 + cps.setPref("www2." + uri, prefName, 2); 1.109 + cps.setPref("www3." + uri, prefName, 3); 1.110 + 1.111 + do_check_eq(cps.getPref("www2." + uri, prefName), 2); 1.112 + do_check_eq(cps.getPref("www3." + uri, prefName), 3); 1.113 + 1.114 + cps.removeGroupedPrefs(); 1.115 + 1.116 + do_check_false(isCached("www2." + uri, prefName)); 1.117 + do_check_false(isCached("www3." + uri, prefName)); 1.118 + do_check_false(cps.hasPref("www2." + uri, prefName)); 1.119 + do_check_false(cps.hasPref("www3." + uri, prefName)); 1.120 + do_check_neq(cps.getPref("www2." + uri, prefName), 2); 1.121 + do_check_neq(cps.getPref("www3." + uri, prefName), 3); 1.122 + 1.123 + /* removePrefsByName */ 1.124 + cps.setPref("www4." + uri, prefName, 4); 1.125 + cps.setPref("www5." + uri, prefName, 5); 1.126 + 1.127 + do_check_eq(cps.getPref("www4." + uri, prefName), 4); 1.128 + do_check_eq(cps.getPref("www5." + uri, prefName), 5); 1.129 + 1.130 + cps.removePrefsByName(prefName); 1.131 + 1.132 + do_check_false(isCached("www4." + uri, prefName)); 1.133 + do_check_false(isCached("www5." + uri, prefName)); 1.134 + do_check_false(cps.hasPref("www4." + uri, prefName)); 1.135 + do_check_false(cps.hasPref("www5." + uri, prefName)); 1.136 + do_check_neq(cps.getPref("www4." + uri, prefName), 4); 1.137 + do_check_neq(cps.getPref("www5." + uri, prefName), 5); 1.138 +} 1.139 + 1.140 +function testGetCaches(uri, prefName) { 1.141 + const VALUE = 4; 1.142 + 1.143 + let insertGroup = cps.DBConnection.createStatement("INSERT INTO groups (name) VALUES (:name)"); 1.144 + insertGroup.params.name = uri; 1.145 + insertGroup.execute(); 1.146 + let groupId = cps.DBConnection.lastInsertRowID; 1.147 + 1.148 + let insertSetting = cps.DBConnection.createStatement("INSERT INTO settings (name) VALUES (:name)"); 1.149 + insertSetting.params.name = prefName; 1.150 + insertSetting.execute(); 1.151 + let settingId = cps.DBConnection.lastInsertRowID; 1.152 + 1.153 + let insertPref = cps.DBConnection.createStatement("INSERT INTO prefs (groupID, settingID, value) " + 1.154 + "VALUES (:groupId, :settingId, :value)"); 1.155 + insertPref.params.groupId = groupId; 1.156 + insertPref.params.settingId = settingId; 1.157 + insertPref.params.value = VALUE; 1.158 + insertPref.execute(); 1.159 + let prefId = cps.DBConnection.lastInsertRowID; 1.160 + 1.161 + let dbValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId); 1.162 + 1.163 + // First access from service should hit the DB 1.164 + let svcValue = cps.getPref(uri, prefName); 1.165 + 1.166 + // Second time should get the value from cache 1.167 + let cacheValue = cps.getPref(uri, prefName); 1.168 + 1.169 + do_check_eq(VALUE, dbValue); 1.170 + do_check_eq(VALUE, svcValue); 1.171 + do_check_eq(VALUE, cacheValue); 1.172 + 1.173 + do_check_true(isCached(uri, prefName)); 1.174 +} 1.175 + 1.176 +function testTypeConversions(uri, prefName) { 1.177 + let value; 1.178 + 1.179 + cps.setPref(uri, prefName, true); 1.180 + value = cps.getPref(uri, prefName); 1.181 + do_check_true(value === 1); 1.182 + 1.183 + cps.setPref(uri, prefName, false); 1.184 + value = cps.getPref(uri, prefName); 1.185 + do_check_true(value === 0); 1.186 + 1.187 + cps.setPref(uri, prefName, null); 1.188 + value = cps.getPref(uri, prefName); 1.189 + do_check_true(value === null); 1.190 + 1.191 + cps.setPref(uri, prefName, undefined); 1.192 + value = cps.getPref(uri, prefName); 1.193 + do_check_true(value === null); 1.194 +} 1.195 + 1.196 +function testNonExistingPrefCachesAsUndefined(uri, prefName) { 1.197 + 1.198 + do_check_false(isCached(uri, prefName)); 1.199 + 1.200 + // Cache the pref 1.201 + let value = cps.getPref(uri, prefName); 1.202 + do_check_true(value === undefined); 1.203 + 1.204 + do_check_true(isCached(uri, prefName)); 1.205 + 1.206 + // Cached pref 1.207 + value = cps.getPref(uri, prefName); 1.208 + do_check_true(value === undefined); 1.209 +} 1.210 + 1.211 +function testCacheEviction(uri, prefName) { 1.212 + 1.213 + cps.setPref(uri, prefName, 5); 1.214 + do_check_eq(cps.getPref(uri, prefName), 5); 1.215 + do_check_true(isCached(uri, prefName)); 1.216 + 1.217 + // try to evict value from cache by adding various other entries 1.218 + const ENTRIES_TO_ADD = 200; 1.219 + for (let i = 0; i < ENTRIES_TO_ADD; i++) { 1.220 + let uriToAdd = "www" + i + uri; 1.221 + cps.setPref(uriToAdd, prefName, 0); 1.222 + } 1.223 + 1.224 + do_check_false(isCached(uri, prefName)); 1.225 + 1.226 +} 1.227 + 1.228 +function selectValue(stmt, columnName, param1, param2) { 1.229 + let stmt = cps.DBConnection.createStatement(stmt); 1.230 + if (param1) 1.231 + stmt.params.param1 = param1; 1.232 + 1.233 + if (param2) 1.234 + stmt.params.param2 = param2; 1.235 + 1.236 + stmt.executeStep(); 1.237 + let val = stmt.row[columnName]; 1.238 + stmt.reset(); 1.239 + stmt.finalize(); 1.240 + return val; 1.241 +} 1.242 + 1.243 +function isCached(uri, prefName) { 1.244 + return cps.hasCachedPref(uri, prefName); 1.245 +}