Bug 460926 A11y hierachy is broken on Ubuntu 8.10 (GNOME 2.24), r=Evan.Yan sr=roc
[wine-gecko.git] / netwerk / test / TestCacheCollisions.js
blobcadcc3ef4c3568682bc1aeef197bd4a0f04aabc5
1 var DEBUG = true;
3 var clientID = "HTTP";
4 var nsICache = Components.interfaces.nsICache;
6 function getEventQueue()
8     var nsIEventQueueService = Components.interfaces.nsIEventQueueService;
9     var CID = Components.classes["@mozilla.org/event-queue-service;1"];
10     var service = CID.getService(nsIEventQueueService);
11     return service.getSpecialEventQueue(nsIEventQueueService.CURRENT_THREAD_EVENT_QUEUE);
14 var eventQueue = getEventQueue();
16 function getCacheService()
18     var nsCacheService = Components.classes["@mozilla.org/network/cache-service;1"];
19     var service = nsCacheService.getService(Components.interfaces.nsICacheService);
20     return service;
23 function createCacheSession(clientID, storagePolicy, streamable)
25     var service = getCacheService();
26     var session = service.createSession(clientID, storagePolicy, streamable);
27     return session;
30 function openCacheEntry(url, mode)
32     var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true);
33     var entry = session.openCacheEntry(url, mode);
34     return entry;
37 function dumpLeaks()
39     var leakDetector = Components.classes["@mozilla.org/xpcom/leakdetector;1"].getService(Components.interfaces.nsILeakDetector);
40     leakDetector.dumpLeaks();
43 function wrapInputStream(input)
45     var nsIScriptableInputStream = Components.interfaces.nsIScriptableInputStream;
46     var factory = Components.classes["@mozilla.org/scriptableinputstream;1"];
47     var wrapper = factory.createInstance(nsIScriptableInputStream);
48     wrapper.init(input);
49     return wrapper;
52 function download(key)
54     var url = new java.net.URL(key);
55     var data = "";
56     var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 65536);
57     var stream = url.openStream();
58     while (true) {
59         var count = stream.read(buffer);
60         if (count <= 0)
61             break;
62         var str = new java.lang.String(buffer, 0, count);
63         data += str;
64     }
65     stream.close();
66     return data;
69 function write(url, data)
71     var key = url.toString();
72     var outputEntry = openCacheEntry(key, nsICache.ACCESS_WRITE);
73     var output = outputEntry.transport.openOutputStream(0, -1, 0);
74     var count = output.write(data, data.length);
76     // store some metadata.
77     outputEntry.setMetaDataElement("size", data.length);
79     output.close();
80     outputEntry.markValid();
81     outputEntry.close();
83     return count;
86 function CacheListener()
88     this.done = false;
91 CacheListener.prototype = {
92     QueryInterface : function(iid)
93     {
94         if (iid.equals(Components.interfaces.nsICacheListener))
95             return this;
96         throw Components.results.NS_NOINTERFACE;
97     },
99     onCacheEntryAvailable : function(/* in nsICacheEntryDescriptor */   descriptor,
100                                      /* in nsCacheAccessMode */         accessGranted,
101                                      /* in nsresult */                  status)
102     {
103         this.descriptor = descriptor;
104         this.status = status;
105         this.done = true;
106     }
109 function asyncOpenCacheEntry(url, mode)
111     var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true);
112     var listener = new CacheListener();
113     session.asyncOpenCacheEntry(url, mode, listener);
114     while (!listener.done)
115         eventQueue.processPendingEvents();
116     return listener.descriptor;
119 function asyncWrite(key, data)
121     var outputEntry = asyncOpenCacheEntry(key, nsICache.ACCESS_WRITE);
122     
123     var output = outputEntry.transport.openOutputStream(0, -1, 0);
124     var count = output.write(data, data.length);
126     // store some metadata.
127     outputEntry.setMetaDataElement("size", data.length);
129     output.close();
130     outputEntry.markValid();
131     outputEntry.close();
133     return count;
136 function StreamListener()
138     this.done = false;
139     this.data = "";
140     this.wrapper = null;
143 StreamListener.prototype = {
144     QueryInterface : function(iid)
145     {
146         if (iid.equals(Components.interfaces.nsIStreamListener) ||
147             iid.equals(Components.interfaces.nsIStreamObserver))
148             return this;
149         throw Components.results.NS_NOINTERFACE;
150     },
151     
152     onStartRequest : function(request, context)
153     {
154     },
155     
156     onStopRequest : function(request, context, statusCode, statusText)
157     {
158         this.statusCode = statusCode;
159         this.done = true;
160     },
161     
162     onDataAvailable : function(request, context, input, offset, count)
163     {
164         if (this.wrapper == null)
165             this.wrapper = wrapInputStream(input);
166         input = this.wrapper;
167         this.data += input.read(count);
168     }
171 function asyncRead(key)
173     var inputEntry = asyncOpenCacheEntry(key, nsICache.ACCESS_READ);
174     var listener = new StreamListener();
175     inputEntry.transport.asyncRead(listener, null, 0, inputEntry.dataSize, 0);
176     while (!listener.done)
177         eventQueue.processPendingEvents();
178     inputEntry.close();
179     return listener.data;
182 function read(key)
184     var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ);
185     var input = wrapInputStream(inputEntry.transport.openInputStream(0, -1, 0));
186     var data = input.read(input.available());
187     input.close();
188     inputEntry.close();
189     return data;
192 function readMetaData(key, element)
194     var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ);
195     var metadata = inputEntry.getMetaDataElement(element);
196     inputEntry.close();
197     return metadata;
200 function doom(url)
202     var key = url.toString();
203     var doomedEntry = openCacheEntry(key, nsICache.ACCESS_READ_WRITE);
204     doomedEntry.doom();
205     doomedEntry.close();
208 // two keys which are known to collide right now.
209 var key1 = "http://a772.g.akamai.net/7/772/51/7648437e551b56/www.apple.com/t/2001/us/en/i/2.gif";
210 var key2 = "http://a772.g.akamai.net/7/772/51/70601300d0bde6/www.apple.com/t/2001/us/en/i/1right.gif";
212 function test()
214     // 1. generate a collision, and close the colliding entry first.
215     var entry1 = asyncOpenCacheEntry(key1, nsICache.ACCESS_READ_WRITE);
216     var data1 = key1;
217     entry1.setMetaDataElement("size", data1.length);
218     entry1.markValid();
219     var output1 = entry1.transport.openOutputStream(0, -1, 0);
220     output1.write(data1, data1.length);
221     
222     var entry2 = asyncOpenCacheEntry(key2, nsICache.ACCESS_READ_WRITE);
223     var data2 = key2;
224     entry2.setMetaDataElement("size", data2.length);
225     entry2.markValid();
226     var output2 = entry2.transport.openOutputStream(0, -1, 0);
227     output2.write(data2, data2.length);
229     output1.close();
230     output2.close();
231     
232     entry1.close();
233     entry2.close();
236 function median(array)
238     var cmp = function(x, y) { return x - y; }
239     array.sort(cmp);
240     var middle = Math.floor(array.length / 2);
241     return array[middle];
244 function sum(array)
246     var s = 0;
247     var len = array.length;
248     for (var i = 0; i < len; ++i)
249         s += array[i];
250     return s;
253 function time()
255     var N = 50;
256     var System = java.lang.System;
257     var url = new java.net.URL("http://www.mozilla.org");
258     var key = url.toString();
259     var downloadTimes = new Array();
260     for (var i = 0; i < N; ++i) {
261         var begin = System.currentTimeMillis();
262         download(url);
263         var end = System.currentTimeMillis();
264         downloadTimes.push(end - begin);
265     }
266     var downloadTotal = sum(downloadTimes);
267     var downloadMean = downloadTotal / N;
268     var downloadMedian = median(downloadTimes);
269     print("" + N + " downloads took " + downloadTotal + " milliseconds.");
270     print("mean = " + downloadMean + " milliseconds.");
271     print("median = " + downloadMedian + " milliseconds.");
273     var readTimes = new Array();
274     for (var i = 0; i < N; ++i) {
275         var begin = System.currentTimeMillis();
276         asyncRead(key);
277         var end = System.currentTimeMillis();
278         readTimes.push(end - begin);
279     }
280     var readTotal = sum(readTimes);
281     var readMean = readTotal / N;
282     var readMedian = median(readTimes);
283     print("" + N + " reads took " + readTotal + " milliseconds.");
284     print("mean = " + readMean + " milliseconds.");
285     print("median = " + readMedian + " milliseconds.");
288 // load the cache service before doing anything with Java...
289 getCacheService();
291 if (DEBUG) {
292     print("cache service loaded.");
293 } else {
294     print("running disk cache test.");
295     test();
296     print("disk cache test complete.");