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());