Bug 1857386 [wpt PR 42383] - Update wpt metadata, a=testonly
[gecko.git] / netwerk / test / unit / test_bug482601.js
blobae4e848dbff5d2d34482c195c2bd31d89abef692
1 "use strict";
3 const { HttpServer } = ChromeUtils.importESModule(
4   "resource://testing-common/httpd.sys.mjs"
5 );
7 var httpserv = null;
8 var test_nr = 0;
9 var observers_called = "";
10 var handlers_called = "";
11 var buffer = "";
13 var observer = {
14   QueryInterface: ChromeUtils.generateQI(["nsIObserver"]),
16   observe(subject, topic, data) {
17     if (observers_called.length) {
18       observers_called += ",";
19     }
21     observers_called += topic;
22   },
25 var listener = {
26   onStartRequest(request) {
27     buffer = "";
28   },
30   onDataAvailable(request, stream, offset, count) {
31     buffer = buffer.concat(read_stream(stream, count));
32   },
34   onStopRequest(request, status) {
35     Assert.equal(status, Cr.NS_OK);
36     Assert.equal(buffer, "0123456789");
37     Assert.equal(observers_called, results[test_nr]);
38     test_nr++;
39     do_timeout(0, do_test);
40   },
43 function run_test() {
44   httpserv = new HttpServer();
45   httpserv.registerPathHandler("/bug482601/nocache", bug482601_nocache);
46   httpserv.registerPathHandler("/bug482601/partial", bug482601_partial);
47   httpserv.registerPathHandler("/bug482601/cached", bug482601_cached);
48   httpserv.registerPathHandler(
49     "/bug482601/only_from_cache",
50     bug482601_only_from_cache
51   );
52   httpserv.start(-1);
54   var obs = Cc["@mozilla.org/observer-service;1"].getService();
55   obs = obs.QueryInterface(Ci.nsIObserverService);
56   obs.addObserver(observer, "http-on-examine-response");
57   obs.addObserver(observer, "http-on-examine-merged-response");
58   obs.addObserver(observer, "http-on-examine-cached-response");
60   do_timeout(0, do_test);
61   do_test_pending();
64 function do_test() {
65   if (test_nr < tests.length) {
66     tests[test_nr]();
67   } else {
68     Assert.equal(handlers_called, "nocache,partial,cached");
69     httpserv.stop(do_test_finished);
70   }
73 var tests = [test_nocache, test_partial, test_cached, test_only_from_cache];
75 var results = [
76   "http-on-examine-response",
77   "http-on-examine-response,http-on-examine-merged-response",
78   "http-on-examine-response,http-on-examine-merged-response",
79   "http-on-examine-cached-response",
82 function makeChan(url) {
83   return NetUtil.newChannel({
84     uri: url,
85     loadUsingSystemPrincipal: true,
86   }).QueryInterface(Ci.nsIHttpChannel);
89 function storeCache(aCacheEntry, aResponseHeads, aContent) {
90   aCacheEntry.setMetaDataElement("request-method", "GET");
91   aCacheEntry.setMetaDataElement("response-head", aResponseHeads);
92   aCacheEntry.setMetaDataElement("charset", "ISO-8859-1");
94   var oStream = aCacheEntry.openOutputStream(0, aContent.length);
95   var written = oStream.write(aContent, aContent.length);
96   if (written != aContent.length) {
97     do_throw(
98       "oStream.write has not written all data!\n" +
99         "  Expected: " +
100         written +
101         "\n" +
102         "  Actual: " +
103         aContent.length +
104         "\n"
105     );
106   }
107   oStream.close();
108   aCacheEntry.close();
111 function test_nocache() {
112   observers_called = "";
114   var chan = makeChan(
115     "http://localhost:" + httpserv.identity.primaryPort + "/bug482601/nocache"
116   );
117   chan.asyncOpen(listener);
120 function test_partial() {
121   asyncOpenCacheEntry(
122     "http://localhost:" + httpserv.identity.primaryPort + "/bug482601/partial",
123     "disk",
124     Ci.nsICacheStorage.OPEN_NORMALLY,
125     null,
126     test_partial2
127   );
130 function test_partial2(status, entry) {
131   Assert.equal(status, Cr.NS_OK);
132   storeCache(
133     entry,
134     "HTTP/1.1 200 OK\r\n" +
135       "Date: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
136       "Server: httpd.js\r\n" +
137       "Last-Modified: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
138       "Accept-Ranges: bytes\r\n" +
139       "Content-Length: 10\r\n" +
140       "Content-Type: text/plain\r\n",
141     "0123"
142   );
144   observers_called = "";
146   var chan = makeChan(
147     "http://localhost:" + httpserv.identity.primaryPort + "/bug482601/partial"
148   );
149   chan.asyncOpen(listener);
152 function test_cached() {
153   asyncOpenCacheEntry(
154     "http://localhost:" + httpserv.identity.primaryPort + "/bug482601/cached",
155     "disk",
156     Ci.nsICacheStorage.OPEN_NORMALLY,
157     null,
158     test_cached2
159   );
162 function test_cached2(status, entry) {
163   Assert.equal(status, Cr.NS_OK);
164   storeCache(
165     entry,
166     "HTTP/1.1 200 OK\r\n" +
167       "Date: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
168       "Server: httpd.js\r\n" +
169       "Last-Modified: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
170       "Accept-Ranges: bytes\r\n" +
171       "Content-Length: 10\r\n" +
172       "Content-Type: text/plain\r\n",
173     "0123456789"
174   );
176   observers_called = "";
178   var chan = makeChan(
179     "http://localhost:" + httpserv.identity.primaryPort + "/bug482601/cached"
180   );
181   chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS;
182   chan.asyncOpen(listener);
185 function test_only_from_cache() {
186   asyncOpenCacheEntry(
187     "http://localhost:" +
188       httpserv.identity.primaryPort +
189       "/bug482601/only_from_cache",
190     "disk",
191     Ci.nsICacheStorage.OPEN_NORMALLY,
192     null,
193     test_only_from_cache2
194   );
197 function test_only_from_cache2(status, entry) {
198   Assert.equal(status, Cr.NS_OK);
199   storeCache(
200     entry,
201     "HTTP/1.1 200 OK\r\n" +
202       "Date: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
203       "Server: httpd.js\r\n" +
204       "Last-Modified: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
205       "Accept-Ranges: bytes\r\n" +
206       "Content-Length: 10\r\n" +
207       "Content-Type: text/plain\r\n",
208     "0123456789"
209   );
211   observers_called = "";
213   var chan = makeChan(
214     "http://localhost:" +
215       httpserv.identity.primaryPort +
216       "/bug482601/only_from_cache"
217   );
218   chan.loadFlags = Ci.nsICachingChannel.LOAD_ONLY_FROM_CACHE;
219   chan.asyncOpen(listener);
222 // PATHS
224 // /bug482601/nocache
225 function bug482601_nocache(metadata, response) {
226   response.setHeader("Content-Type", "text/plain", false);
227   var body = "0123456789";
228   response.bodyOutputStream.write(body, body.length);
229   handlers_called += "nocache";
232 // /bug482601/partial
233 function bug482601_partial(metadata, response) {
234   Assert.ok(metadata.hasHeader("If-Range"));
235   Assert.equal(metadata.getHeader("If-Range"), "Thu, 1 Jan 2009 00:00:00 GMT");
236   Assert.ok(metadata.hasHeader("Range"));
237   Assert.equal(metadata.getHeader("Range"), "bytes=4-");
239   response.setStatusLine(metadata.httpVersion, 206, "Partial Content");
240   response.setHeader("Content-Range", "bytes 4-9/10", false);
241   response.setHeader("Content-Type", "text/plain", false);
242   response.setHeader("Last-Modified", "Thu, 1 Jan 2009 00:00:00 GMT");
244   var body = "456789";
245   response.bodyOutputStream.write(body, body.length);
246   handlers_called += ",partial";
249 // /bug482601/cached
250 function bug482601_cached(metadata, response) {
251   Assert.ok(metadata.hasHeader("If-Modified-Since"));
252   Assert.equal(
253     metadata.getHeader("If-Modified-Since"),
254     "Thu, 1 Jan 2009 00:00:00 GMT"
255   );
257   response.setStatusLine(metadata.httpVersion, 304, "Not Modified");
258   handlers_called += ",cached";
261 // /bug482601/only_from_cache
262 function bug482601_only_from_cache(metadata, response) {
263   do_throw("This should not be reached");