test_upgradeFromPersistentStorageDirectory.js (10451B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 /** 7 * This test is mainly to verify 8 * MaybeUpgradeFromPersistentStorageDirectoryToDefaultStorageDirectory method. 9 */ 10 11 loadScript("dom/quota/test/common/file.js"); 12 13 function* testSteps() { 14 const origins = [ 15 { 16 oldPath: "storage/persistent/1007+f+app+++system.gaiamobile.org", 17 }, 18 19 { 20 oldPath: "storage/persistent/1007+t+https+++developer.cdn.mozilla.net", 21 }, 22 23 { 24 oldPath: "storage/persistent/chrome", 25 newPath: "storage/permanent/chrome", 26 chrome: true, 27 persistence: "persistent", 28 }, 29 30 { 31 oldPath: "storage/persistent/file++++", 32 newPath: "storage/default/file++++", 33 url: "file:///", 34 persistence: "default", 35 }, 36 37 { 38 oldPath: "storage/persistent/file++++++index.html", 39 newPath: "storage/default/file++++++index.html", 40 url: "file:///+/index.html", 41 persistence: "default", 42 }, 43 44 { 45 oldPath: "storage/persistent/file++++++index.html", 46 newPath: "storage/default/file++++++index.html", 47 url: "file://///index.html", 48 persistence: "default", 49 }, 50 51 { 52 oldPath: "storage/persistent/file++++Users+joe+", 53 newPath: "storage/default/file++++Users+joe+", 54 url: "file:///Users/joe/", 55 persistence: "default", 56 }, 57 58 { 59 oldPath: "storage/persistent/file++++Users+joe+c+++index.html", 60 newPath: "storage/default/file++++Users+joe+c+++index.html", 61 url: "file:///Users/joe/c++/index.html", 62 persistence: "default", 63 }, 64 65 { 66 oldPath: "storage/persistent/file++++Users+joe+c+++index.html", 67 newPath: "storage/default/file++++Users+joe+c+++index.html", 68 url: "file:///Users/joe/c///index.html", 69 persistence: "default", 70 }, 71 72 { 73 oldPath: "storage/persistent/file++++Users+joe+index.html", 74 newPath: "storage/default/file++++Users+joe+index.html", 75 url: "file:///Users/joe/index.html", 76 persistence: "default", 77 }, 78 79 { 80 oldPath: "storage/persistent/file++++c++", 81 newPath: "storage/default/file++++c++", 82 url: "file:///c:/", 83 persistence: "default", 84 }, 85 86 { 87 oldPath: "storage/persistent/file++++c++Users+joe+", 88 newPath: "storage/default/file++++c++Users+joe+", 89 url: "file:///c:/Users/joe/", 90 persistence: "default", 91 }, 92 93 { 94 oldPath: "storage/persistent/file++++c++Users+joe+index.html", 95 newPath: "storage/default/file++++c++Users+joe+index.html", 96 url: "file:///c:/Users/joe/index.html", 97 persistence: "default", 98 }, 99 100 { 101 oldPath: "storage/persistent/http+++127.0.0.1", 102 newPath: "storage/default/http+++127.0.0.1", 103 url: "http://127.0.0.1", 104 persistence: "default", 105 }, 106 107 { 108 oldPath: "storage/persistent/http+++localhost", 109 newPath: "storage/default/http+++localhost", 110 url: "http://localhost", 111 persistence: "default", 112 }, 113 114 { 115 oldPath: "storage/persistent/http+++www.mozilla.org", 116 newPath: "storage/default/http+++www.mozilla.org", 117 url: "http://www.mozilla.org", 118 persistence: "default", 119 }, 120 121 { 122 oldPath: "storage/persistent/http+++www.mozilla.org+8080", 123 newPath: "storage/default/http+++www.mozilla.org+8080", 124 url: "http://www.mozilla.org:8080", 125 persistence: "default", 126 }, 127 128 { 129 oldPath: "storage/persistent/https+++www.mozilla.org", 130 newPath: "storage/default/https+++www.mozilla.org", 131 url: "https://www.mozilla.org", 132 persistence: "default", 133 }, 134 135 { 136 oldPath: "storage/persistent/https+++www.mozilla.org+8080", 137 newPath: "storage/default/https+++www.mozilla.org+8080", 138 url: "https://www.mozilla.org:8080", 139 persistence: "default", 140 }, 141 142 { 143 oldPath: "storage/persistent/indexeddb+++fx-devtools", 144 newPath: "storage/permanent/indexeddb+++fx-devtools", 145 url: "indexeddb://fx-devtools", 146 persistence: "persistent", 147 }, 148 149 { 150 oldPath: "storage/persistent/moz-safe-about+++home", 151 }, 152 153 { 154 oldPath: "storage/persistent/moz-safe-about+home", 155 newPath: "storage/permanent/moz-safe-about+home", 156 url: "moz-safe-about:home", 157 persistence: "persistent", 158 }, 159 160 { 161 oldPath: 162 "storage/persistent/resource+++fx-share-addon-at-mozilla-dot-org-fx-share-addon-data", 163 newPath: 164 "storage/permanent/resource+++fx-share-addon-at-mozilla-dot-org-fx-share-addon-data", 165 url: "resource://fx-share-addon-at-mozilla-dot-org-fx-share-addon-data", 166 persistence: "persistent", 167 }, 168 169 { 170 oldPath: "storage/temporary/1007+f+app+++system.gaiamobile.org", 171 }, 172 173 { 174 oldPath: "storage/temporary/1007+t+https+++developer.cdn.mozilla.net", 175 }, 176 177 // The .metadata file was intentionally appended for this origin directory 178 // to test recovery from unfinished upgrades (some metadata files can be 179 // already upgraded). 180 { 181 oldPath: "storage/temporary/chrome", 182 newPath: "storage/temporary/chrome", 183 metadataUpgraded: true, 184 chrome: true, 185 persistence: "temporary", 186 }, 187 188 { 189 oldPath: "storage/temporary/http+++localhost", 190 newPath: "storage/temporary/http+++localhost", 191 url: "http://localhost", 192 persistence: "temporary", 193 }, 194 195 // The .metadata file was intentionally removed for this origin directory 196 // to test restoring during upgrade. 197 { 198 oldPath: "storage/temporary/http+++localhost+81", 199 newPath: "storage/temporary/http+++localhost+81", 200 metadataRemoved: true, 201 url: "http://localhost:81", 202 persistence: "temporary", 203 }, 204 205 // The .metadata file was intentionally truncated for this origin directory 206 // to test restoring during upgrade. 207 { 208 oldPath: "storage/temporary/http+++localhost+82", 209 newPath: "storage/temporary/http+++localhost+82", 210 url: "http://localhost:82", 211 persistence: "temporary", 212 }, 213 ]; 214 215 const metadataFileName = ".metadata"; 216 217 const packages = [ 218 // Storage used by 26-35 (storage/persistent/ directory, tracked only 219 // timestamp in .metadata for persistent storage and isApp not tracked in 220 // .metadata for temporary storage). 221 "persistentStorageDirectory_profile", 222 "../persistentStorageDirectory_shared", 223 ]; 224 225 let metadataBuffers = []; 226 227 clear(continueToNextStepSync); 228 yield undefined; 229 230 info("Verifying storage"); 231 232 verifyStorage(packages, "beforeInstall"); 233 234 info("Installing packages"); 235 236 installPackages(packages); 237 238 info("Verifying storage"); 239 240 verifyStorage(packages, "afterInstall"); 241 242 info("Checking origin directories"); 243 244 for (let origin of origins) { 245 let originDir = getRelativeFile(origin.oldPath); 246 let exists = originDir.exists(); 247 ok(exists, "Origin directory does exist"); 248 249 if (origin.newPath) { 250 info("Reading out contents of metadata file"); 251 252 let metadataFile = originDir.clone(); 253 metadataFile.append(metadataFileName); 254 255 if (origin.metadataRemoved) { 256 metadataBuffers.push(new ArrayBuffer(0)); 257 } else { 258 File.createFromNsIFile(metadataFile).then(grabArgAndContinueHandler); 259 let file = yield undefined; 260 261 let fileReader = new FileReader(); 262 fileReader.onload = continueToNextStepSync; 263 fileReader.readAsArrayBuffer(file); 264 265 yield undefined; 266 267 metadataBuffers.push(fileReader.result); 268 } 269 270 if (origin.newPath != origin.oldPath) { 271 originDir = getRelativeFile(origin.newPath); 272 exists = originDir.exists(); 273 ok(!exists, "Origin directory doesn't exist"); 274 } 275 } 276 } 277 278 info("Initializing"); 279 280 let request = init(continueToNextStepSync); 281 yield undefined; 282 283 Assert.equal(request.resultCode, NS_OK, "Initialization succeeded"); 284 285 info("Verifying storage"); 286 287 verifyStorage(packages, "afterInit"); 288 289 // TODO: Remove this block once temporary storage initialization is able to 290 // ignore unknown directories. 291 getRelativeFile("storage/default/invalid+++example.com").remove(false); 292 getRelativeFile("storage/temporary/invalid+++example.com").remove(false); 293 294 info("Checking origin directories"); 295 296 for (let origin of origins) { 297 if (!origin.newPath || origin.newPath != origin.oldPath) { 298 let originDir = getRelativeFile(origin.oldPath); 299 let exists = originDir.exists(); 300 ok(!exists, "Origin directory doesn't exist"); 301 } 302 303 if (origin.newPath) { 304 let originDir = getRelativeFile(origin.newPath); 305 let exists = originDir.exists(); 306 ok(exists, "Origin directory does exist"); 307 308 info("Reading out contents of metadata file"); 309 310 let metadataFile = originDir.clone(); 311 metadataFile.append(metadataFileName); 312 313 File.createFromNsIFile(metadataFile).then(grabArgAndContinueHandler); 314 let file = yield undefined; 315 316 let fileReader = new FileReader(); 317 fileReader.onload = continueToNextStepSync; 318 fileReader.readAsArrayBuffer(file); 319 320 yield undefined; 321 322 let metadataBuffer = fileReader.result; 323 324 info("Verifying blobs differ"); 325 326 if (origin.metadataUpgraded) { 327 ok( 328 compareBuffers(metadataBuffer, metadataBuffers.shift()), 329 "Metadata doesn't differ" 330 ); 331 } else { 332 ok( 333 !compareBuffers(metadataBuffer, metadataBuffers.shift()), 334 "Metadata differ" 335 ); 336 } 337 } 338 } 339 340 info("Initializing"); 341 342 request = initTemporaryStorage(continueToNextStepSync); 343 yield undefined; 344 345 Assert.equal(request.resultCode, NS_OK, "Initialization succeeded"); 346 347 info("Initializing origins"); 348 349 for (const origin of origins) { 350 if (origin.newPath) { 351 info("Initializing origin"); 352 353 let principal; 354 if (origin.chrome) { 355 principal = getCurrentPrincipal(); 356 } else { 357 principal = getPrincipal(origin.url); 358 } 359 360 if (origin.persistence == "persistent") { 361 request = initPersistentOrigin(principal, continueToNextStepSync); 362 } else { 363 request = initTemporaryOrigin( 364 origin.persistence, 365 principal, 366 /* createIfNonExistent */ true, 367 continueToNextStepSync 368 ); 369 } 370 yield undefined; 371 372 Assert.equal(request.resultCode, NS_OK, "Initialization succeeded"); 373 374 ok(!request.result, "Origin directory wasn't created"); 375 } 376 } 377 378 finishTest(); 379 }