shill: wimax: Listen to SignalStrengthChanged and update the service strength.

Also, change some instances of DBus::Path to RpcIdentifier.

BUG=chrome-os-partner:9831,chrome-os-partner:9837
TEST=unit tests
CQ-DEPEND=If7c0543cc98bc39fba28e7465bcd6de974d8aa1f

Change-Id: I49fafd5569764d46f5814ac3d19783fe4409a675
Reviewed-on: https://gerrit.chromium.org/gerrit/23115
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/mock_wimax_network_proxy.cc b/mock_wimax_network_proxy.cc
index f622145..e6d12fd 100644
--- a/mock_wimax_network_proxy.cc
+++ b/mock_wimax_network_proxy.cc
@@ -4,6 +4,8 @@
 
 #include "shill/mock_wimax_network_proxy.h"
 
+#include <base/callback.h>
+
 namespace shill {
 
 MockWiMaxNetworkProxy::MockWiMaxNetworkProxy() {}
diff --git a/mock_wimax_network_proxy.h b/mock_wimax_network_proxy.h
index d922cf2..6948693 100644
--- a/mock_wimax_network_proxy.h
+++ b/mock_wimax_network_proxy.h
@@ -16,7 +16,9 @@
   MockWiMaxNetworkProxy();
   virtual ~MockWiMaxNetworkProxy();
 
-  MOCK_CONST_METHOD0(proxy_object_path, DBus::Path());
+  MOCK_CONST_METHOD0(path, RpcIdentifier());
+  MOCK_METHOD1(set_signal_strength_changed_callback,
+               void(const SignalStrengthChangedCallback &callback));
   MOCK_METHOD1(Identifier, uint32(Error *error));
   MOCK_METHOD1(Name, std::string(Error *error));
   MOCK_METHOD1(Type, int(Error *error));
diff --git a/wimax_network_proxy.cc b/wimax_network_proxy.cc
index c0581be..7b2dede 100644
--- a/wimax_network_proxy.cc
+++ b/wimax_network_proxy.cc
@@ -20,10 +20,15 @@
 
 WiMaxNetworkProxy::~WiMaxNetworkProxy() {}
 
-DBus::Path WiMaxNetworkProxy::proxy_object_path() const {
+RpcIdentifier WiMaxNetworkProxy::path() const {
   return proxy_.path();
 }
 
+void WiMaxNetworkProxy::set_signal_strength_changed_callback(
+    const SignalStrengthChangedCallback &callback) {
+  proxy_.set_signal_strength_changed_callback(callback);
+}
+
 uint32 WiMaxNetworkProxy::Identifier(Error *error) {
   SLOG(DBus, 2) << __func__;
   try {
@@ -104,4 +109,17 @@
 
 WiMaxNetworkProxy::Proxy::~Proxy() {}
 
+void WiMaxNetworkProxy::Proxy::set_signal_strength_changed_callback(
+    const SignalStrengthChangedCallback &callback) {
+  signal_strength_changed_callback_ = callback;
+}
+
+void WiMaxNetworkProxy::Proxy::SignalStrengthChanged(
+    const int32 &signal_strength) {
+  SLOG(DBus, 2) << __func__ << "(" << signal_strength << ")";
+  if (!signal_strength_changed_callback_.is_null()) {
+    signal_strength_changed_callback_.Run(signal_strength);
+  }
+}
+
 }  // namespace shill
diff --git a/wimax_network_proxy.h b/wimax_network_proxy.h
index d1bccc1..1be7733 100644
--- a/wimax_network_proxy.h
+++ b/wimax_network_proxy.h
@@ -5,6 +5,8 @@
 #ifndef SHILL_WIMAX_NETWORK_PROXY_H_
 #define SHILL_WIMAX_NETWORK_PROXY_H_
 
+#include <base/callback.h>
+
 #include "shill/dbus_bindings/wimax_manager-network.h"
 #include "shill/wimax_network_proxy_interface.h"
 
@@ -18,7 +20,9 @@
   virtual ~WiMaxNetworkProxy();
 
   // Inherited from WiMaxNetwokProxyInterface.
-  virtual DBus::Path proxy_object_path() const;
+  virtual RpcIdentifier path() const;
+  virtual void set_signal_strength_changed_callback(
+      const SignalStrengthChangedCallback &callback);
   virtual uint32 Identifier(Error *error);
   virtual std::string Name(Error *error);
   virtual int Type(Error *error);
@@ -33,13 +37,18 @@
     Proxy(DBus::Connection *connection, const DBus::Path &path);
     virtual ~Proxy();
 
+    void set_signal_strength_changed_callback(
+        const SignalStrengthChangedCallback &callback);
+
    private:
     // Signal callbacks inherited from WiMaxManager::Network_proxy.
-    // [None]
+    virtual void SignalStrengthChanged(const int32 &signal_strength);
 
     // Method callbacks inherited from WiMaxManager::Network_proxy.
     // [None]
 
+    SignalStrengthChangedCallback signal_strength_changed_callback_;
+
     DISALLOW_COPY_AND_ASSIGN(Proxy);
   };
 
diff --git a/wimax_network_proxy_interface.h b/wimax_network_proxy_interface.h
index 3777ba6..2216051 100644
--- a/wimax_network_proxy_interface.h
+++ b/wimax_network_proxy_interface.h
@@ -8,7 +8,9 @@
 #include <string>
 
 #include <base/basictypes.h>
-#include <dbus-c++/dbus.h>
+#include <base/callback_forward.h>
+
+#include "shill/accessor_interface.h"
 
 namespace shill {
 
@@ -18,9 +20,14 @@
 // interface is provided so that it can be mocked in tests.
 class WiMaxNetworkProxyInterface {
  public:
+  typedef base::Callback<void(int)> SignalStrengthChangedCallback;
+
   virtual ~WiMaxNetworkProxyInterface() {}
 
-  virtual DBus::Path proxy_object_path() const = 0;
+  virtual RpcIdentifier path() const = 0;
+
+  virtual void set_signal_strength_changed_callback(
+      const SignalStrengthChangedCallback &callback) = 0;
 
   // Properties.
   virtual uint32 Identifier(Error *error) = 0;
diff --git a/wimax_service.cc b/wimax_service.cc
index 588d5ab..3455a60 100644
--- a/wimax_service.cc
+++ b/wimax_service.cc
@@ -48,13 +48,14 @@
       .append_string(eap().password.c_str());
 }
 
-DBus::Path WiMaxService::GetNetworkObjectPath() const {
+RpcIdentifier WiMaxService::GetNetworkObjectPath() const {
   CHECK(proxy_.get());
-  return proxy_->proxy_object_path();
+  return proxy_->path();
 }
 
 bool WiMaxService::Start(WiMaxNetworkProxyInterface *proxy) {
   SLOG(WiMax, 2) << __func__;
+  CHECK(proxy);
   proxy_.reset(proxy);
 
   Error error;
@@ -72,6 +73,8 @@
     return false;
   }
   SetStrength(signal_strength);
+  proxy_->set_signal_strength_changed_callback(
+      Bind(&WiMaxService::OnSignalStrengthChanged, Unretained(this)));
 
   set_friendly_name(network_name_);
   storage_id_ =
@@ -108,4 +111,9 @@
   return wimax_->GetRpcIdentifier();
 }
 
+void WiMaxService::OnSignalStrengthChanged(int strength) {
+  SLOG(WiMax, 2) << __func__ << "(" << strength << ")";
+  SetStrength(strength);
+}
+
 }  // namespace shill
diff --git a/wimax_service.h b/wimax_service.h
index 98e4cc2..aaf0119 100644
--- a/wimax_service.h
+++ b/wimax_service.h
@@ -27,10 +27,9 @@
   // connecting to the network associated with this service.
   void GetConnectParameters(DBusPropertiesMap *parameters) const;
 
-  // Returns the DBus object path for the WiMaxManager.Network object
-  // associated with this service. Must only be called after |proxy_| is set
-  // by Start().
-  DBus::Path GetNetworkObjectPath() const;
+  // Returns the RPC object path for the WiMaxManager.Network object associated
+  // with this service. Must only be called after |proxy_| is set by Start().
+  RpcIdentifier GetNetworkObjectPath() const;
 
   // Returns true on success, false otherwise. Takes ownership of proxy,
   // regardless of the result of the operation.
@@ -47,9 +46,12 @@
 
  private:
   FRIEND_TEST(WiMaxServiceTest, GetDeviceRpcId);
+  FRIEND_TEST(WiMaxServiceTest, OnSignalStrengthChanged);
 
   virtual std::string GetDeviceRpcId(Error *error);
 
+  void OnSignalStrengthChanged(int strength);
+
   WiMaxRefPtr wimax_;
   scoped_ptr<WiMaxNetworkProxyInterface> proxy_;
   std::string storage_id_;
diff --git a/wimax_service_unittest.cc b/wimax_service_unittest.cc
index f0fa69a..91a3153 100644
--- a/wimax_service_unittest.cc
+++ b/wimax_service_unittest.cc
@@ -14,6 +14,7 @@
 #include "shill/mock_manager.h"
 #include "shill/mock_metrics.h"
 #include "shill/mock_wimax.h"
+#include "shill/mock_wimax_network_proxy.h"
 
 using std::string;
 using testing::_;
@@ -37,7 +38,8 @@
 class WiMaxServiceTest : public testing::Test {
  public:
   WiMaxServiceTest()
-      : manager_(&control_, NULL, NULL, NULL),
+      : proxy_(new MockWiMaxNetworkProxy()),
+        manager_(&control_, NULL, NULL, NULL),
         wimax_(new MockWiMax(&control_, NULL, &metrics_, &manager_,
                              kTestLinkName, kTestAddress, kTestInterfaceIndex,
                              kTestPath)),
@@ -47,6 +49,7 @@
   virtual ~WiMaxServiceTest() {}
 
  protected:
+  scoped_ptr<MockWiMaxNetworkProxy> proxy_;
   NiceMockControl control_;
   MockManager manager_;
   MockMetrics metrics_;
@@ -101,4 +104,27 @@
   EXPECT_TRUE(error.IsSuccess());
 }
 
+TEST_F(WiMaxServiceTest, OnSignalStrengthChanged) {
+  const int kStrength = 55;
+  service_->OnSignalStrengthChanged(kStrength);
+  EXPECT_EQ(kStrength, service_->strength());
+}
+
+TEST_F(WiMaxServiceTest, Start) {
+  static const char kName[] = "MyWiMaxNetwork";
+  const uint32 kIdentifier = 1234;
+  const int kStrength = 66;
+  EXPECT_CALL(*proxy_, Name(_)).WillOnce(Return(kName));
+  EXPECT_CALL(*proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
+  EXPECT_CALL(*proxy_, SignalStrength(_)).WillOnce(Return(kStrength));
+  EXPECT_CALL(*proxy_, set_signal_strength_changed_callback(_));
+  EXPECT_TRUE(service_->Start(proxy_.release()));
+  EXPECT_EQ(kStrength, service_->strength());
+  EXPECT_EQ(kName, service_->network_name());
+  EXPECT_EQ(kName, service_->friendly_name());
+  EXPECT_EQ(kIdentifier, service_->network_identifier());
+  EXPECT_TRUE(service_->connectable());
+  EXPECT_FALSE(service_->GetStorageIdentifier().empty());
+}
+
 }  // namespace shill
diff --git a/wimax_unittest.cc b/wimax_unittest.cc
index 5640c0d..32bd01f 100644
--- a/wimax_unittest.cc
+++ b/wimax_unittest.cc
@@ -120,6 +120,8 @@
   EXPECT_CALL(manager_, DeregisterService(_));
   EXPECT_CALL(*network_proxy_, Name(_));
   EXPECT_CALL(*network_proxy_, Identifier(_));
+  EXPECT_CALL(*network_proxy_, SignalStrength(_));
+  EXPECT_CALL(*network_proxy_, set_signal_strength_changed_callback(_));
   EXPECT_CALL(manager_, RegisterService(_));
   wimax_->OnNetworksChanged(live_devices);
   ASSERT_EQ(1, wimax_->services_.size());
@@ -133,6 +135,8 @@
 
   EXPECT_CALL(*network_proxy_, Name(_)).WillOnce(Return(kTestNetworkName));
   EXPECT_CALL(*network_proxy_, Identifier(_));
+  EXPECT_CALL(*network_proxy_, SignalStrength(_));
+  EXPECT_CALL(*network_proxy_, set_signal_strength_changed_callback(_));
   EXPECT_CALL(manager_, RegisterService(_));
   wimax_->CreateService(GetTestNetworkPath(1));
   ASSERT_EQ(1, wimax_->services_.size());