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