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_service.h"
18c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
198a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko#include <string>
208a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
22289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__)
23289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h>
24289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else
25e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov#include <chromeos/dbus/service_constants.h>
26289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif  // __ANDROID__
27c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include <gtest/gtest.h>
28c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
29c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/error.h"
30c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/mock_adaptors.h"
31c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart#include "shill/mock_eap_credentials.h"
32c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/mock_manager.h"
33c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan#include "shill/mock_metrics.h"
34d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov#include "shill/mock_store.h"
35a41ab517725d036b63420f8445550246f8f50b99Alex Vakulenko#include "shill/nice_mock_control.h"
36cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal#include "shill/service_property_change_test.h"
37c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/mock_wimax.h"
38c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/mock_wimax_network_proxy.h"
39c3d707d1ae4198d5538ff4deccd729a83f1bc805Ben Chan#include "shill/wimax/mock_wimax_provider.h"
40c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
41e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkovusing std::string;
42c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanusing testing::_;
437cc906803118d61ead47471f26eb1970a5851811Paul Stewartusing testing::AnyNumber;
44c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewartusing testing::Mock;
45c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanusing testing::NiceMock;
46c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanusing testing::Return;
474e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chanusing wimax_manager::kEAPAnonymousIdentity;
484e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chanusing wimax_manager::kEAPUserIdentity;
494e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chanusing wimax_manager::kEAPUserPassword;
50c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
51c07362bebe25b1db1716c24ed340b46b309868e5Ben Channamespace shill {
52c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
53c07362bebe25b1db1716c24ed340b46b309868e5Ben Channamespace {
54c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
55c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanconst char kTestLinkName[] = "wm0";
56e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkovconst char kTestAddress[] = "0123456789AB";
57c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanconst int kTestInterfaceIndex = 5;
58e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkovconst char kTestPath[] = "/org/chromium/WiMaxManager/Device/wm7";
59d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkovconst char kTestName[] = "Test WiMAX Network";
60d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkovconst char kTestNetworkId[] = "1234abcd";
61c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
62c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan}  // namespace
63c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
64c07362bebe25b1db1716c24ed340b46b309868e5Ben Chanclass WiMaxServiceTest : public testing::Test {
65c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan public:
66c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  WiMaxServiceTest()
671e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov      : proxy_(new MockWiMaxNetworkProxy()),
68bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal        manager_(&control_, nullptr, nullptr),
6953cc894f1ca677f930da7fce1564db44a7b02791Ben Chan        metrics_(nullptr),
7053cc894f1ca677f930da7fce1564db44a7b02791Ben Chan        device_(new MockWiMax(&control_, nullptr, &metrics_, &manager_,
71c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov                              kTestLinkName, kTestAddress, kTestInterfaceIndex,
72c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov                              kTestPath)),
7353cc894f1ca677f930da7fce1564db44a7b02791Ben Chan        service_(new WiMaxService(&control_, nullptr, &metrics_, &manager_)),
74c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart        eap_(new MockEapCredentials()) {
75d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov    service_->set_friendly_name(kTestName);
76d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov    service_->set_network_id(kTestNetworkId);
77d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov    service_->InitStorageIdentifier();
78c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart    service_->eap_.reset(eap_);  // Passes ownership.
79d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  }
80c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
81c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  virtual ~WiMaxServiceTest() {}
82c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
83c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan protected:
84c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  virtual void TearDown() {
8553cc894f1ca677f930da7fce1564db44a7b02791Ben Chan    service_->device_ = nullptr;
86c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  }
87c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
88b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov  void ExpectUpdateService() {
89b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov    EXPECT_CALL(manager_, HasService(_)).WillOnce(Return(true));
90b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov    EXPECT_CALL(manager_, UpdateService(_));
91b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov  }
92b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov
936b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  void SetConnectable(bool connectable) {
946b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov    service_->connectable_ = connectable;
956b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  }
966b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
97cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  void SetDevice(WiMaxRefPtr device) {
98cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal    service_->SetDevice(device);
99cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  }
100cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal
10193d817916f4cac344b6985c867a85f65711a1486Paul Stewart  ServiceMockAdaptor* GetAdaptor() {
102fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko    return static_cast<ServiceMockAdaptor*>(service_->adaptor());
103cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  }
104cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal
105247dcc12556bbfb7e50753befe217d29eb2f2f86Ben Chan  std::unique_ptr<MockWiMaxNetworkProxy> proxy_;
106c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  NiceMockControl control_;
107c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  MockManager manager_;
1083a4100c44c9676f17829de5bcb23e883bd970ef7Darin Petkov  NiceMock<MockMetrics> metrics_;
109c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  scoped_refptr<MockWiMax> device_;
110c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan  WiMaxServiceRefPtr service_;
11193d817916f4cac344b6985c867a85f65711a1486Paul Stewart  MockEapCredentials* eap_;  // Owned by |service_|.
112c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan};
113c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan
1144e5c1310a1c70445a473653bd37d06604c5d5f47Ben ChanTEST_F(WiMaxServiceTest, GetConnectParameters) {
115c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  KeyValueStore parameters;
116c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, PopulateWiMaxProperties(&parameters));
117c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  service_->GetConnectParameters(&parameters);
1184e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chan}
1194e5c1310a1c70445a473653bd37d06604c5d5f47Ben Chan
120e4b270274cba2a1976c7be6c733bd899e009c1d1Darin PetkovTEST_F(WiMaxServiceTest, GetDeviceRpcId) {
121e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov  Error error;
1227723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu  EXPECT_EQ(control_.NullRPCIdentifier(), service_->GetDeviceRpcId(&error));
123d4dc0836d64d957f233eaf6e4ab24093a97dd4cemukesh agrawal  EXPECT_EQ(Error::kNotFound, error.type());
124c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  service_->device_ = device_;
125c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  error.Reset();
126e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov  EXPECT_EQ(DeviceMockAdaptor::kRpcId, service_->GetDeviceRpcId(&error));
127e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov  EXPECT_TRUE(error.IsSuccess());
128e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov}
129e4b270274cba2a1976c7be6c733bd899e009c1d1Darin Petkov
1301e52a1b85f387a5f81e01a6f9fc5196e073803caDarin PetkovTEST_F(WiMaxServiceTest, OnSignalStrengthChanged) {
1311e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  const int kStrength = 55;
1321e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  service_->OnSignalStrengthChanged(kStrength);
1331e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_EQ(kStrength, service_->strength());
1341e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov}
1351e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov
136d1cd79736d7a9969c966a76a5906ea408bad3731Darin PetkovTEST_F(WiMaxServiceTest, StartStop) {
137d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  static const char kName[] = "My WiMAX Network";
1387fab89734d88724a288e96a9996b15548c5294c7Ben Chan  const uint32_t kIdentifier = 0x1234abcd;
1391e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  const int kStrength = 66;
140a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(service_->connectable());
141d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(service_->IsStarted());
142f4647d4e9783b3de43c1a92b93e276ddc461ef92Ben Chan  EXPECT_FALSE(service_->IsVisible());
143d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(0, service_->strength());
144d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(service_->proxy_.get());
1451e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_CALL(*proxy_, Name(_)).WillOnce(Return(kName));
1461e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_CALL(*proxy_, Identifier(_)).WillOnce(Return(kIdentifier));
1471e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_CALL(*proxy_, SignalStrength(_)).WillOnce(Return(kStrength));
1481e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_CALL(*proxy_, set_signal_strength_changed_callback(_));
14993d817916f4cac344b6985c867a85f65711a1486Paul Stewart  ServiceMockAdaptor* adaptor = GetAdaptor();
1507cc906803118d61ead47471f26eb1970a5851811Paul Stewart  EXPECT_CALL(*adaptor, EmitBoolChanged(kConnectableProperty, _))
1517cc906803118d61ead47471f26eb1970a5851811Paul Stewart     .Times(AnyNumber());
1527cc906803118d61ead47471f26eb1970a5851811Paul Stewart  EXPECT_CALL(*adaptor, EmitBoolChanged(kVisibleProperty, true));
153b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov  ExpectUpdateService();
154a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  service_->need_passphrase_ = false;
1551e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_TRUE(service_->Start(proxy_.release()));
156d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(service_->IsStarted());
157f4647d4e9783b3de43c1a92b93e276ddc461ef92Ben Chan  EXPECT_TRUE(service_->IsVisible());
1581e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_EQ(kStrength, service_->strength());
1591e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov  EXPECT_EQ(kName, service_->network_name());
160d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(kTestName, service_->friendly_name());
161d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(kTestNetworkId, service_->network_id());
162a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_TRUE(service_->connectable());
163d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(service_->proxy_.get());
164c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
165c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  service_->device_ = device_;
166c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(*device_, OnServiceStopped(_));
1677cc906803118d61ead47471f26eb1970a5851811Paul Stewart  EXPECT_CALL(*adaptor, EmitBoolChanged(kVisibleProperty, false));
168b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov  ExpectUpdateService();
169d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  service_->Stop();
170d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(service_->IsStarted());
171f4647d4e9783b3de43c1a92b93e276ddc461ef92Ben Chan  EXPECT_FALSE(service_->IsVisible());
172d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(0, service_->strength());
173d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_FALSE(service_->proxy_.get());
1741e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov}
1751e52a1b85f387a5f81e01a6f9fc5196e073803caDarin Petkov
176c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul StewartTEST_F(WiMaxServiceTest, Connectable) {
177c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_TRUE(service_->Is8021x());
1788021e7f581b1d040fa8ff0a09ee9444bdb58bc86Darin Petkov  EXPECT_TRUE(service_->need_passphrase_);
179c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_FALSE(service_->connectable());
180c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart
181c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
182c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart      .WillOnce(Return(false))
183c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart      .WillRepeatedly(Return(true));
184c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov
185c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  // No WiMaxCredentials.
1865777690fb2291a468715eabfcc6f7aac6f1678cdRebecca Silberstein  service_->OnEapCredentialsChanged(Service::kReasonPropertyUpdate);
1878021e7f581b1d040fa8ff0a09ee9444bdb58bc86Darin Petkov  EXPECT_TRUE(service_->need_passphrase_);
188c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_FALSE(service_->connectable());
189c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov
190c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  // Not started (no proxy).
1915777690fb2291a468715eabfcc6f7aac6f1678cdRebecca Silberstein  service_->OnEapCredentialsChanged(Service::kReasonPropertyUpdate);
192a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(service_->need_passphrase_);
193c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_FALSE(service_->connectable());
194c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov
195c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  // Connectable.
196c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  service_->proxy_.reset(proxy_.release());
197b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov  ExpectUpdateService();
1985777690fb2291a468715eabfcc6f7aac6f1678cdRebecca Silberstein  service_->OnEapCredentialsChanged(Service::kReasonPropertyUpdate);
199a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(service_->need_passphrase_);
200c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_TRUE(service_->connectable());
201a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
202c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  // Reset WimaxConnectable state.
203c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  Mock::VerifyAndClearExpectations(eap_);
204c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, set_password(""));
205c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
206c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart      .WillRepeatedly(Return(false));
207b2ba39fb7b19ce331f6aadb3e6e9e61d70a2f0a1Darin Petkov  ExpectUpdateService();
208a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  service_->ClearPassphrase();
209a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_TRUE(service_->need_passphrase_);
210c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_FALSE(service_->connectable());
2118021e7f581b1d040fa8ff0a09ee9444bdb58bc86Darin Petkov}
2128021e7f581b1d040fa8ff0a09ee9444bdb58bc86Darin Petkov
213b6df8b11a3eff18acdc3e9128af73c62ef39aa1aRebecca SilbersteinTEST_F(WiMaxServiceTest, ChangeCredResetHasEverConnected) {
214b6df8b11a3eff18acdc3e9128af73c62ef39aa1aRebecca Silberstein  service_->has_ever_connected_ = true;
215b6df8b11a3eff18acdc3e9128af73c62ef39aa1aRebecca Silberstein  EXPECT_TRUE(service_->has_ever_connected());
2165777690fb2291a468715eabfcc6f7aac6f1678cdRebecca Silberstein  service_->OnEapCredentialsChanged(Service::kReasonPropertyUpdate);
217b6df8b11a3eff18acdc3e9128af73c62ef39aa1aRebecca Silberstein  EXPECT_FALSE(service_->has_ever_connected());
218b6df8b11a3eff18acdc3e9128af73c62ef39aa1aRebecca Silberstein}
219b6df8b11a3eff18acdc3e9128af73c62ef39aa1aRebecca Silberstein
220d1cd79736d7a9969c966a76a5906ea408bad3731Darin PetkovTEST_F(WiMaxServiceTest, ConvertIdentifierToNetworkId) {
221d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ("00000000", WiMaxService::ConvertIdentifierToNetworkId(0));
222d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ("abcd1234", WiMaxService::ConvertIdentifierToNetworkId(0xabcd1234));
223d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ("ffffffff", WiMaxService::ConvertIdentifierToNetworkId(0xffffffff));
224d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov}
225d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
226d1cd79736d7a9969c966a76a5906ea408bad3731Darin PetkovTEST_F(WiMaxServiceTest, StorageIdentifier) {
227d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  static const char kStorageId[] = "wimax_test_wimax_network_1234abcd";
228d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(kStorageId, service_->GetStorageIdentifier());
229d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_EQ(kStorageId,
230d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov            WiMaxService::CreateStorageIdentifier(kTestNetworkId, kTestName));
231d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov}
232d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
233d1cd79736d7a9969c966a76a5906ea408bad3731Darin PetkovTEST_F(WiMaxServiceTest, Save) {
234d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  NiceMock<MockStore> storage;
235d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  string storage_id = service_->GetStorageIdentifier();
236d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_CALL(storage, SetString(storage_id, _, _))
237d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov      .WillRepeatedly(Return(true));
238d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_CALL(storage, DeleteKey(storage_id, _)).WillRepeatedly(Return(true));
239d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_CALL(storage, SetString(storage_id,
240d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov                                 WiMaxService::kStorageNetworkId,
241d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov                                 kTestNetworkId));
242d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov  EXPECT_TRUE(service_->Save(&storage));
243d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov}
244d1cd79736d7a9969c966a76a5906ea408bad3731Darin Petkov
245c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin PetkovTEST_F(WiMaxServiceTest, Connect) {
246a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  // Connect but not connectable.
247a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  Error error;
248a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_FALSE(service_->connectable());
249dc7b8447aa220fae51b73fd8610cbfed14ed57fcmukesh agrawal  service_->Connect(&error, "in test");
250a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  EXPECT_EQ(Error::kOperationFailed, error.type());
2516b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  SetConnectable(true);
252a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov
253a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  // No carrier device available.
254c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  MockWiMaxProvider provider;
255c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  scoped_refptr<MockWiMax> null_device;
256c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
257c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(null_device));
258a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  error.Reset();
259dc7b8447aa220fae51b73fd8610cbfed14ed57fcmukesh agrawal  service_->Connect(&error, "in test");
260c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_EQ(Error::kNoCarrier, error.type());
261c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
262a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  // Successful connect.
263c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(manager_, wimax_provider()).WillOnce(Return(&provider));
264c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
265c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(*device_, ConnectTo(_, _));
266c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  error.Reset();
267dc7b8447aa220fae51b73fd8610cbfed14ed57fcmukesh agrawal  service_->Connect(&error, "in test");
268c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(error.IsSuccess());
269c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
270a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  // Connect while already connected.
271b5310a1b20a6bbc0b644227440cee213fe53ade1Ben Chan  // TODO(benchan): Check for error if we populate error again after changing
272b5310a1b20a6bbc0b644227440cee213fe53ade1Ben Chan  // the way that Chrome handles Error::kAlreadyConnected situation.
273dc7b8447aa220fae51b73fd8610cbfed14ed57fcmukesh agrawal  service_->Connect(&error, "in test");
274c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
275a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  // Successful disconnect.
276d141ad880ee5f3c8dbf1db3487558d5231ba209fBen Chan  EXPECT_CALL(*eap_, set_password(_)).Times(0);
277c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_CALL(*device_, DisconnectFrom(_, _));
278c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  error.Reset();
2790d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  service_->Disconnect(&error, "in test");
280c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_TRUE(error.IsSuccess());
281d141ad880ee5f3c8dbf1db3487558d5231ba209fBen Chan  EXPECT_TRUE(service_->connectable());
282a289f6682940ac49c7f7217bc5f5168eef06ff75Ben Chan
283a3f9f775e30f6fbb06f34f7ee9e20a68a1412c95Darin Petkov  // Disconnect while not connected.
2840d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan  service_->Disconnect(&error, "in test");
285c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov  EXPECT_EQ(Error::kNotConnected, error.type());
286c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov}
287c63dcf0b428ea99e8a9a88bc964a51e65b6dddf0Darin Petkov
288c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin PetkovTEST_F(WiMaxServiceTest, Unload) {
289c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  MockWiMaxProvider provider;
290c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  EXPECT_CALL(manager_, wimax_provider())
291c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov      .Times(2)
292c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov      .WillRepeatedly(Return(&provider));
293c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, Reset());
294c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, set_password(""));
295c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
296c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart      .WillRepeatedly(Return(false));
297c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  EXPECT_CALL(provider, OnServiceUnloaded(_)).WillOnce(Return(false));
298c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  EXPECT_FALSE(service_->Unload());
299c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  Mock::VerifyAndClearExpectations(eap_);
300c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart
301c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, Reset());
302c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, set_password(""));
303c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  EXPECT_CALL(*eap_, IsConnectableUsingPassphrase())
304c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart      .WillRepeatedly(Return(false));
305c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  EXPECT_CALL(provider, OnServiceUnloaded(_)).WillOnce(Return(true));
306c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov  EXPECT_TRUE(service_->Unload());
307c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov}
308c1e5273c8c52bb3e5c20364d5c172d57417d3c4cDarin Petkov
3098ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin PetkovTEST_F(WiMaxServiceTest, SetState) {
3108ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  service_->device_ = device_;
3118ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_EQ(Service::kStateIdle, service_->state());
3128ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov
3138ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(manager_, UpdateService(_));
314c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  service_->SetState(Service::kStateAssociating);
3158ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_EQ(Service::kStateAssociating, service_->state());
3168ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_TRUE(service_->device_);
3178ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov
3188ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_CALL(manager_, UpdateService(_));
319c43cbbe5b33a7afe1b1250bef87fb8e9223cb764Paul Stewart  service_->SetState(Service::kStateFailure);
3208ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_EQ(Service::kStateFailure, service_->state());
3218ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov  EXPECT_FALSE(service_->device_);
3228ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov}
3238ea0eaf6fb42aa7d959a131e43ea1d06635d6da2Darin Petkov
3246b9b2e18088f22b79ea5d87f575b67632fb5770aDarin PetkovTEST_F(WiMaxServiceTest, IsAutoConnectable) {
3256b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_FALSE(service_->connectable());
32693d817916f4cac344b6985c867a85f65711a1486Paul Stewart  const char* reason = "";
3276b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
3286b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_FALSE(service_->IsAutoConnectable(&reason));
3296b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
3306b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  MockWiMaxProvider provider;
3316b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_CALL(manager_, wimax_provider())
3326b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov      .Times(2)
3336b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov      .WillRepeatedly(Return(&provider));
3346b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
3356b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  SetConnectable(true);
3366b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
3376b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_CALL(*device_, IsIdle()).WillOnce(Return(false));
3386b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  reason = "";
3396b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_FALSE(service_->IsAutoConnectable(&reason));
3406b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_EQ(WiMaxService::kAutoConnBusy, reason);
3416b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
3426b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_CALL(provider, SelectCarrier(_)).WillOnce(Return(device_));
3436b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_CALL(*device_, IsIdle()).WillOnce(Return(true));
3446b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  reason = "";
3456b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_TRUE(service_->IsAutoConnectable(&reason));
3466b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov  EXPECT_STREQ("", reason);
3476b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov}
3486b9b2e18088f22b79ea5d87f575b67632fb5770aDarin Petkov
349cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawalTEST_F(WiMaxServiceTest, PropertyChanges) {
35093d817916f4cac344b6985c867a85f65711a1486Paul Stewart  ServiceMockAdaptor* adaptor = GetAdaptor();
351cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  TestCommonPropertyChanges(service_, adaptor);
352cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  TestAutoConnectPropertyChange(service_, adaptor);
353cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal
354cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  EXPECT_CALL(*adaptor,
3554276ccab7a3bdf1c2e2e69cf79b859733d7404a0Ben Chan              EmitRpcIdentifierChanged(kDeviceProperty, _));
356cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  SetDevice(device_);
357cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  Mock::VerifyAndClearExpectations(adaptor);
358cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal
359cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  EXPECT_CALL(*adaptor,
3604276ccab7a3bdf1c2e2e69cf79b859733d7404a0Ben Chan              EmitRpcIdentifierChanged(kDeviceProperty, _));
36153cc894f1ca677f930da7fce1564db44a7b02791Ben Chan  SetDevice(nullptr);
362cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal  Mock::VerifyAndClearExpectations(adaptor);
363cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal}
364cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal
365bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if
366bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value.
367bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(WiMaxServiceTest, CustomSetterNoopChange) {
368bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal  TestCustomSetterNoopChange(service_, &manager_);
369bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal}
370bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal
371c07362bebe25b1db1716c24ed340b46b309868e5Ben Chan}  // namespace shill
372