Metric reporting for services on the same network.

Added metric for reporting number of services that are connected
to the currently connected network.

BUG=chromium:359302
TEST=unittest

Change-Id: I8a88cea19c4d956ef5242fdfb0419c1ca79bc003
Reviewed-on: https://chromium-review.googlesource.com/194820
Tested-by: Peter Qiu <zqiu@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: Peter Qiu <zqiu@chromium.org>
diff --git a/metrics.cc b/metrics.cc
index bff1ab3..78fec18 100644
--- a/metrics.cc
+++ b/metrics.cc
@@ -291,6 +291,13 @@
 const int Metrics::kMetricWifiAvailableBSSesMin = 1;
 const int Metrics::kMetricWifiAvailableBSSesNumBuckets = 10;
 
+// Number of services associated with currently connected network.
+const char Metrics::kMetricServicesOnSameNetwork[] =
+    "Network.Shill.ServicesOnSameNetwork";
+const int Metrics::kMetricServicesOnSameNetworkMax = 20;
+const int Metrics::kMetricServicesOnSameNetworkMin = 1;
+const int Metrics::kMetricServicesOnSameNetworkNumBuckets = 10;
+
 Metrics::Metrics(EventDispatcher *dispatcher)
     : dispatcher_(dispatcher),
       library_(&metrics_library_),
@@ -1067,6 +1074,14 @@
             kMetricWifiAvailableBSSesNumBuckets);
 }
 
+void Metrics::NotifyServicesOnSameNetwork(int num_services) {
+  SendToUMA(kMetricServicesOnSameNetwork,
+            num_services,
+            kMetricServicesOnSameNetworkMin,
+            kMetricServicesOnSameNetworkMax,
+            kMetricServicesOnSameNetworkNumBuckets);
+}
+
 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 8a9aceb..ba1d36c 100644
--- a/metrics.h
+++ b/metrics.h
@@ -449,6 +449,12 @@
   static const int kMetricWifiAvailableBSSesMin;
   static const int kMetricWifiAvailableBSSesNumBuckets;
 
+  // Number of services associated with currently connected network.
+  static const char kMetricServicesOnSameNetwork[];
+  static const int kMetricServicesOnSameNetworkMax;
+  static const int kMetricServicesOnSameNetworkMin;
+  static const int kMetricServicesOnSameNetworkNumBuckets;
+
   explicit Metrics(EventDispatcher *dispatcher);
   virtual ~Metrics();
 
@@ -614,6 +620,10 @@
   // when attempt to connect to that service.
   virtual void NotifyWifiAvailableBSSes(int num_services);
 
+  // Notifies this object about number of services associated to the
+  // currently connected network.
+  virtual void NotifyServicesOnSameNetwork(int num_services);
+
   // Notifies this object about a corrupted profile.
   virtual void NotifyCorruptedProfile();
 
diff --git a/metrics_unittest.cc b/metrics_unittest.cc
index c3b1ab1..1ff9ed4 100644
--- a/metrics_unittest.cc
+++ b/metrics_unittest.cc
@@ -725,6 +725,16 @@
   ScopeLogger::GetInstance()->set_verbose_level(0);
 }
 
+TEST_F(MetricsTest, NotifyServicesOnSameNetwork) {
+  EXPECT_CALL(library_,
+      SendToUMA(Metrics::kMetricServicesOnSameNetwork,
+                1,
+                Metrics::kMetricServicesOnSameNetworkMin,
+                Metrics::kMetricServicesOnSameNetworkMax,
+                Metrics::kMetricServicesOnSameNetworkNumBuckets));
+  metrics_.NotifyServicesOnSameNetwork(1);
+}
+
 #ifndef NDEBUG
 
 typedef MetricsTest MetricsDeathTest;
diff --git a/mock_metrics.h b/mock_metrics.h
index a2359c3..55995ce 100644
--- a/mock_metrics.h
+++ b/mock_metrics.h
@@ -44,6 +44,7 @@
                                int max, int num_buckets));
   MOCK_METHOD1(NotifyWifiAutoConnectableServices, void(int num_service));
   MOCK_METHOD1(NotifyWifiAvailableBSSes, void(int num_bss));
+  MOCK_METHOD1(NotifyWifiServicesOnSameNetwork, void(int num_service));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockMetrics);