From 968148b9114cd765da07e2171f0e852eecbca35f Mon Sep 17 00:00:00 2001 From: Robert Strong Date: Tue, 23 Jun 2009 12:16:45 -0700 Subject: [PATCH] Test only - Bug 497578 - Fallback upgrade ends in endless loop of downloading partial upgrades when Private Browsing auto-start is enabled. r=dtownsend --- .../update/test/unit/test_bug497578.js | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 toolkit/mozapps/update/test/unit/test_bug497578.js diff --git a/toolkit/mozapps/update/test/unit/test_bug497578.js b/toolkit/mozapps/update/test/unit/test_bug497578.js new file mode 100644 index 000000000000..8ff308e48b7d --- /dev/null +++ b/toolkit/mozapps/update/test/unit/test_bug497578.js @@ -0,0 +1,156 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is the Application Update Service. + * + * The Initial Developer of the Original Code is + * Robert Strong . + * + * Portions created by the Initial Developer are Copyright (C) 2009 + * the Mozilla Foundation . All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** + */ + +/** + * Bug 497578 - begin download of a complete update after a failure applying a + * partial update. + */ + +const PRIVATEBROWSING_CONTRACT_ID = "@mozilla.org/privatebrowsing;1"; + +function run_test() { + // Return early if Private Browsing is unavailable. + if (!(PRIVATEBROWSING_CONTRACT_ID in AUS_Cc)) + return; + + do_test_pending(); + dump("Testing: Bug 497578 - begin download of a complete update after a " + + "failure to apply a partial update\n"); + + removeUpdateDirsAndFiles(); + + var registrar = Components.manager.QueryInterface(AUS_Ci.nsIComponentRegistrar); + registrar.registerFactory(Components.ID("{1dfeb90a-2193-45d5-9cb8-864928b2af55}"), + "Fake Window Watcher", + "@mozilla.org/embedcomp/window-watcher;1", + WindowWatcherFactory); + + var pb = getPrefBranch(); + // Enable automatic app update so that after the failed partial is found the + // complete update will start to download automatically. + pb.setBoolPref("app.update.enabled", true); + pb.setBoolPref("browser.privatebrowsing.autostart", true); + + var defaults = pb.QueryInterface(AUS_Ci.nsIPrefService).getDefaultBranch(null); + defaults.setCharPref("app.update.channel", "bogus_channel"); + + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1.0", "2.0"); + setDefaultPrefs(); + do_timeout(0, "run_test_pt1()"); +} + +function end_test() { + do_test_finished(); + // Call the app update service's observe method with xpcom-shutdown to force + // updating the active-update.xml and updates.xml files so they don't contain + // updates. + gAUS.observe(null, "xpcom-shutdown", ""); + cleanUp(); +} + +function run_test_pt1() { + writeUpdatesToXMLFile(getLocalUpdatesXMLString(""), false); + var url = URL_HOST + DIR_DATA + "/partial.mar"; + var patches = getLocalPatchString("partial", url, null, null, null, null, + STATE_FAILED) + + getLocalPatchString(null, null, null, null, null, null, + STATE_NONE); + var updates = getLocalUpdateString(patches, false, null, "1.0", null, "1.0", + null, null, null, + URL_HOST + DIR_DATA + "/partial.mar"); + writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true); + writeStatusFile(STATE_FAILED); + + // This test needs to call the observe method for private browsing + // and app update instead of using notifyObserver to control when their code + // executes. To accomplish this startAUS can't be used so gAUS is set here. + gAUS = AUS_Cc["@mozilla.org/updates/update-service;1"]. + getService(AUS_Ci.nsIApplicationUpdateService). + QueryInterface(AUS_Ci.nsIObserver); + startUpdateManager(); + + var privBrowsing = AUS_Cc[PRIVATEBROWSING_CONTRACT_ID]. + getService(AUS_Ci.nsIPrivateBrowsingService). + QueryInterface(AUS_Ci.nsIObserver); + + gAUS.observe(null, "profile-after-change", ""); + privBrowsing.observe(null, "profile-after-change", ""); + dump("Testing: private mode should be entered automatically\n"); + do_check_true(privBrowsing.privateBrowsingEnabled); + + dump("Testing: private browsing is auto-started\n"); + do_check_true(privBrowsing.autoStarted); + + // Use a timeout to give private browsing time to reset necko. + do_timeout(0, "run_test_pt2()"); +} +function run_test_pt2() { + gAUS.observe(null, "final-ui-startup", ""); + + dump("Testing: update count should equal 1\n"); + do_check_eq(gUpdateManager.updateCount, 1); + dump("Testing: activeUpdate should not equal null\n"); + do_check_neq(gUpdateManager.activeUpdate, null); + dump("Testing: activeUpdate.state should not equal null\n"); + do_check_neq(gUpdateManager.activeUpdate.state, null); + dump("Testing: activeUpdate.state should equal STATE_DOWNLOADING\n"); + do_check_eq(gUpdateManager.activeUpdate.state, STATE_DOWNLOADING); + end_test(); +} + +// Prevent the attempt to display the Update wizard for the failed update +var WindowWatcher = { + openWindow: function(parent, url, name, features, args) { + }, + + QueryInterface: function(iid) { + if (iid.equals(AUS_Ci.nsIWindowWatcher) + || iid.equals(AUS_Ci.nsISupports)) + return this; + + throw AUS_Cr.NS_ERROR_NO_INTERFACE; + } +} + +var WindowWatcherFactory = { + createInstance: function createInstance(outer, iid) { + if (outer != null) + throw AUS_Cr.NS_ERROR_NO_AGGREGATION; + return WindowWatcher.QueryInterface(iid); + } +};