summaryrefslogtreecommitdiffstats
path: root/security/manager/ssl/tests/unit/test_data_storage.js
blob: 89d6c2f965b7d93a53c9958f64d6f3467d380aa7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

do_get_profile(); // must be done before instantiating nsIDataStorageManager

let dataStorageManager = Cc[
  "@mozilla.org/security/datastoragemanager;1"
].getService(Ci.nsIDataStorageManager);
let dataStorage = dataStorageManager.get(
  Ci.nsIDataStorageManager.ClientAuthRememberList
);

add_task(function test_data_storage() {
  // Test putting a simple key/value pair.
  dataStorage.put("test", "value", Ci.nsIDataStorage.Persistent);
  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Persistent), "value");

  // Test that getting a value with the same key but of a different type throws.
  Assert.throws(
    () => dataStorage.get("test", Ci.nsIDataStorage.Private),
    /NS_ERROR_NOT_AVAILABLE/,
    "getting a value of a type that hasn't been set yet should throw"
  );

  // Put with Private data shouldn't affect Persistent data
  dataStorage.put("test", "private", Ci.nsIDataStorage.Private);
  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Private), "private");
  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Persistent), "value");

  // Put of a previously-present key overwrites it (if of the same type)
  dataStorage.put("test", "new", Ci.nsIDataStorage.Persistent);
  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Persistent), "new");

  // Removal should work
  dataStorage.remove("test", Ci.nsIDataStorage.Persistent);
  Assert.throws(
    () => dataStorage.get("test", Ci.nsIDataStorage.Persistent),
    /NS_ERROR_NOT_AVAILABLE/,
    "getting a removed value should throw"
  );
  // But removing one type shouldn't affect the other
  Assert.equal(dataStorage.get("test", Ci.nsIDataStorage.Private), "private");
  // Test removing the other type as well
  dataStorage.remove("test", Ci.nsIDataStorage.Private);
  Assert.throws(
    () => dataStorage.get("test", Ci.nsIDataStorage.Private),
    /NS_ERROR_NOT_AVAILABLE/,
    "getting a removed value should throw"
  );

  // Saturate the storage tables (there is a maximum of 2048 entries for each
  // type of data).
  for (let i = 0; i < 2048; i++) {
    let padded = i.toString().padStart(4, "0");
    dataStorage.put(
      `key${padded}`,
      `value${padded}`,
      Ci.nsIDataStorage.Persistent
    );
    dataStorage.put(
      `key${padded}`,
      `value${padded}`,
      Ci.nsIDataStorage.Private
    );
  }
  // Ensure the data can be read back.
  for (let i = 0; i < 2048; i++) {
    let padded = i.toString().padStart(4, "0");
    let val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Persistent);
    Assert.equal(val, `value${padded}`);
    val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Private);
    Assert.equal(val, `value${padded}`);
  }
  // Remove each entry.
  for (let i = 0; i < 2048; i++) {
    let padded = i.toString().padStart(4, "0");
    dataStorage.remove(`key${padded}`, Ci.nsIDataStorage.Persistent);
    dataStorage.remove(`key${padded}`, Ci.nsIDataStorage.Private);
  }
  // Ensure the entries are not present.
  for (let i = 0; i < 2048; i++) {
    let padded = i.toString().padStart(4, "0");
    Assert.throws(
      () => dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Persistent),
      /NS_ERROR_NOT_AVAILABLE/,
      "getting a removed value should throw"
    );
    Assert.throws(
      () => dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Private),
      /NS_ERROR_NOT_AVAILABLE/,
      "getting a removed value should throw"
    );
  }
  // Add new entries.
  for (let i = 0; i < 2048; i++) {
    let padded = i.toString().padStart(5, "1");
    dataStorage.put(
      `key${padded}`,
      `value${padded}`,
      Ci.nsIDataStorage.Persistent
    );
    dataStorage.put(
      `key${padded}`,
      `value${padded}`,
      Ci.nsIDataStorage.Private
    );
  }
  // Ensure each new entry was added.
  for (let i = 0; i < 2048; i++) {
    let padded = i.toString().padStart(5, "1");
    let val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Persistent);
    Assert.equal(val, `value${padded}`);
    val = dataStorage.get(`key${padded}`, Ci.nsIDataStorage.Private);
    Assert.equal(val, `value${padded}`);
  }
});