tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }