summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_suspend_channel_before_connect.js
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/unit/test_suspend_channel_before_connect.js')
-rw-r--r--netwerk/test/unit/test_suspend_channel_before_connect.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_suspend_channel_before_connect.js b/netwerk/test/unit/test_suspend_channel_before_connect.js
new file mode 100644
index 000000000..f41932a46
--- /dev/null
+++ b/netwerk/test/unit/test_suspend_channel_before_connect.js
@@ -0,0 +1,102 @@
+
+var CC = Components.Constructor;
+
+Cu.import("resource://gre/modules/NetUtil.jsm");
+
+const ServerSocket = CC("@mozilla.org/network/server-socket;1",
+ "nsIServerSocket",
+ "init");
+
+var obs = Cc["@mozilla.org/observer-service;1"]
+ .getService(Ci.nsIObserverService);
+
+var ios = Cc["@mozilla.org/network/io-service;1"]
+ .getService(Components.interfaces.nsIIOService);
+
+// A server that waits for a connect. If a channel is suspended it should not
+// try to connect to the server until it is is resumed or not try at all if it
+// is cancelled as in this test.
+function TestServer() {
+ this.listener = ServerSocket(-1, true, -1);
+ this.port = this.listener.port;
+ this.listener.asyncListen(this);
+}
+
+TestServer.prototype = {
+ onSocketAccepted: function(socket, trans) {
+ do_check_true(false, "Socket should not have tried to connect!");
+ },
+
+ onStopListening: function(socket) {
+ },
+
+ stop: function() {
+ try { this.listener.close(); } catch(ignore) {}
+ }
+}
+
+var requestListenerObserver = {
+
+ QueryInterface: function queryinterface(iid) {
+ if (iid.equals(Ci.nsISupports) ||
+ iid.equals(Ci.nsIObserver))
+ return this;
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ },
+
+ observe: function(subject, topic, data) {
+ if (topic === "http-on-modify-request" &&
+ subject instanceof Ci.nsIHttpChannel) {
+
+ var chan = subject.QueryInterface(Ci.nsIHttpChannel);
+ chan.suspend();
+ var obs = Cc["@mozilla.org/observer-service;1"].getService();
+ obs = obs.QueryInterface(Ci.nsIObserverService);
+ obs.removeObserver(this, "http-on-modify-request");
+
+ // Timers are bad, but we need to wait to see that we are not trying to
+ // connect to the server. There are no other event since nothing should
+ // happen until we resume the channel.
+ let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback(() => {
+ chan.cancel(Cr.NS_BINDING_ABORTED);
+ chan.resume();
+ }, 1000, Ci.nsITimer.TYPE_ONE_SHOT);
+ }
+ }
+};
+
+var listener = {
+ onStartRequest: function test_onStartR(request, ctx) {
+ },
+
+ onDataAvailable: function test_ODA() {
+ do_throw("Should not get any data!");
+ },
+
+ onStopRequest: function test_onStopR(request, ctx, status) {
+ do_execute_soon(run_next_test);
+ }
+};
+
+// Add observer and start a channel. Observer is going to suspend the channel on
+// "http-on-modify-request" even. If a channel is suspended so early it should
+// not try to connect at all until it is resumed. In this case we are going to
+// wait for some time and cancel the channel before resuming it.
+add_test(function testNoConnectChannelCanceledEarly() {
+
+ serv = new TestServer();
+
+ obs.addObserver(requestListenerObserver, "http-on-modify-request", false);
+ var chan = NetUtil.newChannel({
+ uri:"http://localhost:" + serv.port,
+ loadUsingSystemPrincipal: true
+ });
+ chan.asyncOpen2(listener);
+
+ do_register_cleanup(function(){ serv.stop(); });
+});
+
+function run_test() {
+ run_next_test();
+}