|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 Cu.import("resource://gre/modules/Log.jsm"); |
|
6 Cu.import("resource://services-common/utils.js"); |
|
7 Cu.import("resource://testing-common/httpd.js"); |
|
8 Cu.import("resource://testing-common/services-common/logging.js"); |
|
9 |
|
10 let btoa = Cu.import("resource://gre/modules/Log.jsm").btoa; |
|
11 let atob = Cu.import("resource://gre/modules/Log.jsm").atob; |
|
12 |
|
13 function do_check_empty(obj) { |
|
14 do_check_attribute_count(obj, 0); |
|
15 } |
|
16 |
|
17 function do_check_attribute_count(obj, c) { |
|
18 do_check_eq(c, Object.keys(obj).length); |
|
19 } |
|
20 |
|
21 function do_check_throws(aFunc, aResult, aStack) { |
|
22 if (!aStack) { |
|
23 try { |
|
24 // We might not have a 'Components' object. |
|
25 aStack = Components.stack.caller; |
|
26 } catch (e) {} |
|
27 } |
|
28 |
|
29 try { |
|
30 aFunc(); |
|
31 } catch (e) { |
|
32 do_check_eq(e.result, aResult, aStack); |
|
33 return; |
|
34 } |
|
35 do_throw("Expected result " + aResult + ", none thrown.", aStack); |
|
36 } |
|
37 |
|
38 |
|
39 /** |
|
40 * Test whether specified function throws exception with expected |
|
41 * result. |
|
42 * |
|
43 * @param func |
|
44 * Function to be tested. |
|
45 * @param message |
|
46 * Message of expected exception. <code>null</code> for no throws. |
|
47 */ |
|
48 function do_check_throws_message(aFunc, aResult) { |
|
49 try { |
|
50 aFunc(); |
|
51 } catch (e) { |
|
52 do_check_eq(e.message, aResult); |
|
53 return; |
|
54 } |
|
55 do_throw("Expected an error, none thrown."); |
|
56 } |
|
57 |
|
58 /** |
|
59 * Print some debug message to the console. All arguments will be printed, |
|
60 * separated by spaces. |
|
61 * |
|
62 * @param [arg0, arg1, arg2, ...] |
|
63 * Any number of arguments to print out |
|
64 * @usage _("Hello World") -> prints "Hello World" |
|
65 * @usage _(1, 2, 3) -> prints "1 2 3" |
|
66 */ |
|
67 let _ = function(some, debug, text, to) print(Array.slice(arguments).join(" ")); |
|
68 |
|
69 function httpd_setup (handlers, port=-1) { |
|
70 let server = new HttpServer(); |
|
71 for (let path in handlers) { |
|
72 server.registerPathHandler(path, handlers[path]); |
|
73 } |
|
74 try { |
|
75 server.start(port); |
|
76 } catch (ex) { |
|
77 _("=========================================="); |
|
78 _("Got exception starting HTTP server on port " + port); |
|
79 _("Error: " + CommonUtils.exceptionStr(ex)); |
|
80 _("Is there a process already listening on port " + port + "?"); |
|
81 _("=========================================="); |
|
82 do_throw(ex); |
|
83 } |
|
84 |
|
85 // Set the base URI for convenience. |
|
86 let i = server.identity; |
|
87 server.baseURI = i.primaryScheme + "://" + i.primaryHost + ":" + i.primaryPort; |
|
88 |
|
89 return server; |
|
90 } |
|
91 |
|
92 function httpd_handler(statusCode, status, body) { |
|
93 return function handler(request, response) { |
|
94 _("Processing request"); |
|
95 // Allow test functions to inspect the request. |
|
96 request.body = readBytesFromInputStream(request.bodyInputStream); |
|
97 handler.request = request; |
|
98 |
|
99 response.setStatusLine(request.httpVersion, statusCode, status); |
|
100 if (body) { |
|
101 response.bodyOutputStream.write(body, body.length); |
|
102 } |
|
103 }; |
|
104 } |
|
105 |
|
106 /* |
|
107 * Read bytes string from an nsIInputStream. If 'count' is omitted, |
|
108 * all available input is read. |
|
109 */ |
|
110 function readBytesFromInputStream(inputStream, count) { |
|
111 return CommonUtils.readBytesFromInputStream(inputStream, count); |
|
112 } |
|
113 |
|
114 /* |
|
115 * Ensure exceptions from inside callbacks leads to test failures. |
|
116 */ |
|
117 function ensureThrows(func) { |
|
118 return function() { |
|
119 try { |
|
120 func.apply(this, arguments); |
|
121 } catch (ex) { |
|
122 do_throw(ex); |
|
123 } |
|
124 }; |
|
125 } |
|
126 |
|
127 /** |
|
128 * Proxy auth helpers. |
|
129 */ |
|
130 |
|
131 /** |
|
132 * Fake a PAC to prompt a channel replacement. |
|
133 */ |
|
134 let PACSystemSettings = { |
|
135 CID: Components.ID("{5645d2c1-d6d8-4091-b117-fe7ee4027db7}"), |
|
136 contractID: "@mozilla.org/system-proxy-settings;1", |
|
137 |
|
138 QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, |
|
139 Ci.nsISystemProxySettings]), |
|
140 |
|
141 createInstance: function createInstance(outer, iid) { |
|
142 if (outer) { |
|
143 throw Cr.NS_ERROR_NO_AGGREGATION; |
|
144 } |
|
145 return this.QueryInterface(iid); |
|
146 }, |
|
147 |
|
148 lockFactory: function lockFactory(lock) { |
|
149 throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
|
150 }, |
|
151 |
|
152 // Replace this URI for each test to avoid caching. We want to ensure that |
|
153 // each test gets a completely fresh setup. |
|
154 mainThreadOnly: true, |
|
155 PACURI: null, |
|
156 getProxyForURI: function getProxyForURI(aURI) { |
|
157 throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
|
158 } |
|
159 }; |
|
160 |
|
161 function installFakePAC() { |
|
162 _("Installing fake PAC."); |
|
163 Cm.nsIComponentRegistrar |
|
164 .registerFactory(PACSystemSettings.CID, |
|
165 "Fake system proxy-settings", |
|
166 PACSystemSettings.contractID, |
|
167 PACSystemSettings); |
|
168 } |
|
169 |
|
170 function uninstallFakePAC() { |
|
171 _("Uninstalling fake PAC."); |
|
172 let CID = PACSystemSettings.CID; |
|
173 Cm.nsIComponentRegistrar.unregisterFactory(CID, PACSystemSettings); |
|
174 } |
|
175 |
|
176 // Many tests do service.startOver() and don't expect the provider type to |
|
177 // change (whereas by default, a startOver will do exactly that so FxA is |
|
178 // subsequently used). The tests that know how to deal with |
|
179 // the Firefox Accounts identity hack things to ensure that still works. |
|
180 function ensureStartOverKeepsIdentity() { |
|
181 Cu.import("resource://gre/modules/Services.jsm"); |
|
182 Services.prefs.setBoolPref("services.sync-testing.startOverKeepIdentity", true); |
|
183 do_register_cleanup(function() { |
|
184 Services.prefs.clearUserPref("services.sync-testing.startOverKeepIdentity"); |
|
185 }); |
|
186 } |
|
187 ensureStartOverKeepsIdentity(); |