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