tor-browser

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

test_cache_updateUsage.html (6200B)


      1 <!-- Any copyright is dedicated to the Public Domain.
      2   - http://creativecommons.org/publicdomain/zero/1.0/ -->
      3 <!DOCTYPE HTML>
      4 <html>
      5 <head>
      6  <title>Test Cache update its usage to QuotaManager</title>
      7  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      8  <script type="text/javascript" src="large_url_list.js"></script>
      9  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
     10 </head>
     11 <body>
     12 <script class="testbody" type="text/javascript">
     13 function setupTestIframe() {
     14  return new Promise(function(resolve) {
     15    var iframe = document.createElement("iframe");
     16    iframe.src = "empty.html";
     17    iframe.onload = function() {
     18      window.caches = iframe.contentWindow.caches;
     19      resolve();
     20    };
     21    document.body.appendChild(iframe);
     22  });
     23 }
     24 
     25 function clearStorage() {
     26  return new Promise(function(resolve) {
     27    var qms = SpecialPowers.Services.qms;
     28    var principal = SpecialPowers.wrap(document).nodePrincipal;
     29    var request = qms.clearStoragesForPrincipal(principal);
     30    var cb = SpecialPowers.wrapCallback(resolve);
     31    request.callback = cb;
     32  });
     33 }
     34 
     35 function resetStorage() {
     36  return new Promise(function(resolve) {
     37    var qms = SpecialPowers.Services.qms;
     38    var principal = SpecialPowers.wrap(document).nodePrincipal;
     39    var request = qms.resetStoragesForPrincipal(principal);
     40    var cb = SpecialPowers.wrapCallback(resolve);
     41    request.callback = cb;
     42  });
     43 }
     44 
     45 function getStorageUsage() {
     46  return new Promise(function(resolve) {
     47    var qms = SpecialPowers.Services.qms;
     48    var principal = SpecialPowers.wrap(document).nodePrincipal;
     49    var cb = SpecialPowers.wrapCallback(function(request) {
     50      var result = request.result;
     51      resolve(result.usage);
     52    });
     53    qms.getUsageForPrincipal(principal, cb);
     54  });
     55 }
     56 
     57 function getCachedStorageUsage() {
     58  return new Promise(function(resolve) {
     59    var qms = SpecialPowers.Services.qms;
     60    var principal = SpecialPowers.wrap(document).nodePrincipal;
     61    var cb = SpecialPowers.wrapCallback(function(request) {
     62      var result = request.result;
     63      resolve(result);
     64    });
     65    var request = qms.getCachedUsageForPrincipal(principal);
     66    request.callback = cb;
     67  });
     68 }
     69 
     70 async function verifyUsage() {
     71  // This returns origin usage by calculating it from an in-memory object.
     72  let memoryUsage = await getCachedStorageUsage();
     73  // This returns origin usage by calculating it from file sizes on disk.
     74  let diskUsage = await getStorageUsage();
     75 
     76  is(memoryUsage, diskUsage,
     77     "In-memory usage and disk usage should be the same.");
     78  return memoryUsage;
     79 }
     80 
     81 async function waitForIOToComplete(cache, request) {
     82  info("Wait for IO complete.");
     83  // The following lines ensure we've deleted orphaned body.
     84  // First, wait for cache operation delete the orphaned body.
     85  await cache.match(request);
     86 
     87  // Finally, wait for -wal file finish its job.
     88  return resetStorage();
     89 }
     90 
     91 SimpleTest.waitForExplicitFinish();
     92 SpecialPowers.pushPrefEnv({
     93  "set": [["dom.caches.enabled", true],
     94          ["dom.caches.testing.enabled", true],
     95          ["dom.quotaManager.testing", true]],
     96 }, async function() {
     97  const name = "cacheUpdateUsage";
     98  const url = "test_cache_add.js";
     99  const other_url = "test_cache_put.js";
    100 
    101  // This test mainly ensure DOM Cache updates its usage to QuotaManager when
    102  // executing an operation which creates/deletes files. To do this, we verify
    103  // usage by calling getUsageFromPrincipal twice with different flag(aGroup).
    104  // The reason is we get group usage by collecting in-memory data, and getting
    105  // origin usage by collecting storage usage from files.
    106 
    107  await setupTestIframe();
    108 
    109  info("Stage 1: Clean storage.");
    110  await clearStorage();
    111  await verifyUsage();
    112 
    113  info("Stage 2: Verify CacheStorage.");
    114  info("Stage 2.1: Verify caches.open.");
    115  await caches.open(name);
    116  await verifyUsage();
    117 
    118  info("Stage 2.2: Verify caches.delete.");
    119  var deleted = await caches.delete(name);
    120  ok(deleted, "Cache storage should be deleted");
    121  // Reference from test_cache_orphanced_body.html. It ensures that all
    122  // the runnables have been flushed through the threads.
    123  await caches.has(name);
    124  await resetStorage();
    125  await verifyUsage();
    126 
    127  info("Stage 3: Verify Cache.");
    128  let cache = await caches.open(name);
    129  info("Stage 3.1: Verify cache.addAll.");
    130  await cache.addAll([url, other_url]);
    131  await verifyUsage();
    132  info("Stage 3.1.1: Delete all cached requests.");
    133  await cache.delete(url);
    134  await cache.delete(other_url);
    135  await waitForIOToComplete(cache, other_url);
    136  let emptyUsage1 = await verifyUsage();
    137 
    138  info("Stage 3.2: Verify cache.add.");
    139  cache = await caches.open(name);
    140  await cache.add(url);
    141  await verifyUsage();
    142  info("Stage 3.2.1: Delete cache.");
    143  await cache.delete(url);
    144  await waitForIOToComplete(cache, url);
    145  let emptyUsage2 = await verifyUsage();
    146 
    147  info("Stage 3.3: Verify cache.put.");
    148  cache = await caches.open(name);
    149  let response = await fetch(other_url);
    150  await cache.put(other_url, response);
    151  await verifyUsage();
    152  info("Stage 3.3.1: Delete cache.");
    153  await cache.delete(other_url);
    154  await waitForIOToComplete(cache, other_url);
    155  let emptyUsage3 = await verifyUsage();
    156 
    157  // Adding same requests twice will make Cache create morgue file twice, and
    158  // then delete the previous one.
    159  info("Stage 4: Add same request twice to make removing a morgue file.");
    160  cache = await caches.open(name);
    161  info("Stage 4.1: First cache.add.");
    162  await cache.add(url);
    163  await verifyUsage();
    164 
    165  info("Stage 4.2: Second cache.add.");
    166  await cache.add(url);
    167 
    168  // Since we trigger the action to delete orphaned body, we need to wait for
    169  // the action is done.
    170  await waitForIOToComplete(cache, url);
    171  await verifyUsage();
    172  cache = await caches.open(name);
    173  info("Stage 4.2.1: cache.delete.");
    174  await cache.delete(url);
    175  await waitForIOToComplete(cache, url);
    176  let emptyUsage4 = await verifyUsage();
    177 
    178  info("Stage 5: Clean caches.");
    179  await caches.delete(name);
    180 
    181  info("Stage 6: Final Check.");
    182  ok(emptyUsage1 == emptyUsage2 &&
    183     emptyUsage1 == emptyUsage3 &&
    184     emptyUsage1 == emptyUsage4,
    185     "Empty usages should be the same");
    186 
    187  await SimpleTest.finish();
    188 });
    189 </script>
    190 </body>
    191 </html>