tor-browser

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

test_originInit.js (6943B)


      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  // ToDo: Replace storage and default with a getter function once we expose the
      8  // filenames of them to a IDL file.
      9  const basePath = `${storageDirName}/${defaultPersistenceDirName}/`;
     10  const principal = getPrincipal("https://example.com");
     11  const originDirName = "https+++example.com";
     12 
     13  // ToDo: Replace caches.sqlite with a getter function once we expose the
     14  // filename of it to a IDL file.
     15  const cachesDatabase = getRelativeFile(
     16    `${basePath}/${originDirName}/${cacheClientDirName()}/caches.sqlite`
     17  );
     18  // ToDo: Replace .padding with a getter function once we expose the filename
     19  // of it to a IDL file.
     20  const paddingFile = getRelativeFile(
     21    `${basePath}/${originDirName}/${cacheClientDirName()}/.padding`
     22  );
     23  // ToDo: Replace .padding-tmp with a getter function once we expose the
     24  // filename of it to a IDL file.
     25  const paddingTempFile = getRelativeFile(
     26    `${basePath}/${originDirName}/${cacheClientDirName()}/.padding-tmp`
     27  );
     28  // ToDo: Replace morgue with a getter function once we expose the
     29  // filename of it to a IDL file.
     30  const morgueDir = getRelativeFile(
     31    `${basePath}/${originDirName}/${cacheClientDirName()}/morgue`
     32  );
     33 
     34  const persistentCacheDir = getRelativeFile(
     35    `${storageDirName}/${persistentPersistenceDirName}/${originDirName}/` +
     36      `${cacheClientDirName()}`
     37  );
     38 
     39  async function createNormalCacheOrigin() {
     40    async function sandboxScript() {
     41      const cache = await caches.open("myCache");
     42      const request = new Request("https://example.com/index.html");
     43      const response = new Response("hello world");
     44      await cache.put(request, response);
     45    }
     46 
     47    const sandbox = new Cu.Sandbox(principal, {
     48      wantGlobalProperties: ["caches", "fetch"],
     49    });
     50 
     51    const promise = new Promise(function (resolve, reject) {
     52      sandbox.resolve = resolve;
     53      sandbox.reject = reject;
     54    });
     55 
     56    Cu.evalInSandbox(
     57      sandboxScript.toSource() + " sandboxScript().then(resolve, reject);",
     58      sandbox
     59    );
     60    await promise;
     61 
     62    let request = reset();
     63    await requestFinished(request);
     64  }
     65 
     66  async function createPersistentTestOrigin() {
     67    let database = getSimpleDatabase(principal, "persistent");
     68 
     69    let request = database.open("data");
     70    await requestFinished(request);
     71 
     72    request = reset();
     73    await requestFinished(request);
     74  }
     75 
     76  function removeFile(file) {
     77    file.remove(false);
     78  }
     79 
     80  function removeDir(dir) {
     81    dir.remove(true);
     82  }
     83 
     84  function createEmptyFile(file) {
     85    file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o644);
     86  }
     87 
     88  function createEmptyDirectory(dir) {
     89    dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o0755);
     90  }
     91 
     92  async function initTestOrigin() {
     93    let request = initStorage();
     94    await requestFinished(request);
     95 
     96    request = initTemporaryStorage();
     97    await requestFinished(request);
     98 
     99    request = initTemporaryOrigin(principal);
    100    await requestFinished(request);
    101  }
    102 
    103  async function initPersistentTestOrigin() {
    104    let request = initStorage();
    105    await requestFinished(request);
    106 
    107    request = initPersistentOrigin(principal);
    108    await requestFinished(request);
    109  }
    110 
    111  function checkFiles(
    112    expectCachesDatabase,
    113    expectPaddingFile,
    114    expectTempPaddingFile,
    115    expectMorgueDir
    116  ) {
    117    let exists = cachesDatabase.exists();
    118    if (expectCachesDatabase) {
    119      ok(exists, "caches.sqlite does exist");
    120    } else {
    121      ok(!exists, "caches.sqlite doesn't exist");
    122    }
    123 
    124    exists = paddingFile.exists();
    125    if (expectPaddingFile) {
    126      ok(exists, ".padding does exist");
    127    } else {
    128      ok(!exists, ".padding doesn't exist");
    129    }
    130 
    131    exists = paddingTempFile.exists();
    132    if (expectTempPaddingFile) {
    133      ok(exists, ".padding-tmp does exist");
    134    } else {
    135      ok(!exists, ".padding-tmp doesn't exist");
    136    }
    137 
    138    exists = morgueDir.exists();
    139    if (expectMorgueDir) {
    140      ok(exists, "morgue does exist");
    141    } else {
    142      ok(!exists, "moruge doesn't exist");
    143    }
    144  }
    145 
    146  async function clearTestOrigin() {
    147    let request = clearOrigin(principal, defaultPersistence);
    148    await requestFinished(request);
    149  }
    150 
    151  async function clearPersistentTestOrigin() {
    152    let request = clearOrigin(principal, persistentPersistence);
    153    await requestFinished(request);
    154  }
    155 
    156  async function testOriginInit(
    157    createCachesDatabase,
    158    createPaddingFile,
    159    createTempPaddingFile,
    160    createMorgueDir
    161  ) {
    162    info(
    163      `Testing initialization of cache directory when caches.sqlite ` +
    164        `${createCachesDatabase ? "exists" : "doesn't exist"}, .padding ` +
    165        `${createPaddingFile ? "exists" : "doesn't exist"}, .padding-tmp ` +
    166        `${createTempPaddingFile ? "exists" : "doesn't exist"}, morgue ` +
    167        `${createMorgueDir ? "exists" : "doesn't exist"}`
    168    );
    169 
    170    await createNormalCacheOrigin();
    171 
    172    checkFiles(true, true, false, true);
    173 
    174    if (!createCachesDatabase) {
    175      removeFile(cachesDatabase);
    176    }
    177 
    178    if (!createPaddingFile) {
    179      removeFile(paddingFile);
    180    }
    181 
    182    if (createTempPaddingFile) {
    183      createEmptyFile(paddingTempFile);
    184    }
    185 
    186    if (!createMorgueDir) {
    187      removeDir(morgueDir);
    188    }
    189 
    190    await initTestOrigin();
    191 
    192    checkFiles(
    193      createCachesDatabase,
    194      // After the origin is initialized, ".padding" should only exist when
    195      // "caches.sqlite" exists.
    196      createCachesDatabase,
    197      // After the origin is initialized, ".padding-tmp" should have always been
    198      // removed.
    199      false,
    200      createCachesDatabase && createMorgueDir
    201    );
    202 
    203    await clearTestOrigin();
    204  }
    205 
    206  // Test all possible combinations.
    207  for (let createCachesDatabase of [false, true]) {
    208    for (let createPaddingFile of [false, true]) {
    209      for (let createTempPaddingFile of [false, true]) {
    210        for (let createMorgueDir of [false, true]) {
    211          await testOriginInit(
    212            createCachesDatabase,
    213            createPaddingFile,
    214            createTempPaddingFile,
    215            createMorgueDir
    216          );
    217        }
    218      }
    219    }
    220  }
    221 
    222  // Verify that InitializeOrigin doesn't fail when a
    223  // storage/permanent/${origin}/cache exists.
    224  async function testPermanentCacheDir() {
    225    info(
    226      "Testing initialization of cache directory placed in permanent origin " +
    227        "directory"
    228    );
    229 
    230    await createPersistentTestOrigin();
    231 
    232    createEmptyDirectory(persistentCacheDir);
    233 
    234    try {
    235      await initPersistentTestOrigin();
    236 
    237      ok(true, "Should not have thrown");
    238    } catch (ex) {
    239      ok(false, "Should not have thrown");
    240    }
    241 
    242    let exists = persistentCacheDir.exists();
    243    ok(exists, "cache directory in permanent origin directory does exist");
    244 
    245    await clearPersistentTestOrigin();
    246  }
    247 
    248  await testPermanentCacheDir();
    249 }
    250 
    251 add_task(
    252  {
    253    pref_set: [["dom.quotaManager.loadQuotaFromCache", false]],
    254  },
    255  testSteps
    256 );