Bug 1221187: testing/marionette: Set log level from preference; r?automatedtester draft
authorAndreas Tolfsen <ato@mozilla.com>
Sat, 02 Jan 2016 15:08:54 +0000
changeset 320980 c347687c3163e4144da83b52075c20c617e3c2a2
parent 320979 29fb9dd8cf23bff3b80e19d28dc0c5d9dd5ef52d
child 320981 1a8aa23b77dfd4efac81a307d22a79c0a36a061c
push id9315
push useratolfsen@mozilla.com
push dateTue, 12 Jan 2016 19:08:25 +0000
reviewersautomatedtester
bugs1221187
milestone46.0a1
Bug 1221187: testing/marionette: Set log level from preference; r?automatedtester This change allows the logging level for Marionette to be set using a preference. This lets an out-of-process program control Marionette's logging level. It also changes the logging defaults to print log messages with the level Log.Level.Info and above for optimised builds, and Log.Level.Trace and above for non-optimised/debug builds. The log level can be set through the marionette.logging preference. It holds a string value that needs to correspond to a level defined in toolkit/modules/Log.jsm's Log.Level enum.
testing/marionette/components/marionettecomponent.js
testing/marionette/dispatcher.js
--- a/testing/marionette/components/marionettecomponent.js
+++ b/testing/marionette/components/marionettecomponent.js
@@ -14,54 +14,65 @@ const ENABLED_PREF = "marionette.default
 const PORT_PREF = "marionette.defaultPrefs.port";
 const FORCELOCAL_PREF = "marionette.force-local";
 const LOG_PREF = "marionette.logging";
 
 const ServerSocket = CC("@mozilla.org/network/server-socket;1",
     "nsIServerSocket",
     "initSpecialConnection");
 
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/FileUtils.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
+Cu.import("resource://gre/modules/Preferences.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 function MarionetteComponent() {
   this.loaded_ = false;
   this.observerService = Services.obs;
-
-  this.logger = Log.repository.getLogger("Marionette");
-  this.logger.level = Log.Level.Trace;
-  let dumper = false;
-#ifdef DEBUG
-  dumper = true;
-#endif
-#ifdef MOZ_B2G
-  dumper = true;
-#endif
-  try {
-    if (dumper || Services.prefs.getBoolPref(LOG_PREF)) {
-      let formatter = new Log.BasicFormatter();
-      this.logger.addAppender(new Log.DumpAppender(formatter));
-    }
-  } catch(e) {}
+  this.logger = this.setupLogger_(this.determineLoggingLevel_());
 }
 
 MarionetteComponent.prototype = {
   classDescription: "Marionette component",
   classID: MARIONETTE_CID,
   contractID: MARIONETTE_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler, Ci.nsIObserver]),
   _xpcom_categories: [
     {category: "command-line-handler", entry: "b-marionette"},
     {category: "profile-after-change", service: true}
   ],
   enabled: false,
   finalUiStartup: false,
-  server: null
+  server: null,
+};
+
+MarionetteComponent.prototype.setupLogger_ = function(level) {
+  let log = Log.repository.getLogger("Marionette");
+  log.level = level;
+  log.addAppender(new Log.DumpAppender());
+  return log;
+};
+
+MarionetteComponent.prototype.determineLoggingLevel_ = function() {
+  let level = Log.Level.Info;
+#ifdef DEBUG
+  level = Log.Level.Trace;
+#endif
+
+  // marionette.logging pref can override default
+  // with an entry from the Log.Level enum
+  if (Preferences.has(LOG_PREF)) {
+    let s = Preferences.get(LOG_PREF);
+    s = s.toLowerCase();
+    s = s.charAt(0).toUpperCase() + s.slice(1);
+    level = Log.Level[s];
+  }
+
+  return level;
 };
 
 MarionetteComponent.prototype.onSocketAccepted = function(
     socket, transport) {
   this.logger.info("onSocketAccepted for Marionette dummy socket");
 };
 
 MarionetteComponent.prototype.onStopListening = function(socket, status) {
@@ -69,33 +80,33 @@ MarionetteComponent.prototype.onStopList
   socket.close();
 };
 
 /** Check cmdLine argument for {@code --marionette}. */
 MarionetteComponent.prototype.handle = function(cmdLine) {
   // if the CLI is there then lets do work otherwise nothing to see
   if (cmdLine.handleFlag("marionette", false)) {
     this.enabled = true;
-    this.logger.info("Marionette enabled via command-line flag");
+    this.logger.debug("Marionette enabled via command-line flag");
     this.init();
   }
 };
 
 MarionetteComponent.prototype.observe = function(subj, topic, data) {
   switch (topic) {
     case "profile-after-change":
       // Using final-ui-startup as the xpcom category doesn't seem to work,
       // so we wait for that by adding an observer here.
       this.observerService.addObserver(this, "final-ui-startup", false);
 #ifdef ENABLE_MARIONETTE
       try {
         this.enabled = Services.prefs.getBoolPref(ENABLED_PREF);
       } catch(e) {}
       if (this.enabled) {
-        this.logger.info("Marionette enabled via build flag and pref");
+        this.logger.debug("Marionette enabled via build flag and pref");
 
         // We want to suppress the modal dialog that's shown
         // when starting up in safe-mode to enable testing.
         if (Services.appinfo.inSafeMode) {
           this.observerService.addObserver(this, "domwindowopened", false);
         }
       }
 #endif
--- a/testing/marionette/dispatcher.js
+++ b/testing/marionette/dispatcher.js
@@ -231,15 +231,12 @@ Dispatcher.prototype.sendMessage = funct
  * @param {Object} payload
  *     The payload to ship.
  */
 Dispatcher.prototype.sendRaw = function(payload) {
   this.conn.send(payload);
 };
 
 Dispatcher.prototype.log_ = function(msg) {
-  if (logger.level > Log.Level.Debug) {
-    return;
-  }
   let a = (msg.origin == MessageOrigin.Client ? " -> " : " <- ");
   let s = JSON.stringify(msg.toMsg());
   logger.trace(this.connId + a + s);
 };