1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
16c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
17c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/wimax.h"
18c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
19247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan#include <memory>
20d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov#include <string>
21d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
22675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_config.h"
23675d0b0f04936050a357722f52dc078a3ab671d8Peter Qiu#include "shill/dhcp/mock_dhcp_provider.h"
24c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/mock_manager.h"
25c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/mock_metrics.h"
26c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/nice_mock_control.h"
277723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu#include "shill/test_event_dispatcher.h"
280bc1acaf481a6ebf33a1b973f15f800919b676eeBen Chan#include "shill/testing.h"
29c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/mock_wimax_device_proxy.h"
30c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/mock_wimax_provider.h"
31c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/mock_wimax_service.h"
32b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
3359f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkovusing base::Bind;
3459f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkovusing base::Unretained;
35b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkovusing std::string;
36912f0de92ca103568821e20412b7dc2529494f98Darin Petkovusing testing::_;
378ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkovusing testing::NiceMock;
389893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkovusing testing::Return;
39c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
40c07362bebe25b1db1716c24ed340b46b309868e5Ben Channamespace shill {
41c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
42c07362bebe25b1db1716c24ed340b46b309868e5Ben Channamespace {
43c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
44c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanconst char kTestLinkName[] = "wm0";
454e64d2d72eed1947ab1d15e6ce25a47c37a9e10cBen Chanconst char kTestAddress[] = "01:23:45:67:89:ab";
46c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanconst int kTestInterfaceIndex = 5;
47b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkovconst char kTestPath[] = "/org/chromium/WiMaxManager/Device/6";
48c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
49c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan}  // namespace
50c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
51c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanclass WiMaxTest : public testing::Test {
52c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan public:
53c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  WiMaxTest()
54b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov      : proxy_(new MockWiMaxDeviceProxy()),
556c1e3bbca64d642cb30ed9952203626942bc1451Thieu Le        metrics_(&dispatcher_),
56bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal        manager_(&control_, &dispatcher_, &metrics_),
57ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray        dhcp_config_(new MockDHCPConfig(&control_,
58ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray                                        kTestLinkName)),
59d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov        device_(new WiMax(&control_, &dispatcher_, &metrics_, &manager_,
60d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov                          kTestLinkName, kTestAddress, kTestInterfaceIndex,
61d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov                          kTestPath)) {}
62c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
63c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  virtual ~WiMaxTest() {}
64c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
65c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan protected:
6659f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  class Target {
6759f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov   public:
6859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov    virtual ~Target() {}
6959f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
7093d817916f4cac344b6985c867a85f65711a1486Paul Stewart    MOCK_METHOD1(EnabledStateChanged, void(const Error& error));
7159f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  };
7259f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
73b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  virtual void SetUp() {
74ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray    device_->set_dhcp_provider(&dhcp_provider_);
75b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  }
76b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
77b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  virtual void TearDown() {
7853cc894f1ca677f930da7fce1564db44a7b02791Ben Chan    device_->SelectService(nullptr);
7953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan    device_->pending_service_ = nullptr;
80b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov  }
81b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
82247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan  std::unique_ptr<MockWiMaxDeviceProxy> proxy_;
83c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  NiceMockControl control_;
847723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu  EventDispatcherForTest dispatcher_;
853a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  NiceMock<MockMetrics> metrics_;
86c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  MockManager manager_;
87ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  MockDHCPProvider dhcp_provider_;
88ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  scoped_refptr<MockDHCPConfig> dhcp_config_;
89d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  WiMaxRefPtr device_;
90c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan};
91c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
92b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin PetkovTEST_F(WiMaxTest, Constructor) {
93d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(kTestPath, device_->path());
94d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(device_->scanning());
95b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov}
96b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
97b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin PetkovTEST_F(WiMaxTest, StartStop) {
98d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(device_->proxy_.get());
99608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu  EXPECT_CALL(control_, CreateWiMaxDeviceProxy(_))
1000bc1acaf481a6ebf33a1b973f15f800919b676eeBen Chan      .WillOnce(ReturnAndReleasePointee(&proxy_));
101912f0de92ca103568821e20412b7dc2529494f98Darin Petkov  EXPECT_CALL(*proxy_, Enable(_, _, _));
1029893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov  EXPECT_CALL(*proxy_, set_networks_changed_callback(_));
1038ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(*proxy_, set_status_changed_callback(_));
104912f0de92ca103568821e20412b7dc2529494f98Darin Petkov  EXPECT_CALL(*proxy_, Disable(_, _, _));
10553cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->Start(nullptr, EnabledStateChangedCallback());
106c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  ASSERT_TRUE(device_->proxy_.get());
107d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
1083a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  scoped_refptr<MockWiMaxService> service(
10953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
1103a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->pending_service_ = service;
1113a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
112c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->networks_.insert("path");
113c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  MockWiMaxProvider provider;
114c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
115c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(provider, OnNetworksChanged());
1163a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();
11753cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->Stop(nullptr, EnabledStateChangedCallback());
118d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(device_->networks_.empty());
1193a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
1203a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->pending_service_);
121d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov}
122d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
123c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin PetkovTEST_F(WiMaxTest, OnServiceStopped) {
124e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan  scoped_refptr<NiceMock<MockWiMaxService>> service0(
12553cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_));
126c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  scoped_refptr<MockWiMaxService> service1(
12753cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
128c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->SelectService(service0);
129c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->pending_service_ = service1;
130d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
13153cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->OnServiceStopped(nullptr);
132d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(device_->selected_service());
133d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(device_->pending_service_);
134d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
135c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->OnServiceStopped(service0);
136d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(device_->selected_service());
137c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(device_->pending_service_);
138d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
139c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->OnServiceStopped(service1);
140c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_FALSE(device_->selected_service());
141c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_FALSE(device_->pending_service_);
142b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov}
143b72b62ec23d13c8e84a1499a04231b79d4bd74bbDarin Petkov
1449893d9c59f596e621463c8e97bb3933f8fa7edf6Darin PetkovTEST_F(WiMaxTest, OnNetworksChanged) {
145c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  MockWiMaxProvider provider;
146c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
147c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(provider, OnNetworksChanged());
148c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  device_->networks_.insert("foo");
149d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  RpcIdentifiers networks;
150c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  networks.push_back("bar");
151c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  networks.push_back("zoo");
152c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  networks.push_back("bar");
153d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  device_->OnNetworksChanged(networks);
154c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_EQ(2, device_->networks_.size());
155c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(ContainsKey(device_->networks_, "bar"));
156c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(ContainsKey(device_->networks_, "zoo"));
1579893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov}
1589893d9c59f596e621463c8e97bb3933f8fa7edf6Darin Petkov
1598ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin PetkovTEST_F(WiMaxTest, OnConnectComplete) {
1608ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  scoped_refptr<MockWiMaxService> service(
16153cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
1628ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  device_->pending_service_ = service;
1638ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(*service, SetState(_)).Times(0);
1648ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_TRUE(device_->pending_service_);
1658ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
1668ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  device_->OnConnectComplete(Error(Error::kOperationFailed));
1678ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_FALSE(device_->pending_service_);
1688ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov}
1698ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov
170a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin PetkovTEST_F(WiMaxTest, OnStatusChanged) {
171a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  scoped_refptr<MockWiMaxService> service(
17253cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
173a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
1743a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
175a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->pending_service_ = service;
1763a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(_)).Times(0);
1773a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
1783a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
1793a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->pending_service_);
1803a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusScanning, device_->status_);
1813a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
1823a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->status_ = wimax_manager::kDeviceStatusConnecting;
183a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
184e494e313d474b91b4b5a5f6ad783e7d0bc343dc8Ben Chan  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
185a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
186a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(device_->pending_service_);
187a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
1883a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->status_ = wimax_manager::kDeviceStatusConnecting;
189a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->SelectService(service);
190a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
191a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
192a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
193a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusScanning);
194a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(device_->selected_service());
195a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
196a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->pending_service_ = service;
197a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->SelectService(service);
198a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(_)).Times(0);
199a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, ClearPassphrase()).Times(0);
200a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  device_->OnStatusChanged(wimax_manager::kDeviceStatusConnecting);
201a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_TRUE(device_->pending_service_);
202a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_TRUE(device_->selected_service());
2033a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusConnecting, device_->status_);
204a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
205a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
20653cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->SelectService(nullptr);
207a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov}
208a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
209ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman UgurayTEST_F(WiMaxTest, UseNoArpGateway) {
21015d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  EXPECT_CALL(dhcp_provider_, CreateIPv4Config(kTestLinkName, _, false, _))
211ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray      .WillOnce(Return(dhcp_config_));
212ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray  device_->AcquireIPConfig();
213ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray}
214ed8e610bb7b8759bcb62b20fbc4ac30a9f242b04Arman Uguray
215b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin PetkovTEST_F(WiMaxTest, DropService) {
216e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan  scoped_refptr<NiceMock<MockWiMaxService>> service0(
21753cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_));
218b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  scoped_refptr<MockWiMaxService> service1(
21953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
220b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->SelectService(service0);
221b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->pending_service_ = service1;
2223a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();
223b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
224b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_CALL(*service0, SetState(Service::kStateIdle)).Times(2);
225b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_CALL(*service1, SetState(Service::kStateIdle));
226b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->DropService(Service::kStateIdle);
227b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->selected_service());
228b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->pending_service_);
2293a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
230b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
231b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  // Expect no crash.
232b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->DropService(Service::kStateFailure);
233b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov}
234b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
235b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin PetkovTEST_F(WiMaxTest, OnDeviceVanished) {
236b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->proxy_.reset(proxy_.release());
237b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  scoped_refptr<MockWiMaxService> service(
23853cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
239b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->pending_service_ = service;
240b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_CALL(*service, SetState(Service::kStateIdle));
241b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  device_->OnDeviceVanished();
242b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->proxy_.get());
243b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov  EXPECT_FALSE(device_->pending_service_);
244b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov}
245b96a4515c8cc4432a87c70cbae2865e1445eb86eDarin Petkov
24659f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin PetkovTEST_F(WiMaxTest, OnEnableComplete) {
24759f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  MockWiMaxProvider provider;
24859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
24959f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  RpcIdentifiers networks(1, "path");
25059f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(*proxy_, Networks(_)).WillOnce(Return(networks));
25159f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  device_->proxy_.reset(proxy_.release());
25259f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(provider, OnNetworksChanged());
25359f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  Target target;
25459f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(target, EnabledStateChanged(_));
25559f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EnabledStateChangedCallback callback(
25659f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov      Bind(&Target::EnabledStateChanged, Unretained(&target)));
25759f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  Error error;
25859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  device_->OnEnableComplete(callback, error);
25959f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_EQ(1, device_->networks_.size());
26059f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_TRUE(ContainsKey(device_->networks_, "path"));
26159f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
26259f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_TRUE(device_->proxy_.get());
26359f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  error.Populate(Error::kOperationFailed);
26459f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_CALL(target, EnabledStateChanged(_));
26559f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  device_->OnEnableComplete(callback, error);
26659f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov  EXPECT_FALSE(device_->proxy_.get());
26759f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov}
26859f2d69a15abf0a1ceb4eff58adcf815f2a0ff92Darin Petkov
2693a4100c44c9676f17829de5bcb23e883bd970ef7Darin PetkovTEST_F(WiMaxTest, ConnectTimeout) {
2703a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(&dispatcher_, device_->dispatcher());
2713a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
2723a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
2733a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(WiMax::kDefaultConnectTimeoutSeconds,
2743a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov            device_->connect_timeout_seconds_);
2753a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->connect_timeout_seconds_ = 0;
2763a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();
2773a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->connect_timeout_callback_.IsCancelled());
2783a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->IsConnectTimeoutStarted());
27953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->dispatcher_ = nullptr;
2803a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->StartConnectTimeout();  // Expect no crash.
2813a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  scoped_refptr<MockWiMaxService> service(
28253cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
2833a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->pending_service_ = service;
2843a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateFailure));
2853a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  dispatcher_.DispatchPendingEvents();
2863a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->connect_timeout_callback_.IsCancelled());
2873a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->IsConnectTimeoutStarted());
2883a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_FALSE(device_->pending_service_);
2893a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov}
2903a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
2913a4100c44c9676f17829de5bcb23e883bd970ef7Darin PetkovTEST_F(WiMaxTest, ConnectTo) {
2923a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  static const char kPath[] = "/network/path";
2933a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  scoped_refptr<MockWiMaxService> service(
29453cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new MockWiMaxService(&control_, nullptr, &metrics_, &manager_));
2953a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, SetState(Service::kStateAssociating));
2963a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->status_ = wimax_manager::kDeviceStatusScanning;
2973a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_CALL(*service, GetNetworkObjectPath()).WillOnce(Return(kPath));
298125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu  EXPECT_CALL(*proxy_, Connect(kPath, _, _, _, _))
299125aea856fbe6520131c836e0b7f14529035c62fPrathmesh Prabhu      .WillOnce(SetErrorTypeInArgument<2>(Error::kSuccess));
3003a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->proxy_.reset(proxy_.release());
3013a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  Error error;
3023a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->ConnectTo(service, &error);
3033a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(error.IsSuccess());
3043a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(service.get(), device_->pending_service_.get());
3053a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(wimax_manager::kDeviceStatusUninitialized, device_->status_);
3063a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_TRUE(device_->IsConnectTimeoutStarted());
3073a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
3083a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  device_->ConnectTo(service, &error);
3093a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  EXPECT_EQ(Error::kInProgress, error.type());
3103a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
31153cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->pending_service_ = nullptr;
3123a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov}
3133a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov
3146b9b2e18088f22b79ea5d87f575b67632fb5770aDarin PetkovTEST_F(WiMaxTest, IsIdle) {
3156b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_TRUE(device_->IsIdle());
316e2ee5e009081a392fb31596c1d0cfb30bc7bad6eBen Chan  scoped_refptr<NiceMock<MockWiMaxService>> service(
31753cc894f1ca677f930da7fce1564db44a7b02791Ben Chan      new NiceMock<MockWiMaxService>(&control_, nullptr, &metrics_, &manager_));
3186b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  device_->pending_service_ = service;
3196b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_FALSE(device_->IsIdle());
32053cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  device_->pending_service_ = nullptr;
3216b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  device_->SelectService(service);
3226b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_FALSE(device_->IsIdle());
3236b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov}
3246b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
325c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan}  // namespace shill
326