netwerk/test/unit/test_headers.js

changeset 1
ca08bd8f51b2
equal deleted inserted replaced
-1:000000000000 0:0cd50dac0636
1 //
2 // cleaner HTTP header test infrastructure
3 //
4 // tests bugs: 589292, [add more here: see hg log for definitive list]
5 //
6 // TO ADD NEW TESTS:
7 // 1) Increment up 'lastTest' to new number (say, "99")
8 // 2) Add new test 'handler99' and 'completeTest99' functions.
9 // 3) If your test should fail the necko channel, set
10 // test_flags[99] = CL_EXPECT_FAILURE.
11 //
12 // TO DEBUG JUST ONE TEST: temporarily change firstTest and lastTest to equal
13 // the test # you're interested in.
14 //
15 // For tests that need duplicate copies of headers to be sent, see
16 // test_duplicate_headers.js
17
18 var firstTest = 1; // set to test of interest when debugging
19 var lastTest = 4; // set to test of interest when debugging
20 ////////////////////////////////////////////////////////////////////////////////
21
22 // Note: sets Cc and Ci variables
23
24 Cu.import("resource://testing-common/httpd.js");
25
26 XPCOMUtils.defineLazyGetter(this, "URL", function() {
27 return "http://localhost:" + httpserver.identity.primaryPort;
28 });
29
30 var httpserver = new HttpServer();
31 var index = 0;
32 var nextTest = firstTest;
33 var test_flags = new Array();
34 var testPathBase = "/test_headers";
35
36 function run_test()
37 {
38 httpserver.start(-1);
39
40 do_test_pending();
41 run_test_number(nextTest);
42 }
43
44 function runNextTest()
45 {
46 if (nextTest == lastTest) {
47 endTests();
48 return;
49 }
50 nextTest++;
51 // Make sure test functions exist
52 if (eval("handler" + nextTest) == undefined)
53 do_throw("handler" + nextTest + " undefined!");
54 if (eval("completeTest" + nextTest) == undefined)
55 do_throw("completeTest" + nextTest + " undefined!");
56
57 run_test_number(nextTest);
58 }
59
60 function run_test_number(num)
61 {
62 testPath = testPathBase + num;
63 httpserver.registerPathHandler(testPath, eval("handler" + num));
64
65 var channel = setupChannel(testPath);
66 flags = test_flags[num]; // OK if flags undefined for test
67 channel.asyncOpen(new ChannelListener(eval("completeTest" + num),
68 channel, flags), null);
69 }
70
71 function setupChannel(url)
72 {
73 var ios = Components.classes["@mozilla.org/network/io-service;1"].
74 getService(Ci.nsIIOService);
75 var chan = ios.newChannel(URL + url, "", null);
76 var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel);
77 return httpChan;
78 }
79
80 function endTests()
81 {
82 httpserver.stop(do_test_finished);
83 }
84
85 ////////////////////////////////////////////////////////////////////////////////
86 // Test 1: test Content-Disposition channel attributes
87 function handler1(metadata, response)
88 {
89 response.setStatusLine(metadata.httpVersion, 200, "OK");
90 response.setHeader("Content-Disposition", "attachment; filename=foo");
91 response.setHeader("Content-Type", "text/plain", false);
92 var body = "foo";
93 }
94
95 function completeTest1(request, data, ctx)
96 {
97 try {
98 var chan = request.QueryInterface(Ci.nsIChannel);
99 do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT);
100 do_check_eq(chan.contentDispositionFilename, "foo");
101 do_check_eq(chan.contentDispositionHeader, "attachment; filename=foo");
102 } catch (ex) {
103 do_throw("error parsing Content-Disposition: " + ex);
104 }
105 runNextTest();
106 }
107
108 ////////////////////////////////////////////////////////////////////////////////
109 // Test 2: no filename
110 function handler2(metadata, response)
111 {
112 response.setStatusLine(metadata.httpVersion, 200, "OK");
113 response.setHeader("Content-Type", "text/plain", false);
114 response.setHeader("Content-Disposition", "attachment");
115 var body = "foo";
116 response.bodyOutputStream.write(body, body.length);
117 }
118
119 function completeTest2(request, data, ctx)
120 {
121 try {
122 var chan = request.QueryInterface(Ci.nsIChannel);
123 do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT);
124 do_check_eq(chan.contentDispositionHeader, "attachment");
125
126 filename = chan.contentDispositionFilename; // should barf
127 do_throw("Should have failed getting Content-Disposition filename");
128 } catch (ex) {
129 do_print("correctly ate exception");
130 }
131 runNextTest();
132 }
133
134 ////////////////////////////////////////////////////////////////////////////////
135 // Test 3: filename missing
136 function handler3(metadata, response)
137 {
138 response.setStatusLine(metadata.httpVersion, 200, "OK");
139 response.setHeader("Content-Type", "text/plain", false);
140 response.setHeader("Content-Disposition", "attachment; filename=");
141 var body = "foo";
142 response.bodyOutputStream.write(body, body.length);
143 }
144
145 function completeTest3(request, data, ctx)
146 {
147 try {
148 var chan = request.QueryInterface(Ci.nsIChannel);
149 do_check_eq(chan.contentDisposition, chan.DISPOSITION_ATTACHMENT);
150 do_check_eq(chan.contentDispositionHeader, "attachment; filename=");
151
152 filename = chan.contentDispositionFilename; // should barf
153 do_throw("Should have failed getting Content-Disposition filename");
154 } catch (ex) {
155 do_print("correctly ate exception");
156 }
157 runNextTest();
158 }
159
160 ////////////////////////////////////////////////////////////////////////////////
161 // Test 4: inline
162 function handler4(metadata, response)
163 {
164 response.setStatusLine(metadata.httpVersion, 200, "OK");
165 response.setHeader("Content-Type", "text/plain", false);
166 response.setHeader("Content-Disposition", "inline");
167 var body = "foo";
168 response.bodyOutputStream.write(body, body.length);
169 }
170
171 function completeTest4(request, data, ctx)
172 {
173 try {
174 var chan = request.QueryInterface(Ci.nsIChannel);
175 do_check_eq(chan.contentDisposition, chan.DISPOSITION_INLINE);
176 do_check_eq(chan.contentDispositionHeader, "inline");
177
178 filename = chan.contentDispositionFilename; // should barf
179 do_throw("Should have failed getting Content-Disposition filename");
180 } catch (ex) {
181 do_print("correctly ate exception");
182 }
183 runNextTest();
184 }

mercurial