summaryrefslogtreecommitdiffstats
path: root/netwerk/test/httpserver/test/test_sjs.js
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/httpserver/test/test_sjs.js')
-rw-r--r--netwerk/test/httpserver/test/test_sjs.js251
1 files changed, 251 insertions, 0 deletions
diff --git a/netwerk/test/httpserver/test/test_sjs.js b/netwerk/test/httpserver/test/test_sjs.js
new file mode 100644
index 000000000..2a9814196
--- /dev/null
+++ b/netwerk/test/httpserver/test/test_sjs.js
@@ -0,0 +1,251 @@
+/* -*- 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/. */
+
+// tests support for server JS-generated pages
+
+var srv = createServer();
+
+var sjs = do_get_file("data/sjs/cgi.sjs");
+// NB: The server has no state at this point -- all state is set up and torn
+// down in the tests, because we run the same tests twice with only a
+// different query string on the requests, followed by the oddball
+// test that doesn't care about throwing or not.
+srv.start(-1);
+const PORT = srv.identity.primaryPort;
+
+const BASE = "http://localhost:" + PORT;
+var test;
+var tests = [];
+
+
+/*********************
+ * UTILITY FUNCTIONS *
+ *********************/
+
+function bytesToString(bytes)
+{
+ return bytes.map(function(v) { return String.fromCharCode(v); }).join("");
+}
+
+function skipCache(ch)
+{
+ ch.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
+}
+
+
+/********************
+ * DEFINE THE TESTS *
+ ********************/
+
+/**
+ * Adds the set of tests defined in here, differentiating between tests with a
+ * SJS which throws an exception and creates a server error and tests with a
+ * normal, successful SJS.
+ */
+function setupTests(throwing)
+{
+ const TEST_URL = BASE + "/cgi.sjs" + (throwing ? "?throw" : "");
+
+ // registerFile with SJS => raw text
+
+ function setupFile(ch)
+ {
+ srv.registerFile("/cgi.sjs", sjs);
+ skipCache(ch);
+ }
+
+ function verifyRawText(channel, cx, status, bytes)
+ {
+ dumpn(channel.originalURI.spec);
+ do_check_eq(bytesToString(bytes), fileContents(sjs));
+ }
+
+ test = new Test(TEST_URL, setupFile, null, verifyRawText);
+ tests.push(test);
+
+
+ // add mapping, => interpreted
+
+ function addTypeMapping(ch)
+ {
+ srv.registerContentType("sjs", "sjs");
+ skipCache(ch);
+ }
+
+ function checkType(ch, cx)
+ {
+ if (throwing)
+ {
+ do_check_false(ch.requestSucceeded);
+ do_check_eq(ch.responseStatus, 500);
+ }
+ else
+ {
+ do_check_eq(ch.contentType, "text/plain");
+ }
+ }
+
+ function checkContents(ch, cx, status, data)
+ {
+ if (!throwing)
+ do_check_eq("PASS", bytesToString(data));
+ }
+
+ test = new Test(TEST_URL, addTypeMapping, checkType, checkContents);
+ tests.push(test);
+
+
+ // remove file/type mapping, map containing directory => raw text
+
+ function setupDirectoryAndRemoveType(ch)
+ {
+ dumpn("removing type mapping");
+ srv.registerContentType("sjs", null);
+ srv.registerFile("/cgi.sjs", null);
+ srv.registerDirectory("/", sjs.parent);
+ skipCache(ch);
+ }
+
+ test = new Test(TEST_URL, setupDirectoryAndRemoveType, null, verifyRawText);
+ tests.push(test);
+
+
+ // add mapping, => interpreted
+
+ function contentAndCleanup(ch, cx, status, data)
+ {
+ checkContents(ch, cx, status, data);
+
+ // clean up state we've set up
+ srv.registerDirectory("/", null);
+ srv.registerContentType("sjs", null);
+ }
+
+ test = new Test(TEST_URL, addTypeMapping, checkType, contentAndCleanup);
+ tests.push(test);
+
+ // NB: No remaining state in the server right now! If we have any here,
+ // either the second run of tests (without ?throw) or the tests added
+ // after the two sets will almost certainly fail.
+}
+
+
+/*****************
+ * ADD THE TESTS *
+ *****************/
+
+setupTests(true);
+setupTests(false);
+
+// Test that when extension-mappings are used, the entire filename cannot be
+// treated as an extension -- there must be at least one dot for a filename to
+// match an extension.
+
+function init(ch)
+{
+ // clean up state we've set up
+ srv.registerDirectory("/", sjs.parent);
+ srv.registerContentType("sjs", "sjs");
+ skipCache(ch);
+}
+
+function checkNotSJS(ch, cx, status, data)
+{
+ do_check_neq("FAIL", bytesToString(data));
+}
+
+test = new Test(BASE + "/sjs", init, null, checkNotSJS);
+tests.push(test);
+
+// Test that Range requests are passed through to the SJS file without
+// bounds checking.
+
+function rangeInit(expectedRangeHeader)
+{
+ return function setupRangeRequest(ch)
+ {
+ ch.setRequestHeader("Range", expectedRangeHeader, false);
+ };
+}
+
+function checkRangeResult(ch, cx)
+{
+ try
+ {
+ var val = ch.getResponseHeader("Content-Range");
+ }
+ catch (e) { /* IDL doesn't specify a particular exception to require */ }
+ if (val !== undefined)
+ {
+ do_throw("should not have gotten a Content-Range header, but got one " +
+ "with this value: " + val);
+ }
+ do_check_eq(200, ch.responseStatus);
+ do_check_eq("OK", ch.responseStatusText);
+}
+
+test = new Test(BASE + "/range-checker.sjs",
+ rangeInit("not-a-bytes-equals-specifier"),
+ checkRangeResult, null);
+tests.push(test);
+test = new Test(BASE + "/range-checker.sjs",
+ rangeInit("bytes=-"),
+ checkRangeResult, null);
+tests.push(test);
+test = new Test(BASE + "/range-checker.sjs",
+ rangeInit("bytes=1000000-"),
+ checkRangeResult, null);
+tests.push(test);
+test = new Test(BASE + "/range-checker.sjs",
+ rangeInit("bytes=1-4"),
+ checkRangeResult, null);
+tests.push(test);
+test = new Test(BASE + "/range-checker.sjs",
+ rangeInit("bytes=-4"),
+ checkRangeResult, null);
+tests.push(test);
+
+// One last test: for file mappings, the content-type is determined by the
+// extension of the file on the server, not by the extension of the requested
+// path.
+
+function setupFileMapping(ch)
+{
+ srv.registerFile("/script.html", sjs);
+}
+
+function onStart(ch, cx)
+{
+ do_check_eq(ch.contentType, "text/plain");
+}
+
+function onStop(ch, cx, status, data)
+{
+ do_check_eq("PASS", bytesToString(data));
+}
+
+test = new Test(BASE + "/script.html", setupFileMapping, onStart, onStop);
+tests.push(test);
+
+
+/*****************
+ * RUN THE TESTS *
+ *****************/
+
+function run_test()
+{
+ // Test for a content-type which isn't a field-value
+ try
+ {
+ srv.registerContentType("foo", "bar\nbaz");
+ throw "this server throws on content-types which aren't field-values";
+ }
+ catch (e)
+ {
+ isException(e, Cr.NS_ERROR_INVALID_ARG);
+ }
+ runHttpTests(tests, testComplete(srv));
+}