Bug 470455 - test_database_sync_embed_visits.js leaks, r=sdwilsh
[wine-gecko.git] / toolkit / mozapps / update / test / unit / head_update.js
blobc3b5b4db416db01166579a9ee1c42b91ed5f58ea
1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Mozilla Public License Version
5  * 1.1 (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS" basis,
10  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11  * for the specific language governing rights and limitations under the
12  * License.
13  *
14  * The Original Code is the Application Update Service.
15  *
16  * The Initial Developer of the Original Code is
17  * Robert Strong <robert.bugzilla@gmail.com>.
18  *
19  * Portions created by the Initial Developer are Copyright (C) 2008
20  * the Mozilla Foundation <http://www.mozilla.org/>. All Rights Reserved.
21  *
22  * Contributor(s):
23  *
24  * Alternatively, the contents of this file may be used under the terms of
25  * either the GNU General Public License Version 2 or later (the "GPL"), or
26  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27  * in which case the provisions of the GPL or the LGPL are applicable instead
28  * of those above. If you wish to allow use of your version of this file only
29  * under the terms of either the GPL or the LGPL, and not to allow others to
30  * use your version of this file under the terms of the MPL, indicate your
31  * decision by deleting the provisions above and replace them with the notice
32  * and other provisions required by the GPL or the LGPL. If you do not delete
33  * the provisions above, a recipient may use your version of this file under
34  * the terms of any one of the MPL, the GPL or the LGPL.
35  *
36  * ***** END LICENSE BLOCK *****
37  */
39 const NS_APP_USER_PROFILE_50_DIR = "ProfD";
40 const NS_APP_PROFILE_DIR_STARTUP = "ProfDS";
42 // const Cc, Ci, and Cr are defined in netwerk/test/httpserver/httpd.js so we
43 // need to define unique ones.
44 const AUS_Cc = Components.classes;
45 const AUS_Ci = Components.interfaces;
46 const AUS_Cr = Components.results;
48 var gAUS           = null;
49 var gUpdateChecker = null;
50 var gPrefs         = null;
51 var gTestserver    = null;
52 var gXHR           = null;
53 var gXHRCallback   = null;
55 /* Initializes the most commonly used global vars used by tests */
56 function startAUS() {
57   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1.0", "2.0");
58   gPrefs = AUS_Cc["@mozilla.org/preferences;1"]
59              .getService(AUS_Ci.nsIPrefBranch);
61   // Enable Update logging (see below)
62   gPrefs.setBoolPref("app.update.log.all", true);
63   // Lessens the noise in the logs when using Update Service logging (see below)
64   gPrefs.setBoolPref("app.update.enabled", false);
65   gPrefs.setBoolPref("extensions.blocklist.enabled", false);
66   gPrefs.setBoolPref("extensions.update.enabled", false);
67   gPrefs.setBoolPref("browser.search.update", false);
68   gPrefs.setBoolPref("browser.microsummary.updateGenerators", false);
70   gAUS = AUS_Cc["@mozilla.org/updates/update-service;1"]
71            .getService(AUS_Ci.nsIApplicationUpdateService);
72   gUpdateChecker = AUS_Cc["@mozilla.org/updates/update-checker;1"]
73                      .createInstance(AUS_Ci.nsIUpdateChecker);
74   // Uncomment the following two lines to log Update Service logging to the
75   // test logs.
77   var os = AUS_Cc["@mozilla.org/observer-service;1"]
78              .getService(AUS_Ci.nsIObserverService);
79   os.notifyObservers(null, "profile-after-change", null);
83 /**
84  * Toggles network offline.
85  *
86  * Be sure to toggle back to online before the test finishes to prevent the
87  * following from being printed to the test's log file.
88  * WARNING: NS_ENSURE_TRUE(thread) failed: file c:/moz/mozilla-central/mozilla/netwerk/base/src/nsSocketTransportService2.cpp, line 115
89  * WARNING: unable to post SHUTDOWN message
90  */
91 function toggleOffline(aOffline) {
92   const ioService = AUS_Cc["@mozilla.org/network/io-service;1"]
93                       .getService(AUS_Ci.nsIIOService);
95   try {
96     ioService.manageOfflineStatus = !aOffline;
97   }
98   catch (e) {
99   }
100   if (ioService.offline != aOffline)
101     ioService.offline = aOffline;
105  * Sets up the bare bones XMLHttpRequest implementation below. 
107  * @param   callback
108  *          The callback function that will call the nsIDomEventListener's
109  *          handleEvent method.
111  *          Example of the callback function
113  *            function callHandleEvent() {
114  *              gXHR.status = gExpectedStatus;
115  *              var e = { target: gXHR };
116  *              gXHR.onload.handleEvent(e);
117  *            }
118  */
119 function overrideXHR(callback) {
120   gXHRCallback = callback;
121   gXHR = new xhr();
122   var registrar = Components.manager.QueryInterface(AUS_Ci.nsIComponentRegistrar);
123   registrar.registerFactory(gXHR.classID, gXHR.classDescription,
124                             gXHR.contractID, gXHR);
128  * Bare bones XMLHttpRequest implementation for testing onprogress, onerror,
129  * and onload nsIDomEventListener handleEvent.
130  */
131 function xhr() {
133 xhr.prototype = {
134   overrideMimeType: function(mimetype) { },
135   setRequestHeader: function(header, value) { },
136   status: null,
137   channel: { set notificationCallbacks(val) { } },
138   _url: null,
139   _method: null,
140   open: function (method, url) { gXHR._method = method; gXHR._url = url; },
141   send: function(body) {
142     do_timeout(0, "gXHRCallback()"); // Use a timeout so the XHR completes
143   },
144   _onprogress: null,
145   set onprogress(val) { gXHR._onprogress = val; },
146   get onprogress() { return gXHR._onprogress; },
147   _onerror: null,
148   set onerror(val) { gXHR._onerror = val; },
149   get onerror() { return gXHR._onerror; },
150   _onload: null,
151   set onload(val) { gXHR._onload = val; },
152   get onload() { return gXHR._onload; },
153   flags: AUS_Ci.nsIClassInfo.SINGLETON,
154   implementationLanguage: AUS_Ci.nsIProgrammingLanguage.JAVASCRIPT,
155   getHelperForLanguage: function(language) null,
156   getInterfaces: function(count) {
157     var interfaces = [AUS_Ci.nsIXMLHttpRequest, AUS_Ci.nsIJSXMLHttpRequest,
158                       AUS_Ci.nsIXMLHttpRequestEventTarget];
159     count.value = interfaces.length;
160     return interfaces;
161   },
162   classDescription: "XMLHttpRequest",
163   contractID: "@mozilla.org/xmlextras/xmlhttprequest;1",
164   classID: Components.ID("{c9b37f43-4278-4304-a5e0-600991ab08cb}"),
165   createInstance: function (outer, aIID) {
166     if (outer != null)
167       throw AUS_Cr.NS_ERROR_NO_AGGREGATION;
168     return gXHR.QueryInterface(aIID);
169   },
170   QueryInterface: function(aIID) {
171     if (aIID.equals(AUS_Ci.nsIXMLHttpRequest) ||
172         aIID.equals(AUS_Ci.nsIJSXMLHttpRequest) ||
173         aIID.equals(AUS_Ci.nsIXMLHttpRequestEventTarget) ||
174         aIID.equals(AUS_Ci.nsIClassInfo) ||
175         aIID.equals(AUS_Ci.nsISupports))
176       return gXHR;
177     throw AUS_Cr.NS_ERROR_NO_INTERFACE;
178   }
182  * Removes the updates directory and the active-update.xml file if they exist.
183  * This prevents some tests from failing due to files being left behind when
184  * the tests are interrupted.
185  */
186 function remove_dirs_and_files () {
187   var fileLocator = AUS_Cc["@mozilla.org/file/directory_service;1"]
188                       .getService(AUS_Ci.nsIProperties);
189   var dir = fileLocator.get("XCurProcD", AUS_Ci.nsIFile);
191   var file = dir.clone();
192   file.append("active-update.xml");
193   if (file.exists())
194     file.remove(false);
196   file = dir.clone();
197   file.append("updates.xml");
198   if (file.exists())
199     file.remove(false);
201   file = dir.clone();
202   file.append("updates");
203   file.append("last-update.log");
204   try {
205     if (file.exists())
206       file.remove(false);
207   }
208   catch (e) {
209   }
211   file = dir.clone();
212   file.append("updates");
213   file.append("0");
214   file.append("update.mar");
215   try {
216     if (file.exists())
217       file.remove(false);
218   }
219   catch (e) {
220   }
222   file = dir.clone();
223   file.append("updates");
224   file.append("0");
225   file.append("update.status");
226   try {
227     if (file.exists())
228       file.remove(false);
229   }
230   catch (e) {
231   }
233   // This fails sporadically on Mac OS X so wrap it in a try catch
234   dir.append("updates");
235   try {
236     if (dir.exists())
237       dir.remove(true);
238   }
239   catch (e) {
240   }
244  * Helper for starting the http server used by the tests
245  * @param   aRelativeDirName
246  *          The directory name to register relative to
247  *          toolkit/mozapps/update/test/unit/
248  */
249 function start_httpserver(aRelativeDirName) {
250   do_import_script("netwerk/test/httpserver/httpd.js");
251   gTestserver = new nsHttpServer();
252   gTestserver.registerDirectory("/data/", do_get_file("toolkit/mozapps/update/test/unit/" + aRelativeDirName));
253   gTestserver.start(4444);
256 /* Helper for stopping the http server used by the tests */
257 function stop_httpserver() {
258   gTestserver.stop();
262  * Creates an nsIXULAppInfo
263  * @param   id
264  *          The ID of the test application
265  * @param   name
266  *          A name for the test application
267  * @param   version
268  *          The version of the application
269  * @param   platformVersion
270  *          The gecko version of the application
271  */
272 function createAppInfo(id, name, version, platformVersion)
274   const XULAPPINFO_CONTRACTID = "@mozilla.org/xre/app-info;1";
275   const XULAPPINFO_CID = Components.ID("{c763b610-9d49-455a-bbd2-ede71682a1ac}");
276   var XULAppInfo = {
277     vendor: "Mozilla",
278     name: name,
279     ID: id,
280     version: version,
281     appBuildID: "2007010101",
282     platformVersion: platformVersion,
283     platformBuildID: "2007010101",
284     inSafeMode: false,
285     logConsoleErrors: true,
286     OS: "XPCShell",
287     XPCOMABI: "noarch-spidermonkey",
289     QueryInterface: function QueryInterface(iid) {
290       if (iid.equals(AUS_Ci.nsIXULAppInfo) ||
291           iid.equals(AUS_Ci.nsIXULRuntime) ||
292           iid.equals(AUS_Ci.nsISupports))
293         return this;
294     
295       throw AUS_Cr.NS_ERROR_NO_INTERFACE;
296     }
297   };
298   
299   var XULAppInfoFactory = {
300     createInstance: function (outer, iid) {
301       if (outer != null)
302         throw AUS_Cr.NS_ERROR_NO_AGGREGATION;
303       return XULAppInfo.QueryInterface(iid);
304     }
305   };
307   var registrar = Components.manager.QueryInterface(AUS_Ci.nsIComponentRegistrar);
308   registrar.registerFactory(XULAPPINFO_CID, "XULAppInfo",
309                             XULAPPINFO_CONTRACTID, XULAppInfoFactory);
312 // Use a custom profile dir to keep the bin dir clean... not necessary but nice
313 var gDirSvc = AUS_Cc["@mozilla.org/file/directory_service;1"].
314              getService(AUS_Ci.nsIProperties);
315 var gTestRoot = gDirSvc.get("CurProcD", AUS_Ci.nsILocalFile);
316 gTestRoot = gTestRoot.parent.parent;
317 gTestRoot.append("_tests");
318 gTestRoot.append("xpcshell-simple");
319 gTestRoot.append("test_update");
320 gTestRoot.normalize();
322 // Create and register a profile directory.
323 var gProfD = gTestRoot.clone();
324 gProfD.append("profile");
325 if (gProfD.exists())
326   gProfD.remove(true);
327 gProfD.create(AUS_Ci.nsIFile.DIRECTORY_TYPE, 0755);
329 var dirProvider = {
330   getFile: function(prop, persistent) {
331     persistent.value = true;
332     if (prop == NS_APP_USER_PROFILE_50_DIR ||
333         prop == NS_APP_PROFILE_DIR_STARTUP)
334       return gProfD.clone();
335     return null;
336   },
337   QueryInterface: function(iid) {
338     if (iid.equals(AUS_Ci.nsIDirectoryServiceProvider) ||
339         iid.equals(AUS_Ci.nsISupports)) {
340       return this;
341     }
342     throw AUS_Cr.NS_ERROR_NO_INTERFACE;
343   }
345 gDirSvc.QueryInterface(AUS_Ci.nsIDirectoryService).registerProvider(dirProvider);
347 remove_dirs_and_files();