Bug 694728 - Sync: Log Status transitions. r=philikon
authorRichard Newman <rnewman@mozilla.com>
Sat, 15 Oct 2011 15:29:11 -0700
changeset 79086 47950c8ae523664dc1d170fff85c99fec14bcaa6
parent 79085 d9281069d6b824361e8a772e5d18edb9b21faf29
child 79087 a0a374e2976c55d3e43ddf45585b07f43b465436
push id247
push usertim.taubert@gmx.de
push dateSat, 22 Oct 2011 19:08:15 +0000
treeherderfx-team@72bb20c484a2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersphilikon
bugs694728
milestone10.0a1
Bug 694728 - Sync: Log Status transitions. r=philikon
services/sync/modules/status.js
services/sync/services-sync.js
services/sync/tests/unit/test_service_detect_upgrade.js
--- a/services/sync/modules/status.js
+++ b/services/sync/modules/status.js
@@ -12,16 +12,17 @@
 * The Original Code is Weave Status.
 *
 * The Initial Developer of the Original Code is Mozilla Corporation.
 * Portions created by the Initial Developer are Copyright (C) 2009 the Initial
 * Developer. All Rights Reserved.
 *
 * Contributor(s):
 *  Edward Lee <edilee@mozilla.com> (original author)
+*  Richard Newman <rnewman@mozilla.com>
 *
 * 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
@@ -35,46 +36,81 @@
 const EXPORTED_SYMBOLS = ["Status"];
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cr = Components.results;
 const Cu = Components.utils;
 
 Cu.import("resource://services-sync/constants.js");
+Cu.import("resource://services-sync/log4moz.js");
+Cu.import("resource://gre/modules/Services.jsm");
 
 let Status = {
+  _log: Log4Moz.repository.getLogger("Sync.Status"),
   ready: false,
 
-  get login() this._login,
+  get service() {
+    return this._service;
+  },
+
+  set service(code) {
+    this._log.debug("Status.service: " + this._service + " => " + code);
+    this._service = code;
+  },
+
+  get login() {
+    return this._login;
+  },
+
   set login(code) {
+    this._log.debug("Status.login: " + this._login + " => " + code);
     this._login = code;
 
     if (code == LOGIN_FAILED_NO_USERNAME || 
         code == LOGIN_FAILED_NO_PASSWORD || 
-        code == LOGIN_FAILED_NO_PASSPHRASE)
+        code == LOGIN_FAILED_NO_PASSPHRASE) {
       this.service = CLIENT_NOT_CONFIGURED;      
-    else if (code != LOGIN_SUCCEEDED)
+    } else if (code != LOGIN_SUCCEEDED) {
       this.service = LOGIN_FAILED;
-    else
+    } else {
       this.service = STATUS_OK;
+    }
   },
 
-  get sync() this._sync,
+  get sync() {
+    return this._sync;
+  },
+
   set sync(code) {
+    this._log.debug("Status.sync: " + this._sync + " => " + code);
     this._sync = code;
     this.service = code == SYNC_SUCCEEDED ? STATUS_OK : SYNC_FAILED;
   },
 
-  get engines() this._engines,
+  get engines() {
+    return this._engines;
+  },
+
   set engines([name, code]) {
+    this._log.debug("Status for engine " + name + ": " + code);
     this._engines[name] = code;
 
-    if (code != ENGINE_SUCCEEDED)
+    if (code != ENGINE_SUCCEEDED) {
       this.service = SYNC_FAILED_PARTIAL;
+    }
+  },
+
+  // Implement toString because adding a logger introduces a cyclic object
+  // value, so we can't trivially debug-print Status as JSON.
+  toString: function toString() {
+    return "<Status" +
+           ": login: "   + Status.login +
+           ", service: " + Status.service +
+           ", sync: "    + Status.sync + ">";
   },
 
   checkSetup: function checkSetup() {
     // Check whether we have a username without importing The World(tm).
     let prefs = Cc["@mozilla.org/preferences-service;1"]
                 .getService(Ci.nsIPrefService)
                 .getBranch(PREFS_BRANCH);
     let username;
@@ -87,46 +123,60 @@ let Status = {
       return Status.service;
     }
 
     Cu.import("resource://services-sync/util.js");
     Cu.import("resource://services-sync/identity.js");
     Cu.import("resource://services-sync/record.js");
     if (!Utils.mpLocked()) {
       let id = ID.get("WeaveID");
-      if (!id)
+      if (!id) {
         id = ID.set("WeaveID", new Identity(PWDMGR_PASSWORD_REALM, username));
+      }
 
       if (!id.password) {
         Status.login = LOGIN_FAILED_NO_PASSWORD;
         return Status.service;
       }
 
       id = ID.get("WeaveCryptoID");
-      if (!id)
+      if (!id) {
         id = ID.set("WeaveCryptoID",
                     new SyncKeyBundle(PWDMGR_PASSPHRASE_REALM, username));
+      }
 
       if (!id.keyStr) {
         Status.login = LOGIN_FAILED_NO_PASSPHRASE;
         return Status.service;
       }
     }
     return Status.service = STATUS_OK;
   },
 
   resetBackoff: function resetBackoff() {
     this.enforceBackoff = false;
     this.backoffInterval = 0;
     this.minimumNextSync = 0;
   },
+
   resetSync: function resetSync() {
+    // Logger setup.
+    let logPref = PREFS_BRANCH + "log.logger.status";
+    let logLevel = "Trace";
+    try {
+      logLevel = Services.prefs.getCharPref(logPref);
+    } catch (ex) {
+      // Use default.
+    }
+    this._log.level = Log4Moz.Level[logLevel];
+
+    this._log.info("Resetting Status.");
     this.service = STATUS_OK;
     this._login = LOGIN_SUCCEEDED;
     this._sync = SYNC_SUCCEEDED;
     this._engines = {};
     this.partial = false;
-  },
+  }
 };
 
-// Initialize various status values
+// Initialize various status values.
 Status.resetBackoff();
 Status.resetSync();
--- a/services/sync/services-sync.js
+++ b/services/sync/services-sync.js
@@ -33,16 +33,17 @@ pref("services.sync.jpake.maxTries", 10)
 pref("services.sync.log.appender.console", "Warn");
 pref("services.sync.log.appender.dump", "Error");
 pref("services.sync.log.appender.file.level", "Trace");
 pref("services.sync.log.appender.file.logOnError", true);
 pref("services.sync.log.appender.file.logOnSuccess", false);
 pref("services.sync.log.appender.file.maxErrorAge", 864000); // 10 days
 pref("services.sync.log.rootLogger", "Debug");
 pref("services.sync.log.logger.service.main", "Debug");
+pref("services.sync.log.logger.status", "Debug");
 pref("services.sync.log.logger.authenticator", "Debug");
 pref("services.sync.log.logger.network.resources", "Debug");
 pref("services.sync.log.logger.service.jpakeclient", "Debug");
 pref("services.sync.log.logger.engine.bookmarks", "Debug");
 pref("services.sync.log.logger.engine.clients", "Debug");
 pref("services.sync.log.logger.engine.forms", "Debug");
 pref("services.sync.log.logger.engine.history", "Debug");
 pref("services.sync.log.logger.engine.passwords", "Debug");
--- a/services/sync/tests/unit/test_service_detect_upgrade.js
+++ b/services/sync/tests/unit/test_service_detect_upgrade.js
@@ -278,17 +278,17 @@ add_test(function v5_upgrade() {
     
     _("Logging in.");
     try {
       Weave.Service.login("johndoe", "ilovejane", passphrase);
     }
     catch (e) {
       _("Exception: " + e);
     }
-    _("Status: " + JSON.stringify(Status));
+    _("Status: " + Status);
     do_check_false(Weave.Service.isLoggedIn);
     do_check_eq(VERSION_OUT_OF_DATE, Status.sync);
 
     // Clean up.
     Weave.Service.startOver();
     
   } finally {
     Weave.Svc.Prefs.resetBranch("");