tor-browser

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

test_data_storage.js (6193B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 do_get_profile(); // must be done before instantiating nsIDataStorageManager
      8 
      9 let dataStorageManager = Cc[
     10  "@mozilla.org/security/datastoragemanager;1"
     11 ].getService(Ci.nsIDataStorageManager);
     12 let dataStorage = dataStorageManager.get(
     13  Ci.nsIDataStorageManager.ClientAuthRememberList
     14 );
     15 
     16 add_task(function test_data_storage() {
     17  // There shouldn't be anything in the data storage to begin with.
     18  Assert.equal(dataStorage.getAll().length, 0);
     19 
     20  // Test putting a simple key/value pair.
     21  dataStorage.put("test", "value", Ci.nsIDataStorage.Persistent);
     22  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Persistent), "value");
     23 
     24  // Test that getting a value with the same key but of a different type throws.
     25  Assert.throws(
     26    () => dataStorage.get("test", Ci.nsIDataStorage.Temporary),
     27    /NS_ERROR_NOT_AVAILABLE/,
     28    "getting a value of a type that hasn't been set yet should throw"
     29  );
     30  Assert.throws(
     31    () => dataStorage.get("test", Ci.nsIDataStorage.Private),
     32    /NS_ERROR_NOT_AVAILABLE/,
     33    "getting a value of a type that hasn't been set yet should throw"
     34  );
     35 
     36  // Put with Temporary/Private data shouldn't affect Persistent data
     37  dataStorage.put("test", "temporary", Ci.nsIDataStorage.Temporary);
     38  Assert.equal(
     39    dataStorage.get("test", Ci.nsIDataStorage.Temporary),
     40    "temporary"
     41  );
     42  dataStorage.put("test", "private", Ci.nsIDataStorage.Private);
     43  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Private), "private");
     44  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Persistent), "value");
     45 
     46  // Put of a previously-present key overwrites it (if of the same type)
     47  dataStorage.put("test", "new", Ci.nsIDataStorage.Persistent);
     48  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Persistent), "new");
     49 
     50  // Removal should work
     51  dataStorage.remove("test", Ci.nsIDataStorage.Persistent);
     52  Assert.throws(
     53    () => dataStorage.get("test", Ci.nsIDataStorage.Persistent),
     54    /NS_ERROR_NOT_AVAILABLE/,
     55    "getting a removed value should throw"
     56  );
     57  // But removing one type shouldn't affect the others
     58  Assert.equal(
     59    dataStorage.get("test", Ci.nsIDataStorage.Temporary),
     60    "temporary"
     61  );
     62  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Private), "private");
     63  // Test removing the other types as well
     64  dataStorage.remove("test", Ci.nsIDataStorage.Temporary);
     65  dataStorage.remove("test", Ci.nsIDataStorage.Private);
     66  Assert.throws(
     67    () => dataStorage.get("test", Ci.nsIDataStorage.Temporary),
     68    /NS_ERROR_NOT_AVAILABLE/,
     69    "getting a removed value should throw"
     70  );
     71  Assert.throws(
     72    () => dataStorage.get("test", Ci.nsIDataStorage.Private),
     73    /NS_ERROR_NOT_AVAILABLE/,
     74    "getting a removed value should throw"
     75  );
     76 
     77  // Saturate the storage tables (there is a maximum of 2048 entries for each
     78  // type of data).
     79  for (let i = 0; i < 2048; i++) {
     80    let padded = i.toString().padStart(4, "0");
     81    dataStorage.put(
     82      `key${padded}`,
     83      `value${padded}`,
     84      Ci.nsIDataStorage.Persistent
     85    );
     86    dataStorage.put(
     87      `key${padded}`,
     88      `value${padded}`,
     89      Ci.nsIDataStorage.Private
     90    );
     91  }
     92  // Ensure the data can be read back.
     93  for (let i = 0; i < 2048; i++) {
     94    let padded = i.toString().padStart(4, "0");
     95    let val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Persistent);
     96    Assert.equal(val, `value${padded}`);
     97    val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Private);
     98    Assert.equal(val, `value${padded}`);
     99  }
    100  // Remove each entry.
    101  for (let i = 0; i < 2048; i++) {
    102    let padded = i.toString().padStart(4, "0");
    103    dataStorage.remove(`key${padded}`, Ci.nsIDataStorage.Persistent);
    104    dataStorage.remove(`key${padded}`, Ci.nsIDataStorage.Private);
    105  }
    106  // Ensure the entries are not present.
    107  for (let i = 0; i < 2048; i++) {
    108    let padded = i.toString().padStart(4, "0");
    109    Assert.throws(
    110      () => dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Persistent),
    111      /NS_ERROR_NOT_AVAILABLE/,
    112      "getting a removed value should throw"
    113    );
    114    Assert.throws(
    115      () => dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Private),
    116      /NS_ERROR_NOT_AVAILABLE/,
    117      "getting a removed value should throw"
    118    );
    119  }
    120 
    121  // Getting all entries should return an empty array.
    122  Assert.equal(dataStorage.getAll().length, 0);
    123 
    124  // Add new entries.
    125  for (let i = 0; i < 2048; i++) {
    126    let padded = i.toString().padStart(5, "*");
    127    dataStorage.put(
    128      `key${padded}`,
    129      `value${padded}`,
    130      Ci.nsIDataStorage.Persistent
    131    );
    132    dataStorage.put(
    133      `key${padded}`,
    134      `value${padded}`,
    135      Ci.nsIDataStorage.Private
    136    );
    137  }
    138  // Ensure each new entry was added.
    139  for (let i = 0; i < 2048; i++) {
    140    let padded = i.toString().padStart(5, "*");
    141    let val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Persistent);
    142    Assert.equal(val, `value${padded}`);
    143    val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Private);
    144    Assert.equal(val, `value${padded}`);
    145  }
    146 
    147  // Getting all of the entries all at once should work.
    148  let entries = dataStorage.getAll();
    149  Assert.equal(entries.length, 4096);
    150  let persistentEntries = entries.filter(
    151    entry => entry.type == Ci.nsIDataStorage.Persistent
    152  );
    153  Assert.equal(persistentEntries.length, 2048);
    154  let privateEntries = entries.filter(
    155    entry => entry.type == Ci.nsIDataStorage.Private
    156  );
    157  Assert.equal(privateEntries.length, 2048);
    158  let compareEntries = (a, b) => {
    159    if (a.key < b.key) {
    160      return -1;
    161    }
    162    if (a.key == b.key) {
    163      return 0;
    164    }
    165    return 1;
    166  };
    167  persistentEntries.sort(compareEntries);
    168  privateEntries.sort(compareEntries);
    169  for (let i = 0; i < 2048; i++) {
    170    let padded = i.toString().padStart(5, "*");
    171    Assert.equal(persistentEntries[i].key, `key${padded}`);
    172    Assert.equal(persistentEntries[i].value, `value${padded}`);
    173    Assert.equal(privateEntries[i].key, `key${padded}`);
    174    Assert.equal(privateEntries[i].value, `value${padded}`);
    175  }
    176 });