toolkit/components/contentprefs/tests/unit/test_contentPrefsCache.js

Fri, 16 Jan 2015 18:13:44 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 18:13:44 +0100
branch
TOR_BUG_9701
changeset 14
925c144e1f1f
permissions
-rw-r--r--

Integrate suggestion from review to improve consistency with existing code.

     1 /*
     2  * Any copyright is dedicated to the Public Domain.
     3  * http://creativecommons.org/publicdomain/zero/1.0/
     4  */
     6 let cps = new ContentPrefInstance(null);
     8 function run_test() {
     9   testCacheWorks("test1.example.com", "test-pref1");
    10   testHasCachedPrefFunction("test2.example.com", "test-pref2");
    11   testSetCaches("test3.example.com", "test-pref3");
    12   testGetCaches("test4.example.com", "test-pref4");
    13   testRemovePrefs("test5.example.com", "test-pref5");
    14   testTypeConversions("test6.example.com", "test-pref6");
    15   testNonExistingPrefCachesAsUndefined("test7.example.com", "test-pref7");
    16   testCacheEviction("test8.example.com", "test-pref8");
    17 }
    19 function testCacheWorks(uri, prefName) {
    20   const CACHED_VALUE = 3;
    21   const NEW_VALUE = 5;
    23   cps.setPref(uri, prefName, CACHED_VALUE);
    24   do_check_eq(cps.getPref(uri, prefName), CACHED_VALUE);
    26   // Now change the value directly through the DB and check
    27   // that the cached value is different
    29   let groupId = selectValue("SELECT id FROM groups WHERE name = :param1", "id", uri);
    30   let settingId = selectValue("SELECT id FROM settings WHERE name = :param1", "id", prefName);
    31   let prefId = selectValue("SELECT id FROM prefs WHERE groupID = :param1 AND settingID = :param2",
    32                            "id", groupId, settingId);
    34   let stmt = cps.DBConnection.createStatement("UPDATE prefs SET value = :value WHERE id = :id");
    35   stmt.params.value = NEW_VALUE;
    36   stmt.params.id = prefId;
    37   stmt.execute();
    39   let dbValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId);
    40   let cacheValue = cps.getPref(uri, prefName);
    42   do_check_eq(dbValue, NEW_VALUE);
    43   do_check_eq(cacheValue, CACHED_VALUE);
    44   do_check_neq(cacheValue, dbValue);
    46   do_test_pending();
    47   cps.getPref(uri, prefName, function (value) {
    48     do_check_eq(dbValue, NEW_VALUE);
    49     do_check_eq(value, CACHED_VALUE);
    50     do_check_neq(value, dbValue);
    51     do_test_finished();
    52   });
    53 }
    55 function testHasCachedPrefFunction(uri, prefName) {
    56   const STARTING_VALUE = 3;
    57   const NEW_VALUE = 5;
    59   do_check_false(isCached(uri, prefName));
    61   cps.setPref(uri, prefName, STARTING_VALUE);
    63   let groupId = selectValue("SELECT id FROM groups WHERE name = :param1", "id", uri);
    64   let settingId = selectValue("SELECT id FROM settings WHERE name = :param1", "id", prefName);
    65   let prefId = selectValue("SELECT id FROM prefs WHERE groupID = :param1 AND settingID = :param2",
    66                        "id", groupId, settingId);
    68   do_check_neq(prefId, undefined);
    70   let originalValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId);
    71   do_check_eq(originalValue, STARTING_VALUE);
    73   let stmt = cps.DBConnection.createStatement("UPDATE prefs SET value = :value WHERE id = :id");
    74   stmt.params.value = NEW_VALUE;
    75   stmt.params.id = prefId;
    76   stmt.execute();
    78   let newValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId);
    79   do_check_eq(newValue, NEW_VALUE);
    81   let cachedValue = cps.getPref(uri, prefName);
    82   do_check_eq(cachedValue, STARTING_VALUE);
    83   do_check_true(isCached(uri, prefName));
    84 }
    86 function testSetCaches(uri, prefName) {
    87   cps.setPref(uri, prefName, 0);
    88   do_check_true(isCached(uri, prefName));
    89 }
    91 function testRemovePrefs(uri, prefName) {
    93   /* removePref */
    94   cps.setPref("www1." + uri, prefName, 1);
    96   do_check_eq(cps.getPref("www1." + uri, prefName), 1);
    98   cps.removePref("www1." + uri, prefName);
   100   do_check_false(isCached("www1." + uri, prefName));
   101   do_check_false(cps.hasPref("www1." + uri, prefName));
   102   do_check_neq(cps.getPref("www1." + uri, prefName), 1);
   104   /* removeGroupedPrefs */
   105   cps.setPref("www2." + uri, prefName, 2);
   106   cps.setPref("www3." + uri, prefName, 3);
   108   do_check_eq(cps.getPref("www2." + uri, prefName), 2);
   109   do_check_eq(cps.getPref("www3." + uri, prefName), 3);
   111   cps.removeGroupedPrefs();
   113   do_check_false(isCached("www2." + uri, prefName));
   114   do_check_false(isCached("www3." + uri, prefName));
   115   do_check_false(cps.hasPref("www2." + uri, prefName));
   116   do_check_false(cps.hasPref("www3." + uri, prefName));
   117   do_check_neq(cps.getPref("www2." + uri, prefName), 2);
   118   do_check_neq(cps.getPref("www3." + uri, prefName), 3);
   120   /* removePrefsByName */
   121   cps.setPref("www4." + uri, prefName, 4);
   122   cps.setPref("www5." + uri, prefName, 5);
   124   do_check_eq(cps.getPref("www4." + uri, prefName), 4);
   125   do_check_eq(cps.getPref("www5." + uri, prefName), 5);
   127   cps.removePrefsByName(prefName);
   129   do_check_false(isCached("www4." + uri, prefName));
   130   do_check_false(isCached("www5." + uri, prefName));
   131   do_check_false(cps.hasPref("www4." + uri, prefName));
   132   do_check_false(cps.hasPref("www5." + uri, prefName));
   133   do_check_neq(cps.getPref("www4." + uri, prefName), 4);
   134   do_check_neq(cps.getPref("www5." + uri, prefName), 5);
   135 }
   137 function testGetCaches(uri, prefName) {
   138   const VALUE = 4;
   140   let insertGroup = cps.DBConnection.createStatement("INSERT INTO groups (name) VALUES (:name)");
   141   insertGroup.params.name = uri;
   142   insertGroup.execute();
   143   let groupId = cps.DBConnection.lastInsertRowID;
   145   let insertSetting = cps.DBConnection.createStatement("INSERT INTO settings (name) VALUES (:name)");
   146   insertSetting.params.name = prefName;
   147   insertSetting.execute();
   148   let settingId = cps.DBConnection.lastInsertRowID;
   150   let insertPref = cps.DBConnection.createStatement("INSERT INTO prefs (groupID, settingID, value) " +
   151                                                     "VALUES (:groupId, :settingId, :value)");
   152   insertPref.params.groupId = groupId;
   153   insertPref.params.settingId = settingId;
   154   insertPref.params.value = VALUE;
   155   insertPref.execute();
   156   let prefId = cps.DBConnection.lastInsertRowID;
   158   let dbValue = selectValue("SELECT value FROM prefs WHERE id = :param1", "value", prefId);
   160   // First access from service should hit the DB
   161   let svcValue = cps.getPref(uri, prefName);
   163   // Second time should get the value from cache
   164   let cacheValue = cps.getPref(uri, prefName);
   166   do_check_eq(VALUE, dbValue);
   167   do_check_eq(VALUE, svcValue);
   168   do_check_eq(VALUE, cacheValue);
   170   do_check_true(isCached(uri, prefName));
   171 }
   173 function testTypeConversions(uri, prefName) {
   174   let value;
   176   cps.setPref(uri, prefName, true);
   177   value = cps.getPref(uri, prefName);
   178   do_check_true(value === 1);
   180   cps.setPref(uri, prefName, false);
   181   value = cps.getPref(uri, prefName);
   182   do_check_true(value === 0);
   184   cps.setPref(uri, prefName, null);
   185   value = cps.getPref(uri, prefName);
   186   do_check_true(value === null);
   188   cps.setPref(uri, prefName, undefined);
   189   value = cps.getPref(uri, prefName);
   190   do_check_true(value === null);
   191 }
   193 function testNonExistingPrefCachesAsUndefined(uri, prefName) {
   195   do_check_false(isCached(uri, prefName));
   197   // Cache the pref
   198   let value = cps.getPref(uri, prefName);
   199   do_check_true(value === undefined);
   201   do_check_true(isCached(uri, prefName));
   203   // Cached pref
   204   value = cps.getPref(uri, prefName);
   205   do_check_true(value === undefined);
   206 }
   208 function testCacheEviction(uri, prefName) {
   210   cps.setPref(uri, prefName, 5);
   211   do_check_eq(cps.getPref(uri, prefName), 5);
   212   do_check_true(isCached(uri, prefName));
   214   // try to evict value from cache by adding various other entries
   215   const ENTRIES_TO_ADD = 200;
   216   for (let i = 0; i < ENTRIES_TO_ADD; i++) {
   217     let uriToAdd = "www" + i + uri;
   218     cps.setPref(uriToAdd, prefName, 0);
   219   }
   221   do_check_false(isCached(uri, prefName));
   223 }
   225 function selectValue(stmt, columnName, param1, param2) {
   226   let stmt = cps.DBConnection.createStatement(stmt);
   227   if (param1)
   228     stmt.params.param1 = param1;
   230   if (param2)
   231     stmt.params.param2 = param2;
   233   stmt.executeStep();
   234   let val = stmt.row[columnName];
   235   stmt.reset();
   236   stmt.finalize();
   237   return val;
   238 }
   240 function isCached(uri, prefName) {
   241   return cps.hasCachedPref(uri, prefName);
   242 }

mercurial