netwerk/test/TestAsyncCache.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 var DEBUG = true;
michael@0 2
michael@0 3 var clientID = "javascript";
michael@0 4 var nsICache = Components.interfaces.nsICache;
michael@0 5
michael@0 6 function getEventQueue()
michael@0 7 {
michael@0 8 var nsIEventQueueService = Components.interfaces.nsIEventQueueService;
michael@0 9 var CID = Components.classes["@mozilla.org/event-queue-service;1"];
michael@0 10 var service = CID.getService(nsIEventQueueService);
michael@0 11 return service.getSpecialEventQueue(nsIEventQueueService.CURRENT_THREAD_EVENT_QUEUE);
michael@0 12 }
michael@0 13
michael@0 14 var eventQueue = getEventQueue();
michael@0 15
michael@0 16 function getCacheService()
michael@0 17 {
michael@0 18 var nsCacheService = Components.classes["@mozilla.org/network/cache-service;1"];
michael@0 19 var service = nsCacheService.getService(Components.interfaces.nsICacheService);
michael@0 20 return service;
michael@0 21 }
michael@0 22
michael@0 23 function createCacheSession(clientID, storagePolicy, streamable)
michael@0 24 {
michael@0 25 var service = getCacheService();
michael@0 26 var session = service.createSession(clientID, storagePolicy, streamable);
michael@0 27 return session;
michael@0 28 }
michael@0 29
michael@0 30 function openCacheEntry(url, mode)
michael@0 31 {
michael@0 32 var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true);
michael@0 33 var entry = session.openCacheEntry(url, mode);
michael@0 34 return entry;
michael@0 35 }
michael@0 36
michael@0 37 function wrapInputStream(input)
michael@0 38 {
michael@0 39 var nsIScriptableInputStream = Components.interfaces.nsIScriptableInputStream;
michael@0 40 var factory = Components.classes["@mozilla.org/scriptableinputstream;1"];
michael@0 41 var wrapper = factory.createInstance(nsIScriptableInputStream);
michael@0 42 wrapper.init(input);
michael@0 43 return wrapper;
michael@0 44 }
michael@0 45
michael@0 46 function download(url)
michael@0 47 {
michael@0 48 var data = "";
michael@0 49 var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 65536);
michael@0 50 var stream = url.getContent();
michael@0 51 while (true) {
michael@0 52 var count = stream.read(buffer);
michael@0 53 if (count <= 0)
michael@0 54 break;
michael@0 55 var str = new java.lang.String(buffer, 0, count);
michael@0 56 data += str;
michael@0 57 }
michael@0 58 stream.close();
michael@0 59 return data;
michael@0 60 }
michael@0 61
michael@0 62 function write(url, data)
michael@0 63 {
michael@0 64 var key = url.toString();
michael@0 65 var outputEntry = openCacheEntry(key, nsICache.ACCESS_WRITE);
michael@0 66 var output = outputEntry.transport.openOutputStream(0, -1, 0);
michael@0 67 var count = output.write(data, data.length);
michael@0 68
michael@0 69 // store some metadata.
michael@0 70 outputEntry.setMetaDataElement("size", data.length);
michael@0 71
michael@0 72 output.close();
michael@0 73 outputEntry.markValid();
michael@0 74 outputEntry.close();
michael@0 75
michael@0 76 return count;
michael@0 77 }
michael@0 78
michael@0 79 function CacheListener()
michael@0 80 {
michael@0 81 this.done = false;
michael@0 82 }
michael@0 83
michael@0 84 CacheListener.prototype = {
michael@0 85 QueryInterface : function(iid)
michael@0 86 {
michael@0 87 if (iid.equals(Components.interfaces.nsICacheListener))
michael@0 88 return this;
michael@0 89 throw Components.results.NS_NOINTERFACE;
michael@0 90 },
michael@0 91
michael@0 92 onCacheEntryAvailable : function(/* in nsICacheEntryDescriptor */ descriptor,
michael@0 93 /* in nsCacheAccessMode */ accessGranted,
michael@0 94 /* in nsresult */ status)
michael@0 95 {
michael@0 96 this.descriptor = descriptor;
michael@0 97 this.status = status;
michael@0 98 this.done = true;
michael@0 99 }
michael@0 100 };
michael@0 101
michael@0 102 function asyncOpenCacheEntry(url, mode)
michael@0 103 {
michael@0 104 var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true);
michael@0 105 var listener = new CacheListener();
michael@0 106 session.asyncOpenCacheEntry(url, mode, listener);
michael@0 107 while (!listener.done)
michael@0 108 eventQueue.processPendingEvents();
michael@0 109 return listener.descriptor;
michael@0 110 }
michael@0 111
michael@0 112 function asyncWrite(key, data)
michael@0 113 {
michael@0 114 var outputEntry = asyncOpenCacheEntry(key, nsICache.ACCESS_WRITE);
michael@0 115
michael@0 116 var output = outputEntry.transport.openOutputStream(0, -1, 0);
michael@0 117 var count = output.write(data, data.length);
michael@0 118
michael@0 119 // store some metadata.
michael@0 120 outputEntry.setMetaDataElement("size", data.length);
michael@0 121
michael@0 122 output.close();
michael@0 123 outputEntry.markValid();
michael@0 124 outputEntry.close();
michael@0 125
michael@0 126 return count;
michael@0 127 }
michael@0 128
michael@0 129 function StreamListener()
michael@0 130 {
michael@0 131 this.done = false;
michael@0 132 this.data = "";
michael@0 133 this.wrapper = null;
michael@0 134 }
michael@0 135
michael@0 136 StreamListener.prototype = {
michael@0 137 QueryInterface : function(iid)
michael@0 138 {
michael@0 139 if (iid.equals(Components.interfaces.nsIStreamListener) ||
michael@0 140 iid.equals(Components.interfaces.nsIStreamObserver))
michael@0 141 return this;
michael@0 142 throw Components.results.NS_NOINTERFACE;
michael@0 143 },
michael@0 144
michael@0 145 onStartRequest : function(request, context)
michael@0 146 {
michael@0 147 },
michael@0 148
michael@0 149 onStopRequest : function(request, context, statusCode, statusText)
michael@0 150 {
michael@0 151 this.statusCode = statusCode;
michael@0 152 this.done = true;
michael@0 153 },
michael@0 154
michael@0 155 onDataAvailable : function(request, context, input, offset, count)
michael@0 156 {
michael@0 157 if (this.wrapper == null)
michael@0 158 this.wrapper = wrapInputStream(input);
michael@0 159 input = this.wrapper;
michael@0 160 this.data += input.read(count);
michael@0 161 }
michael@0 162 };
michael@0 163
michael@0 164 function asyncRead(key)
michael@0 165 {
michael@0 166 var inputEntry = asyncOpenCacheEntry(key, nsICache.ACCESS_READ);
michael@0 167 var listener = new StreamListener();
michael@0 168 inputEntry.transport.asyncRead(listener, null, 0, inputEntry.dataSize, 0);
michael@0 169 while (!listener.done)
michael@0 170 eventQueue.processPendingEvents();
michael@0 171 inputEntry.close();
michael@0 172 return listener.data;
michael@0 173 }
michael@0 174
michael@0 175 function read(key)
michael@0 176 {
michael@0 177 var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ);
michael@0 178 var input = wrapInputStream(inputEntry.transport.openInputStream(0, -1, 0));
michael@0 179 var data = input.read(input.available());
michael@0 180 input.close();
michael@0 181 inputEntry.close();
michael@0 182 return data;
michael@0 183 }
michael@0 184
michael@0 185 function readMetaData(key, element)
michael@0 186 {
michael@0 187 var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ);
michael@0 188 var metadata = inputEntry.getMetaDataElement(element);
michael@0 189 inputEntry.close();
michael@0 190 return metadata;
michael@0 191 }
michael@0 192
michael@0 193 function doom(url)
michael@0 194 {
michael@0 195 var key = url.toString();
michael@0 196 var doomedEntry = openCacheEntry(key, nsICache.ACCESS_READ_WRITE);
michael@0 197 doomedEntry.doom();
michael@0 198 doomedEntry.close();
michael@0 199 }
michael@0 200
michael@0 201 function test()
michael@0 202 {
michael@0 203 // download some real content from the network.
michael@0 204 var url = new java.net.URL("http://www.mozilla.org");
michael@0 205 var key = url.toString();
michael@0 206 var data = download(url);
michael@0 207
michael@0 208 if (asyncWrite(key, data) == data.length)
michael@0 209 print("disk cache write works!");
michael@0 210 else
michael@0 211 print("disk cache write broken!");
michael@0 212
michael@0 213 if (asyncRead(key) == data)
michael@0 214 print("disk cache read works!");
michael@0 215 else
michael@0 216 print("disk cache read broken!");
michael@0 217
michael@0 218 if (readMetaData(key, "size") == data.length)
michael@0 219 print("disk cache metadata works!");
michael@0 220 else
michael@0 221 print("disk cache metadata broken!");
michael@0 222 }
michael@0 223
michael@0 224 function median(array)
michael@0 225 {
michael@0 226 var cmp = function(x, y) { return x - y; }
michael@0 227 array.sort(cmp);
michael@0 228 var middle = Math.floor(array.length / 2);
michael@0 229 return array[middle];
michael@0 230 }
michael@0 231
michael@0 232 function sum(array)
michael@0 233 {
michael@0 234 var s = 0;
michael@0 235 var len = array.length;
michael@0 236 for (var i = 0; i < len; ++i)
michael@0 237 s += array[i];
michael@0 238 return s;
michael@0 239 }
michael@0 240
michael@0 241 function time()
michael@0 242 {
michael@0 243 var N = 50;
michael@0 244 var System = java.lang.System;
michael@0 245 var url = new java.net.URL("http://www.mozilla.org");
michael@0 246 var key = url.toString();
michael@0 247 var downloadTimes = new Array();
michael@0 248 for (var i = 0; i < N; ++i) {
michael@0 249 var begin = System.currentTimeMillis();
michael@0 250 download(url);
michael@0 251 var end = System.currentTimeMillis();
michael@0 252 downloadTimes.push(end - begin);
michael@0 253 }
michael@0 254 var downloadTotal = sum(downloadTimes);
michael@0 255 var downloadMean = downloadTotal / N;
michael@0 256 var downloadMedian = median(downloadTimes);
michael@0 257 print("" + N + " downloads took " + downloadTotal + " milliseconds.");
michael@0 258 print("mean = " + downloadMean + " milliseconds.");
michael@0 259 print("median = " + downloadMedian + " milliseconds.");
michael@0 260
michael@0 261 var readTimes = new Array();
michael@0 262 for (var i = 0; i < N; ++i) {
michael@0 263 var begin = System.currentTimeMillis();
michael@0 264 asyncRead(key);
michael@0 265 var end = System.currentTimeMillis();
michael@0 266 readTimes.push(end - begin);
michael@0 267 }
michael@0 268 var readTotal = sum(readTimes);
michael@0 269 var readMean = readTotal / N;
michael@0 270 var readMedian = median(readTimes);
michael@0 271 print("" + N + " reads took " + readTotal + " milliseconds.");
michael@0 272 print("mean = " + readMean + " milliseconds.");
michael@0 273 print("median = " + readMedian + " milliseconds.");
michael@0 274 }
michael@0 275
michael@0 276 // load the cache service before doing anything with Java...
michael@0 277 getCacheService();
michael@0 278
michael@0 279 if (DEBUG) {
michael@0 280 print("cache service loaded.");
michael@0 281 } else {
michael@0 282 print("running disk cache test.");
michael@0 283 test();
michael@0 284 print("disk cache test complete.");
michael@0 285 }

mercurial