|
1 var DEBUG = true; |
|
2 |
|
3 var clientID = "javascript"; |
|
4 var nsICache = Components.interfaces.nsICache; |
|
5 |
|
6 function getCacheService() |
|
7 { |
|
8 var nsCacheService = Components.classes["@mozilla.org/network/cache-service;1"]; |
|
9 var service = nsCacheService.getService(Components.interfaces.nsICacheService); |
|
10 return service; |
|
11 } |
|
12 |
|
13 function createCacheSession(clientID, storagePolicy, streamable) |
|
14 { |
|
15 var service = getCacheService(); |
|
16 var session = service.createSession(clientID, storagePolicy, streamable); |
|
17 return session; |
|
18 } |
|
19 |
|
20 function openCacheEntry(url, mode) |
|
21 { |
|
22 var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true); |
|
23 var entry = session.openCacheEntry(url, mode); |
|
24 return entry; |
|
25 } |
|
26 |
|
27 function wrapInputStream(input) |
|
28 { |
|
29 var nsIScriptableInputStream = Components.interfaces.nsIScriptableInputStream; |
|
30 var factory = Components.classes["@mozilla.org/scriptableinputstream;1"]; |
|
31 var wrapper = factory.createInstance(nsIScriptableInputStream); |
|
32 wrapper.init(input); |
|
33 return wrapper; |
|
34 } |
|
35 |
|
36 function getIOService() |
|
37 { |
|
38 var CID = Components.classes["@mozilla.org/network/io-service;1"]; |
|
39 var service = CID.getService(Components.interfaces.nsIIOService); |
|
40 return service; |
|
41 } |
|
42 |
|
43 function downloadHTTP(spec) |
|
44 { |
|
45 var ioService = getIOService(); |
|
46 var uri = ioService.newURI(spec, null, null); |
|
47 var channel = ioService.newChannelFromURI(uri); |
|
48 var input = wrapInputStream(channel.open()); |
|
49 var data = input.read(input.available()); |
|
50 input.close(); |
|
51 return data; |
|
52 } |
|
53 |
|
54 function download(url) |
|
55 { |
|
56 var data = ""; |
|
57 var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 65536); |
|
58 var stream = url.getContent(); |
|
59 while (true) { |
|
60 var count = stream.read(buffer); |
|
61 if (count <= 0) |
|
62 break; |
|
63 var str = new java.lang.String(buffer, 0, count); |
|
64 data += str; |
|
65 } |
|
66 stream.close(); |
|
67 return data; |
|
68 } |
|
69 |
|
70 function write(url, data) |
|
71 { |
|
72 var key = url.toString(); |
|
73 var outputEntry = openCacheEntry(key, nsICache.ACCESS_WRITE); |
|
74 var output = outputEntry.transport.openOutputStream(0, -1, 0); |
|
75 var count = output.write(data, data.length); |
|
76 |
|
77 // store some metadata. |
|
78 outputEntry.setMetaDataElement("size", data.length); |
|
79 |
|
80 output.close(); |
|
81 outputEntry.markValid(); |
|
82 outputEntry.close(); |
|
83 |
|
84 return count; |
|
85 } |
|
86 |
|
87 function read(url) |
|
88 { |
|
89 var key = url.toString(); |
|
90 var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ); |
|
91 var input = wrapInputStream(inputEntry.transport.openInputStream(0, -1, 0)); |
|
92 var data = input.read(input.available()); |
|
93 input.close(); |
|
94 inputEntry.close(); |
|
95 return data; |
|
96 } |
|
97 |
|
98 function readMetaData(url, element) |
|
99 { |
|
100 var key = url.toString(); |
|
101 var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ); |
|
102 var metadata = inputEntry.getMetaDataElement(element); |
|
103 inputEntry.close(); |
|
104 return metadata; |
|
105 } |
|
106 |
|
107 function doom(url) |
|
108 { |
|
109 var key = url.toString(); |
|
110 var doomedEntry = openCacheEntry(key, nsICache.ACCESS_READ_WRITE); |
|
111 doomedEntry.doom(); |
|
112 doomedEntry.close(); |
|
113 } |
|
114 |
|
115 function test() |
|
116 { |
|
117 // download some real content from the network. |
|
118 var url = new java.net.URL("http://www.mozilla.org"); |
|
119 var key = url.toString(); |
|
120 var data = download(url); |
|
121 |
|
122 if (write(url, data) == data.length) |
|
123 print("disk cache write works!"); |
|
124 else |
|
125 print("disk cache write broken!"); |
|
126 |
|
127 if (read(url) == data) |
|
128 print("disk cache read works!"); |
|
129 else |
|
130 print("disk cache read broken!"); |
|
131 |
|
132 if (readMetaData(url, "size") == data.length) |
|
133 print("disk cache metadata works!"); |
|
134 else |
|
135 print("disk cache metadata broken!"); |
|
136 } |
|
137 |
|
138 function median(array) |
|
139 { |
|
140 var cmp = function(x, y) { return x - y; } |
|
141 array.sort(cmp); |
|
142 var middle = Math.floor(array.length / 2); |
|
143 return array[middle]; |
|
144 } |
|
145 |
|
146 function sum(array) |
|
147 { |
|
148 var s = 0; |
|
149 var len = array.length; |
|
150 for (var i = 0; i < len; ++i) |
|
151 s += array[i]; |
|
152 return s; |
|
153 } |
|
154 |
|
155 function time() |
|
156 { |
|
157 var N = 50; |
|
158 var System = java.lang.System; |
|
159 var url = new java.net.URL("http://www.mozilla.org"); |
|
160 var downloadTimes = new Array(); |
|
161 for (var i = 0; i < N; ++i) { |
|
162 var begin = System.currentTimeMillis(); |
|
163 download(url); |
|
164 var end = System.currentTimeMillis(); |
|
165 downloadTimes.push(end - begin); |
|
166 } |
|
167 var downloadTotal = sum(downloadTimes); |
|
168 var downloadMean = downloadTotal / N; |
|
169 var downloadMedian = median(downloadTimes); |
|
170 print("" + N + " downloads took " + downloadTotal + " milliseconds."); |
|
171 print("mean = " + downloadMean + " milliseconds."); |
|
172 print("median = " + downloadMedian + " milliseconds."); |
|
173 |
|
174 var readTimes = new Array(); |
|
175 for (var i = 0; i < N; ++i) { |
|
176 var begin = System.currentTimeMillis(); |
|
177 read(url); |
|
178 var end = System.currentTimeMillis(); |
|
179 readTimes.push(end - begin); |
|
180 } |
|
181 var readTotal = sum(readTimes); |
|
182 var readMean = readTotal / N; |
|
183 var readMedian = median(readTimes); |
|
184 print("" + N + " reads took " + readTotal + " milliseconds."); |
|
185 print("mean = " + readMean + " milliseconds."); |
|
186 print("median = " + readMedian + " milliseconds."); |
|
187 } |
|
188 |
|
189 // load the cache service before doing anything with Java... |
|
190 getCacheService(); |
|
191 |
|
192 if (DEBUG) { |
|
193 print("cache service loaded."); |
|
194 } else { |
|
195 print("running disk cache test."); |
|
196 test(); |
|
197 print("disk cache test complete."); |
|
198 } |