test_originInit.js (8687B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 async function testSteps() { 7 const storageDirName = "storage"; 8 const persistenceTypeDefaultDirName = "default"; 9 const persistenceTypePersistentDirName = "permanent"; 10 11 const principal = getPrincipal("http://example.com"); 12 13 const originDirName = "http+++example.com"; 14 15 const clientLSDirName = "ls"; 16 17 const dataFile = getRelativeFile( 18 `${storageDirName}/${persistenceTypeDefaultDirName}/${originDirName}/` + 19 `${clientLSDirName}/data.sqlite` 20 ); 21 22 const usageJournalFile = getRelativeFile( 23 `${storageDirName}/${persistenceTypeDefaultDirName}/${originDirName}/` + 24 `${clientLSDirName}/usage-journal` 25 ); 26 27 const usageFile = getRelativeFile( 28 `${storageDirName}/${persistenceTypeDefaultDirName}/${originDirName}/` + 29 `${clientLSDirName}/usage` 30 ); 31 32 const persistentLSDir = getRelativeFile( 33 `${storageDirName}/${persistenceTypePersistentDirName}/${originDirName}/` + 34 `${clientLSDirName}` 35 ); 36 37 const data = {}; 38 data.key = "key1"; 39 data.value = "value1"; 40 data.usage = data.key.length + data.value.length; 41 42 const usageFileCookie = 0x420a420a; 43 44 async function createTestOrigin() { 45 let storage = getLocalStorage(principal); 46 47 storage.setItem(data.key, data.value); 48 49 let request = reset(); 50 await requestFinished(request); 51 } 52 53 async function createPersistentTestOrigin() { 54 let database = getSimpleDatabase(principal, "persistent"); 55 56 let request = database.open("data"); 57 await requestFinished(request); 58 59 request = reset(); 60 await requestFinished(request); 61 } 62 63 function removeFile(file) { 64 file.remove(false); 65 } 66 67 function createEmptyFile(file) { 68 file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o0644); 69 } 70 71 function createEmptyDirectory(dir) { 72 dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o0755); 73 } 74 75 function getBinaryOutputStream(file) { 76 var ostream = Cc[ 77 "@mozilla.org/network/file-output-stream;1" 78 ].createInstance(Ci.nsIFileOutputStream); 79 ostream.init(file, -1, parseInt("0644", 8), 0); 80 81 let bstream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance( 82 Ci.nsIBinaryOutputStream 83 ); 84 bstream.setOutputStream(ostream); 85 86 return bstream; 87 } 88 89 async function initTestOrigin() { 90 let request = initStorage(); 91 await requestFinished(request); 92 93 request = initTemporaryStorage(); 94 await requestFinished(request); 95 96 request = initTemporaryOrigin("default", principal); 97 await requestFinished(request); 98 } 99 100 async function initPersistentTestOrigin() { 101 let request = initStorage(); 102 await requestFinished(request); 103 104 request = initPersistentOrigin(principal); 105 await requestFinished(request); 106 } 107 108 async function checkFiles(wantData, wantUsage) { 109 let exists = dataFile.exists(); 110 if (wantData) { 111 ok(exists, "Data file does exist"); 112 } else { 113 ok(!exists, "Data file doesn't exist"); 114 } 115 116 exists = usageJournalFile.exists(); 117 ok(!exists, "Usage journal file doesn't exist"); 118 119 exists = usageFile.exists(); 120 if (wantUsage) { 121 ok(exists, "Usage file does exist"); 122 } else { 123 ok(!exists, "Usage file doesn't exist"); 124 return; 125 } 126 127 let usage = await readUsageFromUsageFile(usageFile); 128 Assert.equal(usage, data.usage, "Correct usage"); 129 } 130 131 async function clearTestOrigin() { 132 let request = clearOrigin(principal, "default"); 133 await requestFinished(request); 134 } 135 136 async function clearPersistentTestOrigin() { 137 let request = clearOrigin(principal, "persistent"); 138 await requestFinished(request); 139 } 140 141 info("Setting prefs"); 142 143 Services.prefs.setBoolPref( 144 "dom.storage.enable_unsupported_legacy_implementation", 145 false 146 ); 147 148 info( 149 "Stage 1 - " + 150 "data.sqlite file doesn't exist, " + 151 "usage-journal file doesn't exist, " + 152 "any usage file exists" 153 ); 154 155 await createTestOrigin(); 156 157 removeFile(dataFile); 158 159 await initTestOrigin(); 160 161 await checkFiles(/* wantData */ false, /* wantUsage */ false); 162 163 await clearTestOrigin(); 164 165 info( 166 "Stage 2 - " + 167 "data.sqlite file doesn't exist, " + 168 "any usage-journal file exists, " + 169 "any usage file exists" 170 ); 171 172 await createTestOrigin(); 173 174 removeFile(dataFile); 175 createEmptyFile(usageJournalFile); 176 177 await initTestOrigin(); 178 179 await checkFiles(/* wantData */ false, /* wantUsage */ false); 180 181 await clearTestOrigin(); 182 183 info( 184 "Stage 3 - " + 185 "valid data.sqlite file exists, " + 186 "usage-journal file doesn't exist, " + 187 "usage file doesn't exist" 188 ); 189 190 await createTestOrigin(); 191 192 removeFile(usageFile); 193 194 await initTestOrigin(); 195 196 await checkFiles(/* wantData */ true, /* wantUsage */ true); 197 198 await clearTestOrigin(); 199 200 info( 201 "Stage 4 - " + 202 "valid data.sqlite file exists, " + 203 "usage-journal file doesn't exist, " + 204 "invalid (wrong file size) usage file exists" 205 ); 206 207 await createTestOrigin(); 208 209 removeFile(usageFile); 210 createEmptyFile(usageFile); 211 212 await initTestOrigin(); 213 214 await checkFiles(/* wantData */ true, /* wantUsage */ true); 215 216 await clearTestOrigin(); 217 218 info( 219 "Stage 5 - " + 220 "valid data.sqlite file exists, " + 221 "usage-journal file doesn't exist, " + 222 "invalid (wrong cookie) usage file exists" 223 ); 224 225 await createTestOrigin(); 226 227 let stream = getBinaryOutputStream(usageFile); 228 stream.write32(usageFileCookie - 1); 229 stream.write64(data.usage); 230 stream.close(); 231 232 await initTestOrigin(); 233 234 await checkFiles(/* wantData */ true, /* wantUsage */ true); 235 236 await clearTestOrigin(); 237 238 info( 239 "Stage 6 - " + 240 "valid data.sqlite file exists, " + 241 "usage-journal file doesn't exist, " + 242 "valid usage file exists" 243 ); 244 245 await createTestOrigin(); 246 247 await initTestOrigin(); 248 249 await checkFiles(/* wantData */ true, /* wantUsage */ true); 250 251 await clearTestOrigin(); 252 253 info( 254 "Stage 7 - " + 255 "valid data.sqlite file exists, " + 256 "any usage-journal exists, " + 257 "usage file doesn't exist" 258 ); 259 260 await createTestOrigin(); 261 262 createEmptyFile(usageJournalFile); 263 removeFile(usageFile); 264 265 await initTestOrigin(); 266 267 await checkFiles(/* wantData */ true, /* wantUsage */ true); 268 269 await clearTestOrigin(); 270 271 info( 272 "Stage 8 - " + 273 "valid data.sqlite file exists, " + 274 "any usage-journal exists, " + 275 "invalid (wrong file size) usage file exists" 276 ); 277 278 await createTestOrigin(); 279 280 createEmptyFile(usageJournalFile); 281 removeFile(usageFile); 282 createEmptyFile(usageFile); 283 284 await initTestOrigin(); 285 286 await checkFiles(/* wantData */ true, /* wantUsage */ true); 287 288 await clearTestOrigin(); 289 290 info( 291 "Stage 9 - " + 292 "valid data.sqlite file exists, " + 293 "any usage-journal exists, " + 294 "invalid (wrong cookie) usage file exists" 295 ); 296 297 await createTestOrigin(); 298 299 createEmptyFile(usageJournalFile); 300 stream = getBinaryOutputStream(usageFile); 301 stream.write32(usageFileCookie - 1); 302 stream.write64(data.usage); 303 stream.close(); 304 305 await initTestOrigin(); 306 307 await checkFiles(/* wantData */ true, /* wantUsage */ true); 308 309 await clearTestOrigin(); 310 311 info( 312 "Stage 10 - " + 313 "valid data.sqlite file exists, " + 314 "any usage-journal exists, " + 315 "invalid (wrong usage) usage file exists" 316 ); 317 318 await createTestOrigin(); 319 320 createEmptyFile(usageJournalFile); 321 stream = getBinaryOutputStream(usageFile); 322 stream.write32(usageFileCookie); 323 stream.write64(data.usage - 1); 324 stream.close(); 325 326 await initTestOrigin(); 327 328 await checkFiles(/* wantData */ true, /* wantUsage */ true); 329 330 await clearTestOrigin(); 331 332 info( 333 "Stage 11 - " + 334 "valid data.sqlite file exists, " + 335 "any usage-journal exists, " + 336 "valid usage file exists" 337 ); 338 339 await createTestOrigin(); 340 341 createEmptyFile(usageJournalFile); 342 343 await initTestOrigin(); 344 345 await checkFiles(/* wantData */ true, /* wantUsage */ true); 346 347 await clearTestOrigin(); 348 349 // Verify that InitializeOrigin doesn't fail when a 350 // storage/permanent/${origin}/ls exists. 351 info( 352 "Stage 12 - Testing initialization of ls directory placed in permanent " + 353 "origin directory" 354 ); 355 356 await createPersistentTestOrigin(); 357 358 createEmptyDirectory(persistentLSDir); 359 360 try { 361 await initPersistentTestOrigin(); 362 363 ok(true, "Should not have thrown"); 364 } catch (ex) { 365 ok(false, "Should not have thrown"); 366 } 367 368 let exists = persistentLSDir.exists(); 369 ok(exists, "ls directory in permanent origin directory does exist"); 370 371 await clearPersistentTestOrigin(); 372 } 373 374 add_task( 375 { 376 pref_set: [["dom.quotaManager.loadQuotaFromCache", false]], 377 }, 378 testSteps 379 );