shill: monitor bss signal strength

This wires WiFiEndpoint up to a proxy, to monitor
changes in the corresponding wpa_supplicant BSS
object.

The WiFiEndpoint object notifies its WiFi object
about the change, and WiFi relays the information
to the appropriate WiFiService.

BUG=chromium-os:16786
TEST=new unit tests, manual

Manual testing: ran on device (with --v=1000), observed
"signal is now" messages in log file.

Collateral changes:
- fix WiFiService leak in WiFi (reset |current_service| on Stop)
- suppress some "uninteresting call" messages in
  WiFiMainTest.CurrentBSSChangedUpdateServiceEndpoint

Change-Id: Ic329ecd28f73d93238d517a73105f2cd35cbff2e
Reviewed-on: https://gerrit.chromium.org/gerrit/15868
Commit-Ready: mukesh agrawal <quiche@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Tested-by: mukesh agrawal <quiche@chromium.org>
diff --git a/wifi_endpoint_unittest.cc b/wifi_endpoint_unittest.cc
index 1e682c7..556b966 100644
--- a/wifi_endpoint_unittest.cc
+++ b/wifi_endpoint_unittest.cc
@@ -11,9 +11,12 @@
 
 #include <base/stl_util-inl.h>
 #include <chromeos/dbus/service_constants.h>
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
 #include "shill/ieee80211.h"
+#include "shill/mock_wifi.h"
+#include "shill/property_store_unittest.h"
 #include "shill/refptr_types.h"
 #include "shill/wpa_supplicant.h"
 
@@ -21,14 +24,22 @@
 using std::set;
 using std::string;
 using std::vector;
-
-using ::testing::Test;
+using ::testing::_;
+using ::testing::NiceMock;
 
 namespace shill {
 
-class WiFiEndpointTest : public Test {
+class WiFiEndpointTest : public PropertyStoreTest {
  public:
-  WiFiEndpointTest() {}
+  WiFiEndpointTest() : wifi_(
+      new NiceMock<MockWiFi>(
+          control_interface(),
+          dispatcher(),
+          metrics(),
+          manager(),
+          "wifi",
+          "aabbccddeeff",  // fake mac
+          0)) {}
   virtual ~WiFiEndpointTest() {}
 
  protected:
@@ -77,6 +88,18 @@
     ies->insert(ies->end(), 3, 0);  // OUI
     ies->push_back(0);              // data
   }
+
+  WiFiEndpoint *MakeOpenEndpoint(ProxyFactory *proxy_factory,
+                                 const WiFiRefPtr &wifi,
+                                 const std::string &ssid,
+                                 const std::string &bssid) {
+    return WiFiEndpoint::MakeOpenEndpoint(proxy_factory, wifi, ssid, bssid);
+  }
+
+  scoped_refptr<MockWiFi> wifi() { return wifi_; }
+
+ private:
+  scoped_refptr<MockWiFi> wifi_;
 };
 
 TEST_F(WiFiEndpointTest, ParseKeyManagementMethodsEAP) {
@@ -146,7 +169,7 @@
 
 TEST_F(WiFiEndpointTest, SSIDWithNull) {
   WiFiEndpointRefPtr endpoint =
-      WiFiEndpoint::MakeOpenEndpoint(string(1, 0), "00:00:00:00:00:01");
+      MakeOpenEndpoint(NULL, NULL, string(1, 0), "00:00:00:00:00:01");
   EXPECT_EQ("?", endpoint->ssid_string());
 }
 
@@ -217,4 +240,21 @@
   }
 }
 
+TEST_F(WiFiEndpointTest, PropertiesChanged) {
+  WiFiEndpointRefPtr endpoint =
+      MakeOpenEndpoint(NULL, wifi(), "ssid", "00:00:00:00:00:01");
+  map<string, ::DBus::Variant> changed_properties;
+  ::DBus::MessageIter writer;
+  int16_t signal_strength = 10;
+
+  EXPECT_NE(signal_strength, endpoint->signal_strength());
+  writer =
+      changed_properties[wpa_supplicant::kBSSPropertySignal].writer();
+  writer << signal_strength;
+
+  EXPECT_CALL(*wifi(), NotifyEndpointChanged(_));
+  endpoint->PropertiesChanged(changed_properties);
+  EXPECT_EQ(signal_strength, endpoint->signal_strength());
+}
+
 }  // namespace shill