michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: Components.utils.import("resource://gre/modules/Http.jsm"); michael@0: Components.utils.import("resource://testing-common/httpd.js"); michael@0: michael@0: const BinaryInputStream = Components.Constructor("@mozilla.org/binaryinputstream;1", michael@0: "nsIBinaryInputStream", "setInputStream"); michael@0: michael@0: var server; michael@0: michael@0: const kDefaultServerPort = 9000; michael@0: const kSuccessPath = "/success"; michael@0: const kBaseUrl = "http://localhost:" + kDefaultServerPort; michael@0: const kSuccessUrl = kBaseUrl + kSuccessPath; michael@0: michael@0: const kPostPath = "/post"; michael@0: const kPostUrl = kBaseUrl + kPostPath; michael@0: const kPostDataSent = [["foo", "bar"], ["complex", "!*()@"]]; michael@0: const kPostDataReceived = "foo=bar&complex=%21%2A%28%29%40"; michael@0: michael@0: const kPutPath = "/put"; michael@0: const kPutUrl = kBaseUrl + kPutPath; michael@0: const kPutDataSent = [["P", "NP"]]; michael@0: const kPutDataReceived = "P=NP"; michael@0: michael@0: const kGetPath = "/get"; michael@0: const kGetUrl = kBaseUrl + kGetPath; michael@0: michael@0: function successResult(aRequest, aResponse) { michael@0: aResponse.setStatusLine(null, 200, "OK"); michael@0: aResponse.setHeader("Content-Type", "application/json"); michael@0: aResponse.write("Success!"); michael@0: } michael@0: michael@0: function getDataChecker(aExpectedMethod, aExpectedData) { michael@0: return function(aRequest, aResponse) { michael@0: let body = new BinaryInputStream(aRequest.bodyInputStream); michael@0: let bytes = []; michael@0: let avail; michael@0: while ((avail = body.available()) > 0) michael@0: Array.prototype.push.apply(bytes, body.readByteArray(avail)); michael@0: michael@0: do_check_eq(aRequest.method, aExpectedMethod); michael@0: michael@0: var data = String.fromCharCode.apply(null, bytes); michael@0: michael@0: do_check_eq(data, aExpectedData); michael@0: michael@0: aResponse.setStatusLine(null, 200, "OK"); michael@0: aResponse.setHeader("Content-Type", "application/json"); michael@0: aResponse.write("Success!"); michael@0: } michael@0: } michael@0: michael@0: add_test(function test_successCallback() { michael@0: do_test_pending(); michael@0: let options = { michael@0: onLoad: function(aResponse) { michael@0: do_check_eq(aResponse, "Success!"); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: onError: function(e) { michael@0: do_check_true(false); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: } michael@0: } michael@0: httpRequest(kSuccessUrl, options); michael@0: }); michael@0: michael@0: add_test(function test_errorCallback() { michael@0: do_test_pending(); michael@0: let options = { michael@0: onSuccess: function(aResponse) { michael@0: do_check_true(false); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: onError: function(e, aResponse) { michael@0: do_check_eq(e, "404 - Not Found"); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: } michael@0: } michael@0: httpRequest(kBaseUrl + "/failure", options); michael@0: }); michael@0: michael@0: add_test(function test_PostData() { michael@0: do_test_pending(); michael@0: let options = { michael@0: onLoad: function(aResponse) { michael@0: do_check_eq(aResponse, "Success!"); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: onError: function(e) { michael@0: do_check_true(false); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: postData: kPostDataSent michael@0: } michael@0: httpRequest(kPostUrl, options); michael@0: }); michael@0: michael@0: add_test(function test_PutData() { michael@0: do_test_pending(); michael@0: let options = { michael@0: method: "PUT", michael@0: onLoad: function(aResponse) { michael@0: do_check_eq(aResponse, "Success!"); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: onError: function(e) { michael@0: do_check_true(false); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: postData: kPutDataSent michael@0: } michael@0: httpRequest(kPutUrl, options); michael@0: }); michael@0: michael@0: add_test(function test_GetData() { michael@0: do_test_pending(); michael@0: let options = { michael@0: onLoad: function(aResponse) { michael@0: do_check_eq(aResponse, "Success!"); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: onError: function(e) { michael@0: do_check_true(false); michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: postData: null michael@0: } michael@0: httpRequest(kGetUrl, options); michael@0: }); michael@0: michael@0: add_test(function test_OptionalParameters() { michael@0: let options = { michael@0: onLoad: null, michael@0: onError: null, michael@0: logger: null michael@0: }; michael@0: // Just make sure that nothing throws when doing this (i.e. httpRequest michael@0: // doesn't try to access null options). michael@0: httpRequest(kGetUrl, options); michael@0: run_next_test(); michael@0: }); michael@0: michael@0: function run_test() { michael@0: // Set up a mock HTTP server to serve a success page. michael@0: server = new HttpServer(); michael@0: server.registerPathHandler(kSuccessPath, successResult); michael@0: server.registerPathHandler(kPostPath, michael@0: getDataChecker("POST", kPostDataReceived)); michael@0: server.registerPathHandler(kPutPath, michael@0: getDataChecker("PUT", kPutDataReceived)); michael@0: server.registerPathHandler(kGetPath, getDataChecker("GET", "")); michael@0: server.start(kDefaultServerPort); michael@0: michael@0: run_next_test(); michael@0: michael@0: // Teardown. michael@0: do_register_cleanup(function() { michael@0: server.stop(function() { }); michael@0: }); michael@0: } michael@0: