UMA metric reporting for WIFI TX bitrate.

Added UMA metric for WIFI TX bitrate, which is reported every
minute when wifi is connected.

BUG=chromium:368761
TEST=unit tests, manual
Manual Test:
1. Connect a chrome device to a wireless AP
2. Browse to "chrome://histograms", and verify there is a histogram
   for "Network.Shill.WiFi.TXBitrate"

Conflicts:
	metrics.cc
	metrics.h
	metrics_unittest.cc
	mock_metrics.h

Change-Id: Ib4280f2df89269f30fb988904b97d35c16569218
Reviewed-on: https://chromium-review.googlesource.com/197731
Reviewed-by: Peter Qiu <zqiu@chromium.org>
Commit-Queue: Peter Qiu <zqiu@chromium.org>
Tested-by: Peter Qiu <zqiu@chromium.org>
diff --git a/metrics.cc b/metrics.cc
index 6efc711..1f6f52e 100644
--- a/metrics.cc
+++ b/metrics.cc
@@ -289,6 +289,12 @@
 const char Metrics::kMetricUserInitiatedEvents[] =
     "Network.Shill.UserInitatedEvents";
 
+const char Metrics::kMetricWifiTxBitrate[] =
+    "Network.Shill.WiFi.TransmitBitrateMbps";
+const int Metrics::kMetricWifiTxBitrateMax = 7000;
+const int Metrics::kMetricWifiTxBitrateMin = 1;
+const int Metrics::kMetricWifiTxBitrateNumBuckets = 100;
+
 Metrics::Metrics(EventDispatcher *dispatcher)
     : dispatcher_(dispatcher),
       library_(&metrics_library_),
@@ -1098,6 +1104,14 @@
                 kUserInitiatedEventMax);
 }
 
+void Metrics::NotifyWifiTxBitrate(int bitrate) {
+  SendToUMA(kMetricWifiTxBitrate,
+            bitrate,
+            kMetricWifiTxBitrateMin,
+            kMetricWifiTxBitrateMax,
+            kMetricWifiTxBitrateNumBuckets);
+}
+
 bool Metrics::SendEnumToUMA(const string &name, int sample, int max) {
   SLOG(Metrics, 5)
       << "Sending enum " << name << " with value " << sample << ".";
diff --git a/metrics.h b/metrics.h
index 67ba3ce..1d9c03a 100644
--- a/metrics.h
+++ b/metrics.h
@@ -469,6 +469,12 @@
   // Metric for user-initiated events.
   static const char kMetricUserInitiatedEvents[];
 
+  // Wifi TX bitrate in Mbps.
+  static const char kMetricWifiTxBitrate[];
+  static const int kMetricWifiTxBitrateMax;
+  static const int kMetricWifiTxBitrateMin;
+  static const int kMetricWifiTxBitrateNumBuckets;
+
   explicit Metrics(EventDispatcher *dispatcher);
   virtual ~Metrics();
 
@@ -638,6 +644,9 @@
   // currently connected network.
   virtual void NotifyServicesOnSameNetwork(int num_services);
 
+  // Notifies this object about WIFI TX bitrate in Mbps.
+  virtual void NotifyWifiTxBitrate(int bitrate);
+
   // Notifies this object about a corrupted profile.
   virtual void NotifyCorruptedProfile();
 
diff --git a/metrics_unittest.cc b/metrics_unittest.cc
index e3dbbd0..c804952 100644
--- a/metrics_unittest.cc
+++ b/metrics_unittest.cc
@@ -771,6 +771,16 @@
   metrics_.NotifyUserInitiatedEvent(Metrics::kUserInitiatedEventWifiScan);
 }
 
+TEST_F(MetricsTest, NotifyWifiTxBitrate) {
+  EXPECT_CALL(library_,
+      SendToUMA(Metrics::kMetricWifiTxBitrate,
+                1,
+                Metrics::kMetricWifiTxBitrateMin,
+                Metrics::kMetricWifiTxBitrateMax,
+                Metrics::kMetricWifiTxBitrateNumBuckets));
+  metrics_.NotifyWifiTxBitrate(1);
+}
+
 #ifndef NDEBUG
 
 typedef MetricsTest MetricsDeathTest;
diff --git a/mock_metrics.h b/mock_metrics.h
index fc874ff..013143c 100644
--- a/mock_metrics.h
+++ b/mock_metrics.h
@@ -46,6 +46,7 @@
   MOCK_METHOD1(NotifyWifiAvailableBSSes, void(int num_bss));
   MOCK_METHOD1(NotifyServicesOnSameNetwork, void(int num_service));
   MOCK_METHOD1(NotifyUserInitiatedEvent, void(int event));
+  MOCK_METHOD1(NotifyWifiTxBitrate, void(int bitrate));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockMetrics);
diff --git a/wifi.cc b/wifi.cc
index 5a92983..51b05c7 100644
--- a/wifi.cc
+++ b/wifi.cc
@@ -2481,6 +2481,7 @@
                                               band_info.c_str(),
                                               is_short_gi ? " short GI" : "",
                                               nss_info.c_str()));
+      metrics()->NotifyWifiTxBitrate(rate/10);
     }
   }
 }
diff --git a/wifi_unittest.cc b/wifi_unittest.cc
index c0c5ab5..1aa66ec 100644
--- a/wifi_unittest.cc
+++ b/wifi_unittest.cc
@@ -2895,6 +2895,7 @@
 
   EXPECT_NE(kSignalValue, endpoint->signal_strength());
   EXPECT_CALL(*wifi_provider(), OnEndpointUpdated(EndpointMatch(endpoint)));
+  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kBitrate/10));
   AttributeListConstRefPtr station_info_prime;
   ReportReceivedStationInfo(new_station);
   EXPECT_EQ(kSignalValue, endpoint->signal_strength());
@@ -2962,6 +2963,8 @@
   new_vht_station.attributes()->SetNestedAttributeHasAValue(
       NL80211_ATTR_STA_INFO);
 
+  EXPECT_CALL(*metrics(), NotifyWifiTxBitrate(kVhtBitrate/10));
+
   ReportReceivedStationInfo(new_vht_station);
 
   link_statistics = GetLinkStatistics();