diff options
Diffstat (limited to 'netwerk/test/httpserver/test/test_basic_functionality.js')
-rw-r--r-- | netwerk/test/httpserver/test/test_basic_functionality.js | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/netwerk/test/httpserver/test/test_basic_functionality.js b/netwerk/test/httpserver/test/test_basic_functionality.js new file mode 100644 index 0000000000..d00cfa4eb2 --- /dev/null +++ b/netwerk/test/httpserver/test/test_basic_functionality.js @@ -0,0 +1,182 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Basic functionality test, from the client programmer's POV. + */ + +XPCOMUtils.defineLazyGetter(this, "port", function () { + return srv.identity.primaryPort; +}); + +XPCOMUtils.defineLazyGetter(this, "tests", function () { + return [ + new Test( + "http://localhost:" + port + "/objHandler", + null, + start_objHandler, + null + ), + new Test( + "http://localhost:" + port + "/functionHandler", + null, + start_functionHandler, + null + ), + new Test( + "http://localhost:" + port + "/nonexistent-path", + null, + start_non_existent_path, + null + ), + new Test( + "http://localhost:" + port + "/lotsOfHeaders", + null, + start_lots_of_headers, + null + ), + ]; +}); + +var srv; + +function run_test() { + srv = createServer(); + + // base path + // XXX should actually test this works with a file by comparing streams! + var path = Services.dirsvc.get("CurWorkD", Ci.nsIFile); + srv.registerDirectory("/", path); + + // register a few test paths + srv.registerPathHandler("/objHandler", objHandler); + srv.registerPathHandler("/functionHandler", functionHandler); + srv.registerPathHandler("/lotsOfHeaders", lotsOfHeadersHandler); + + srv.start(-1); + + runHttpTests(tests, testComplete(srv)); +} + +const HEADER_COUNT = 1000; + +// TEST DATA + +// common properties *always* appended by server +// or invariants for every URL in paths +function commonCheck(ch) { + Assert.ok(ch.contentLength > -1); + Assert.equal(ch.getResponseHeader("connection"), "close"); + Assert.ok(!ch.isNoStoreResponse()); + Assert.ok(!ch.isPrivateResponse()); +} + +function start_objHandler(ch) { + commonCheck(ch); + + Assert.equal(ch.responseStatus, 200); + Assert.ok(ch.requestSucceeded); + Assert.equal(ch.getResponseHeader("content-type"), "text/plain"); + Assert.equal(ch.responseStatusText, "OK"); + + var reqMin = {}, + reqMaj = {}, + respMin = {}, + respMaj = {}; + ch.getRequestVersion(reqMaj, reqMin); + ch.getResponseVersion(respMaj, respMin); + Assert.ok(reqMaj.value == respMaj.value && reqMin.value == respMin.value); +} + +function start_functionHandler(ch) { + commonCheck(ch); + + Assert.equal(ch.responseStatus, 404); + Assert.ok(!ch.requestSucceeded); + Assert.equal(ch.getResponseHeader("foopy"), "quux-baz"); + Assert.equal(ch.responseStatusText, "Page Not Found"); + + var reqMin = {}, + reqMaj = {}, + respMin = {}, + respMaj = {}; + ch.getRequestVersion(reqMaj, reqMin); + ch.getResponseVersion(respMaj, respMin); + Assert.ok(reqMaj.value == 1 && reqMin.value == 1); + Assert.ok(respMaj.value == 1 && respMin.value == 1); +} + +function start_non_existent_path(ch) { + commonCheck(ch); + + Assert.equal(ch.responseStatus, 404); + Assert.ok(!ch.requestSucceeded); +} + +function start_lots_of_headers(ch) { + commonCheck(ch); + + Assert.equal(ch.responseStatus, 200); + Assert.ok(ch.requestSucceeded); + + for (var i = 0; i < HEADER_COUNT; i++) { + Assert.equal(ch.getResponseHeader("X-Header-" + i), "value " + i); + } +} + +// PATH HANDLERS + +// /objHandler +var objHandler = { + handle(metadata, response) { + response.setStatusLine(metadata.httpVersion, 200, "OK"); + response.setHeader("Content-Type", "text/plain", false); + + var body = "Request (slightly reformatted):\n\n"; + body += metadata.method + " " + metadata.path; + + Assert.equal(metadata.port, port); + + if (metadata.queryString) { + body += "?" + metadata.queryString; + } + + body += " HTTP/" + metadata.httpVersion + "\n"; + + var headEnum = metadata.headers; + while (headEnum.hasMoreElements()) { + var fieldName = headEnum + .getNext() + .QueryInterface(Ci.nsISupportsString).data; + body += fieldName + ": " + metadata.getHeader(fieldName) + "\n"; + } + + response.bodyOutputStream.write(body, body.length); + }, + QueryInterface: ChromeUtils.generateQI(["nsIHttpRequestHandler"]), +}; + +// /functionHandler +function functionHandler(metadata, response) { + response.setStatusLine("1.1", 404, "Page Not Found"); + response.setHeader("foopy", "quux-baz", false); + + Assert.equal(metadata.port, port); + Assert.equal(metadata.host, "localhost"); + Assert.equal(metadata.path.charAt(0), "/"); + + var body = "this is text\n"; + response.bodyOutputStream.write(body, body.length); +} + +// /lotsOfHeaders +function lotsOfHeadersHandler(request, response) { + response.setHeader("Content-Type", "text/plain", false); + + for (var i = 0; i < HEADER_COUNT; i++) { + response.setHeader("X-Header-" + i, "value " + i, false); + } +} |