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