wimax_unittest.cc revision 247dcc12556bbfb7e50753befe217d29eb2f2f86
1c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan// Use of this source code is governed by a BSD-style license that can be
3c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan// found in the LICENSE file.
4c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
5c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/wimax.h"
6c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
7247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan#include <memory>
8d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov#include <string>
9d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
10c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/event_dispatcher.h"
11ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray#include "shill/mock_dhcp_config.h"
12ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray#include "shill/mock_dhcp_provider.h"
13c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/mock_manager.h"
14c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/mock_metrics.h"
150bc1acaf481a6ebf33a1b973f15f800919b676eeBen Chan#include "shill/mock_proxy_factory.h"
16b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov#include "shill/mock_wimax_device_proxy.h"
17c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov#include "shill/mock_wimax_provider.h"
189893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov#include "shill/mock_wimax_service.h"
19c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/nice_mock_control.h"
200bc1acaf481a6ebf33a1b973f15f800919b676eeBen Chan#include "shill/testing.h"
21b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
2259f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkovusing base::Bind;
2359f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkovusing base::Unretained;
24b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkovusing std::string;
25912f0de92ca103568821e20412b7dc2529494f98Darin Petkovusing testing::_;
268ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkovusing testing::NiceMock;
279893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkovusing testing::Return;
28c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
29c07362bebe25b1db1716c24ed340b46b309868e5Ben Channamespace shill {
30c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
31c07362bebe25b1db1716c24ed340b46b309868e5Ben Channamespace {
32c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
33c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanconst char kTestLinkName[] = "wm0";
344e64d2d72eed1947ab1d15e6ce25a47c37a9e10cBen Chanconst char kTestAddress[] = "01:23:45:67:89:ab";
35c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanconst int kTestInterfaceIndex = 5;
36b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkovconst char kTestPath[] = "/org/chromium/WiMaxManager/Device/6";
37c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
38c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan}  // namespace
39c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
40c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanclass WiMaxTest : public testing::Test {
41c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan public:
42c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  WiMaxTest()
43b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov      : proxy_(new MockWiMaxDeviceProxy()),
446c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le        metrics_(&dispatcher_),
4553cc894f1ca677f930da7fce1564db44a7b02791Ben Chan        manager_(&control_, &dispatcher_, &metrics_, nullptr),
46ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray        dhcp_config_(new MockDHCPConfig(&control_,
47ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray                                        kTestLinkName)),
48d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov        device_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_,
49d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov                          kTestLinkName, kTestAddress, kTestInterfaceIndex,
50d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov                          kTestPath)) {}
51c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
52c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  virtual ~WiMaxTest() {}
53c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
54c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan protected:
5559f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  class Target {
5659f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov   public:
5759f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov    virtual ~Target() {}
5859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
5959f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov    MOCK_METHOD1(EnabledStateChanged, void(const Error &error));
6059f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  };
6159f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
62b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  virtual void SetUp() {
63d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov    device_->proxy_factory_ = &proxy_factory_;
64ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray    device_->set_dhcp_provider(&dhcp_provider_);
65b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  }
66b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
67b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  virtual void TearDown() {
6853cc894f1ca677f930da7fce1564db44a7b02791Ben Chan    device_->SelectService(nullptr);
6953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan    device_->pending_service_ = nullptr;
7053cc894f1ca677f930da7fce1564db44a7b02791Ben Chan    device_->proxy_factory_ = nullptr;
71b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  }
72b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
73247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan  std::unique_ptr<MockWiMaxDeviceProxy> proxy_;
740bc1acaf481a6ebf33a1b973f15f800919b676eeBen Chan  MockProxyFactory proxy_factory_;
75c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  NiceMockControl control_;
76c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  EventDispatcher dispatcher_;
773a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  NiceMock<MockMetrics> metrics_;
78c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  MockManager manager_;
79ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  MockDHCPProvider dhcp_provider_;
80ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  scoped_refptr<MockDHCPConfig> dhcp_config_;
81d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  WiMaxRefPtr device_;
82c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan};
83c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
84b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin PetkovTEST_F(WiMaxTest, Constructor) {
85d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(kTestPath, device_->path());
86d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(device_->scanning());
87b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov}
88b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
89b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin PetkovTEST_F(WiMaxTest, StartStop) {
90d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(device_->proxy_.get());
910bc1acaf481a6ebf33a1b973f15f800919b676eeBen Chan  EXPECT_CALL(proxy_factory_, CreateWiMaxDeviceProxy(_))
920bc1acaf481a6ebf33a1b973f15f800919b676eeBen Chan      .WillOnce(ReturnAndReleasePointee(&proxy_));
93912f0de92ca103568821e20412b7dc2529494f98Darin Petkov  EXPECT_CALL(*proxy_, Enable(_, _, _));
949893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  EXPECT_CALL(*proxy_, set_networks_changed_callback(_));
958ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(*proxy_, set_status_changed_callback(_));
96912f0de92ca103568821e20412b7dc2529494f98Darin Petkov  EXPECT_CALL(*proxy_, Disable(_, _, _));
9753cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->Start(nullptr, EnabledStateChangedCallback());
98c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  ASSERT_TRUE(device_->proxy_.get());
99d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
1003a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  scoped_refptr<MockWiMaxService> service(
10153cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
1023a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->pending_service_ = service;
1033a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
104c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->networks_.insert("path");
105c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  MockWiMaxProvider provider;
106c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
107c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(provider, OnNetworksChanged());
1083a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();
10953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->Stop(nullptr, EnabledStateChangedCallback());
110d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(device_->networks_.empty());
1113a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
1123a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->pending_service_);
113d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov}
114d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
115c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin PetkovTEST_F(WiMaxTest, OnServiceStopped) {
116e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan  scoped_refptr<NiceMock<MockWiMaxService>> service0(
11753cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_));
118c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  scoped_refptr<MockWiMaxService> service1(
11953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
120c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->SelectService(service0);
121c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->pending_service_ = service1;
122d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
12353cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->OnServiceStopped(nullptr);
124d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(device_->selected_service());
125d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(device_->pending_service_);
126d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
127c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->OnServiceStopped(service0);
128d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(device_->selected_service());
129c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(device_->pending_service_);
130d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
131c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->OnServiceStopped(service1);
132c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_FALSE(device_->selected_service());
133c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_FALSE(device_->pending_service_);
134b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov}
135b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
1369893d9c59f596e621463c8e97bb3933f8fa7edf6Darin PetkovTEST_F(WiMaxTest, OnNetworksChanged) {
137c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  MockWiMaxProvider provider;
138c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
139c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(provider, OnNetworksChanged());
140c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->networks_.insert("foo");
141d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  RpcIdentifiers networks;
142c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  networks.push_back("bar");
143c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  networks.push_back("zoo");
144c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  networks.push_back("bar");
145d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  device_->OnNetworksChanged(networks);
146c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_EQ(2, device_->networks_.size());
147c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(ContainsKey(device_->networks_, "bar"));
148c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(ContainsKey(device_->networks_, "zoo"));
1499893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov}
1509893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
1518ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin PetkovTEST_F(WiMaxTest, OnConnectComplete) {
1528ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  scoped_refptr<MockWiMaxService> service(
15353cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
1548ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  device_->pending_service_ = service;
1558ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(*service, SetState(_)).Times(0);
1568ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_TRUE(device_->pending_service_);
1578ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
1588ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  device_->OnConnectComplete(Error(Error::kOperationFailed));
1598ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_FALSE(device_->pending_service_);
1608ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov}
1618ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov
162a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin PetkovTEST_F(WiMaxTest, OnStatusChanged) {
163a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  scoped_refptr<MockWiMaxService> service(
16453cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
165a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
1663a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
167a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->pending_service_ = service;
1683a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(_)).Times(0);
1693a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
1703a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
1713a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->pending_service_);
1723a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusScanning, device_->status_);
1733a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
1743a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->status_ = wimax_manager::kDeviceStatusConnecting;
175a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
176e494e313d474b91b4b5a5f6ad783e7d0bc343dc8Ben Chan  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
177a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
178a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(device_->pending_service_);
179a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
1803a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->status_ = wimax_manager::kDeviceStatusConnecting;
181a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->SelectService(service);
182a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
183a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
184a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
185a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
186a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(device_->selected_service());
187a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
188a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->pending_service_ = service;
189a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->SelectService(service);
190a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(_)).Times(0);
191a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
192a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusConnecting);
193a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_TRUE(device_->pending_service_);
194a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_TRUE(device_->selected_service());
1953a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusConnecting, device_->status_);
196a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
197a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
19853cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->SelectService(nullptr);
199a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov}
200a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
201ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiMaxTest, UseNoArpGateway) {
202b108318d9554032feee1249d51c961e4f90f4561Paul Stewart  EXPECT_CALL(dhcp_provider_, CreateConfig(kTestLinkName, _, _, false))
203ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
204ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  device_->AcquireIPConfig();
205ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
206ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
207b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin PetkovTEST_F(WiMaxTest, DropService) {
208e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan  scoped_refptr<NiceMock<MockWiMaxService>> service0(
20953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_));
210b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  scoped_refptr<MockWiMaxService> service1(
21153cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
212b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->SelectService(service0);
213b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->pending_service_ = service1;
2143a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();
215b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
216b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(2);
217b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_CALL(*service1, SetState(Service::kStateIdle));
218b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->DropService(Service::kStateIdle);
219b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->selected_service());
220b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->pending_service_);
2213a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
222b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
223b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  // Expect no crash.
224b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->DropService(Service::kStateFailure);
225b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov}
226b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
227b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin PetkovTEST_F(WiMaxTest, OnDeviceVanished) {
228b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->proxy_.reset(proxy_.release());
229b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  scoped_refptr<MockWiMaxService> service(
23053cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
231b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->pending_service_ = service;
232b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
233b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->OnDeviceVanished();
234b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->proxy_.get());
235b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->pending_service_);
236b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov}
237b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
23859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin PetkovTEST_F(WiMaxTest, OnEnableComplete) {
23959f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  MockWiMaxProvider provider;
24059f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
24159f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  RpcIdentifiers networks(1, "path");
24259f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(*proxy_, Networks(_)).WillOnce(Return(networks));
24359f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  device_->proxy_.reset(proxy_.release());
24459f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(provider, OnNetworksChanged());
24559f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  Target target;
24659f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(target, EnabledStateChanged(_));
24759f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EnabledStateChangedCallback callback(
24859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov      Bind(&Target::EnabledStateChanged, Unretained(&target)));
24959f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  Error error;
25059f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  device_->OnEnableComplete(callback, error);
25159f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_EQ(1, device_->networks_.size());
25259f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_TRUE(ContainsKey(device_->networks_, "path"));
25359f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
25459f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_TRUE(device_->proxy_.get());
25559f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  error.Populate(Error::kOperationFailed);
25659f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(target, EnabledStateChanged(_));
25759f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  device_->OnEnableComplete(callback, error);
25859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_FALSE(device_->proxy_.get());
25959f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov}
26059f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
2613a4100c44c9676f17829de5bcb23e883bd970ef7Darin PetkovTEST_F(WiMaxTest, ConnectTimeout) {
2623a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(&dispatcher_, device_->dispatcher());
2633a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
2643a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
2653a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(WiMax::kDefaultConnectTimeoutSeconds,
2663a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov            device_->connect_timeout_seconds_);
2673a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->connect_timeout_seconds_ = 0;
2683a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();
2693a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->connect_timeout_callback_.IsCancelled());
2703a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->IsConnectTimeoutStarted());
27153cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->dispatcher_ = nullptr;
2723a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();  // Expect no crash.
2733a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  scoped_refptr<MockWiMaxService> service(
27453cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
2753a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->pending_service_ = service;
2763a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
2773a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  dispatcher_.DispatchPendingEvents();
2783a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
2793a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
2803a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->pending_service_);
2813a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov}
2823a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
2833a4100c44c9676f17829de5bcb23e883bd970ef7Darin PetkovTEST_F(WiMaxTest, ConnectTo) {
2843a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  static const char kPath[] = "/network/path";
2853a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  scoped_refptr<MockWiMaxService> service(
28653cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
2873a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2883a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->status_ = wimax_manager::kDeviceStatusScanning;
2893a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, GetNetworkObjectPath()).WillOnce(Return(kPath));
290125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu  EXPECT_CALL(*proxy_, Connect(kPath, _, _, _, _))
291125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      .WillOnce(SetErrorTypeInArgument<2>(Error::kSuccess));
2923a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->proxy_.reset(proxy_.release());
2933a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  Error error;
2943a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->ConnectTo(service, &error);
2953a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(error.IsSuccess());
2963a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(service.get(), device_->pending_service_.get());
2973a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
2983a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->IsConnectTimeoutStarted());
2993a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
3003a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->ConnectTo(service, &error);
3013a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(Error::kInProgress, error.type());
3023a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
30353cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->pending_service_ = nullptr;
3043a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov}
3053a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
3066b9b2e18088f22b79ea5d87f575b67632fb5770aDarin PetkovTEST_F(WiMaxTest, IsIdle) {
3076b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_TRUE(device_->IsIdle());
308e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan  scoped_refptr<NiceMock<MockWiMaxService>> service(
30953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_));
3106b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  device_->pending_service_ = service;
3116b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_FALSE(device_->IsIdle());
31253cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->pending_service_ = nullptr;
3136b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  device_->SelectService(service);
3146b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_FALSE(device_->IsIdle());
3156b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov}
3166b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
317c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan}  // namespace shill
318