cellular_service_unittest.cc revision c54afe521739065a5d77e7c049acdb5e603f0592
1ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov// Use of this source code is governed by a BSD-style license that can be 3b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov// found in the LICENSE file. 4b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 5c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_service.h" 6b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 7b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include <chromeos/dbus/service_constants.h> 8b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include <gtest/gtest.h> 91582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley#include <mm/mm-modem.h> 10b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 11c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_capability.h" 12c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/cellular_capability_cdma.h" 13c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_cellular.h" 14c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_modem_info.h" 15c54afe521739065a5d77e7c049acdb5e603f0592Ben Chan#include "shill/cellular/mock_out_of_credits_detector.h" 16b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include "shill/mock_adaptors.h" 17965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan#include "shill/mock_manager.h" 183426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h" 19c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood#include "shill/mock_profile.h" 2019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan#include "shill/mock_store.h" 213ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan#include "shill/nice_mock_control.h" 223ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan#include "shill/proxy_factory.h" 23cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal#include "shill/service_property_change_test.h" 24b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 25313324136473f9120b1e485a408f51ae938dcb64Darin Petkovusing std::string; 269cb026860ded74991fa26700e07389c9d9e3c841Darin Petkovusing testing::_; 27c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbroodusing testing::InSequence; 2881599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawalusing testing::Mock; 29b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovusing testing::NiceMock; 30965804431fecfb49ae9ec4b4a0493af4840f51adBen Chanusing testing::Return; 31a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalusing testing::SetArgumentPointee; 32b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 33b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovnamespace shill { 34b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 35b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovclass CellularServiceTest : public testing::Test { 36b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov public: 37b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov CellularServiceTest() 38ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan : modem_info_(nullptr, &dispatcher_, nullptr, nullptr, nullptr), 3927526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu device_(new MockCellular(&modem_info_, 40398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le "usb0", 41398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le kAddress, 42398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 3, 43398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le Cellular::kTypeCDMA, 44398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le "", 45398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le "", 46398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le "", 47398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le ProxyFactory::GetInstance())), 480d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu service_(new CellularService(&modem_info_, device_)), 49ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan adaptor_(nullptr) {} 50b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 51b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov virtual ~CellularServiceTest() { 52ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan adaptor_ = nullptr; 53b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov } 54b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 55b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov virtual void SetUp() { 56b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov adaptor_ = 570d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu dynamic_cast<ServiceMockAdaptor *>(service_->adaptor()); 5843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le out_of_credits_detector_ = 59ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan new MockOutOfCreditsDetector(nullptr, nullptr, nullptr, service_); 6043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le // Passes ownership. 6143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le service_->set_out_of_credits_detector(out_of_credits_detector_); 62b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov } 63b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 643ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan CellularCapabilityCDMA *GetCapabilityCDMA() { 653ecdf823b0ae196bd6824d5dc140da752776b3f9Ben Chan return dynamic_cast<CellularCapabilityCDMA *>(device_->capability_.get()); 6682f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow } 6782f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow 68b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov protected: 69313324136473f9120b1e485a408f51ae938dcb64Darin Petkov static const char kAddress[]; 70313324136473f9120b1e485a408f51ae938dcb64Darin Petkov 71457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov string GetFriendlyName() const { return service_->friendly_name(); } 72457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov 73965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EventDispatcher dispatcher_; 7427526f1dad75e135f437e023cb34b0919d9a981fPrathmesh Prabhu MockModemInfo modem_info_; 75398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le scoped_refptr<MockCellular> device_; 76b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov CellularServiceRefPtr service_; 770d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu ServiceMockAdaptor *adaptor_; // Owned by |service_|. 7843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le MockOutOfCreditsDetector *out_of_credits_detector_; // Owned by |service_|. 79b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov}; 80b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 81313324136473f9120b1e485a408f51ae938dcb64Darin Petkovconst char CellularServiceTest::kAddress[] = "000102030405"; 82313324136473f9120b1e485a408f51ae938dcb64Darin Petkov 839fdf137271659498c0d942c3510a8133478555a7Thieu LeTEST_F(CellularServiceTest, Constructor) { 849fdf137271659498c0d942c3510a8133478555a7Thieu Le EXPECT_TRUE(service_->connectable()); 859fdf137271659498c0d942c3510a8133478555a7Thieu Le} 869fdf137271659498c0d942c3510a8133478555a7Thieu Le 87965804431fecfb49ae9ec4b4a0493af4840f51adBen ChanTEST_F(CellularServiceTest, SetActivationState) { 88965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan { 89965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan InSequence call_sequence; 90965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 917ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 927ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateNotActivated)); 93965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged( 947ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kConnectableProperty, false)); 95965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 967ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 977ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateActivating)); 98965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged( 997ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kConnectableProperty, true)); 100965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1017ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1027ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStatePartiallyActivated)); 103965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1047ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1057ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateActivated)); 106965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitStringChanged( 1077ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateProperty, 1087ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kActivationStateNotActivated)); 109965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_CALL(*adaptor_, EmitBoolChanged( 1107ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kConnectableProperty, false)); 111965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan } 1120d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu EXPECT_CALL(*modem_info_.mock_manager(), HasService(_)) 1130d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu .WillRepeatedly(Return(false)); 114965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 115965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->activation_state().empty()); 116965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 117965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1187ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateNotActivated); 1197ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateNotActivated, service_->activation_state()); 120965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_FALSE(service_->connectable()); 121965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1227ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateActivating); 1237ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateActivating, service_->activation_state()); 124965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 125965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1267ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStatePartiallyActivated); 1277ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStatePartiallyActivated, service_->activation_state()); 128965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 129965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1307ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateActivated); 1317ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateActivated, service_->activation_state()); 132965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_TRUE(service_->connectable()); 133965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 1347ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateNotActivated); 1357ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kActivationStateNotActivated, service_->activation_state()); 136965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan EXPECT_FALSE(service_->connectable()); 137965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan} 138965804431fecfb49ae9ec4b4a0493af4840f51adBen Chan 139b72cf40dc315f9ae3537980f4fd85e737c125a03Darin PetkovTEST_F(CellularServiceTest, SetNetworkTechnology) { 1407ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kNetworkTechnologyProperty, 1417ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kNetworkTechnologyUmts)); 142b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_TRUE(service_->network_technology().empty()); 1437ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetNetworkTechnology(kNetworkTechnologyUmts); 1447ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kNetworkTechnologyUmts, service_->network_technology()); 1457ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetNetworkTechnology(kNetworkTechnologyUmts); 146b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} 147b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 148b72cf40dc315f9ae3537980f4fd85e737c125a03Darin PetkovTEST_F(CellularServiceTest, SetRoamingState) { 1497ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kRoamingStateProperty, 1507ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan kRoamingStateHome)); 151b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov EXPECT_TRUE(service_->roaming_state().empty()); 1527ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetRoamingState(kRoamingStateHome); 1537ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(kRoamingStateHome, service_->roaming_state()); 1547ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetRoamingState(kRoamingStateHome); 155b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} 156b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov 157313324136473f9120b1e485a408f51ae938dcb64Darin PetkovTEST_F(CellularServiceTest, SetStorageIdentifier) { 1587ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_EQ(string(kTypeCellular) + "_" + 159457728b3eeb2d67c980e0d20675f0a0f750903e1Darin Petkov kAddress + "_" + GetFriendlyName(), 160313324136473f9120b1e485a408f51ae938dcb64Darin Petkov service_->GetStorageIdentifier()); 161313324136473f9120b1e485a408f51ae938dcb64Darin Petkov service_->SetStorageIdentifier("a b c"); 162313324136473f9120b1e485a408f51ae938dcb64Darin Petkov EXPECT_EQ("a_b_c", service_->GetStorageIdentifier()); 163313324136473f9120b1e485a408f51ae938dcb64Darin Petkov} 164313324136473f9120b1e485a408f51ae938dcb64Darin Petkov 1659cb026860ded74991fa26700e07389c9d9e3c841Darin PetkovTEST_F(CellularServiceTest, SetServingOperator) { 1669cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov static const char kCode[] = "123456"; 1679cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov static const char kName[] = "Some Cellular Operator"; 168ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius Stringmap test_operator; 169ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius service_->set_serving_operator(test_operator); 170ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius test_operator[kOperatorCodeKey] = kCode; 171ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius test_operator[kOperatorNameKey] = kName; 172ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_CALL(*adaptor_, 173ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EmitStringmapChanged(kServingOperatorProperty, _)); 174ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius service_->set_serving_operator(test_operator); 175ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius const Stringmap &serving_operator = service_->serving_operator(); 176ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius ASSERT_NE(serving_operator.end(), serving_operator.find(kOperatorCodeKey)); 177ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius ASSERT_NE(serving_operator.end(), serving_operator.find(kOperatorNameKey)); 178ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_EQ(kCode, serving_operator.find(kOperatorCodeKey)->second); 179ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_EQ(kName, serving_operator.find(kOperatorNameKey)->second); 180ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius Mock::VerifyAndClearExpectations(adaptor_); 181ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EXPECT_CALL(*adaptor_, 182ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius EmitStringmapChanged(kServingOperatorProperty, _)).Times(0); 183ec77f591237b5e0e2b05f67ae8dd4b25c08de6cbRoshan Pius service_->set_serving_operator(serving_operator); 1849cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov} 1859cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov 186381928f996d23a21d4cfbed70d07cbf9029f625dDarin PetkovTEST_F(CellularServiceTest, SetOLP) { 18792df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu const char kMethod[] = "GET"; 18892df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu const char kURL[] = "payment.url"; 18992df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu const char kPostData[] = "post_man"; 19092df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu Stringmap olp; 19192df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu 19292df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu service_->SetOLP("", "", ""); 19392df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp = service_->olp(); // Copy to simplify assertions below. 19492df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ("", olp[kPaymentPortalURL]); 19592df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ("", olp[kPaymentPortalMethod]); 19692df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ("", olp[kPaymentPortalPostData]); 19792df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu 198381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov EXPECT_CALL(*adaptor_, 1997ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kPaymentPortalProperty, _)); 20092df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu service_->SetOLP(kURL, kMethod, kPostData); 20192df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu olp = service_->olp(); // Copy to simplify assertions below. 20292df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ(kURL, olp[kPaymentPortalURL]); 20392df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ(kMethod, olp[kPaymentPortalMethod]); 20492df619a98585c7fe7b072fe07f60b43c9ec52ddPrathmesh Prabhu EXPECT_EQ(kPostData, olp[kPaymentPortalPostData]); 205381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov} 206381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov 207381928f996d23a21d4cfbed70d07cbf9029f625dDarin PetkovTEST_F(CellularServiceTest, SetUsageURL) { 208381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov static const char kUsageURL[] = "usage.url"; 2097ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kUsageURLProperty, 210381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov kUsageURL)); 211381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov EXPECT_TRUE(service_->usage_url().empty()); 212381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov service_->SetUsageURL(kUsageURL); 213381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov EXPECT_EQ(kUsageURL, service_->usage_url()); 214381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov service_->SetUsageURL(kUsageURL); 215381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov} 216381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov 217c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, SetApn) { 218c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kApn[] = "TheAPN"; 219c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kUsername[] = "commander.data"; 220c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ProfileRefPtr profile(new NiceMock<MockProfile>( 2210d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.control_interface(), modem_info_.metrics(), 2220d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.manager())); 223c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->set_profile(profile); 224c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Error error; 225c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap testapn; 2267ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 2277ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 228c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood { 229c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood InSequence seq; 230c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2317ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 232c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)); 233c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2347ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)); 235c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood } 236c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(testapn, &error); 237c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(error.IsSuccess()); 238c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap resultapn = service_->GetApn(&error); 239c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(error.IsSuccess()); 240c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_EQ(2, resultapn.size()); 2417ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan Stringmap::const_iterator it = resultapn.find(kApnProperty); 242c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn.end() && it->second == kApn); 2437ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan it = resultapn.find(kApnUsernameProperty); 244c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn.end() && it->second == kUsername); 245ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_NE(nullptr, service_->GetUserSpecifiedApn()); 246c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood} 247c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 248c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, ClearApn) { 249c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kApn[] = "TheAPN"; 250c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kUsername[] = "commander.data"; 251c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ProfileRefPtr profile(new NiceMock<MockProfile>( 2520d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.control_interface(), modem_info_.metrics(), 2530d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.manager())); 254c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->set_profile(profile); 255c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Error error; 256c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // Set up an APN to make sure that it later gets cleared. 257c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap testapn; 2587ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 2597ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 260c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood { 261c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood InSequence seq; 262c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2637ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 264c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)); 265c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2667ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)); 267c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood } 268c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(testapn, &error); 269c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap resultapn = service_->GetApn(&error); 270c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ASSERT_TRUE(error.IsSuccess()); 271c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ASSERT_EQ(2, service_->GetApn(&error).size()); 272c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 273c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap emptyapn; 274c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2757ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 276c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)).Times(0); 277c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2787ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)).Times(1); 279c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(emptyapn, &error); 280c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(error.IsSuccess()); 281c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood resultapn = service_->GetApn(&error); 282c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(resultapn.empty()); 283ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_EQ(nullptr, service_->GetUserSpecifiedApn());; 284c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood} 285c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 286c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, LastGoodApn) { 287c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kApn[] = "TheAPN"; 288c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood static const char kUsername[] = "commander.data"; 289c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood ProfileRefPtr profile(new NiceMock<MockProfile>( 2900d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.control_interface(), modem_info_.metrics(), 2910d36b4fb5424a4c6f890e65a62a3b29e26eddb7aPrathmesh Prabhu modem_info_.manager())); 292c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->set_profile(profile); 293c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap testapn; 2947ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 2957ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 296c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 2977ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, _)); 298c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetLastGoodApn(testapn); 299c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap *resultapn = service_->GetLastGoodApn(); 300ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_NE(nullptr, resultapn); 301c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_EQ(2, resultapn->size()); 3027ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan Stringmap::const_iterator it = resultapn->find(kApnProperty); 303c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn->end() && it->second == kApn); 3047ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan it = resultapn->find(kApnUsernameProperty); 305c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_TRUE(it != resultapn->end() && it->second == kUsername); 306c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // Now set the user-specified APN, and check that LastGoodApn got 307c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood // cleared. 308c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Stringmap userapn; 3097ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan userapn[kApnProperty] = kApn; 3107ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan userapn[kApnUsernameProperty] = kUsername; 311c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood { 312c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood InSequence seq; 313c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 3147ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularLastGoodApnProperty, 315c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood _)); 316c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood EXPECT_CALL(*adaptor_, 3177ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EmitStringmapChanged(kCellularApnProperty, _)); 318c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood } 319c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood Error error; 320c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood service_->SetApn(userapn, &error); 321ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan EXPECT_EQ(nullptr, service_->GetLastGoodApn());; 322c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood} 323c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood 32419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben ChanTEST_F(CellularServiceTest, IsAutoConnectable) { 325ea18c6c99743aeee9b2e544532ef9fe55dbd182dBen Chan const char *reason = nullptr; 32619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 32743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le ON_CALL(*out_of_credits_detector_, IsDetecting()) 32843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillByDefault(Return(false)); 32943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le 33019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // Auto-connect should be suppressed if the device is not running. 33119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan device_->running_ = false; 33219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 33319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(CellularService::kAutoConnDeviceDisabled, reason); 33419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 33519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan device_->running_ = true; 33619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 3371582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley // If we're waiting on a disconnect before an activation, don't auto-connect. 3381582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_starting_ = true; 3391582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 3401582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley 3411582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley // If we're waiting on an activation, also don't auto-connect. 3421582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_starting_ = false; 3431582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3441582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING; 3451582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 3461582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley 347398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le GetCapabilityCDMA()->activation_state_ = 348398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED; 349398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 350398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le // Auto-connect should be suppressed if the we're undergoing an 351398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le // out-of-credits detection. 35243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, IsDetecting()) 35343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillOnce(Return(true)); 354398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 355398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_STREQ(CellularService::kAutoConnOutOfCreditsDetectionInProgress, 356398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le reason); 35743ce4d428d619bda64eea6d37534f02c179a1756Thieu Le Mock::VerifyAndClearExpectations(out_of_credits_detector_); 358398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 359398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le // Auto-connect should be suppressed if we're out of credits. 36043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, IsDetecting()) 36143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillOnce(Return(false)); 36243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, out_of_credits()) 36343ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillOnce(Return(true)); 364398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 365398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le EXPECT_STREQ(CellularService::kAutoConnOutOfCredits, reason); 36643ce4d428d619bda64eea6d37534f02c179a1756Thieu Le Mock::VerifyAndClearExpectations(out_of_credits_detector_); 367398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 36843ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*out_of_credits_detector_, out_of_credits()) 36943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le .WillRepeatedly(Return(false)); 370398b1da04e413f89f0edeb53e939e3a2d2866298Thieu Le 3711582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley // But other activation states are fine. 3721582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3731582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED; 3741582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 3751582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3761582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED; 3771582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 3781582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley GetCapabilityCDMA()->activation_state_ = 3791582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED; 3801582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 3811582bddf620625f9e6f6c407a707d6a916387df1Christopher Wiley 382d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal // A PPP authentication failure means the Service is not auto-connectable. 383d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal service_->SetFailure(Service::kFailurePPPAuth); 384d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 385d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal 386d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal // Reset failure state, to make the Service auto-connectable again. 387d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal service_->SetState(Service::kStateIdle); 388d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 389d47738866711ed29c04a82647d9acb7b8a668924mukesh agrawal 39019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // The following test cases are copied from ServiceTest.IsAutoConnectable 39119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 392cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal service_->SetConnectable(true); 39319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 39419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 39519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // We should not auto-connect to a Service that a user has 39619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // deliberately disconnected. 39719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan Error error; 39819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->UserInitiatedDisconnect(&error); 39919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 40019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(Service::kAutoConnExplicitDisconnect, reason); 40119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 40219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // But if the Service is reloaded, it is eligible for auto-connect 40319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // again. 40419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan NiceMock<MockStore> storage; 40519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_CALL(storage, ContainsGroup(service_->GetStorageIdentifier())) 40619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan .WillOnce(Return(true)); 40719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->Load(&storage)); 40819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 40919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 41019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // A non-user initiated Disconnect doesn't change anything. 4110d06119be3224788ba1aa65ed24bc8e46b56b949Samuel Tan service_->Disconnect(&error, "in test"); 41219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 41319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 41419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan // A resume also re-enables auto-connect. 41519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->UserInitiatedDisconnect(&error); 41619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 41719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->OnAfterResume(); 41819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_TRUE(service_->IsAutoConnectable(&reason)); 41919f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 42019f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->SetState(Service::kStateConnected); 42119f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 42219f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(Service::kAutoConnConnected, reason); 42319f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 42419f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan service_->SetState(Service::kStateAssociating); 42519f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_FALSE(service_->IsAutoConnectable(&reason)); 42619f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan EXPECT_STREQ(Service::kAutoConnConnecting, reason); 42719f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan} 42819f83971a35d7f2c7b08aae6eb0abdc8e52ba057Ben Chan 429a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawalTEST_F(CellularServiceTest, LoadResetsPPPAuthFailure) { 430a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal NiceMock<MockStore> storage; 431a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, ContainsGroup(_)).WillRepeatedly(Return(true)); 432a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, GetString(_, _, _)).WillRepeatedly(Return(true)); 433a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal 434a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kDefaultUser; 435a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kDefaultPass; 436a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kNewUser("new-username"); 437a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal const string kNewPass("new-password"); 438a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal for (const auto change_username : { false, true }) { 439a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal for (const auto change_password : { false, true }) { 440a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal service_->ppp_username_ = kDefaultUser; 441a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal service_->ppp_password_ = kDefaultPass; 442a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal service_->SetFailure(Service::kFailurePPPAuth); 443a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_TRUE(service_->IsFailed()); 444a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_EQ(Service::kFailurePPPAuth, service_->failure()); 445a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal if (change_username) { 446a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, 447a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal GetString(_, CellularService::kStoragePPPUsername, _)) 448a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .WillOnce(DoAll(SetArgumentPointee<2>(kNewUser), Return(true))) 449a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .RetiresOnSaturation(); 450a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 451a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal if (change_password) { 452a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_CALL(storage, 453a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal GetString(_, CellularService::kStoragePPPPassword, _)) 454a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .WillOnce(DoAll(SetArgumentPointee<2>(kNewPass), Return(true))) 455a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal .RetiresOnSaturation(); 456a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 457a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_TRUE(service_->Load(&storage)); 458a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal if (change_username || change_password) { 459a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_NE(Service::kFailurePPPAuth, service_->failure()); 460a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } else { 461a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal EXPECT_EQ(Service::kFailurePPPAuth, service_->failure()); 462a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 463a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 464a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal } 465a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal} 466a70ec27425dcc4527ece33c1b95f37129ba26653mukesh agrawal 46781599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal// Some of these tests duplicate signals tested above. However, it's 46881599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal// convenient to have all the property change notifications documented 46981599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal// (and tested) in one place. 470cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawalTEST_F(CellularServiceTest, PropertyChanges) { 471cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal TestCommonPropertyChanges(service_, adaptor_); 472cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal TestAutoConnectPropertyChange(service_, adaptor_); 47381599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 47481599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal EXPECT_CALL(*adaptor_, 47571f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le EmitStringChanged(kActivationTypeProperty, _)); 47671f81a648ef4e087d94e7faf0074f8c78965dec7Thieu Le service_->SetActivationType(CellularService::kActivationTypeOTA); 47781599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 47881599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 4797ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_NE(kActivationStateNotActivated, service_->activation_state()); 4807ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kActivationStateProperty, _)); 4817ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan service_->SetActivationState(kActivationStateNotActivated); 48281599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 48381599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 48481599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal string network_technology = service_->network_technology(); 4857ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kNetworkTechnologyProperty, _)); 48681599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal service_->SetNetworkTechnology(network_technology + "and some new stuff"); 48781599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 48881599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 48943ce4d428d619bda64eea6d37534f02c179a1756Thieu Le bool out_of_credits = true; 49043ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EXPECT_CALL(*adaptor_, 49143ce4d428d619bda64eea6d37534f02c179a1756Thieu Le EmitBoolChanged(kOutOfCreditsProperty, out_of_credits)); 49243ce4d428d619bda64eea6d37534f02c179a1756Thieu Le service_->SignalOutOfCreditsChanged(out_of_credits); 49381599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 49481599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal 49581599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal string roaming_state = service_->roaming_state(); 4967ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan EXPECT_CALL(*adaptor_, EmitStringChanged(kRoamingStateProperty, _)); 49781599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal service_->SetRoamingState(roaming_state + "and some new stuff"); 49881599e00d01dee9f13710376577b37dfd70fe3f4mukesh agrawal Mock::VerifyAndClearExpectations(adaptor_); 499cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal} 500cbfb34e699532f62eb5b381d0ea3a15d39e00b7cmukesh agrawal 501bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// Custom property setters should return false, and make no changes, if 502bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal// the new value is the same as the old value. 503bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawalTEST_F(CellularServiceTest, CustomSetterNoopChange) { 504bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Test that we didn't break any setters provided by the base class. 505bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal TestCustomSetterNoopChange(service_, modem_info_.mock_manager()); 506bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 507bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // Test the new setter we added. 508bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // First set up our environment... 509bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const char kApn[] = "TheAPN"; 510bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal static const char kUsername[] = "commander.data"; 511bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Error error; 512bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal Stringmap testapn; 513bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal ProfileRefPtr profile(new NiceMock<MockProfile>(nullptr, nullptr, nullptr)); 514bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal service_->set_profile(profile); 5157ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnProperty] = kApn; 5167ea768e15de860c8a27143ead02a8d3f15ab9f47Ben Chan testapn[kApnUsernameProperty] = kUsername; 517bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // ... then set to a known value ... 518bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(service_->SetApn(testapn, &error)); 519bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 520bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal // ... then set to same value. 521bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_FALSE(service_->SetApn(testapn, &error)); 522bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal EXPECT_TRUE(error.IsSuccess()); 523bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal} 524bebf1b8bce52b88c2cc2d93200b9405f9c19cf21mukesh agrawal 525b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov} // namespace shill 526