1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/TestAsyncCache.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,285 @@ 1.4 +var DEBUG = true; 1.5 + 1.6 +var clientID = "javascript"; 1.7 +var nsICache = Components.interfaces.nsICache; 1.8 + 1.9 +function getEventQueue() 1.10 +{ 1.11 + var nsIEventQueueService = Components.interfaces.nsIEventQueueService; 1.12 + var CID = Components.classes["@mozilla.org/event-queue-service;1"]; 1.13 + var service = CID.getService(nsIEventQueueService); 1.14 + return service.getSpecialEventQueue(nsIEventQueueService.CURRENT_THREAD_EVENT_QUEUE); 1.15 +} 1.16 + 1.17 +var eventQueue = getEventQueue(); 1.18 + 1.19 +function getCacheService() 1.20 +{ 1.21 + var nsCacheService = Components.classes["@mozilla.org/network/cache-service;1"]; 1.22 + var service = nsCacheService.getService(Components.interfaces.nsICacheService); 1.23 + return service; 1.24 +} 1.25 + 1.26 +function createCacheSession(clientID, storagePolicy, streamable) 1.27 +{ 1.28 + var service = getCacheService(); 1.29 + var session = service.createSession(clientID, storagePolicy, streamable); 1.30 + return session; 1.31 +} 1.32 + 1.33 +function openCacheEntry(url, mode) 1.34 +{ 1.35 + var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true); 1.36 + var entry = session.openCacheEntry(url, mode); 1.37 + return entry; 1.38 +} 1.39 + 1.40 +function wrapInputStream(input) 1.41 +{ 1.42 + var nsIScriptableInputStream = Components.interfaces.nsIScriptableInputStream; 1.43 + var factory = Components.classes["@mozilla.org/scriptableinputstream;1"]; 1.44 + var wrapper = factory.createInstance(nsIScriptableInputStream); 1.45 + wrapper.init(input); 1.46 + return wrapper; 1.47 +} 1.48 + 1.49 +function download(url) 1.50 +{ 1.51 + var data = ""; 1.52 + var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 65536); 1.53 + var stream = url.getContent(); 1.54 + while (true) { 1.55 + var count = stream.read(buffer); 1.56 + if (count <= 0) 1.57 + break; 1.58 + var str = new java.lang.String(buffer, 0, count); 1.59 + data += str; 1.60 + } 1.61 + stream.close(); 1.62 + return data; 1.63 +} 1.64 + 1.65 +function write(url, data) 1.66 +{ 1.67 + var key = url.toString(); 1.68 + var outputEntry = openCacheEntry(key, nsICache.ACCESS_WRITE); 1.69 + var output = outputEntry.transport.openOutputStream(0, -1, 0); 1.70 + var count = output.write(data, data.length); 1.71 + 1.72 + // store some metadata. 1.73 + outputEntry.setMetaDataElement("size", data.length); 1.74 + 1.75 + output.close(); 1.76 + outputEntry.markValid(); 1.77 + outputEntry.close(); 1.78 + 1.79 + return count; 1.80 +} 1.81 + 1.82 +function CacheListener() 1.83 +{ 1.84 + this.done = false; 1.85 +} 1.86 + 1.87 +CacheListener.prototype = { 1.88 + QueryInterface : function(iid) 1.89 + { 1.90 + if (iid.equals(Components.interfaces.nsICacheListener)) 1.91 + return this; 1.92 + throw Components.results.NS_NOINTERFACE; 1.93 + }, 1.94 + 1.95 + onCacheEntryAvailable : function(/* in nsICacheEntryDescriptor */ descriptor, 1.96 + /* in nsCacheAccessMode */ accessGranted, 1.97 + /* in nsresult */ status) 1.98 + { 1.99 + this.descriptor = descriptor; 1.100 + this.status = status; 1.101 + this.done = true; 1.102 + } 1.103 +}; 1.104 + 1.105 +function asyncOpenCacheEntry(url, mode) 1.106 +{ 1.107 + var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true); 1.108 + var listener = new CacheListener(); 1.109 + session.asyncOpenCacheEntry(url, mode, listener); 1.110 + while (!listener.done) 1.111 + eventQueue.processPendingEvents(); 1.112 + return listener.descriptor; 1.113 +} 1.114 + 1.115 +function asyncWrite(key, data) 1.116 +{ 1.117 + var outputEntry = asyncOpenCacheEntry(key, nsICache.ACCESS_WRITE); 1.118 + 1.119 + var output = outputEntry.transport.openOutputStream(0, -1, 0); 1.120 + var count = output.write(data, data.length); 1.121 + 1.122 + // store some metadata. 1.123 + outputEntry.setMetaDataElement("size", data.length); 1.124 + 1.125 + output.close(); 1.126 + outputEntry.markValid(); 1.127 + outputEntry.close(); 1.128 + 1.129 + return count; 1.130 +} 1.131 + 1.132 +function StreamListener() 1.133 +{ 1.134 + this.done = false; 1.135 + this.data = ""; 1.136 + this.wrapper = null; 1.137 +} 1.138 + 1.139 +StreamListener.prototype = { 1.140 + QueryInterface : function(iid) 1.141 + { 1.142 + if (iid.equals(Components.interfaces.nsIStreamListener) || 1.143 + iid.equals(Components.interfaces.nsIStreamObserver)) 1.144 + return this; 1.145 + throw Components.results.NS_NOINTERFACE; 1.146 + }, 1.147 + 1.148 + onStartRequest : function(request, context) 1.149 + { 1.150 + }, 1.151 + 1.152 + onStopRequest : function(request, context, statusCode, statusText) 1.153 + { 1.154 + this.statusCode = statusCode; 1.155 + this.done = true; 1.156 + }, 1.157 + 1.158 + onDataAvailable : function(request, context, input, offset, count) 1.159 + { 1.160 + if (this.wrapper == null) 1.161 + this.wrapper = wrapInputStream(input); 1.162 + input = this.wrapper; 1.163 + this.data += input.read(count); 1.164 + } 1.165 +}; 1.166 + 1.167 +function asyncRead(key) 1.168 +{ 1.169 + var inputEntry = asyncOpenCacheEntry(key, nsICache.ACCESS_READ); 1.170 + var listener = new StreamListener(); 1.171 + inputEntry.transport.asyncRead(listener, null, 0, inputEntry.dataSize, 0); 1.172 + while (!listener.done) 1.173 + eventQueue.processPendingEvents(); 1.174 + inputEntry.close(); 1.175 + return listener.data; 1.176 +} 1.177 + 1.178 +function read(key) 1.179 +{ 1.180 + var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ); 1.181 + var input = wrapInputStream(inputEntry.transport.openInputStream(0, -1, 0)); 1.182 + var data = input.read(input.available()); 1.183 + input.close(); 1.184 + inputEntry.close(); 1.185 + return data; 1.186 +} 1.187 + 1.188 +function readMetaData(key, element) 1.189 +{ 1.190 + var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ); 1.191 + var metadata = inputEntry.getMetaDataElement(element); 1.192 + inputEntry.close(); 1.193 + return metadata; 1.194 +} 1.195 + 1.196 +function doom(url) 1.197 +{ 1.198 + var key = url.toString(); 1.199 + var doomedEntry = openCacheEntry(key, nsICache.ACCESS_READ_WRITE); 1.200 + doomedEntry.doom(); 1.201 + doomedEntry.close(); 1.202 +} 1.203 + 1.204 +function test() 1.205 +{ 1.206 + // download some real content from the network. 1.207 + var url = new java.net.URL("http://www.mozilla.org"); 1.208 + var key = url.toString(); 1.209 + var data = download(url); 1.210 + 1.211 + if (asyncWrite(key, data) == data.length) 1.212 + print("disk cache write works!"); 1.213 + else 1.214 + print("disk cache write broken!"); 1.215 + 1.216 + if (asyncRead(key) == data) 1.217 + print("disk cache read works!"); 1.218 + else 1.219 + print("disk cache read broken!"); 1.220 + 1.221 + if (readMetaData(key, "size") == data.length) 1.222 + print("disk cache metadata works!"); 1.223 + else 1.224 + print("disk cache metadata broken!"); 1.225 +} 1.226 + 1.227 +function median(array) 1.228 +{ 1.229 + var cmp = function(x, y) { return x - y; } 1.230 + array.sort(cmp); 1.231 + var middle = Math.floor(array.length / 2); 1.232 + return array[middle]; 1.233 +} 1.234 + 1.235 +function sum(array) 1.236 +{ 1.237 + var s = 0; 1.238 + var len = array.length; 1.239 + for (var i = 0; i < len; ++i) 1.240 + s += array[i]; 1.241 + return s; 1.242 +} 1.243 + 1.244 +function time() 1.245 +{ 1.246 + var N = 50; 1.247 + var System = java.lang.System; 1.248 + var url = new java.net.URL("http://www.mozilla.org"); 1.249 + var key = url.toString(); 1.250 + var downloadTimes = new Array(); 1.251 + for (var i = 0; i < N; ++i) { 1.252 + var begin = System.currentTimeMillis(); 1.253 + download(url); 1.254 + var end = System.currentTimeMillis(); 1.255 + downloadTimes.push(end - begin); 1.256 + } 1.257 + var downloadTotal = sum(downloadTimes); 1.258 + var downloadMean = downloadTotal / N; 1.259 + var downloadMedian = median(downloadTimes); 1.260 + print("" + N + " downloads took " + downloadTotal + " milliseconds."); 1.261 + print("mean = " + downloadMean + " milliseconds."); 1.262 + print("median = " + downloadMedian + " milliseconds."); 1.263 + 1.264 + var readTimes = new Array(); 1.265 + for (var i = 0; i < N; ++i) { 1.266 + var begin = System.currentTimeMillis(); 1.267 + asyncRead(key); 1.268 + var end = System.currentTimeMillis(); 1.269 + readTimes.push(end - begin); 1.270 + } 1.271 + var readTotal = sum(readTimes); 1.272 + var readMean = readTotal / N; 1.273 + var readMedian = median(readTimes); 1.274 + print("" + N + " reads took " + readTotal + " milliseconds."); 1.275 + print("mean = " + readMean + " milliseconds."); 1.276 + print("median = " + readMedian + " milliseconds."); 1.277 +} 1.278 + 1.279 +// load the cache service before doing anything with Java... 1.280 +getCacheService(); 1.281 + 1.282 +if (DEBUG) { 1.283 + print("cache service loaded."); 1.284 +} else { 1.285 + print("running disk cache test."); 1.286 + test(); 1.287 + print("disk cache test complete."); 1.288 +}