cellular_service_unittest.cc revision 9fdf137271659498c0d942c3510a8133478555a7
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
5b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include "shill/cellular_service.h"
6b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
7b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include <chromeos/dbus/service_constants.h>
8b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include <gtest/gtest.h>
9b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
105de44ab664b7cbb7619e31431e346ec8309548a6Eric Shienbrood#include "shill/cellular_capability.h"
1182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow#include "shill/cellular_capability_gsm.h"
12b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include "shill/nice_mock_control.h"
13b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov#include "shill/mock_adaptors.h"
143426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le#include "shill/mock_metrics.h"
15c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood#include "shill/mock_profile.h"
16b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
17313324136473f9120b1e485a408f51ae938dcb64Darin Petkovusing std::string;
189cb026860ded74991fa26700e07389c9d9e3c841Darin Petkovusing testing::_;
19c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbroodusing testing::InSequence;
20b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovusing testing::NiceMock;
21b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
22b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovnamespace shill {
23b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
24b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkovclass CellularServiceTest : public testing::Test {
25b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov public:
26b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  CellularServiceTest()
27ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov      : device_(new Cellular(&control_,
28ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             NULL,
293426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                             &metrics_,
30ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             NULL,
31ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             "usb0",
32313324136473f9120b1e485a408f51ae938dcb64Darin Petkov                             kAddress,
33ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             3,
34ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             Cellular::kTypeGSM,
35ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             "",
36ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             "",
37ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov                             NULL)),
383426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le        service_(new CellularService(&control_, NULL, &metrics_, NULL,
393426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le                                     device_)),
40b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov        adaptor_(NULL) {}
41b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
42b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  virtual ~CellularServiceTest() {
43b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov    adaptor_ = NULL;
44b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  }
45b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
46b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  virtual void SetUp() {
47b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov    adaptor_ =
48b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov        dynamic_cast<NiceMock<ServiceMockAdaptor> *>(service_->adaptor());
49b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  }
50b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
5182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  CellularCapabilityGSM *GetCapabilityGSM() {
5282f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow    return dynamic_cast<CellularCapabilityGSM *>(device_->capability_.get());
5382f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  }
5482f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow
55b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov protected:
56313324136473f9120b1e485a408f51ae938dcb64Darin Petkov  static const char kAddress[];
57313324136473f9120b1e485a408f51ae938dcb64Darin Petkov
58b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  NiceMockControl control_;
593426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  MockMetrics metrics_;
60ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov  CellularRefPtr device_;
61b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  CellularServiceRefPtr service_;
62b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  NiceMock<ServiceMockAdaptor> *adaptor_;  // Owned by |service_|.
63b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov};
64b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
65313324136473f9120b1e485a408f51ae938dcb64Darin Petkovconst char CellularServiceTest::kAddress[] = "000102030405";
66313324136473f9120b1e485a408f51ae938dcb64Darin Petkov
679fdf137271659498c0d942c3510a8133478555a7Thieu LeTEST_F(CellularServiceTest, Constructor) {
689fdf137271659498c0d942c3510a8133478555a7Thieu Le  EXPECT_TRUE(service_->connectable());
699fdf137271659498c0d942c3510a8133478555a7Thieu Le}
709fdf137271659498c0d942c3510a8133478555a7Thieu Le
71b72cf40dc315f9ae3537980f4fd85e737c125a03Darin PetkovTEST_F(CellularServiceTest, SetNetworkTechnology) {
72b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kNetworkTechnologyProperty,
73b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov                                           flimflam::kNetworkTechnologyUmts));
74b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  EXPECT_TRUE(service_->network_technology().empty());
75b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  service_->SetNetworkTechnology(flimflam::kNetworkTechnologyUmts);
76b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  EXPECT_EQ(flimflam::kNetworkTechnologyUmts, service_->network_technology());
77b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  service_->SetNetworkTechnology(flimflam::kNetworkTechnologyUmts);
78b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov}
79b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
80b72cf40dc315f9ae3537980f4fd85e737c125a03Darin PetkovTEST_F(CellularServiceTest, SetRoamingState) {
81b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kRoamingStateProperty,
82b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov                                           flimflam::kRoamingStateHome));
83b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  EXPECT_TRUE(service_->roaming_state().empty());
84b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  service_->SetRoamingState(flimflam::kRoamingStateHome);
85b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  EXPECT_EQ(flimflam::kRoamingStateHome, service_->roaming_state());
86b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov  service_->SetRoamingState(flimflam::kRoamingStateHome);
87b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov}
88b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov
89ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin PetkovTEST_F(CellularServiceTest, FriendlyName) {
90ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov  static const char kCarrier[] = "Cellular Carrier";
9182f9ab3f404c8f414348c6effdc57c4d3b9223d7Jason Glasgow  GetCapabilityGSM()->carrier_ = kCarrier;
923426c8fc7a3943f2d8fcb2ec78f0593088b42bedThieu Le  service_ = new CellularService(&control_, NULL, &metrics_, NULL, device_);
93ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov  EXPECT_EQ(kCarrier, service_->friendly_name());
94ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov}
95ac635a8fb539fd44f3e24c33872b61fd064c0d60Darin Petkov
96313324136473f9120b1e485a408f51ae938dcb64Darin PetkovTEST_F(CellularServiceTest, SetStorageIdentifier) {
97dd3e86688859f209f1128f5562fc03a21f211aa8Darin Petkov  EXPECT_EQ(string(flimflam::kTypeCellular) + "_" +
98dd3e86688859f209f1128f5562fc03a21f211aa8Darin Petkov            kAddress + "_" + service_->friendly_name(),
99313324136473f9120b1e485a408f51ae938dcb64Darin Petkov            service_->GetStorageIdentifier());
100313324136473f9120b1e485a408f51ae938dcb64Darin Petkov  service_->SetStorageIdentifier("a b c");
101313324136473f9120b1e485a408f51ae938dcb64Darin Petkov  EXPECT_EQ("a_b_c", service_->GetStorageIdentifier());
102313324136473f9120b1e485a408f51ae938dcb64Darin Petkov}
103313324136473f9120b1e485a408f51ae938dcb64Darin Petkov
1049cb026860ded74991fa26700e07389c9d9e3c841Darin PetkovTEST_F(CellularServiceTest, SetServingOperator) {
1059cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  EXPECT_CALL(*adaptor_,
1069cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov              EmitStringmapChanged(flimflam::kServingOperatorProperty, _));
1079cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  static const char kCode[] = "123456";
1089cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  static const char kName[] = "Some Cellular Operator";
1099cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  Cellular::Operator oper;
1109cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  service_->SetServingOperator(oper);
1119cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  oper.SetCode(kCode);
1129cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  oper.SetName(kName);
1139cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  service_->SetServingOperator(oper);
1149cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  EXPECT_EQ(kCode, service_->serving_operator().GetCode());
1159cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  EXPECT_EQ(kName, service_->serving_operator().GetName());
1169cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov  service_->SetServingOperator(oper);
1179cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov}
1189cb026860ded74991fa26700e07389c9d9e3c841Darin Petkov
119381928f996d23a21d4cfbed70d07cbf9029f625dDarin PetkovTEST_F(CellularServiceTest, SetOLP) {
120381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  EXPECT_CALL(*adaptor_,
121381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov              EmitStringmapChanged(flimflam::kPaymentPortalProperty, _));
122381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  static const char kURL[] = "payment.url";
123381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  static const char kMethod[] = "GET";
124381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  CellularService::OLP olp;
125381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  service_->SetOLP(olp);
126381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  olp.SetURL(kURL);
127381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  olp.SetMethod(kMethod);
128381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  service_->SetOLP(olp);
129381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  EXPECT_EQ(kURL, service_->olp().GetURL());
130381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  EXPECT_EQ(kMethod, service_->olp().GetMethod());
131381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  service_->SetOLP(olp);
132381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov}
133381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov
134381928f996d23a21d4cfbed70d07cbf9029f625dDarin PetkovTEST_F(CellularServiceTest, SetUsageURL) {
135381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  static const char kUsageURL[] = "usage.url";
136381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  EXPECT_CALL(*adaptor_, EmitStringChanged(flimflam::kUsageURLProperty,
137381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov                                           kUsageURL));
138381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  EXPECT_TRUE(service_->usage_url().empty());
139381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  service_->SetUsageURL(kUsageURL);
140381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  EXPECT_EQ(kUsageURL, service_->usage_url());
141381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov  service_->SetUsageURL(kUsageURL);
142381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov}
143381928f996d23a21d4cfbed70d07cbf9029f625dDarin Petkov
144c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, SetApn) {
145c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  static const char kApn[] = "TheAPN";
146c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  static const char kUsername[] = "commander.data";
147c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  ProfileRefPtr profile(new NiceMock<MockProfile>(
148c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood      &control_, reinterpret_cast<Manager *>(NULL)));
149c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->set_profile(profile);
150c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Error error;
151c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap testapn;
152c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  testapn[flimflam::kApnProperty] = kApn;
153c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  testapn[flimflam::kApnUsernameProperty] = kUsername;
154c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  {
155c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    InSequence seq;
156c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    EXPECT_CALL(*adaptor_,
157c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
158c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                                     _));
159c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    EXPECT_CALL(*adaptor_,
160c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                EmitStringmapChanged(flimflam::kCellularApnProperty, _));
161c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  }
162c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->SetApn(testapn, &error);
163c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(error.IsSuccess());
164c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap resultapn = service_->GetApn(&error);
165c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(error.IsSuccess());
166c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_EQ(2, resultapn.size());
167c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap::const_iterator it = resultapn.find(flimflam::kApnProperty);
168c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(it != resultapn.end() && it->second == kApn);
169c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  it = resultapn.find(flimflam::kApnUsernameProperty);
170c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(it != resultapn.end() && it->second == kUsername);
171c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_FALSE(service_->GetUserSpecifiedApn() == NULL);
172c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood}
173c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood
174c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, ClearApn) {
175c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  static const char kApn[] = "TheAPN";
176c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  static const char kUsername[] = "commander.data";
177c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  ProfileRefPtr profile(new NiceMock<MockProfile>(
178c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood      &control_, reinterpret_cast<Manager *>(NULL)));
179c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->set_profile(profile);
180c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Error error;
181c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  // Set up an APN to make sure that it later gets cleared.
182c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap testapn;
183c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  testapn[flimflam::kApnProperty] = kApn;
184c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  testapn[flimflam::kApnUsernameProperty] = kUsername;
185c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  {
186c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    InSequence seq;
187c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    EXPECT_CALL(*adaptor_,
188c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
189c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                                     _));
190c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    EXPECT_CALL(*adaptor_,
191c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                EmitStringmapChanged(flimflam::kCellularApnProperty, _));
192c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  }
193c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->SetApn(testapn, &error);
194c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap resultapn = service_->GetApn(&error);
195c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  ASSERT_TRUE(error.IsSuccess());
196c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  ASSERT_EQ(2, service_->GetApn(&error).size());
197c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood
198c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap emptyapn;
199c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_CALL(*adaptor_,
200c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood              EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
201c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                                   _)).Times(0);
202c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_CALL(*adaptor_,
203c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood              EmitStringmapChanged(flimflam::kCellularApnProperty, _)).Times(1);
204c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->SetApn(emptyapn, &error);
205c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(error.IsSuccess());
206c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  resultapn = service_->GetApn(&error);
207c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(resultapn.empty());
208c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(service_->GetUserSpecifiedApn() == NULL);
209c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood}
210c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood
211c7073307211b6b5a090a14b951524ac210ab1c9cEric ShienbroodTEST_F(CellularServiceTest, LastGoodApn) {
212c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  static const char kApn[] = "TheAPN";
213c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  static const char kUsername[] = "commander.data";
214c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  ProfileRefPtr profile(new NiceMock<MockProfile>(
215c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood      &control_, reinterpret_cast<Manager *>(NULL)));
216c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->set_profile(profile);
217c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap testapn;
218c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  testapn[flimflam::kApnProperty] = kApn;
219c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  testapn[flimflam::kApnUsernameProperty] = kUsername;
220c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_CALL(*adaptor_,
221c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood              EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty, _));
222c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->SetLastGoodApn(testapn);
223c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap *resultapn = service_->GetLastGoodApn();
224c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_FALSE(resultapn == NULL);
225c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_EQ(2, resultapn->size());
226c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap::const_iterator it = resultapn->find(flimflam::kApnProperty);
227c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(it != resultapn->end() && it->second == kApn);
228c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  it = resultapn->find(flimflam::kApnUsernameProperty);
229c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(it != resultapn->end() && it->second == kUsername);
230c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  // Now set the user-specified APN, and check that LastGoodApn got
231c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  // cleared.
232c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Stringmap userapn;
233c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  userapn[flimflam::kApnProperty] = kApn;
234c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  userapn[flimflam::kApnUsernameProperty] = kUsername;
235c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  {
236c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    InSequence seq;
237c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    EXPECT_CALL(*adaptor_,
238c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                EmitStringmapChanged(flimflam::kCellularLastGoodApnProperty,
239c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                                     _));
240c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood    EXPECT_CALL(*adaptor_,
241c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood                EmitStringmapChanged(flimflam::kCellularApnProperty, _));
242c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  }
243c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  Error error;
244c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  service_->SetApn(userapn, &error);
245c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood  EXPECT_TRUE(service_->GetLastGoodApn() == NULL);
246c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood}
247c7073307211b6b5a090a14b951524ac210ab1c9cEric Shienbrood
248b72cf40dc315f9ae3537980f4fd85e737c125a03Darin Petkov}  // namespace shill
249