summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_bug482601.js
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/unit/test_bug482601.js')
-rw-r--r--netwerk/test/unit/test_bug482601.js233
1 files changed, 233 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_bug482601.js b/netwerk/test/unit/test_bug482601.js
new file mode 100644
index 000000000..fde70f005
--- /dev/null
+++ b/netwerk/test/unit/test_bug482601.js
@@ -0,0 +1,233 @@
+Cu.import("resource://testing-common/httpd.js");
+Cu.import("resource://gre/modules/NetUtil.jsm");
+
+var httpserv = null;
+var test_nr = 0;
+var observers_called = "";
+var handlers_called = "";
+var buffer = "";
+
+var observer = {
+ QueryInterface: function (aIID) {
+ if (aIID.equals(Ci.nsISupports) ||
+ aIID.equals(Ci.nsIObserver))
+ return this;
+ throw Cr.NS_ERROR_NO_INTERFACE;
+ },
+
+ observe: function(subject, topic, data) {
+ if (observers_called.length)
+ observers_called += ",";
+
+ observers_called += topic;
+ }
+};
+
+var listener = {
+ onStartRequest: function (request, ctx) {
+ buffer = "";
+ },
+
+ onDataAvailable: function (request, ctx, stream, offset, count) {
+ buffer = buffer.concat(read_stream(stream, count));
+ },
+
+ onStopRequest: function (request, ctx, status) {
+ do_check_eq(status, Cr.NS_OK);
+ do_check_eq(buffer, "0123456789");
+ do_check_eq(observers_called, results[test_nr]);
+ test_nr++;
+ do_timeout(0, do_test);
+ }
+};
+
+function run_test() {
+ httpserv = new HttpServer();
+ httpserv.registerPathHandler("/bug482601/nocache", bug482601_nocache);
+ httpserv.registerPathHandler("/bug482601/partial", bug482601_partial);
+ httpserv.registerPathHandler("/bug482601/cached", bug482601_cached);
+ httpserv.registerPathHandler("/bug482601/only_from_cache", bug482601_only_from_cache);
+ httpserv.start(-1);
+
+ var obs = Cc["@mozilla.org/observer-service;1"].getService();
+ obs = obs.QueryInterface(Ci.nsIObserverService);
+ obs.addObserver(observer, "http-on-examine-response", false);
+ obs.addObserver(observer, "http-on-examine-merged-response", false);
+ obs.addObserver(observer, "http-on-examine-cached-response", false);
+
+ do_timeout(0, do_test);
+ do_test_pending();
+}
+
+function do_test() {
+ if (test_nr < tests.length) {
+ tests[test_nr]();
+ }
+ else {
+ do_check_eq(handlers_called, "nocache,partial,cached");
+ httpserv.stop(do_test_finished);
+ }
+}
+
+var tests = [test_nocache,
+ test_partial,
+ test_cached,
+ test_only_from_cache];
+
+var results = ["http-on-examine-response",
+ "http-on-examine-response,http-on-examine-merged-response",
+ "http-on-examine-response,http-on-examine-merged-response",
+ "http-on-examine-cached-response"];
+
+function makeChan(url) {
+ return NetUtil.newChannel({uri: url, loadUsingSystemPrincipal: true})
+ .QueryInterface(Ci.nsIHttpChannel);
+}
+
+function storeCache(aCacheEntry, aResponseHeads, aContent) {
+ aCacheEntry.setMetaDataElement("request-method", "GET");
+ aCacheEntry.setMetaDataElement("response-head", aResponseHeads);
+ aCacheEntry.setMetaDataElement("charset", "ISO-8859-1");
+
+ var oStream = aCacheEntry.openOutputStream(0);
+ var written = oStream.write(aContent, aContent.length);
+ if (written != aContent.length) {
+ do_throw("oStream.write has not written all data!\n" +
+ " Expected: " + written + "\n" +
+ " Actual: " + aContent.length + "\n");
+ }
+ oStream.close();
+ aCacheEntry.close();
+}
+
+function test_nocache() {
+ observers_called = "";
+
+ var chan = makeChan("http://localhost:" + httpserv.identity.primaryPort +
+ "/bug482601/nocache");
+ chan.asyncOpen2(listener);
+}
+
+function test_partial() {
+ asyncOpenCacheEntry("http://localhost:" + httpserv.identity.primaryPort +
+ "/bug482601/partial",
+ "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null,
+ test_partial2);
+}
+
+function test_partial2(status, entry) {
+ do_check_eq(status, Cr.NS_OK);
+ storeCache(entry,
+ "HTTP/1.1 200 OK\r\n" +
+ "Date: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
+ "Server: httpd.js\r\n" +
+ "Last-Modified: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
+ "Accept-Ranges: bytes\r\n" +
+ "Content-Length: 10\r\n" +
+ "Content-Type: text/plain\r\n",
+ "0123");
+
+ observers_called = "";
+
+ var chan = makeChan("http://localhost:" + httpserv.identity.primaryPort +
+ "/bug482601/partial");
+ chan.asyncOpen2(listener);
+}
+
+function test_cached() {
+ asyncOpenCacheEntry("http://localhost:" + httpserv.identity.primaryPort +
+ "/bug482601/cached",
+ "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null,
+ test_cached2);
+}
+
+function test_cached2(status, entry) {
+ do_check_eq(status, Cr.NS_OK);
+ storeCache(entry,
+ "HTTP/1.1 200 OK\r\n" +
+ "Date: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
+ "Server: httpd.js\r\n" +
+ "Last-Modified: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
+ "Accept-Ranges: bytes\r\n" +
+ "Content-Length: 10\r\n" +
+ "Content-Type: text/plain\r\n",
+ "0123456789");
+
+ observers_called = "";
+
+ var chan = makeChan("http://localhost:" + httpserv.identity.primaryPort +
+ "/bug482601/cached");
+ chan.loadFlags = Ci.nsIRequest.VALIDATE_ALWAYS;
+ chan.asyncOpen2(listener);
+}
+
+function test_only_from_cache() {
+ asyncOpenCacheEntry("http://localhost:" + httpserv.identity.primaryPort +
+ "/bug482601/only_from_cache",
+ "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null,
+ test_only_from_cache2);
+}
+
+function test_only_from_cache2(status, entry) {
+ do_check_eq(status, Cr.NS_OK);
+ storeCache(entry,
+ "HTTP/1.1 200 OK\r\n" +
+ "Date: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
+ "Server: httpd.js\r\n" +
+ "Last-Modified: Thu, 1 Jan 2009 00:00:00 GMT\r\n" +
+ "Accept-Ranges: bytes\r\n" +
+ "Content-Length: 10\r\n" +
+ "Content-Type: text/plain\r\n",
+ "0123456789");
+
+ observers_called = "";
+
+ var chan = makeChan("http://localhost:" + httpserv.identity.primaryPort +
+ "/bug482601/only_from_cache");
+ chan.loadFlags = Ci.nsICachingChannel.LOAD_ONLY_FROM_CACHE;
+ chan.asyncOpen2(listener);
+}
+
+
+// PATHS
+
+// /bug482601/nocache
+function bug482601_nocache(metadata, response) {
+ response.setHeader("Content-Type", "text/plain", false);
+ var body = "0123456789";
+ response.bodyOutputStream.write(body, body.length);
+ handlers_called += "nocache";
+}
+
+// /bug482601/partial
+function bug482601_partial(metadata, response) {
+ do_check_true(metadata.hasHeader("If-Range"));
+ do_check_eq(metadata.getHeader("If-Range"),
+ "Thu, 1 Jan 2009 00:00:00 GMT");
+ do_check_true(metadata.hasHeader("Range"));
+ do_check_eq(metadata.getHeader("Range"), "bytes=4-");
+
+ response.setStatusLine(metadata.httpVersion, 206, "Partial Content");
+ response.setHeader("Content-Range", "bytes 4-9/10", false);
+ response.setHeader("Content-Type", "text/plain", false);
+ response.setHeader("Last-Modified", "Thu, 1 Jan 2009 00:00:00 GMT");
+
+ var body = "456789";
+ response.bodyOutputStream.write(body, body.length);
+ handlers_called += ",partial";
+}
+
+// /bug482601/cached
+function bug482601_cached(metadata, response) {
+ do_check_true(metadata.hasHeader("If-Modified-Since"));
+ do_check_eq(metadata.getHeader("If-Modified-Since"),
+ "Thu, 1 Jan 2009 00:00:00 GMT");
+
+ response.setStatusLine(metadata.httpVersion, 304, "Not Modified");
+ handlers_called += ",cached";
+}
+
+// /bug482601/only_from_cache
+function bug482601_only_from_cache(metadata, response) {
+ do_throw("This should not be reached");
+}