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