From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- .../unit/test_suspend_channel_before_connect.js | 95 ++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 netwerk/test/unit/test_suspend_channel_before_connect.js (limited to 'netwerk/test/unit/test_suspend_channel_before_connect.js') 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 0000000000..038ec6e2d5 --- /dev/null +++ b/netwerk/test/unit/test_suspend_channel_before_connect.js @@ -0,0 +1,95 @@ +"use strict"; + +var CC = Components.Constructor; + +const ServerSocket = CC( + "@mozilla.org/network/server-socket;1", + "nsIServerSocket", + "init" +); + +var obs = Services.obs; + +// 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(socket, trans) { + Assert.ok(false, "Socket should not have tried to connect!"); + }, + + onStopListening(socket) {}, + + stop() { + try { + this.listener.close(); + } catch (ignore) {} + }, +}; + +var requestListenerObserver = { + QueryInterface: ChromeUtils.generateQI(["nsIObserver"]), + + observe(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) {}, + + onDataAvailable: function test_ODA() { + do_throw("Should not get any data!"); + }, + + onStopRequest: function test_onStopR(request, status) { + executeSoon(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() { + let serv = new TestServer(); + + obs.addObserver(requestListenerObserver, "http-on-modify-request"); + var chan = NetUtil.newChannel({ + uri: "http://localhost:" + serv.port, + loadUsingSystemPrincipal: true, + }); + chan.asyncOpen(listener); + + registerCleanupFunction(function () { + serv.stop(); + }); +}); -- cgit v1.2.3