wimax_unittest.cc revision c3d707d1ae4198d5538ff4deccd729a83f1bc805
1// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "shill/wimax/wimax.h" 6 7#include <memory> 8#include <string> 9 10#include "shill/event_dispatcher.h" 11#include "shill/mock_dhcp_config.h" 12#include "shill/mock_dhcp_provider.h" 13#include "shill/mock_manager.h" 14#include "shill/mock_metrics.h" 15#include "shill/mock_proxy_factory.h" 16#include "shill/nice_mock_control.h" 17#include "shill/testing.h" 18#include "shill/wimax/mock_wimax_device_proxy.h" 19#include "shill/wimax/mock_wimax_provider.h" 20#include "shill/wimax/mock_wimax_service.h" 21 22using base::Bind; 23using base::Unretained; 24using std::string; 25using testing::_; 26using testing::NiceMock; 27using testing::Return; 28 29namespace shill { 30 31namespace { 32 33const char kTestLinkName[] = "wm0"; 34const char kTestAddress[] = "01:23:45:67:89:ab"; 35const int kTestInterfaceIndex = 5; 36const char kTestPath[] = "/org/chromium/WiMaxManager/Device/6"; 37 38} // namespace 39 40class WiMaxTest : public testing::Test { 41 public: 42 WiMaxTest() 43 : proxy_(new MockWiMaxDeviceProxy()), 44 metrics_(&dispatcher_), 45 manager_(&control_, &dispatcher_, &metrics_, nullptr), 46 dhcp_config_(new MockDHCPConfig(&control_, 47 kTestLinkName)), 48 device_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_, 49 kTestLinkName, kTestAddress, kTestInterfaceIndex, 50 kTestPath)) {} 51 52 virtual ~WiMaxTest() {} 53 54 protected: 55 class Target { 56 public: 57 virtual ~Target() {} 58 59 MOCK_METHOD1(EnabledStateChanged, void(const Error &error)); 60 }; 61 62 virtual void SetUp() { 63 device_->proxy_factory_ = &proxy_factory_; 64 device_->set_dhcp_provider(&dhcp_provider_); 65 } 66 67 virtual void TearDown() { 68 device_->SelectService(nullptr); 69 device_->pending_service_ = nullptr; 70 device_->proxy_factory_ = nullptr; 71 } 72 73 std::unique_ptr<MockWiMaxDeviceProxy> proxy_; 74 MockProxyFactory proxy_factory_; 75 NiceMockControl control_; 76 EventDispatcher dispatcher_; 77 NiceMock<MockMetrics> metrics_; 78 MockManager manager_; 79 MockDHCPProvider dhcp_provider_; 80 scoped_refptr<MockDHCPConfig> dhcp_config_; 81 WiMaxRefPtr device_; 82}; 83 84TEST_F(WiMaxTest, Constructor) { 85 EXPECT_EQ(kTestPath, device_->path()); 86 EXPECT_FALSE(device_->scanning()); 87} 88 89TEST_F(WiMaxTest, StartStop) { 90 EXPECT_FALSE(device_->proxy_.get()); 91 EXPECT_CALL(proxy_factory_, CreateWiMaxDeviceProxy(_)) 92 .WillOnce(ReturnAndReleasePointee(&proxy_)); 93 EXPECT_CALL(*proxy_, Enable(_, _, _)); 94 EXPECT_CALL(*proxy_, set_networks_changed_callback(_)); 95 EXPECT_CALL(*proxy_, set_status_changed_callback(_)); 96 EXPECT_CALL(*proxy_, Disable(_, _, _)); 97 device_->Start(nullptr, EnabledStateChangedCallback()); 98 ASSERT_TRUE(device_->proxy_.get()); 99 100 scoped_refptr<MockWiMaxService> service( 101 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 102 device_->pending_service_ = service; 103 EXPECT_CALL(*service, SetState(Service::kStateIdle)); 104 device_->networks_.insert("path"); 105 MockWiMaxProvider provider; 106 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider)); 107 EXPECT_CALL(provider, OnNetworksChanged()); 108 device_->StartConnectTimeout(); 109 device_->Stop(nullptr, EnabledStateChangedCallback()); 110 EXPECT_TRUE(device_->networks_.empty()); 111 EXPECT_FALSE(device_->IsConnectTimeoutStarted()); 112 EXPECT_FALSE(device_->pending_service_); 113} 114 115TEST_F(WiMaxTest, OnServiceStopped) { 116 scoped_refptr<NiceMock<MockWiMaxService>> service0( 117 new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_)); 118 scoped_refptr<MockWiMaxService> service1( 119 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 120 device_->SelectService(service0); 121 device_->pending_service_ = service1; 122 123 device_->OnServiceStopped(nullptr); 124 EXPECT_TRUE(device_->selected_service()); 125 EXPECT_TRUE(device_->pending_service_); 126 127 device_->OnServiceStopped(service0); 128 EXPECT_FALSE(device_->selected_service()); 129 EXPECT_TRUE(device_->pending_service_); 130 131 device_->OnServiceStopped(service1); 132 EXPECT_FALSE(device_->selected_service()); 133 EXPECT_FALSE(device_->pending_service_); 134} 135 136TEST_F(WiMaxTest, OnNetworksChanged) { 137 MockWiMaxProvider provider; 138 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider)); 139 EXPECT_CALL(provider, OnNetworksChanged()); 140 device_->networks_.insert("foo"); 141 RpcIdentifiers networks; 142 networks.push_back("bar"); 143 networks.push_back("zoo"); 144 networks.push_back("bar"); 145 device_->OnNetworksChanged(networks); 146 EXPECT_EQ(2, device_->networks_.size()); 147 EXPECT_TRUE(ContainsKey(device_->networks_, "bar")); 148 EXPECT_TRUE(ContainsKey(device_->networks_, "zoo")); 149} 150 151TEST_F(WiMaxTest, OnConnectComplete) { 152 scoped_refptr<MockWiMaxService> service( 153 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 154 device_->pending_service_ = service; 155 EXPECT_CALL(*service, SetState(_)).Times(0); 156 EXPECT_TRUE(device_->pending_service_); 157 EXPECT_CALL(*service, SetState(Service::kStateFailure)); 158 device_->OnConnectComplete(Error(Error::kOperationFailed)); 159 EXPECT_FALSE(device_->pending_service_); 160} 161 162TEST_F(WiMaxTest, OnStatusChanged) { 163 scoped_refptr<MockWiMaxService> service( 164 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 165 166 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_); 167 device_->pending_service_ = service; 168 EXPECT_CALL(*service, SetState(_)).Times(0); 169 EXPECT_CALL(*service, ClearPassphrase()).Times(0); 170 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning); 171 EXPECT_TRUE(device_->pending_service_); 172 EXPECT_EQ(wimax_manager::kDeviceStatusScanning, device_->status_); 173 174 device_->status_ = wimax_manager::kDeviceStatusConnecting; 175 EXPECT_CALL(*service, SetState(Service::kStateFailure)); 176 EXPECT_CALL(*service, ClearPassphrase()).Times(0); 177 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning); 178 EXPECT_FALSE(device_->pending_service_); 179 180 device_->status_ = wimax_manager::kDeviceStatusConnecting; 181 device_->SelectService(service); 182 EXPECT_CALL(*service, SetState(Service::kStateFailure)); 183 EXPECT_CALL(*service, SetState(Service::kStateIdle)); 184 EXPECT_CALL(*service, ClearPassphrase()).Times(0); 185 device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning); 186 EXPECT_FALSE(device_->selected_service()); 187 188 device_->pending_service_ = service; 189 device_->SelectService(service); 190 EXPECT_CALL(*service, SetState(_)).Times(0); 191 EXPECT_CALL(*service, ClearPassphrase()).Times(0); 192 device_->OnStatusChanged(wimax_manager::kDeviceStatusConnecting); 193 EXPECT_TRUE(device_->pending_service_); 194 EXPECT_TRUE(device_->selected_service()); 195 EXPECT_EQ(wimax_manager::kDeviceStatusConnecting, device_->status_); 196 197 EXPECT_CALL(*service, SetState(Service::kStateIdle)); 198 device_->SelectService(nullptr); 199} 200 201TEST_F(WiMaxTest, UseNoArpGateway) { 202 EXPECT_CALL(dhcp_provider_, CreateConfig(kTestLinkName, _, _, false)) 203 .WillOnce(Return(dhcp_config_)); 204 device_->AcquireIPConfig(); 205} 206 207TEST_F(WiMaxTest, DropService) { 208 scoped_refptr<NiceMock<MockWiMaxService>> service0( 209 new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_)); 210 scoped_refptr<MockWiMaxService> service1( 211 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 212 device_->SelectService(service0); 213 device_->pending_service_ = service1; 214 device_->StartConnectTimeout(); 215 216 EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(2); 217 EXPECT_CALL(*service1, SetState(Service::kStateIdle)); 218 device_->DropService(Service::kStateIdle); 219 EXPECT_FALSE(device_->selected_service()); 220 EXPECT_FALSE(device_->pending_service_); 221 EXPECT_FALSE(device_->IsConnectTimeoutStarted()); 222 223 // Expect no crash. 224 device_->DropService(Service::kStateFailure); 225} 226 227TEST_F(WiMaxTest, OnDeviceVanished) { 228 device_->proxy_.reset(proxy_.release()); 229 scoped_refptr<MockWiMaxService> service( 230 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 231 device_->pending_service_ = service; 232 EXPECT_CALL(*service, SetState(Service::kStateIdle)); 233 device_->OnDeviceVanished(); 234 EXPECT_FALSE(device_->proxy_.get()); 235 EXPECT_FALSE(device_->pending_service_); 236} 237 238TEST_F(WiMaxTest, OnEnableComplete) { 239 MockWiMaxProvider provider; 240 EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider)); 241 RpcIdentifiers networks(1, "path"); 242 EXPECT_CALL(*proxy_, Networks(_)).WillOnce(Return(networks)); 243 device_->proxy_.reset(proxy_.release()); 244 EXPECT_CALL(provider, OnNetworksChanged()); 245 Target target; 246 EXPECT_CALL(target, EnabledStateChanged(_)); 247 EnabledStateChangedCallback callback( 248 Bind(&Target::EnabledStateChanged, Unretained(&target))); 249 Error error; 250 device_->OnEnableComplete(callback, error); 251 EXPECT_EQ(1, device_->networks_.size()); 252 EXPECT_TRUE(ContainsKey(device_->networks_, "path")); 253 254 EXPECT_TRUE(device_->proxy_.get()); 255 error.Populate(Error::kOperationFailed); 256 EXPECT_CALL(target, EnabledStateChanged(_)); 257 device_->OnEnableComplete(callback, error); 258 EXPECT_FALSE(device_->proxy_.get()); 259} 260 261TEST_F(WiMaxTest, ConnectTimeout) { 262 EXPECT_EQ(&dispatcher_, device_->dispatcher()); 263 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled()); 264 EXPECT_FALSE(device_->IsConnectTimeoutStarted()); 265 EXPECT_EQ(WiMax::kDefaultConnectTimeoutSeconds, 266 device_->connect_timeout_seconds_); 267 device_->connect_timeout_seconds_ = 0; 268 device_->StartConnectTimeout(); 269 EXPECT_FALSE(device_->connect_timeout_callback_.IsCancelled()); 270 EXPECT_TRUE(device_->IsConnectTimeoutStarted()); 271 device_->dispatcher_ = nullptr; 272 device_->StartConnectTimeout(); // Expect no crash. 273 scoped_refptr<MockWiMaxService> service( 274 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 275 device_->pending_service_ = service; 276 EXPECT_CALL(*service, SetState(Service::kStateFailure)); 277 dispatcher_.DispatchPendingEvents(); 278 EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled()); 279 EXPECT_FALSE(device_->IsConnectTimeoutStarted()); 280 EXPECT_FALSE(device_->pending_service_); 281} 282 283TEST_F(WiMaxTest, ConnectTo) { 284 static const char kPath[] = "/network/path"; 285 scoped_refptr<MockWiMaxService> service( 286 new MockWiMaxService(&control_, nullptr, &metrics_, &manager_)); 287 EXPECT_CALL(*service, SetState(Service::kStateAssociating)); 288 device_->status_ = wimax_manager::kDeviceStatusScanning; 289 EXPECT_CALL(*service, GetNetworkObjectPath()).WillOnce(Return(kPath)); 290 EXPECT_CALL(*proxy_, Connect(kPath, _, _, _, _)) 291 .WillOnce(SetErrorTypeInArgument<2>(Error::kSuccess)); 292 device_->proxy_.reset(proxy_.release()); 293 Error error; 294 device_->ConnectTo(service, &error); 295 EXPECT_TRUE(error.IsSuccess()); 296 EXPECT_EQ(service.get(), device_->pending_service_.get()); 297 EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_); 298 EXPECT_TRUE(device_->IsConnectTimeoutStarted()); 299 300 device_->ConnectTo(service, &error); 301 EXPECT_EQ(Error::kInProgress, error.type()); 302 303 device_->pending_service_ = nullptr; 304} 305 306TEST_F(WiMaxTest, IsIdle) { 307 EXPECT_TRUE(device_->IsIdle()); 308 scoped_refptr<NiceMock<MockWiMaxService>> service( 309 new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_)); 310 device_->pending_service_ = service; 311 EXPECT_FALSE(device_->IsIdle()); 312 device_->pending_service_ = nullptr; 313 device_->SelectService(service); 314 EXPECT_FALSE(device_->IsIdle()); 315} 316 317} // namespace shill 318