Bug 486275 - active-update.xml is not saved after a channel change which leaves behind cruft. r=dtownsend
authorRobert Strong <robert.bugzilla@gmail.com>
Tue, 19 May 2009 13:24:26 -0700
changeset 28597 371be45fedd12ba2d504cc610c6afed77dcae2b4
parent 28596 cc733691a549236790d5219a4bd6182133796ae2
child 28598 25483465753c6d48865e8d00048384d90395b984
push id7135
push userrstrong@mozilla.com
push dateTue, 19 May 2009 20:25:22 +0000
treeherdermozilla-central@25483465753c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdtownsend
bugs486275
milestone1.9.2a1pre
Bug 486275 - active-update.xml is not saved after a channel change which leaves behind cruft. r=dtownsend
toolkit/mozapps/update/src/nsUpdateService.js.in
toolkit/mozapps/update/test/unit/test_0063_manager.js
--- a/toolkit/mozapps/update/src/nsUpdateService.js.in
+++ b/toolkit/mozapps/update/src/nsUpdateService.js.in
@@ -1932,16 +1932,17 @@ UpdateManager.prototype = {
    * See nsIUpdateService.idl
    */
   get activeUpdate() {
     if (this._activeUpdate &&
         this._activeUpdate.channel != getUpdateChannel()) {
       // User switched channels, clear out any old active updates and remove
       // partial downloads
       this._activeUpdate = null;
+      this.saveUpdates();
 
       // Destroy the updates directory, since we're done with it.
       cleanUpUpdatesDir();
     }
     return this._activeUpdate;
   },
   set activeUpdate(activeUpdate) {
     this._addUpdate(activeUpdate);
@@ -2023,16 +2024,17 @@ UpdateManager.prototype = {
    * See nsIUpdateService.idl
    */
   saveUpdates: function UM_saveUpdates() {
     this._writeUpdatesToXMLFile([this._activeUpdate],
                                 getUpdateFile([FILE_UPDATE_ACTIVE]));
     if (this._activeUpdate)
       this._addUpdate(this._activeUpdate);
 
+    this._ensureUpdates();
     // Don't write updates that have a temporary state to the updates.xml file.
     if (this._updates) {
       let updates = this._updates.slice();
       for (let i = updates.length - 1; i >= 0; --i) {
         let state = updates[i].state;
         if (state == STATE_NONE || state == STATE_DOWNLOADING ||
             state == STATE_PENDING) {
           updates.splice(i, 1);
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/update/test/unit/test_0063_manager.js
@@ -0,0 +1,78 @@
+/* ***** 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 <robert.bugzilla@gmail.com>.
+ *
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Mozilla Foundation <http://www.mozilla.org/>. 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 *****
+ */
+
+/* General Update Manager Tests */
+
+function run_test() {
+  dump("Testing: removing an active update for a channel that is not valid" +
+       "due to switching channels - bug 486275\n");
+  removeUpdateDirsAndFiles();
+  var defaults = getPrefBranch().QueryInterface(AUS_Ci.nsIPrefService).
+                 getDefaultBranch(null);
+  defaults.setCharPref("app.update.channel", "original_channel");
+
+  var patches = getLocalPatchString(null, null, null, null, null, null,
+                                    STATE_FAILED);
+  var updates = getLocalUpdateString(patches, "Existing", null, "3.0", "3.0",
+                                     "3.0", null, null, null, null, null,
+                                     getString("patchApplyFailure"));
+  writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), false);
+
+  patches = getLocalPatchString(null, null, null, null, null, null,
+                                STATE_DOWNLOADING);
+  updates = getLocalUpdateString(patches, null, null, "1.0", null, "1.0", null,
+                                 null, null, URL_HOST + DIR_DATA + "/empty.mar");
+  writeUpdatesToXMLFile(getLocalUpdatesXMLString(updates), true);
+  writeStatusFile(STATE_DOWNLOADING);
+
+  startAUS();
+  startUpdateManager();
+
+  do_check_eq(gUpdateManager.updateCount, 1);
+  var update = gUpdateManager.getUpdateAt(0);
+  do_check_eq(update.name, "Existing");
+
+  do_check_eq(gUpdateManager.activeUpdate, null);
+  // Verify that the active-update.xml file has had the update from the old
+  // channel removed.
+  var file = getCurrentProcessDir();
+  file.append(FILE_UPDATE_ACTIVE);
+  dump("Testing: verifying contents of " + FILE_UPDATE_ACTIVE + "\n");
+  do_check_eq(readFile(file), getLocalUpdatesXMLString(""));
+  cleanUp();
+}