diff options
Diffstat (limited to 'netwerk/test/unit/test_reopen.js')
-rw-r--r-- | netwerk/test/unit/test_reopen.js | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_reopen.js b/netwerk/test/unit/test_reopen.js new file mode 100644 index 000000000..b3744dfc5 --- /dev/null +++ b/netwerk/test/unit/test_reopen.js @@ -0,0 +1,141 @@ +// This testcase verifies that channels can't be reopened +// See https://bugzilla.mozilla.org/show_bug.cgi?id=372486 + +Cu.import("resource://testing-common/httpd.js"); +Cu.import("resource://gre/modules/NetUtil.jsm"); + +const NS_ERROR_IN_PROGRESS = 0x804b000f; +const NS_ERROR_ALREADY_OPENED = 0x804b0049; + +var chan = null; +var httpserv = null; + +[ + test_data_channel, + test_http_channel, + test_file_channel, + // Commented by default as it relies on external ressources + //test_ftp_channel, + end +].forEach(add_test); + +// Utility functions + +function makeChan(url) { + return chan = NetUtil.newChannel({uri: url, loadUsingSystemPrincipal: true}) + .QueryInterface(Ci.nsIChannel); +} + +function new_file_channel(file) { + var ios = Cc["@mozilla.org/network/io-service;1"] + .getService(Ci.nsIIOService); + return NetUtil.newChannel({ + uri: ios.newFileURI(file), + loadUsingSystemPrincipal: true + }); +} + + +function check_throws(closure, error) { + var thrown = false; + try { + closure(); + } catch (e) { + if (error instanceof Array) { + do_check_neq(error.indexOf(e.result), -1); + } else { + do_check_eq(e.result, error); + } + thrown = true; + } + do_check_true(thrown); +} + +function check_open_throws(error) { + check_throws(function() { + chan.open2(listener); + }, error); +} + +function check_async_open_throws(error) { + check_throws(function() { + chan.asyncOpen2(listener); + }, error); +} + +var listener = { + onStartRequest: function test_onStartR(request, ctx) { + check_async_open_throws(NS_ERROR_IN_PROGRESS); + }, + + onDataAvailable: function test_ODA(request, cx, inputStream, + offset, count) { + new BinaryInputStream(inputStream).readByteArray(count); // required by API + check_async_open_throws(NS_ERROR_IN_PROGRESS); + }, + + onStopRequest: function test_onStopR(request, ctx, status) { + // Once onStopRequest is reached, the channel is marked as having been + // opened + check_async_open_throws(NS_ERROR_ALREADY_OPENED); + do_timeout(0, after_channel_closed); + } +}; + +function after_channel_closed() { + check_async_open_throws(NS_ERROR_ALREADY_OPENED); + + run_next_test(); +} + +function test_channel(createChanClosure) { + // First, synchronous reopening test + chan = createChanClosure(); + var inputStream = chan.open2(); + check_open_throws(NS_ERROR_IN_PROGRESS); + check_async_open_throws([NS_ERROR_IN_PROGRESS, NS_ERROR_ALREADY_OPENED]); + + // Then, asynchronous one + chan = createChanClosure(); + chan.asyncOpen2(listener); + check_open_throws(NS_ERROR_IN_PROGRESS); + check_async_open_throws(NS_ERROR_IN_PROGRESS); +} + +function test_data_channel() { + test_channel(function() { + return makeChan("data:text/plain,foo"); + }); +} + +function test_http_channel() { + test_channel(function() { + return makeChan("http://localhost:" + httpserv.identity.primaryPort + "/"); + }); +} + +function test_file_channel() { + var file = do_get_file("data/test_readline1.txt"); + test_channel(function() { + return new_file_channel(file); + }); +} + +// Uncomment test_ftp_channel in test_array to test this +function test_ftp_channel() { + test_channel(function() { + return makeChan("ftp://ftp.mozilla.org/pub/mozilla.org/README"); + }); +} + +function end() { + httpserv.stop(do_test_finished); +} + +function run_test() { + // start server + httpserv = new HttpServer(); + httpserv.start(-1); + + run_next_test(); +} |