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// 16b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 17c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_service.h" 18b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 19289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__) 20289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h> 21289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else 22b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include <chromeos/dbus/service_constants.h> 23289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif // __ANDROID__ 24b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include <gtest/gtest.h> 251582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley#include <mm/mm-modem.h> 26b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 27c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_capability.h" 28c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_capability_cdma.h" 29c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_cellular.h" 30c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_modem_info.h" 31c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_out_of_credits_detector.h" 32b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include "shill/mock_adaptors.h" 33965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan#include "shill/mock_manager.h" 343426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 35c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood#include "shill/mock_profile.h" 3619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan#include "shill/mock_store.h" 373ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan#include "shill/nice_mock_control.h" 38cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal#include "shill/service_property_change_test.h" 39b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 40313324136473f9120b1e485a408f51ae938dcb64Darin Petkovusing std::string; 419cb026860ded74991fa26700e07389c9d9e3c841Darin Petkovusing testing::_; 42c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbroodusing testing::InSequence; 4381599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawalusing testing::Mock; 44b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovusing testing::NiceMock; 45965804431fecfb49ae9ec4b4a0493af4840f51adBen Chanusing testing::Return; 46a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalusing testing::SetArgumentPointee; 47b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 48b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovnamespace shill { 49b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 50b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovclass CellularServiceTest : public testing::Test { 51b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov public: 52b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov CellularServiceTest() 53bad1c10ffd2d4ac14f7bd9f4ef6a8982e711f566mukesh agrawal : modem_info_(nullptr, &dispatcher_, nullptr, nullptr), 5427526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu device_(new MockCellular(&modem_info_, 55398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le "usb0", 56398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le kAddress, 57398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 3, 58398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le Cellular::kTypeCDMA, 59398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le "", 60608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu "")), 610d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu service_(new CellularService(&modem_info_, device_)), 62ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan adaptor_(nullptr) {} 63b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 64b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov virtual ~CellularServiceTest() { 65ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan adaptor_ = nullptr; 66b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov } 67b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 68b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov virtual void SetUp() { 69b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov adaptor_ = 70fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko static_cast<ServiceMockAdaptor*>(service_->adaptor()); 7143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le out_of_credits_detector_ = 720951ccbfca977a9cf218b2e4308aa26fb4d06ef9Alex Vakulenko new MockOutOfCreditsDetector(nullptr, nullptr, nullptr, service_.get()); 7343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le // Passes ownership. 7443ce4d428d619bda64eea6d37534f02c179a1756Thieu Le service_->set_out_of_credits_detector(out_of_credits_detector_); 75b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov } 76b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 772f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart CellularCapabilityCDMA* GetCapabilityCDMA() { 78fa1eb722d0742d89c26b9c5c81d02ef2a138cbf2Alex Vakulenko return static_cast<CellularCapabilityCDMA*>(device_->capability_.get()); 7982f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow } 8082f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 81b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov protected: 82313324136473f9120b1e485a408f51ae938dcb64Darin Petkov static const char kAddress[]; 83313324136473f9120b1e485a408f51ae938dcb64Darin Petkov 84457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov string GetFriendlyName() const { return service_->friendly_name(); } 85457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov 86965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EventDispatcher dispatcher_; 8727526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu MockModemInfo modem_info_; 88398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le scoped_refptr<MockCellular> device_; 89b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov CellularServiceRefPtr service_; 902f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart ServiceMockAdaptor* adaptor_; // Owned by |service_|. 912f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart MockOutOfCreditsDetector* out_of_credits_detector_; // Owned by |service_|. 92b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov}; 93b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 94313324136473f9120b1e485a408f51ae938dcb64Darin Petkovconst char CellularServiceTest::kAddress[] = "000102030405"; 95313324136473f9120b1e485a408f51ae938dcb64Darin Petkov 969fdf137271659498c0d942c3510a8133478555a7Thieu LeTEST_F(CellularServiceTest, Constructor) { 979fdf137271659498c0d942c3510a8133478555a7Thieu Le EXPECT_TRUE(service_->connectable()); 989fdf137271659498c0d942c3510a8133478555a7Thieu Le} 999fdf137271659498c0d942c3510a8133478555a7Thieu Le 100965804431fecfb49ae9ec4b4a0493af4840f51adBen ChanTEST_F(CellularServiceTest, SetActivationState) { 101965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan { 102965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan InSequence call_sequence; 103965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1047ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1057ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateNotActivated)); 106965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged( 1077ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kConnectableProperty, false)); 108965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1097ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1107ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateActivating)); 111965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged( 1127ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kConnectableProperty, true)); 113965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1147ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1157ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStatePartiallyActivated)); 116965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1177ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1187ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateActivated)); 119965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1207ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1217ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateNotActivated)); 122965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged( 1237ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kConnectableProperty, false)); 124965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan } 1250d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu EXPECT_CALL(*modem_info_.mock_manager(), HasService(_)) 1260d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu .WillRepeatedly(Return(false)); 127965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 128965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->activation_state().empty()); 129965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 130965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1317ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateNotActivated); 1327ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateNotActivated, service_->activation_state()); 133965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_FALSE(service_->connectable()); 134965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1357ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateActivating); 1367ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateActivating, service_->activation_state()); 137965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 138965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1397ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStatePartiallyActivated); 1407ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStatePartiallyActivated, service_->activation_state()); 141965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 142965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1437ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateActivated); 1447ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateActivated, service_->activation_state()); 145965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 146965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1477ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateNotActivated); 1487ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateNotActivated, service_->activation_state()); 149965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_FALSE(service_->connectable()); 150965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan} 151965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 152b72cf40dc315f9ae3537980f4fd85e737c125a03Darin PetkovTEST_F(CellularServiceTest, SetNetworkTechnology) { 1537ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kNetworkTechnologyProperty, 1547ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kNetworkTechnologyUmts)); 155b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_TRUE(service_->network_technology().empty()); 1567ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetNetworkTechnology(kNetworkTechnologyUmts); 1577ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyUmts, service_->network_technology()); 1587ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetNetworkTechnology(kNetworkTechnologyUmts); 159b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} 160b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 161b72cf40dc315f9ae3537980f4fd85e737c125a03Darin PetkovTEST_F(CellularServiceTest, SetRoamingState) { 1627ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kRoamingStateProperty, 1637ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kRoamingStateHome)); 164b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_TRUE(service_->roaming_state().empty()); 1657ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetRoamingState(kRoamingStateHome); 1667ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateHome, service_->roaming_state()); 1677ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetRoamingState(kRoamingStateHome); 168b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} 169b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 170313324136473f9120b1e485a408f51ae938dcb64Darin PetkovTEST_F(CellularServiceTest, SetStorageIdentifier) { 1717ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(string(kTypeCellular) + "_" + 172457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov kAddress + "_" + GetFriendlyName(), 173313324136473f9120b1e485a408f51ae938dcb64Darin Petkov service_->GetStorageIdentifier()); 174313324136473f9120b1e485a408f51ae938dcb64Darin Petkov service_->SetStorageIdentifier("a b c"); 175313324136473f9120b1e485a408f51ae938dcb64Darin Petkov EXPECT_EQ("a_b_c", service_->GetStorageIdentifier()); 176313324136473f9120b1e485a408f51ae938dcb64Darin Petkov} 177313324136473f9120b1e485a408f51ae938dcb64Darin Petkov 1789cb026860ded74991fa26700e07389c9d9e3c841Darin PetkovTEST_F(CellularServiceTest, SetServingOperator) { 1799cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov static const char kCode[] = "123456"; 1809cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov static const char kName[] = "Some Cellular Operator"; 181ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius Stringmap test_operator; 182ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius service_->set_serving_operator(test_operator); 183ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius test_operator[kOperatorCodeKey] = kCode; 184ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius test_operator[kOperatorNameKey] = kName; 185ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_CALL(*adaptor_, 186ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EmitStringmapChanged(kServingOperatorProperty, _)); 187ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius service_->set_serving_operator(test_operator); 1882f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const Stringmap& serving_operator = service_->serving_operator(); 189ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius ASSERT_NE(serving_operator.end(), serving_operator.find(kOperatorCodeKey)); 190ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius ASSERT_NE(serving_operator.end(), serving_operator.find(kOperatorNameKey)); 191ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_EQ(kCode, serving_operator.find(kOperatorCodeKey)->second); 192ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_EQ(kName, serving_operator.find(kOperatorNameKey)->second); 193ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius Mock::VerifyAndClearExpectations(adaptor_); 194ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_CALL(*adaptor_, 195ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EmitStringmapChanged(kServingOperatorProperty, _)).Times(0); 196ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius service_->set_serving_operator(serving_operator); 1979cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov} 1989cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov 199381928f996d23a21d4cfbed70d07cbf9029f625dDarin PetkovTEST_F(CellularServiceTest, SetOLP) { 20092df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu const char kMethod[] = "GET"; 20192df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu const char kURL[] = "payment.url"; 20292df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu const char kPostData[] = "post_man"; 20392df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu Stringmap olp; 20492df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu 20592df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu service_->SetOLP("", "", ""); 20692df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp = service_->olp(); // Copy to simplify assertions below. 20792df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ("", olp[kPaymentPortalURL]); 20892df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ("", olp[kPaymentPortalMethod]); 20992df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ("", olp[kPaymentPortalPostData]); 21092df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu 211381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov EXPECT_CALL(*adaptor_, 2127ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kPaymentPortalProperty, _)); 21392df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu service_->SetOLP(kURL, kMethod, kPostData); 21492df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp = service_->olp(); // Copy to simplify assertions below. 21592df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ(kURL, olp[kPaymentPortalURL]); 21692df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ(kMethod, olp[kPaymentPortalMethod]); 21792df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ(kPostData, olp[kPaymentPortalPostData]); 218381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov} 219381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov 220381928f996d23a21d4cfbed70d07cbf9029f625dDarin PetkovTEST_F(CellularServiceTest, SetUsageURL) { 221381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov static const char kUsageURL[] = "usage.url"; 2227ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kUsageURLProperty, 223381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov kUsageURL)); 224381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov EXPECT_TRUE(service_->usage_url().empty()); 225381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov service_->SetUsageURL(kUsageURL); 226381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov EXPECT_EQ(kUsageURL, service_->usage_url()); 227381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov service_->SetUsageURL(kUsageURL); 228381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov} 229381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov 230c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, SetApn) { 231c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kApn[] = "TheAPN"; 232c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kUsername[] = "commander.data"; 233c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ProfileRefPtr profile(new NiceMock<MockProfile>( 2340d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.control_interface(), modem_info_.metrics(), 2350d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.manager())); 236c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->set_profile(profile); 237c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Error error; 238c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap testapn; 2397ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 2407ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 241c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood { 242c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood InSequence seq; 243c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2447ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 245c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)); 246c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2477ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)); 248c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood } 249c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(testapn, &error); 250c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(error.IsSuccess()); 251c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap resultapn = service_->GetApn(&error); 252c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(error.IsSuccess()); 253c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_EQ(2, resultapn.size()); 2547ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan Stringmap::const_iterator it = resultapn.find(kApnProperty); 255c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn.end() && it->second == kApn); 2567ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan it = resultapn.find(kApnUsernameProperty); 257c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn.end() && it->second == kUsername); 258ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_NE(nullptr, service_->GetUserSpecifiedApn()); 259c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood} 260c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 261c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, ClearApn) { 262c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kApn[] = "TheAPN"; 263c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kUsername[] = "commander.data"; 264c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ProfileRefPtr profile(new NiceMock<MockProfile>( 2650d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.control_interface(), modem_info_.metrics(), 2660d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.manager())); 267c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->set_profile(profile); 268c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Error error; 269c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // Set up an APN to make sure that it later gets cleared. 270c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap testapn; 2717ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 2727ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 273c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood { 274c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood InSequence seq; 275c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2767ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 277c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)); 278c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2797ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)); 280c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood } 281c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(testapn, &error); 282c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap resultapn = service_->GetApn(&error); 283c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ASSERT_TRUE(error.IsSuccess()); 284c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ASSERT_EQ(2, service_->GetApn(&error).size()); 285c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 286c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap emptyapn; 287c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2887ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 289c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)).Times(0); 290c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2917ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)).Times(1); 292c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(emptyapn, &error); 293c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(error.IsSuccess()); 294c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood resultapn = service_->GetApn(&error); 295c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(resultapn.empty()); 296ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_EQ(nullptr, service_->GetUserSpecifiedApn());; 297c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood} 298c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 299c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, LastGoodApn) { 300c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kApn[] = "TheAPN"; 301c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kUsername[] = "commander.data"; 302c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ProfileRefPtr profile(new NiceMock<MockProfile>( 3030d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.control_interface(), modem_info_.metrics(), 3040d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.manager())); 305c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->set_profile(profile); 306c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap testapn; 3077ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 3087ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 309c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 3107ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, _)); 311c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetLastGoodApn(testapn); 3122f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart Stringmap* resultapn = service_->GetLastGoodApn(); 313ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_NE(nullptr, resultapn); 314c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_EQ(2, resultapn->size()); 3157ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan Stringmap::const_iterator it = resultapn->find(kApnProperty); 316c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn->end() && it->second == kApn); 3177ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan it = resultapn->find(kApnUsernameProperty); 318c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn->end() && it->second == kUsername); 319c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // Now set the user-specified APN, and check that LastGoodApn got 320c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // cleared. 321c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap userapn; 3227ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan userapn[kApnProperty] = kApn; 3237ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan userapn[kApnUsernameProperty] = kUsername; 324c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood { 325c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood InSequence seq; 326c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 3277ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 328c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)); 329c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 3307ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)); 331c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood } 332c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Error error; 333c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(userapn, &error); 334ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_EQ(nullptr, service_->GetLastGoodApn());; 335c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood} 336c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 33719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben ChanTEST_F(CellularServiceTest, IsAutoConnectable) { 3382f6c78991e37f5fa71f2ba4d1669be73f0a6dfd4Paul Stewart const char* reason = nullptr; 33919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 34043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le ON_CALL(*out_of_credits_detector_, IsDetecting()) 34143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillByDefault(Return(false)); 34243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le 34319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // Auto-connect should be suppressed if the device is not running. 34419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan device_->running_ = false; 34519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 34619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(CellularService::kAutoConnDeviceDisabled, reason); 34719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 34819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan device_->running_ = true; 34919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 3501582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley // If we're waiting on a disconnect before an activation, don't auto-connect. 3511582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_starting_ = true; 3521582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 3531582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley 3541582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley // If we're waiting on an activation, also don't auto-connect. 3551582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_starting_ = false; 3561582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3571582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING; 3581582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 3591582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley 360398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le GetCapabilityCDMA()->activation_state_ = 361398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED; 362398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 363398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le // Auto-connect should be suppressed if the we're undergoing an 364398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le // out-of-credits detection. 36543ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, IsDetecting()) 36643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillOnce(Return(true)); 367398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 368398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_STREQ(CellularService::kAutoConnOutOfCreditsDetectionInProgress, 369398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le reason); 37043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le Mock::VerifyAndClearExpectations(out_of_credits_detector_); 371398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 372398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le // Auto-connect should be suppressed if we're out of credits. 37343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, IsDetecting()) 37443ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillOnce(Return(false)); 37543ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, out_of_credits()) 37643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillOnce(Return(true)); 377398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 378398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_STREQ(CellularService::kAutoConnOutOfCredits, reason); 37943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le Mock::VerifyAndClearExpectations(out_of_credits_detector_); 380398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 38143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, out_of_credits()) 38243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillRepeatedly(Return(false)); 383398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 3841582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley // But other activation states are fine. 3851582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3861582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED; 3871582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 3881582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3891582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED; 3901582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 3911582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3921582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED; 3931582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 3941582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley 395d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal // A PPP authentication failure means the Service is not auto-connectable. 396d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal service_->SetFailure(Service::kFailurePPPAuth); 397d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 398d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal 399d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal // Reset failure state, to make the Service auto-connectable again. 400d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal service_->SetState(Service::kStateIdle); 401d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 402d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal 40319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // The following test cases are copied from ServiceTest.IsAutoConnectable 40419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 405cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal service_->SetConnectable(true); 40619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 40719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 40819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // We should not auto-connect to a Service that a user has 40919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // deliberately disconnected. 41019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan Error error; 41119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->UserInitiatedDisconnect(&error); 41219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 41319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(Service::kAutoConnExplicitDisconnect, reason); 41419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 41519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // But if the Service is reloaded, it is eligible for auto-connect 41619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // again. 41719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan NiceMock<MockStore> storage; 41819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_CALL(storage, ContainsGroup(service_->GetStorageIdentifier())) 41919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan .WillOnce(Return(true)); 42019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->Load(&storage)); 42119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 42219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 42319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // A non-user initiated Disconnect doesn't change anything. 4240d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan service_->Disconnect(&error, "in test"); 42519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 42619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 42719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // A resume also re-enables auto-connect. 42819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->UserInitiatedDisconnect(&error); 42919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 43019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->OnAfterResume(); 43119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 43219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 43319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->SetState(Service::kStateConnected); 43419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 43519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(Service::kAutoConnConnected, reason); 43619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 43719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->SetState(Service::kStateAssociating); 43819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 43919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(Service::kAutoConnConnecting, reason); 44019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan} 44119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 442a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalTEST_F(CellularServiceTest, LoadResetsPPPAuthFailure) { 443a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal NiceMock<MockStore> storage; 444a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, ContainsGroup(_)).WillRepeatedly(Return(true)); 445a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, GetString(_, _, _)).WillRepeatedly(Return(true)); 446a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal 447a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kDefaultUser; 448a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kDefaultPass; 449a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kNewUser("new-username"); 450a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kNewPass("new-password"); 451a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal for (const auto change_username : { false, true }) { 452a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal for (const auto change_password : { false, true }) { 453a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal service_->ppp_username_ = kDefaultUser; 454a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal service_->ppp_password_ = kDefaultPass; 455a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal service_->SetFailure(Service::kFailurePPPAuth); 456a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_TRUE(service_->IsFailed()); 457a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_EQ(Service::kFailurePPPAuth, service_->failure()); 458a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal if (change_username) { 459a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, 460a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal GetString(_, CellularService::kStoragePPPUsername, _)) 461a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .WillOnce(DoAll(SetArgumentPointee<2>(kNewUser), Return(true))) 462a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .RetiresOnSaturation(); 463a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 464a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal if (change_password) { 465a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, 466a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal GetString(_, CellularService::kStoragePPPPassword, _)) 467a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .WillOnce(DoAll(SetArgumentPointee<2>(kNewPass), Return(true))) 468a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .RetiresOnSaturation(); 469a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 470a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_TRUE(service_->Load(&storage)); 471a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal if (change_username || change_password) { 472a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_NE(Service::kFailurePPPAuth, service_->failure()); 473a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } else { 474a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_EQ(Service::kFailurePPPAuth, service_->failure()); 475a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 476a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 477a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 478a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal} 479a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal 48081599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal// Some of these tests duplicate signals tested above. However, it's 48181599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal// convenient to have all the property change notifications documented 48281599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal// (and tested) in one place. 483cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawalTEST_F(CellularServiceTest, PropertyChanges) { 484cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal TestCommonPropertyChanges(service_, adaptor_); 485cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal TestAutoConnectPropertyChange(service_, adaptor_); 48681599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 48781599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal EXPECT_CALL(*adaptor_, 48871f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le EmitStringChanged(kActivationTypeProperty, _)); 48971f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le service_->SetActivationType(CellularService::kActivationTypeOTA); 49081599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 49181599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 4927ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_NE(kActivationStateNotActivated, service_->activation_state()); 4937ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kActivationStateProperty, _)); 4947ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateNotActivated); 49581599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 49681599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 49781599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal string network_technology = service_->network_technology(); 4987ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kNetworkTechnologyProperty, _)); 49981599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal service_->SetNetworkTechnology(network_technology + "and some new stuff"); 50081599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 50181599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 50243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le bool out_of_credits = true; 50343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*adaptor_, 50443ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EmitBoolChanged(kOutOfCreditsProperty, out_of_credits)); 50543ce4d428d619bda64eea6d37534f02c179a1756Thieu Le service_->SignalOutOfCreditsChanged(out_of_credits); 50681599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 50781599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 50881599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal string roaming_state = service_->roaming_state(); 5097ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kRoamingStateProperty, _)); 51081599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal service_->SetRoamingState(roaming_state + "and some new stuff"); 51181599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 512cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal} 513cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal 514bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 515bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 516bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(CellularServiceTest, CustomSetterNoopChange) { 517bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Test that we didn't break any setters provided by the base class. 518bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal TestCustomSetterNoopChange(service_, modem_info_.mock_manager()); 519bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 520bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Test the new setter we added. 521bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // First set up our environment... 522bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const char kApn[] = "TheAPN"; 523bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const char kUsername[] = "commander.data"; 524bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 525bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Stringmap testapn; 526bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ProfileRefPtr profile(new NiceMock<MockProfile>(nullptr, nullptr, nullptr)); 527bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal service_->set_profile(profile); 5287ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 5297ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 530bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // ... then set to a known value ... 531bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(service_->SetApn(testapn, &error)); 532bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 533bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // ... then set to same value. 534bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(service_->SetApn(testapn, &error)); 535bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 536bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 537bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 538b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} // namespace shill 539