metrics: Add guest mode detection to metrics library and client

Change-Id: I2c27bd999330395ba3568820ea76198b202bd7f4

BUG=7203
TEST=Verify metrics_client -c and -g toggling consent and guest mode.

Review URL: http://codereview.chromium.org/3571009
diff --git a/metrics/metrics_client.cc b/metrics/metrics_client.cc
index e85c4d4..ce22e98 100644
--- a/metrics/metrics_client.cc
+++ b/metrics/metrics_client.cc
@@ -7,63 +7,29 @@
 
 #include "metrics_library.h"
 
-int main(int argc, char** argv) {
-  bool send_to_autotest = false;
-  bool send_to_chrome = true;
-  bool send_enum = false;
-  bool secs_to_msecs = false;
-  int name_index = 1;
-  bool print_usage = false;
+void ShowUsage() {
+  fprintf(stderr,
+          "Usage:  metrics_client [-ab] [-t] name sample min max nbuckets\n"
+          "        metrics_client [-ab] -e   name sample max\n"
+          "        metrics_client [-cg]\n"
+          "\n"
+          "  default: send metric with integer values to Chrome only\n"
+          "           |min| > 0, |min| <= sample < |max|\n"
+          "  -a: send metric (name/sample) to Autotest only\n"
+          "  -b: send metric to both Chrome and Autotest\n"
+          "  -c: return exit status 0 if user consents to stats, 1 otherwise\n"
+          "  -e: send linear/enumeration histogram data\n"
+          "  -g: return exit status 0 if machine in guest mode, 1 otherwise\n"
+          "  -t: convert sample from double seconds to int milliseconds\n");
+  exit(1);
+}
 
-  if (argc >= 3) {
-    // Parse arguments
-    int flag;
-    while ((flag = getopt(argc, argv, "abet")) != -1) {
-      switch (flag) {
-        case 'a':
-          send_to_autotest = true;
-          send_to_chrome = false;
-          break;
-        case 'b':
-          send_to_chrome = true;
-          send_to_autotest = true;
-          break;
-        case 'e':
-          send_enum = true;
-          break;
-        case 't':
-          secs_to_msecs = true;
-          break;
-        default:
-          print_usage = true;
-          break;
-      }
-    }
-    name_index = optind;
-  } else {
-    print_usage = true;
-  }
-
-  int num_args = send_enum ? 3 : 5;
-  if ((name_index + num_args) != argc ||
-      (send_enum && secs_to_msecs)) {
-    print_usage = true;
-  }
-
-  if (print_usage) {
-    fprintf(stderr,
-            "Usage:  metrics_client [-ab] [-t] name sample min max nbuckets\n"
-            "        metrics_client [-ab] -e   name sample max\n"
-            "\n"
-            "  default: send metric with integer values to Chrome only\n"
-            "           |min| > 0, |min| <= sample < |max|\n"
-            "  -a: send metric (name/sample) to Autotest only\n"
-            "  -b: send metric to both Chrome and Autotest\n"
-            "  -e: send linear/enumeration histogram data\n"
-            "  -t: convert sample from double seconds to int milliseconds\n");
-    return 1;
-  }
-
+static int SendStats(char* argv[],
+                     int name_index,
+                     bool send_enum,
+                     bool secs_to_msecs,
+                     bool send_to_autotest,
+                     bool send_to_chrome) {
   const char* name = argv[name_index];
   int sample;
   if (secs_to_msecs) {
@@ -92,3 +58,89 @@
   }
   return 0;
 }
+
+static int HasConsent() {
+  MetricsLibrary metrics_lib;
+  metrics_lib.Init();
+  return metrics_lib.AreMetricsEnabled() ? 0 : 1;
+}
+
+static int IsGuestMode() {
+  MetricsLibrary metrics_lib;
+  metrics_lib.Init();
+  return metrics_lib.IsGuestMode() ? 0 : 1;
+}
+
+int main(int argc, char** argv) {
+  enum Mode {
+    kModeSendStats,
+    kModeHasConsent,
+    kModeIsGuestMode
+  } mode = kModeSendStats;
+  bool send_to_autotest = false;
+  bool send_to_chrome = true;
+  bool send_enum = false;
+  bool secs_to_msecs = false;
+  bool print_usage = false;
+
+  // Parse arguments
+  int flag;
+  while ((flag = getopt(argc, argv, "abcegt")) != -1) {
+    switch (flag) {
+      case 'a':
+        mode = kModeSendStats;
+        send_to_autotest = true;
+        send_to_chrome = false;
+        break;
+      case 'b':
+        mode = kModeSendStats;
+        send_to_chrome = true;
+        send_to_autotest = true;
+        break;
+      case 'c':
+        mode = kModeHasConsent;
+        break;
+      case 'e':
+        send_enum = true;
+        break;
+      case 'g':
+        mode = kModeIsGuestMode;
+        break;
+      case 't':
+        secs_to_msecs = true;
+        break;
+      default:
+        print_usage = true;
+        break;
+    }
+  }
+  int name_index = optind;
+
+  int expected_args = 0;
+  if (mode == kModeSendStats)
+    expected_args = send_enum ? 3 : 5;
+
+  if ((name_index + expected_args) != argc) {
+    ShowUsage();
+  }
+
+  switch(mode) {
+    case kModeSendStats:
+      if (send_enum && secs_to_msecs) {
+        ShowUsage();
+      }
+      return SendStats(argv,
+                       name_index,
+                       send_enum,
+                       secs_to_msecs,
+                       send_to_autotest,
+                       send_to_chrome);
+    case kModeHasConsent:
+      return HasConsent();
+    case kModeIsGuestMode:
+      return IsGuestMode();
+    default:
+      ShowUsage();
+      return 0;
+  }
+}