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 });