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>