tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_snapshotting.js (9078B)


      1 /**
      2 * Any copyright is dedicated to the Public Domain.
      3 * http://creativecommons.org/publicdomain/zero/1.0/
      4 */
      5 
      6 add_task(async function testSteps() {
      7  const url = "http://example.com";
      8 
      9  info("Setting pref");
     10 
     11  Services.prefs.setBoolPref("dom.storage.snapshot_reusing", false);
     12 
     13  const items = [
     14    { key: "key01", value: "value01" },
     15    { key: "key02", value: "value02" },
     16    { key: "key03", value: "value03" },
     17    { key: "key04", value: "value04" },
     18    { key: "key05", value: "value05" },
     19    { key: "key06", value: "value06" },
     20    { key: "key07", value: "value07" },
     21    { key: "key08", value: "value08" },
     22    { key: "key09", value: "value09" },
     23    { key: "key10", value: "value10" },
     24  ];
     25 
     26  let sizeOfOneKey;
     27  let sizeOfOneValue;
     28  let sizeOfOneItem;
     29  let sizeOfKeys = 0;
     30  let sizeOfItems = 0;
     31 
     32  for (let i = 0; i < items.length; i++) {
     33    let item = items[i];
     34    let sizeOfKey = item.key.length;
     35    let sizeOfValue = item.value.length;
     36    let sizeOfItem = sizeOfKey + sizeOfValue;
     37    if (i == 0) {
     38      sizeOfOneKey = sizeOfKey;
     39      sizeOfOneValue = sizeOfValue;
     40      sizeOfOneItem = sizeOfItem;
     41    }
     42    sizeOfKeys += sizeOfKey;
     43    sizeOfItems += sizeOfItem;
     44  }
     45 
     46  info("Size of one key is " + sizeOfOneKey);
     47  info("Size of one value is " + sizeOfOneValue);
     48  info("Size of one item is " + sizeOfOneItem);
     49  info("Size of keys is " + sizeOfKeys);
     50  info("Size of items is " + sizeOfItems);
     51 
     52  const prefillValues = [
     53    // Zero prefill (prefill disabled)
     54    0,
     55    // Less than one key length prefill
     56    sizeOfOneKey - 1,
     57    // Greater than one key length and less than one item length prefill
     58    sizeOfOneKey + 1,
     59    // Precisely one item length prefill
     60    sizeOfOneItem,
     61    // Precisely two times one item length prefill
     62    2 * sizeOfOneItem,
     63    // Precisely three times one item length prefill
     64    3 * sizeOfOneItem,
     65    // Precisely four times one item length prefill
     66    4 * sizeOfOneItem,
     67    // Precisely size of keys prefill
     68    sizeOfKeys,
     69    // Less than size of keys plus one value length prefill
     70    sizeOfKeys + sizeOfOneValue - 1,
     71    // Precisely size of keys plus one value length prefill
     72    sizeOfKeys + sizeOfOneValue,
     73    // Greater than size of keys plus one value length and less than size of
     74    // keys plus two times one value length prefill
     75    sizeOfKeys + sizeOfOneValue + 1,
     76    // Precisely size of keys plus two times one value length prefill
     77    sizeOfKeys + 2 * sizeOfOneValue,
     78    // Precisely size of keys plus three times one value length prefill
     79    sizeOfKeys + 3 * sizeOfOneValue,
     80    // Precisely size of keys plus four times one value length prefill
     81    sizeOfKeys + 4 * sizeOfOneValue,
     82    // Precisely size of keys plus five times one value length prefill
     83    sizeOfKeys + 5 * sizeOfOneValue,
     84    // Precisely size of keys plus six times one value length prefill
     85    sizeOfKeys + 6 * sizeOfOneValue,
     86    // Precisely size of keys plus seven times one value length prefill
     87    sizeOfKeys + 7 * sizeOfOneValue,
     88    // Precisely size of keys plus eight times one value length prefill
     89    sizeOfKeys + 8 * sizeOfOneValue,
     90    // Precisely size of keys plus nine times one value length prefill
     91    sizeOfKeys + 9 * sizeOfOneValue,
     92    // Precisely size of items prefill
     93    sizeOfItems,
     94    // Unlimited prefill
     95    -1,
     96  ];
     97 
     98  for (let prefillValue of prefillValues) {
     99    info("Setting prefill value to " + prefillValue);
    100 
    101    Services.prefs.setIntPref("dom.storage.snapshot_prefill", prefillValue);
    102 
    103    const gradualPrefillValues = [
    104      // Zero gradual prefill
    105      0,
    106      // Less than one key length gradual prefill
    107      sizeOfOneKey - 1,
    108      // Greater than one key length and less than one item length gradual
    109      // prefill
    110      sizeOfOneKey + 1,
    111      // Precisely one item length gradual prefill
    112      sizeOfOneItem,
    113      // Precisely two times one item length gradual prefill
    114      2 * sizeOfOneItem,
    115      // Precisely three times one item length gradual prefill
    116      3 * sizeOfOneItem,
    117      // Precisely four times one item length gradual prefill
    118      4 * sizeOfOneItem,
    119      // Precisely five times one item length gradual prefill
    120      5 * sizeOfOneItem,
    121      // Precisely six times one item length gradual prefill
    122      6 * sizeOfOneItem,
    123      // Precisely seven times one item length gradual prefill
    124      7 * sizeOfOneItem,
    125      // Precisely eight times one item length gradual prefill
    126      8 * sizeOfOneItem,
    127      // Precisely nine times one item length gradual prefill
    128      9 * sizeOfOneItem,
    129      // Precisely size of items prefill
    130      sizeOfItems,
    131      // Unlimited gradual prefill
    132      -1,
    133    ];
    134 
    135    for (let gradualPrefillValue of gradualPrefillValues) {
    136      info("Setting gradual prefill value to " + gradualPrefillValue);
    137 
    138      Services.prefs.setIntPref(
    139        "dom.storage.snapshot_gradual_prefill",
    140        gradualPrefillValue
    141      );
    142 
    143      info("Getting storage");
    144 
    145      let storage = getLocalStorage(getPrincipal(url));
    146 
    147      // 1st snapshot
    148 
    149      info("Adding data");
    150 
    151      for (let item of items) {
    152        storage.setItem(item.key, item.value);
    153      }
    154 
    155      info("Saving key order");
    156 
    157      // This forces GetKeys to be called internally.
    158      let savedKeys = Object.keys(storage);
    159 
    160      // GetKey should match GetKeys
    161      for (let i = 0; i < savedKeys.length; i++) {
    162        is(storage.key(i), savedKeys[i], "Correct key");
    163      }
    164 
    165      info("Returning to event loop");
    166 
    167      // Returning to event loop forces the internal snapshot to finish.
    168      await returnToEventLoop();
    169 
    170      // 2nd snapshot
    171 
    172      info("Verifying length");
    173 
    174      is(storage.length, items.length, "Correct length");
    175 
    176      info("Verifying key order");
    177 
    178      let keys = Object.keys(storage);
    179 
    180      is(keys.length, savedKeys.length);
    181 
    182      for (let i = 0; i < keys.length; i++) {
    183        is(keys[i], savedKeys[i], "Correct key");
    184      }
    185 
    186      info("Verifying values");
    187 
    188      for (let item of items) {
    189        is(storage.getItem(item.key), item.value, "Correct value");
    190      }
    191 
    192      info("Returning to event loop");
    193 
    194      await returnToEventLoop();
    195 
    196      // 3rd snapshot
    197 
    198      // Force key2 to load.
    199      storage.getItem("key02");
    200 
    201      // Fill out write infos a bit.
    202      storage.removeItem("key05");
    203      storage.setItem("key05", "value05");
    204      storage.removeItem("key05");
    205      storage.setItem("key11", "value11");
    206      storage.setItem("key05", "value05");
    207 
    208      items.push({ key: "key11", value: "value11" });
    209 
    210      info("Verifying length");
    211 
    212      is(storage.length, items.length, "Correct length");
    213 
    214      // This forces to get all keys from the parent and then apply write infos
    215      // on already cached values.
    216      savedKeys = Object.keys(storage);
    217 
    218      info("Verifying values");
    219 
    220      for (let item of items) {
    221        is(storage.getItem(item.key), item.value, "Correct value");
    222      }
    223 
    224      storage.removeItem("key11");
    225 
    226      items.pop();
    227 
    228      info("Returning to event loop");
    229 
    230      await returnToEventLoop();
    231 
    232      // 4th snapshot
    233 
    234      // Force loading of all items.
    235      info("Verifying length");
    236 
    237      is(storage.length, items.length, "Correct length");
    238 
    239      info("Verifying values");
    240 
    241      for (let item of items) {
    242        is(storage.getItem(item.key), item.value, "Correct value");
    243      }
    244 
    245      is(storage.getItem("key11"), null, "Correct value");
    246 
    247      info("Returning to event loop");
    248 
    249      await returnToEventLoop();
    250 
    251      // 5th snapshot
    252 
    253      // Force loading of all keys.
    254      info("Saving key order");
    255 
    256      savedKeys = Object.keys(storage);
    257 
    258      // Force loading of all items.
    259      info("Verifying length");
    260 
    261      is(storage.length, items.length, "Correct length");
    262 
    263      info("Verifying values");
    264 
    265      for (let item of items) {
    266        is(storage.getItem(item.key), item.value, "Correct value");
    267      }
    268 
    269      is(storage.getItem("key11"), null, "Correct value");
    270 
    271      info("Returning to event loop");
    272 
    273      await returnToEventLoop();
    274 
    275      // 6th snapshot
    276      info("Verifying unknown item");
    277 
    278      is(storage.getItem("key11"), null, "Correct value");
    279 
    280      info("Verifying unknown item again");
    281 
    282      is(storage.getItem("key11"), null, "Correct value");
    283 
    284      info("Returning to event loop");
    285 
    286      await returnToEventLoop();
    287 
    288      // 7th snapshot
    289 
    290      // Save actual key order.
    291      info("Saving key order");
    292 
    293      savedKeys = Object.keys(storage);
    294 
    295      await returnToEventLoop();
    296 
    297      // 8th snapshot
    298 
    299      // Force loading of all items, but in reverse order.
    300      info("Getting values");
    301 
    302      for (let i = items.length - 1; i >= 0; i--) {
    303        let item = items[i];
    304        storage.getItem(item.key);
    305      }
    306 
    307      info("Verifying key order");
    308 
    309      keys = Object.keys(storage);
    310 
    311      is(keys.length, savedKeys.length);
    312 
    313      for (let i = 0; i < keys.length; i++) {
    314        is(keys[i], savedKeys[i], "Correct key");
    315      }
    316 
    317      await returnToEventLoop();
    318 
    319      // 9th snapshot
    320 
    321      info("Clearing");
    322 
    323      storage.clear();
    324 
    325      info("Returning to event loop");
    326 
    327      await returnToEventLoop();
    328    }
    329  }
    330 });