|
1 /* -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 "use strict"; |
|
8 |
|
9 Cu.import("resource://testing-common/httpd.js"); |
|
10 |
|
11 var baseURL; |
|
12 const kResponseTimeoutPref = "network.http.response.timeout"; |
|
13 const kResponseTimeout = 1; |
|
14 const kShortLivedKeepalivePref = |
|
15 "network.http.tcp_keepalive.short_lived_connections"; |
|
16 const kLongLivedKeepalivePref = |
|
17 "network.http.tcp_keepalive.long_lived_connections"; |
|
18 |
|
19 const prefService = Cc["@mozilla.org/preferences-service;1"] |
|
20 .getService(Ci.nsIPrefBranch); |
|
21 |
|
22 var server = new HttpServer(); |
|
23 |
|
24 function TimeoutListener(expectResponse) { |
|
25 this.expectResponse = expectResponse; |
|
26 } |
|
27 |
|
28 TimeoutListener.prototype = { |
|
29 onStartRequest: function (request, ctx) { |
|
30 }, |
|
31 |
|
32 onDataAvailable: function (request, ctx, stream) { |
|
33 }, |
|
34 |
|
35 onStopRequest: function (request, ctx, status) { |
|
36 if (this.expectResponse) { |
|
37 do_check_eq(status, Cr.NS_OK); |
|
38 } else { |
|
39 do_check_eq(status, Cr.NS_ERROR_NET_TIMEOUT); |
|
40 } |
|
41 |
|
42 run_next_test(); |
|
43 }, |
|
44 }; |
|
45 |
|
46 function serverStopListener() { |
|
47 do_test_finished(); |
|
48 } |
|
49 |
|
50 function testTimeout(timeoutEnabled, expectResponse) { |
|
51 // Set timeout pref. |
|
52 if (timeoutEnabled) { |
|
53 prefService.setIntPref(kResponseTimeoutPref, kResponseTimeout); |
|
54 } else { |
|
55 prefService.setIntPref(kResponseTimeoutPref, 0); |
|
56 } |
|
57 |
|
58 var ios = Cc["@mozilla.org/network/io-service;1"] |
|
59 .getService(Ci.nsIIOService); |
|
60 var chan = ios.newChannel(baseURL, null, null) |
|
61 .QueryInterface(Ci.nsIHttpChannel); |
|
62 var listener = new TimeoutListener(expectResponse); |
|
63 chan.asyncOpen(listener, null); |
|
64 } |
|
65 |
|
66 function testTimeoutEnabled() { |
|
67 // Set a timeout value; expect a timeout and no response. |
|
68 testTimeout(true, false); |
|
69 } |
|
70 |
|
71 function testTimeoutDisabled() { |
|
72 // Set a timeout value of 0; expect a response. |
|
73 testTimeout(false, true); |
|
74 } |
|
75 |
|
76 function testTimeoutDisabledByShortLivedKeepalives() { |
|
77 // Enable TCP Keepalives for short lived HTTP connections. |
|
78 prefService.setBoolPref(kShortLivedKeepalivePref, true); |
|
79 prefService.setBoolPref(kLongLivedKeepalivePref, false); |
|
80 |
|
81 // Try to set a timeout value, but expect a response without timeout. |
|
82 testTimeout(true, true); |
|
83 } |
|
84 |
|
85 function testTimeoutDisabledByLongLivedKeepalives() { |
|
86 // Enable TCP Keepalives for long lived HTTP connections. |
|
87 prefService.setBoolPref(kShortLivedKeepalivePref, false); |
|
88 prefService.setBoolPref(kLongLivedKeepalivePref, true); |
|
89 |
|
90 // Try to set a timeout value, but expect a response without timeout. |
|
91 testTimeout(true, true); |
|
92 } |
|
93 |
|
94 function testTimeoutDisabledByBothKeepalives() { |
|
95 // Enable TCP Keepalives for short and long lived HTTP connections. |
|
96 prefService.setBoolPref(kShortLivedKeepalivePref, true); |
|
97 prefService.setBoolPref(kLongLivedKeepalivePref, true); |
|
98 |
|
99 // Try to set a timeout value, but expect a response without timeout. |
|
100 testTimeout(true, true); |
|
101 } |
|
102 |
|
103 function setup_tests() { |
|
104 // Start tests with timeout enabled, i.e. disable TCP keepalives for HTTP. |
|
105 // Reset pref in cleanup. |
|
106 if (prefService.getBoolPref(kShortLivedKeepalivePref)) { |
|
107 prefService.setBoolPref(kShortLivedKeepalivePref, false); |
|
108 do_register_cleanup(function() { |
|
109 prefService.setBoolPref(kShortLivedKeepalivePref, true); |
|
110 }); |
|
111 } |
|
112 if (prefService.getBoolPref(kLongLivedKeepalivePref)) { |
|
113 prefService.setBoolPref(kLongLivedKeepalivePref, false); |
|
114 do_register_cleanup(function() { |
|
115 prefService.setBoolPref(kLongLivedKeepalivePref, true); |
|
116 }); |
|
117 } |
|
118 |
|
119 var tests = [ |
|
120 // Enable with a timeout value >0; |
|
121 testTimeoutEnabled, |
|
122 // Disable with a timeout value of 0; |
|
123 testTimeoutDisabled, |
|
124 // Disable by enabling TCP keepalive for short-lived HTTP connections. |
|
125 testTimeoutDisabledByShortLivedKeepalives, |
|
126 // Disable by enabling TCP keepalive for long-lived HTTP connections. |
|
127 testTimeoutDisabledByLongLivedKeepalives, |
|
128 // Disable by enabling TCP keepalive for both HTTP connection types. |
|
129 testTimeoutDisabledByBothKeepalives |
|
130 ]; |
|
131 |
|
132 for (var i=0; i < tests.length; i++) { |
|
133 add_test(tests[i]); |
|
134 } |
|
135 } |
|
136 |
|
137 function setup_http_server() { |
|
138 // Start server; will be stopped at test cleanup time. |
|
139 server.start(-1); |
|
140 baseURL = "http://localhost:" + server.identity.primaryPort + "/"; |
|
141 do_print("Using baseURL: " + baseURL); |
|
142 server.registerPathHandler('/', function(metadata, response) { |
|
143 // Wait until the timeout should have passed, then respond. |
|
144 response.processAsync(); |
|
145 |
|
146 do_timeout((kResponseTimeout+1)*1000 /* ms */, function() { |
|
147 response.setStatusLine(metadata.httpVersion, 200, "OK"); |
|
148 response.write("Hello world"); |
|
149 response.finish(); |
|
150 }); |
|
151 }); |
|
152 do_register_cleanup(function() { |
|
153 server.stop(serverStopListener); |
|
154 }); |
|
155 } |
|
156 |
|
157 function run_test() { |
|
158 setup_http_server(); |
|
159 |
|
160 setup_tests(); |
|
161 |
|
162 run_next_test(); |
|
163 } |