michael@0: // michael@0: // cleaner HTTP header test infrastructure michael@0: // michael@0: // tests bugs: 589292, [add more here: see hg log for definitive list] michael@0: // michael@0: // TO ADD NEW TESTS: michael@0: // 1) Increment up 'lastTest' to new number (say, "99") michael@0: // 2) Add new test 'handler99' and 'completeTest99' functions. michael@0: // 3) If your test should fail the necko channel, set michael@0: // test_flags[99] = CL_EXPECT_FAILURE. michael@0: // michael@0: // TO DEBUG JUST ONE TEST: temporarily change firstTest and lastTest to equal michael@0: // the test # you're interested in. michael@0: // michael@0: // For tests that need duplicate copies of headers to be sent, see michael@0: // test_duplicate_headers.js michael@0: michael@0: var firstTest = 1; // set to test of interest when debugging michael@0: var lastTest = 4; // set to test of interest when debugging michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: // Note: sets Cc and Ci variables michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: XPCOMUtils.defineLazyGetter(this, "URL", function() { michael@0: return "http://localhost:" + httpserver.identity.primaryPort; michael@0: }); michael@0: michael@0: var httpserver = new HttpServer(); michael@0: var index = 0; michael@0: var nextTest = firstTest; michael@0: var test_flags = new Array(); michael@0: var testPathBase = "/test_headers"; michael@0: michael@0: function run_test() michael@0: { michael@0: httpserver.start(-1); michael@0: michael@0: do_test_pending(); michael@0: run_test_number(nextTest); michael@0: } michael@0: michael@0: function runNextTest() michael@0: { michael@0: if (nextTest == lastTest) { michael@0: endTests(); michael@0: return; michael@0: } michael@0: nextTest++; michael@0: // Make sure test functions exist michael@0: if (eval("handler" + nextTest) == undefined) michael@0: do_throw("handler" + nextTest + " undefined!"); michael@0: if (eval("completeTest" + nextTest) == undefined) michael@0: do_throw("completeTest" + nextTest + " undefined!"); michael@0: michael@0: run_test_number(nextTest); michael@0: } michael@0: michael@0: function run_test_number(num) michael@0: { michael@0: testPath = testPathBase + num; michael@0: httpserver.registerPathHandler(testPath, eval("handler" + num)); michael@0: michael@0: var channel = setupChannel(testPath); michael@0: flags = test_flags[num]; // OK if flags undefined for test michael@0: channel.asyncOpen(new ChannelListener(eval("completeTest" + num), michael@0: channel, flags), null); michael@0: } michael@0: michael@0: function setupChannel(url) michael@0: { michael@0: var ios = Components.classes["@mozilla.org/network/io-service;1"]. michael@0: getService(Ci.nsIIOService); michael@0: var chan = ios.newChannel(URL + url, "", null); michael@0: var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); michael@0: return httpChan; michael@0: } michael@0: michael@0: function endTests() michael@0: { michael@0: httpserver.stop(do_test_finished); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 1: test Content-Disposition channel attributes michael@0: function handler1(metadata, response) michael@0: { michael@0: response.setStatusLine(metadata.httpVersion, 200, "OK"); michael@0: response.setHeader("Content-Disposition", "attachment; filename=foo"); michael@0: response.setHeader("Content-Type", "text/plain", false); michael@0: var body = "foo"; michael@0: } michael@0: michael@0: function completeTest1(request, data, ctx) michael@0: { michael@0: try { michael@0: var chan = request.QueryInterface(Ci.nsIChannel); michael@0: do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT); michael@0: do_check_eq(chan.contentDispositionFilename, "foo"); michael@0: do_check_eq(chan.contentDispositionHeader, "attachment; filename=foo"); michael@0: } catch (ex) { michael@0: do_throw("error parsing Content-Disposition: " + ex); michael@0: } michael@0: runNextTest(); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 2: no filename michael@0: function handler2(metadata, response) michael@0: { michael@0: response.setStatusLine(metadata.httpVersion, 200, "OK"); michael@0: response.setHeader("Content-Type", "text/plain", false); michael@0: response.setHeader("Content-Disposition", "attachment"); michael@0: var body = "foo"; michael@0: response.bodyOutputStream.write(body, body.length); michael@0: } michael@0: michael@0: function completeTest2(request, data, ctx) michael@0: { michael@0: try { michael@0: var chan = request.QueryInterface(Ci.nsIChannel); michael@0: do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT); michael@0: do_check_eq(chan.contentDispositionHeader, "attachment"); michael@0: michael@0: filename = chan.contentDispositionFilename; // should barf michael@0: do_throw("Should have failed getting Content-Disposition filename"); michael@0: } catch (ex) { michael@0: do_print("correctly ate exception"); michael@0: } michael@0: runNextTest(); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 3: filename missing michael@0: function handler3(metadata, response) michael@0: { michael@0: response.setStatusLine(metadata.httpVersion, 200, "OK"); michael@0: response.setHeader("Content-Type", "text/plain", false); michael@0: response.setHeader("Content-Disposition", "attachment; filename="); michael@0: var body = "foo"; michael@0: response.bodyOutputStream.write(body, body.length); michael@0: } michael@0: michael@0: function completeTest3(request, data, ctx) michael@0: { michael@0: try { michael@0: var chan = request.QueryInterface(Ci.nsIChannel); michael@0: do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT); michael@0: do_check_eq(chan.contentDispositionHeader, "attachment; filename="); michael@0: michael@0: filename = chan.contentDispositionFilename; // should barf michael@0: do_throw("Should have failed getting Content-Disposition filename"); michael@0: } catch (ex) { michael@0: do_print("correctly ate exception"); michael@0: } michael@0: runNextTest(); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 4: inline michael@0: function handler4(metadata, response) michael@0: { michael@0: response.setStatusLine(metadata.httpVersion, 200, "OK"); michael@0: response.setHeader("Content-Type", "text/plain", false); michael@0: response.setHeader("Content-Disposition", "inline"); michael@0: var body = "foo"; michael@0: response.bodyOutputStream.write(body, body.length); michael@0: } michael@0: michael@0: function completeTest4(request, data, ctx) michael@0: { michael@0: try { michael@0: var chan = request.QueryInterface(Ci.nsIChannel); michael@0: do_check_eq(chan.contentDisposition, chan.DISPOSITION_INLINE); michael@0: do_check_eq(chan.contentDispositionHeader, "inline"); michael@0: michael@0: filename = chan.contentDispositionFilename; // should barf michael@0: do_throw("Should have failed getting Content-Disposition filename"); michael@0: } catch (ex) { michael@0: do_print("correctly ate exception"); michael@0: } michael@0: runNextTest(); michael@0: }