diff options
Diffstat (limited to 'netwerk/test/unit/test_post.js')
-rw-r--r-- | netwerk/test/unit/test_post.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_post.js b/netwerk/test/unit/test_post.js new file mode 100644 index 000000000..934719e7d --- /dev/null +++ b/netwerk/test/unit/test_post.js @@ -0,0 +1,120 @@ +// +// POST test +// + +Cu.import("resource://testing-common/httpd.js"); +Cu.import("resource://gre/modules/NetUtil.jsm"); + +XPCOMUtils.defineLazyGetter(this, "URL", function() { + return "http://localhost:" + httpserver.identity.primaryPort; +}); + +var httpserver = new HttpServer(); +var testpath = "/simple"; + +var testfile = do_get_file("../unit/data/test_readline6.txt"); + +const BOUNDARY = "AaB03x"; +var teststring1 = "--" + BOUNDARY + "\r\n" + + "Content-Disposition: form-data; name=\"body\"\r\n\r\n" + + "0123456789\r\n" + + "--" + BOUNDARY + "\r\n" + + "Content-Disposition: form-data; name=\"files\"; filename=\"" + testfile.leafName + "\"\r\n" + + "Content-Type: application/octet-stream\r\n" + + "Content-Length: " + testfile.fileSize + "\r\n\r\n"; +var teststring2 = "--" + BOUNDARY + "--\r\n"; + +const BUFFERSIZE = 4096; +var correctOnProgress = false; + +var listenerCallback = { + QueryInterface: function (iid) { + if (iid.equals(Ci.nsISupports) || + iid.equals(Ci.nsIProgressEventSink)) + return this; + throw Cr.NS_ERROR_NO_INTERFACE; + }, + + getInterface: function (iid) { + if (iid.equals(Ci.nsIProgressEventSink)) + return this; + throw Cr.NS_ERROR_NO_INTERFACE; + }, + + onProgress: function (request, context, progress, progressMax) { + // this works because the response is 0 bytes and does not trigger onprogress + if (progress === progressMax) { + correctOnProgress = true; + } + }, + + onStatus: function (request, context, status, statusArg) { }, +}; + +function run_test() { + var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"]. + createInstance(Ci.nsIStringInputStream); + sstream1.data = teststring1; + + var fstream = Cc["@mozilla.org/network/file-input-stream;1"]. + createInstance(Ci.nsIFileInputStream); + fstream.init(testfile, -1, -1, 0); + + var buffered = Cc["@mozilla.org/network/buffered-input-stream;1"]. + createInstance(Ci.nsIBufferedInputStream); + buffered.init(fstream, BUFFERSIZE); + + var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"]. + createInstance(Ci.nsIStringInputStream); + sstream2.data = teststring2; + + var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"]. + createInstance(Ci.nsIMultiplexInputStream); + multi.appendStream(sstream1); + multi.appendStream(buffered); + multi.appendStream(sstream2); + + var mime = Cc["@mozilla.org/network/mime-input-stream;1"]. + createInstance(Ci.nsIMIMEInputStream); + mime.addHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY); + mime.setData(multi); + mime.addContentLength = true; + + httpserver.registerPathHandler(testpath, serverHandler); + httpserver.start(-1); + + var channel = setupChannel(testpath); + + channel.QueryInterface(Ci.nsIUploadChannel) + .setUploadStream(mime, "", mime.available()); + channel.requestMethod = "POST"; + channel.notificationCallbacks = listenerCallback; + channel.asyncOpen2(new ChannelListener(checkRequest, channel)); + do_test_pending(); +} + +function setupChannel(path) { + return NetUtil.newChannel({uri: URL + path, loadUsingSystemPrincipal: true}) + .QueryInterface(Ci.nsIHttpChannel); +} + +function serverHandler(metadata, response) { + do_check_eq(metadata.method, "POST"); + + var data = read_stream(metadata.bodyInputStream, + metadata.bodyInputStream.available()); + + var testfile_stream = Cc["@mozilla.org/network/file-input-stream;1"]. + createInstance(Ci.nsIFileInputStream); + testfile_stream.init(testfile, -1, -1, 0); + + do_check_eq(teststring1 + + read_stream(testfile_stream, testfile_stream.available()) + + teststring2, + data); +} + +function checkRequest(request, data, context) { + do_check_true(correctOnProgress); + httpserver.stop(do_test_finished); +} |